aetherius 0.3.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {aetherius-0.3.0 → aetherius-0.4.0}/.github/workflows/ci.yml +1 -1
- {aetherius-0.3.0 → aetherius-0.4.0}/CHANGELOG.md +123 -1
- {aetherius-0.3.0 → aetherius-0.4.0}/CONTRIBUTING.md +5 -1
- {aetherius-0.3.0 → aetherius-0.4.0}/Makefile +1 -1
- {aetherius-0.3.0 → aetherius-0.4.0}/PKG-INFO +97 -20
- {aetherius-0.3.0 → aetherius-0.4.0}/README.md +92 -16
- {aetherius-0.3.0/src/aetherius/_contracts → aetherius-0.4.0/contracts}/blueprint.schema.json +59 -4
- {aetherius-0.3.0 → aetherius-0.4.0}/contracts/events.schema.json +1 -1
- {aetherius-0.3.0 → aetherius-0.4.0}/contracts/openapi.yaml +37 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/pyproject.toml +11 -10
- {aetherius-0.3.0/contracts → aetherius-0.4.0/src/aetherius/_contracts}/blueprint.schema.json +59 -4
- aetherius-0.4.0/src/aetherius/acts/_cognition/__init__.py +12 -0
- aetherius-0.4.0/src/aetherius/acts/_cognition/claude.py +217 -0
- aetherius-0.4.0/src/aetherius/acts/_cognition/local.py +47 -0
- aetherius-0.4.0/src/aetherius/acts/_cognition/planning.py +240 -0
- aetherius-0.4.0/src/aetherius/acts/_cognition/provider.py +61 -0
- aetherius-0.4.0/src/aetherius/acts/_perception.py +48 -0
- aetherius-0.4.0/src/aetherius/acts/_shared.py +280 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/bridge.py +6 -3
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/driver.py +2 -0
- aetherius-0.4.0/src/aetherius/acts/oracle/driver.py +220 -0
- aetherius-0.4.0/src/aetherius/acts/oracle/locator.py +62 -0
- aetherius-0.4.0/src/aetherius/acts/oracle/model.py +7 -0
- aetherius-0.4.0/src/aetherius/acts/oracle/perception.py +6 -0
- aetherius-0.4.0/src/aetherius/acts/oracle/scan.py +98 -0
- aetherius-0.4.0/src/aetherius/acts/phantom/driver.py +92 -0
- aetherius-0.4.0/src/aetherius/acts/phantom/loop.py +145 -0
- aetherius-0.4.0/src/aetherius/acts/phantom/memory.py +70 -0
- aetherius-0.4.0/src/aetherius/acts/phantom/perception.py +21 -0
- aetherius-0.4.0/src/aetherius/acts/phantom/planner.py +47 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/driver.py +2 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/factory.py +6 -4
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/validation.py +9 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/cli/__init__.py +11 -1
- aetherius-0.4.0/src/aetherius/cli/approvals.py +51 -0
- aetherius-0.4.0/src/aetherius/console/approvals.py +56 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/runs.py +13 -1
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screenshots.py +21 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/confirm.py +8 -2
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/base.py +23 -3
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/flow.py +14 -2
- aetherius-0.4.0/src/aetherius/core/actions/human.py +67 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/registry.py +2 -2
- aetherius-0.4.0/src/aetherius/core/actions/vision.py +35 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/blueprint/models.py +20 -0
- aetherius-0.4.0/src/aetherius/core/blueprint/validator.py +130 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/errors.py +23 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/events/models.py +4 -0
- aetherius-0.4.0/src/aetherius/core/runtime/approvals.py +154 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/context.py +4 -0
- aetherius-0.4.0/src/aetherius/core/runtime/drivers.py +119 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/engine.py +25 -24
- aetherius-0.4.0/src/aetherius/core/runtime/flow.py +143 -0
- aetherius-0.4.0/src/aetherius/core/runtime/healing.py +246 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/result.py +3 -0
- aetherius-0.4.0/src/aetherius/core/runtime/selector.py +77 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/steps.py +72 -121
- aetherius-0.4.0/src/aetherius/models/registry.py +39 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/ntfy.py +39 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/base.py +1 -1
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/app.py +5 -1
- aetherius-0.4.0/src/aetherius/server/approvals.py +40 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/config.py +10 -6
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/jobs.py +48 -3
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/runs.py +24 -1
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/schemas.py +20 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/input.py +26 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/mouse.py +18 -3
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/__init__.py +2 -0
- aetherius-0.4.0/src/aetherius/store/approvals.py +48 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/engine.py +6 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/schema.py +18 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/version.py +1 -1
- aetherius-0.3.0/src/aetherius/acts/_shared.py +0 -116
- aetherius-0.3.0/src/aetherius/acts/oracle/driver.py +0 -1
- aetherius-0.3.0/src/aetherius/acts/oracle/locator.py +0 -1
- aetherius-0.3.0/src/aetherius/acts/oracle/model.py +0 -1
- aetherius-0.3.0/src/aetherius/acts/oracle/perception.py +0 -1
- aetherius-0.3.0/src/aetherius/acts/phantom/driver.py +0 -1
- aetherius-0.3.0/src/aetherius/acts/phantom/loop.py +0 -1
- aetherius-0.3.0/src/aetherius/acts/phantom/memory.py +0 -1
- aetherius-0.3.0/src/aetherius/acts/phantom/perception.py +0 -1
- aetherius-0.3.0/src/aetherius/acts/phantom/planner.py +0 -1
- aetherius-0.3.0/src/aetherius/core/blueprint/validator.py +0 -83
- aetherius-0.3.0/src/aetherius/core/runtime/selector.py +0 -1
- aetherius-0.3.0/src/aetherius/models/registry.py +0 -1
- {aetherius-0.3.0 → aetherius-0.4.0}/.dockerignore +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/.env.example +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/.github/workflows/release.yml +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/.gitignore +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/LICENSE +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/UKIT.king.blueprint.json +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/direct.linkaetherius.blueprint.json +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/github.aetherius.blueprint.json +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/github.github.blueprint.json +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/github.zeb.blueprint.json +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/licence.aetherius.blueprint.json +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/record.aetherius.blueprint.json +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/deploy/.env.example +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/deploy/Dockerfile +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/deploy/aetherius.service +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/deploy/blueprints/.gitkeep +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/deploy/docker-compose.yml +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/__main__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/_contracts/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/actions.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/browser.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/debug_overlay.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/human_actions.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/oracle/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/phantom/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/auth.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/client.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/impersonate.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/catalog.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/templates.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/cli/_shared.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/cli/schedule.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/config/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/config/secrets.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/config/settings.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/app.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/console.tcss +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/daemon_control.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/run_bridge.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/_pending.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/act_picker.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/io_editor.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/options_editor.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/preview.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/screen.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/step_editor.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/catalog.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/home.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/library.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/library_scan.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/recorder.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/_common.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/detail.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/form.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/screen.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/sessions.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/settings.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/theme.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/event_log.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/form.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/json_preview.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/run_summary.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/data.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/interaction.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/navigation.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/notification.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/spec.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/blueprint/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/blueprint/loader.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/blueprint/template.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/driver.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/events/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/events/bus.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/events/sinks.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/extraction/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/extraction/html_extractor.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/extraction/json_extractor.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/models/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/models/store/.gitkeep +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/geo.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/identity.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/pool.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/proxy.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/transport.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/base.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/_http.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/discord.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/telegram.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/webhook.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/message.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/registry.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/sink.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/plugins.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_capture_js.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_gesture_js.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_names.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_overlay_js.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_playwright.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_selector_js.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_transform.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_vector_js.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/blueprint_recorder.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/capture.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/continuum_backend.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/gesture_recorder.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/selector_synth.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/session.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/vector_backend.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/deps.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/blueprints.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/recorder.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/schedules.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/stream.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/alerts.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/manual.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/misfire.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/service.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/triggers.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/hardening.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/headers.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/patch.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/profile.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/webrtc.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/gestures/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/gestures/data/human_library.json +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/gestures/library.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/gestures/seed.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/keyboard.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/scroll.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/timing.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/ml/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/ml/fingerprint_model.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/ml/motion_model.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/policy.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/session/__init__.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/session/store.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/session/warmup.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/models.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/runs.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/schedules.py +0 -0
- {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/state.py +0 -0
|
@@ -30,7 +30,7 @@ jobs:
|
|
|
30
30
|
cache: pip
|
|
31
31
|
cache-dependency-path: pyproject.toml
|
|
32
32
|
# Base install stays light; heavy Act extras are not needed, tests marked
|
|
33
|
-
# browser/vision
|
|
33
|
+
# browser/cognition/vision skip themselves when their dependency is absent.
|
|
34
34
|
- run: python -m pip install -e ".[dev]"
|
|
35
35
|
- run: make lint
|
|
36
36
|
- run: make typecheck
|
|
@@ -7,6 +7,127 @@ Toutes les évolutions notables du projet sont consignées ici. Le format s'insp
|
|
|
7
7
|
|
|
8
8
|
## [Non publié]
|
|
9
9
|
|
|
10
|
+
## [0.4.0] - 2026-07-20
|
|
11
|
+
|
|
12
|
+
Phase 2 — les Acts autonomes : **Oracle** (vision) et **Phantom** (agent) deviennent runnables, la
|
|
13
|
+
**composition multi-Act** et le **self-healing** lèvent la contrainte « un Act par Blueprint », et
|
|
14
|
+
l'**humain dans la boucle** (`confirm`) garde les actions sensibles. Phase 2 complète (A–E).
|
|
15
|
+
|
|
16
|
+
### Ajouté
|
|
17
|
+
- **Jalon 2-E — Human-in-the-loop (`confirm`)** ([docs/human-in-the-loop.md](docs/human-in-the-loop.md)) :
|
|
18
|
+
une action **orthogonale aux Acts** (héritée par tous les drivers comme `notify`) qui **gare le
|
|
19
|
+
run** jusqu'à une décision humaine puis reprend. **Attente bloquante, pas suspend/resume** : le
|
|
20
|
+
worker parqué bloque sur un rendez-vous mémoire (`core/runtime/approvals.py`,
|
|
21
|
+
`ApprovalRegistry`/`Rendezvous`), le run — navigateur compris — reste vivant ; la boucle asyncio,
|
|
22
|
+
l'UI, ne gèlent jamais. Le **statut reste `running`** (deux nouveaux events
|
|
23
|
+
`input_requested`/`input_provided` au contrat `events.schema.json`, aucun nouveau statut). **Timeout
|
|
24
|
+
obligatoire** (`timeout_ms`, défaut 5 min) + `on_timeout` `approve`/`reject`/`fail:CODE` (défaut
|
|
25
|
+
**reject**, deny-by-default : le step sensible gardé par `when` se saute) ; un run non surveillé
|
|
26
|
+
(bibliothèque, sans surface) applique le timeout **immédiatement**. **Quatre surfaces, un seul
|
|
27
|
+
rendez-vous** : Console (`ConfirmModal` via `ConsoleApprovalSink` sur `input_requested`),
|
|
28
|
+
CLI/in-process (invite stdin `questionary`, sur un thread pour respecter le timeout, no-op sans
|
|
29
|
+
TTY), **API daemon** (`POST /v1/runs/{id}/decisions`, token opaque lié au `run_id`, 404 run inconnu
|
|
30
|
+
/ 409 rien en attente ou token invalide), et **réponse de notification** (boutons ntfy
|
|
31
|
+
Approve/Reject POSTant la route, via `Notification.data["confirm"]` + `AETHERIUS_DAEMON_PUBLIC_URL`).
|
|
32
|
+
Piste d'audit `approvals` (migration store forward-only **v1→v2**) écrite par le daemon depuis le
|
|
33
|
+
flux d'événements (source unique, sans course). Nouveaux : `core/actions/human.py` (spec `confirm`),
|
|
34
|
+
`Capability.CONFIRM`, `RunContext.approvals` + `RunEngine.run(approvals=)`, `server/approvals.py`,
|
|
35
|
+
`console/approvals.py`, `cli/approvals.py`, `store/approvals.py`. Contrats : event enum + route
|
|
36
|
+
OpenAPI. Exemple zéro config : `examples/vector/confirm-before-post.blueprint.json`. **Phase 2
|
|
37
|
+
terminée (A–E).**
|
|
38
|
+
- **Jalon 2-D — Composition multi-Act & self-healing** ([docs/composition.md](docs/composition.md)) :
|
|
39
|
+
la contrainte « un Act par Blueprint » tombe. **`act` par step** — chaque step peut surcharger
|
|
40
|
+
l'act du run (hérité dans les branches `if`/`repeat`/`for_each`, validé contre l'act **effectif**) ;
|
|
41
|
+
les Acts navigateur (II/III/IV) partagent **un seul navigateur** : le moteur pré-scanne l'arbre
|
|
42
|
+
(surcharges + chaînes de fallback) et instancie une seule instance du plus haut Act atteignable,
|
|
43
|
+
par subsomption de la chaîne d'héritage des drivers (`core/runtime/drivers.py`, `DriverManager` à
|
|
44
|
+
démarrage paresseux, teardown groupé). **Self-healing** opt-in : sur échec d'un step navigateur,
|
|
45
|
+
la chaîne `options.fallback` (ou `fallback` par step, `[]` désactive) rejoue l'**intention** du
|
|
46
|
+
step (`describe`, jamais devinée) sur l'Act supérieur — escalade `oracle` = rejeu du même step en
|
|
47
|
+
ciblage vision (`fill` → `type`), escalade `phantom` = **micro-objectif** d'agent borné (6
|
|
48
|
+
actions, capable d'écarter un obstacle ; limité aux intentions exprimables par le planner).
|
|
49
|
+
L'escalade est ponctuelle (le step suivant repart sur son act) ; un step guéri est un succès
|
|
50
|
+
(`StepResult.healed_by`, durée cumulée), le récit passe par des événements `progress` de niveau
|
|
51
|
+
`warning` (aucun nouveau type d'événement) ; chaîne épuisée = l'erreur d'origine propagée
|
|
52
|
+
inchangée. Schéma : champs `step.act`/`step.describe`/`step.fallback` + `options.fallback`
|
|
53
|
+
(additifs). L'exécuteur est réorganisé (`core/runtime/steps.py` + `flow.py` extrait +
|
|
54
|
+
`healing.py`), zéro régression mono-Act. Exemples zéro config : `examples/composition/`
|
|
55
|
+
(run mixte Continuum→Oracle et sélecteur cassé rattrapé par vision, vérifiés en réel).
|
|
56
|
+
- **Jalon 2-C — Act IV Phantom** ([docs/acts/phantom.md](docs/acts/phantom.md)) : `act: "phantom"`
|
|
57
|
+
est **runnable**. Un Blueprint **sans `steps`** déclare un `goal` et des `constraints` ; le moteur
|
|
58
|
+
route vers `driver.run_goal` (seam goal-only dans `RunEngine.run`) qui lance la boucle
|
|
59
|
+
**percevoir → raisonner → agir**. Le **planner** (Claude par défaut, rôle `Planner` du substrat de
|
|
60
|
+
cognition, `acts/_cognition/planning.py`) choisit chaque action par **tool use forcé**
|
|
61
|
+
(`tool_choice: any`) sur un vocabulaire restreint — ciblage **vision uniquement**, plus les outils
|
|
62
|
+
terminaux `finish` (objectif atteint → sortie) et `abort` (impossible / contrainte violée → échec
|
|
63
|
+
propre). L'action est jouée par le ciblage vision d'Oracle à travers la discrétion.
|
|
64
|
+
`PhantomDriver` **étend** `OracleDriver` (un seul navigateur, une seule discrétion, provider et
|
|
65
|
+
dispatch hérités) — un Blueprint `phantom` avec `steps` tourne déjà en mode scripté (socle 2-D).
|
|
66
|
+
Garde-fou : budget `options.agent.max_steps` (défaut 40, nouveau modèle `AgentOptions` + schéma) ;
|
|
67
|
+
un échec d'action est une **observation** mémorisée (résilience), jamais fatal — seuls `abort`, une
|
|
68
|
+
réponse de planner inutilisable ou le budget épuisé arrêtent le run. Observabilité par réutilisation
|
|
69
|
+
de `progress`/`step_started`/`step_finished` (`step_id` `agent[N]`, un `StepResult` par action),
|
|
70
|
+
**aucun nouvel `EventType`**. Sorties : `finish` exposé sous `{{ steps.agent.* }}`, ou l'issue de
|
|
71
|
+
l'agent (`{result, steps_taken}`) renvoyée telle quelle sans `outputs` déclarés. Garde validator
|
|
72
|
+
« goal-only ⇒ act phantom ». Exemple zéro config :
|
|
73
|
+
`examples/phantom/quotes-find-author.blueprint.json`.
|
|
74
|
+
- **Jalon 2-B — Act III Oracle** ([docs/acts/oracle.md](docs/acts/oracle.md)) : `act: "oracle"` est
|
|
75
|
+
**runnable**. `OracleDriver` **étend** le driver Continuum (un seul navigateur, une seule
|
|
76
|
+
discrétion, steps à sélecteur inchangés) et route les cibles vision : `click`/`type`/`upload`/
|
|
77
|
+
`hover`/`wait_for` acceptent `target: {vision: "description"}` — capture en pixels CSS →
|
|
78
|
+
grounding (un appel par cible, seuil de confiance 0.5 ajustable par `min_confidence`) → action
|
|
79
|
+
par coordonnées off-center (bande 30–70 %) via la façade stealth (`HumanInput` gagne
|
|
80
|
+
`hover_at`). `wait_for` par vision sonde l'écran (un grounding par sonde, `on_timeout:
|
|
81
|
+
"fail:CODE"` honoré) ; `upload` alimente le file chooser ouvert par le clic. Nouvelle action
|
|
82
|
+
**`read`** (extraction sémantique, capability + spec `core/actions/vision.py`) : avec `schema`
|
|
83
|
+
les champs deviennent les sorties du step, sans schéma la valeur arrive sous `data`. Contrat
|
|
84
|
+
documenté sans changement structurel (`target`, `vision.provider`) ; le Studio accepte les steps
|
|
85
|
+
ciblés par vision. Exemple zéro config : `examples/oracle/quotes-vision-demo.blueprint.json`.
|
|
86
|
+
- **Action `wait` : plage aléatoire** — sans `ms`, `min_ms`/`max_ms` tirent une durée uniforme
|
|
87
|
+
dans l'intervalle (act-agnostique) ; le gabarit fondateur `tiktok-upload` devient exact.
|
|
88
|
+
- **Oracle : recherche par défilement (scan)** — une cible vision hors du viewport est trouvée en
|
|
89
|
+
défilant la page viewport par viewport (scroll humanisé sous discrétion, remontée en haut pour
|
|
90
|
+
un départ en milieu de page), à coût borné : 8 coups d'œil maximum, un appel de grounding
|
|
91
|
+
chacun ; `scan: false` épingle le step au viewport courant. Exemple zéro config :
|
|
92
|
+
`examples/oracle/books-scan-below-fold.blueprint.json`.
|
|
93
|
+
- **Contribution : sondes réalistes** — la « Définition de terminé » exige désormais, en plus du
|
|
94
|
+
flux nominal vérifié à la main, une ou deux sondes réalistes « dures » (dont un cas conçu pour
|
|
95
|
+
échouer), consignées dans la doc de la capacité ([docs/testing.md](docs/testing.md)).
|
|
96
|
+
- **Jalon 2-A — Substrat de perception & cognition** ([docs/cognition.md](docs/cognition.md)) : la
|
|
97
|
+
fondation partagée des Acts cognitifs. `ClaudeProvider` implémente le **grounding** (`locate` :
|
|
98
|
+
description → `Box` + confiance) et l'**extraction sémantique** (`read`, schéma optionnel) par
|
|
99
|
+
tool use forcé — réponse structurée, un appel par cible, modèle par défaut `claude-opus-4-8`
|
|
100
|
+
écrasé par `vision.model`, clé via `ANTHROPIC_API_KEY` (`.env` supporté) ; `resolve_provider`
|
|
101
|
+
résout `vision.provider` (`claude` défaut / `local`) ; `LocalGrounder` reste l'option locale
|
|
102
|
+
derrière la même interface (rôles non portés en `CognitionError` typée). Perception de page en
|
|
103
|
+
**pixels CSS** (`capture` : screenshot `scale="css"` + DOM optionnel, réduction 2576 px avec
|
|
104
|
+
remise à l'échelle des boîtes), cible unifiée `Target.from_step` (sélecteur ou
|
|
105
|
+
`target: {vision}`, ambiguïté rejetée), et **clic par coordonnées à travers le stealth**
|
|
106
|
+
(`HumanInput.click_at`/`type_at`, gestes rejoués + timing humain, intégration Chromium réelle).
|
|
107
|
+
Nouvelle erreur `CognitionError`. `import aetherius` reste léger (SDK importés paresseusement).
|
|
108
|
+
- **Phase 2 — Autonomie & Contrôle : cadrage + squelette.** Directives et **spécifications par jalon**
|
|
109
|
+
([docs/phase-2/](docs/phase-2/README.md), jalons 2-A à 2-E), plus les **stubs d'interface** du
|
|
110
|
+
substrat de cognition ([`acts/_cognition/`](src/aetherius/acts/_cognition/),
|
|
111
|
+
[`acts/_perception.py`](src/aetherius/acts/_perception.py),
|
|
112
|
+
[`core/runtime/selector.py`](src/aetherius/core/runtime/selector.py),
|
|
113
|
+
[`models/registry.py`](src/aetherius/models/registry.py)) et des Acts cognitifs (Oracle/Phantom).
|
|
114
|
+
Les Acts II/III/IV deviennent trois stratégies au-dessus d'un même substrat navigateur + stealth +
|
|
115
|
+
perception + cognition. La phase couvre aussi la composition multi-Act par step, le self-healing
|
|
116
|
+
(fallback d'Act) et le human-in-the-loop (action `confirm`). Aucun comportement runtime modifié
|
|
117
|
+
(`make check` vert, `import aetherius` reste léger).
|
|
118
|
+
|
|
119
|
+
### Modifié
|
|
120
|
+
- **Extras refondus (Jalon 2-A)** : nouvel extra `[cognition]` (`anthropic`, `pillow`) — le défaut
|
|
121
|
+
partagé Oracle+Phantom, qui **absorbe l'ancien `[agent]`** (supprimé) ; `[vision]` repositionné
|
|
122
|
+
en **grounder local optionnel** ; `[all]` et les markers pytest alignés (`cognition` remplace
|
|
123
|
+
`agent`).
|
|
124
|
+
- **Oracle (Act III) redéfini** : le ciblage se fait par **grounding VLM** (Claude par défaut, un
|
|
125
|
+
détecteur local restant une option branchable derrière la même interface) plutôt que par un modèle
|
|
126
|
+
ONNX entraîné par tâche ; l'entraînement local devient une piste **optionnelle/avancée**. Fiches
|
|
127
|
+
[docs/acts/oracle.md](docs/acts/oracle.md) et [docs/acts/phantom.md](docs/acts/phantom.md)
|
|
128
|
+
réécrites (définition cible), [training/README.md](training/README.md) requalifié, section
|
|
129
|
+
« Phase 2 » et descriptions Oracle du README harmonisées.
|
|
130
|
+
|
|
10
131
|
## [0.3.0] - 2026-07-17
|
|
11
132
|
|
|
12
133
|
Phase 1.5 : le socle devient **opérationnel** (planification, alertes, réactivité, furtivité réseau
|
|
@@ -184,6 +305,7 @@ Première release publique. Elle clôt la **Phase 1** : le socle d'Aetherius, ut
|
|
|
184
305
|
- SemVer `0.x` : l'API peut évoluer pendant le durcissement de la Phase 1.
|
|
185
306
|
- La **Phase 2** ajoutera Act III (Oracle, vision) et Act IV (Phantom, agent autonome).
|
|
186
307
|
|
|
187
|
-
[Non publié]: https://github.com/kln-mltre/Aetherius/compare/v0.
|
|
308
|
+
[Non publié]: https://github.com/kln-mltre/Aetherius/compare/v0.4.0...HEAD
|
|
309
|
+
[0.4.0]: https://github.com/kln-mltre/Aetherius/releases/tag/v0.4.0
|
|
188
310
|
[0.3.0]: https://github.com/kln-mltre/Aetherius/releases/tag/v0.3.0
|
|
189
311
|
[0.2.0]: https://github.com/kln-mltre/Aetherius/releases/tag/v0.2.0
|
|
@@ -43,7 +43,11 @@ est vrai. On ne saute pas une étape en attendant qu'on la réclame :
|
|
|
43
43
|
3. **Doc à jour** dans le même changement — voir [Documentation](#documentation).
|
|
44
44
|
4. **`make check` vert.**
|
|
45
45
|
5. **Flux vérifié à la main** au moins une fois : le vrai `run`, pas seulement les tests (chaque
|
|
46
|
-
doc d'Act a une section « Tester … » pour ça).
|
|
46
|
+
doc d'Act a une section « Tester … » pour ça). En plus du chemin nominal, jouer **une ou deux
|
|
47
|
+
sondes réalistes « dures »** — un scénario réel plus exigeant que l'exemple zéro config, dont si
|
|
48
|
+
possible un cas conçu pour faire échouer la capacité. Un échec **propre et explicable** est un
|
|
49
|
+
résultat valide ; un comportement surprenant est un correctif ou une limite à documenter avant
|
|
50
|
+
de clore. Voir [docs/testing.md](docs/testing.md#sondes-réalistes).
|
|
47
51
|
6. **Prise en main UI** pour une capacité **liée à l'UI et non triviale** (nouvel écran ou
|
|
48
52
|
interaction non évidente de la Console) : un walkthrough orienté UI dans la doc **et** des captures
|
|
49
53
|
SVG générées (`make screenshots`) — voir [Documentation](#documentation). Exception : une
|
|
@@ -31,7 +31,7 @@ test: ## Run the full Python test suite with coverage
|
|
|
31
31
|
pytest --cov=aetherius --cov-report=term-missing
|
|
32
32
|
|
|
33
33
|
test-fast: ## Run only the fast tests (skip heavy extras and slow tests)
|
|
34
|
-
pytest -m "not browser and not vision and not
|
|
34
|
+
pytest -m "not browser and not vision and not cognition and not slow"
|
|
35
35
|
|
|
36
36
|
test-browser: ## Run the browser tests (Act II) against a real Chromium; needs the [browser] extra
|
|
37
37
|
pytest -m browser
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aetherius
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: A fixed, robust web-bot engine driven by declarative instruction files (Blueprints).
|
|
5
5
|
Project-URL: Repository, https://github.com/kln-mltre/Aetherius
|
|
6
6
|
Author: Kylian Malartre
|
|
@@ -37,10 +37,8 @@ Requires-Dist: typer>=0.12
|
|
|
37
37
|
Requires-Dist: tzlocal>=5.0
|
|
38
38
|
Requires-Dist: uvicorn[standard]>=0.29
|
|
39
39
|
Requires-Dist: websockets>=12.0
|
|
40
|
-
Provides-Extra: agent
|
|
41
|
-
Requires-Dist: anthropic>=0.25; extra == 'agent'
|
|
42
40
|
Provides-Extra: all
|
|
43
|
-
Requires-Dist: anthropic>=0.
|
|
41
|
+
Requires-Dist: anthropic>=0.40; extra == 'all'
|
|
44
42
|
Requires-Dist: curl-cffi>=0.6; extra == 'all'
|
|
45
43
|
Requires-Dist: numpy>=1.26; extra == 'all'
|
|
46
44
|
Requires-Dist: onnxruntime>=1.17; extra == 'all'
|
|
@@ -50,6 +48,9 @@ Requires-Dist: playwright>=1.44; extra == 'all'
|
|
|
50
48
|
Requires-Dist: socksio>=1.0; extra == 'all'
|
|
51
49
|
Provides-Extra: browser
|
|
52
50
|
Requires-Dist: playwright>=1.44; extra == 'browser'
|
|
51
|
+
Provides-Extra: cognition
|
|
52
|
+
Requires-Dist: anthropic>=0.40; extra == 'cognition'
|
|
53
|
+
Requires-Dist: pillow>=10.3; extra == 'cognition'
|
|
53
54
|
Provides-Extra: dev
|
|
54
55
|
Requires-Dist: build>=1.2; extra == 'dev'
|
|
55
56
|
Requires-Dist: mypy>=1.9; extra == 'dev'
|
|
@@ -120,7 +121,7 @@ Blueprint choisit l'Act adapté à la tâche.
|
|
|
120
121
|
|-----|-----|--------|------------------|
|
|
121
122
|
| **I** | **Vector** | Requêtes HTTP/API | Les données sont derrière une API ou des endpoints stables. Le cas « axios ». Le plus rapide. |
|
|
122
123
|
| **II** | **Continuum** | Navigateur scripté (Playwright) | Il faut un vrai navigateur : login, JS, session, DOM. Sélecteurs connus et stables. |
|
|
123
|
-
| **III** | **Oracle** | Navigateur guidé par vision + discrétion | L'UI est fragile/obfusquée : Aetherius « voit » l'écran via un
|
|
124
|
+
| **III** | **Oracle** | Navigateur guidé par vision + discrétion | L'UI est fragile/obfusquée : Aetherius « voit » l'écran via un modèle vision-langage (grounding VLM) et agit avec discrétion. |
|
|
124
125
|
| **IV** | **Phantom** | Agent autonome | Objectif non scripté. Perçoit, raisonne, agit en boucle. Résilience maximale. Le plus lourd. |
|
|
125
126
|
|
|
126
127
|
Plus l'Act est élevé, plus le Blueprint est **haut-niveau** (on décrit *quoi*, plus *comment*) et
|
|
@@ -139,10 +140,11 @@ exigent un navigateur : login, cookies de session, contenu rendu par JS. C'est l
|
|
|
139
140
|
et réutilisable d'une « WebView cachée qui scrape ». Discrétion optionnelle.
|
|
140
141
|
|
|
141
142
|
### Act III — Oracle
|
|
142
|
-
Quand les sélecteurs sont trop fragiles ou absents, Oracle **regarde l'écran**. Un
|
|
143
|
-
vision
|
|
144
|
-
captures d'écran ; Aetherius clique par coordonnées à travers la
|
|
145
|
-
|
|
143
|
+
Quand les sélecteurs sont trop fragiles ou absents, Oracle **regarde l'écran**. Un modèle
|
|
144
|
+
vision-langage (VLM — Claude par défaut, un détecteur local reste une option) localise en langage
|
|
145
|
+
naturel les éléments cibles sur des captures d'écran ; Aetherius clique par coordonnées à travers la
|
|
146
|
+
couche de discrétion. Le flux reste scripté et déterministe (un appel de grounding par cible). Idéal
|
|
147
|
+
pour les interfaces qui changent souvent ou piègent les bots.
|
|
146
148
|
|
|
147
149
|
### Act IV — Phantom
|
|
148
150
|
Un agent décisionnel autonome. Boucle **percevoir → raisonner → agir** : il perçoit la page (vision
|
|
@@ -325,8 +327,9 @@ aetherius # ouvre la Console
|
|
|
325
327
|
> **État actuel** : la Console est navigable de bout en bout. Library, Runs, **Schedules** (runs
|
|
326
328
|
> récurrents : liste, tir manuel, historique, création guidée), Catalog, le **Recorder**, le
|
|
327
329
|
> **Blueprint Studio** et **Settings** (démarrer/arrêter le daemon) sont pleinement fonctionnels
|
|
328
|
-
> pour Act I (Vector)
|
|
329
|
-
> honnêtement son jalon en attente
|
|
330
|
+
> pour Act I (Vector), Act II (Continuum, extra `[browser]`), Act III (Oracle) et Act IV (Phantom)
|
|
331
|
+
> (extras `[cognition]`+`[browser]`) ; seul **Sessions** affiche honnêtement son jalon en attente
|
|
332
|
+
> (stealth/session). Détails : [docs/console.md](docs/console.md).
|
|
330
333
|
|
|
331
334
|
Depuis la Console, sans écrire de JSON à la main :
|
|
332
335
|
- **Créer et éditer des Blueprints** via le **Blueprint Studio** (voir plus bas).
|
|
@@ -464,7 +467,8 @@ console.log(result.outputs.events);
|
|
|
464
467
|
```
|
|
465
468
|
src/aetherius/
|
|
466
469
|
core/ blueprint (models/loader/validator/template), actions (le dictionnaire),
|
|
467
|
-
runtime (engine/
|
|
470
|
+
runtime (engine/drivers/steps/flow/healing/context/selector/result), extraction,
|
|
471
|
+
events, errors, driver
|
|
468
472
|
acts/ vector (I), continuum (II), oracle (III), phantom (IV)
|
|
469
473
|
stealth/ policy, humanizer (mouse/keyboard/scroll/timing), gestures, fingerprint,
|
|
470
474
|
session (store/warmup), ml (optionnel)
|
|
@@ -493,10 +497,10 @@ typées (jamais avalées) ; les Acts sont des drivers interchangeables derrière
|
|
|
493
497
|
## Installation (cible)
|
|
494
498
|
|
|
495
499
|
```bash
|
|
496
|
-
pip install aetherius
|
|
497
|
-
pip install aetherius[browser]
|
|
498
|
-
pip install aetherius[
|
|
499
|
-
pip install aetherius[
|
|
500
|
+
pip install aetherius # cœur + Act I (Vector) + daemon + Console
|
|
501
|
+
pip install aetherius[browser] # + Act II (Continuum)
|
|
502
|
+
pip install aetherius[cognition] # + Acts III/IV (Oracle, Phantom) : cognition Claude par défaut
|
|
503
|
+
pip install aetherius[vision] # optionnel : grounder local (ONNX/VLM) derrière la même interface
|
|
500
504
|
pip install aetherius[all]
|
|
501
505
|
```
|
|
502
506
|
|
|
@@ -678,10 +682,83 @@ couche stealth, le rendre invisible **au niveau réseau** (proxy, rotation d'IP)
|
|
|
678
682
|
`examples/vector/http-headers-identity.blueprint.json`. [docs/stealth.md](docs/stealth.md),
|
|
679
683
|
[docs/phase-1.5/h-fingerprint.md](docs/phase-1.5/h-fingerprint.md).
|
|
680
684
|
|
|
681
|
-
### Phase 2 —
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
+
### Phase 2 — Autonomie & Contrôle (terminée)
|
|
686
|
+
|
|
687
|
+
Cadrage complet et **spécifications par jalon** : [docs/phase-2/](docs/phase-2/README.md). La phase
|
|
688
|
+
livre les **Acts cognitifs** et rend le bot à la fois plus **autonome** (il gère les parties non
|
|
689
|
+
scriptées, voit l'écran, s'auto-répare) et plus **pilotable** (il demande une confirmation humaine à
|
|
690
|
+
distance). Oracle est **redéfini** : ciblage par **grounding VLM** (Claude par défaut, modèle local
|
|
691
|
+
optionnel), sans entraînement obligatoire.
|
|
692
|
+
|
|
693
|
+
- [x] **2-A** — Substrat de perception & cognition : la fondation partagée d'Oracle et Phantom.
|
|
694
|
+
Interface `CognitionProvider` ségrégée en trois rôles (`Grounder`/`Extractor`/`Planner`),
|
|
695
|
+
`ClaudeProvider` par défaut — grounding et extraction sémantique par **tool use forcé** (réponse
|
|
696
|
+
structurée, un appel par cible, `claude-opus-4-8` écrasé par `vision.model`) —, `LocalGrounder`
|
|
697
|
+
optionnel derrière la même interface, résolution `vision.provider` (`claude`/`local`).
|
|
698
|
+
Perception de page en **pixels CSS** (`capture` : screenshot `scale="css"`, DOM optionnel),
|
|
699
|
+
cible unifiée `Target` (sélecteur **ou** `{vision: "description"}`), et **clic par coordonnées à
|
|
700
|
+
travers le stealth** (`HumanInput.click_at`/`type_at`, gestes rejoués + timing humain, vérifié
|
|
701
|
+
sur Chromium réel). Extras refondus : `[cognition]` (anthropic + pillow, absorbe `[agent]`),
|
|
702
|
+
`[vision]` repositionné en grounder local. `import aetherius` reste léger.
|
|
703
|
+
[docs/cognition.md](docs/cognition.md),
|
|
704
|
+
[docs/phase-2/2-a-cognition.md](docs/phase-2/2-a-cognition.md).
|
|
705
|
+
- [x] **2-B** — Act III Oracle : `oracle` est **runnable**. Ciblage par description en langage
|
|
706
|
+
naturel (`target: {vision}`) sur `click`/`type`/`upload`/`hover`/`wait_for` : capture en pixels
|
|
707
|
+
CSS → grounding (un appel par cible, seuil de confiance 0.5, `min_confidence` par step) → action
|
|
708
|
+
par coordonnées **off-center (bande 30–70 %) à travers le stealth** (`hover_at` rejoint la façade
|
|
709
|
+
`HumanInput`) ; une cible hors viewport est trouvée par **recherche par défilement** (scan borné
|
|
710
|
+
à 8 coups d'œil, scroll humanisé, opt-out `scan: false`) ; `wait_for` par vision sonde l'écran
|
|
711
|
+
(un grounding par sonde), `upload` alimente le file chooser ouvert par le clic. Action **`read`** (extraction sémantique) : `vision` + `schema`
|
|
712
|
+
objet → les champs deviennent les sorties du step, sans schéma → valeur sous `data`.
|
|
713
|
+
`OracleDriver` **étend** le driver Continuum — un seul navigateur, une seule discrétion, steps à
|
|
714
|
+
sélecteur inchangés. Capability `read` (specs `core/actions/vision.py`, hint « requires
|
|
715
|
+
act='oracle' »), et l'action `wait` gagne `min_ms`/`max_ms` (durée aléatoire uniforme,
|
|
716
|
+
act-agnostique). Exemples zéro config : `examples/oracle/quotes-vision-demo.blueprint.json` et
|
|
717
|
+
`books-scan-below-fold.blueprint.json` (vérifiés en réel, Claude + Chromium).
|
|
718
|
+
[docs/acts/oracle.md](docs/acts/oracle.md), [docs/phase-2/2-b-oracle.md](docs/phase-2/2-b-oracle.md).
|
|
719
|
+
- [x] **2-C** — Act IV Phantom : `act: "phantom"` est **runnable**. Un Blueprint sans `steps`
|
|
720
|
+
déclare un `goal` et des `constraints` ; le moteur invoque la boucle **percevoir → raisonner →
|
|
721
|
+
agir** (`RunEngine` route vers `driver.run_goal` quand `steps` est vide). Le **planner** (Claude
|
|
722
|
+
par défaut, rôle `Planner` du substrat) choisit chaque action via un vocabulaire d'outils
|
|
723
|
+
restreint (tool use forcé, ciblage **vision uniquement**, plus `finish`/`abort`) ; l'action est
|
|
724
|
+
jouée par le ciblage vision d'Oracle à travers la discrétion. `PhantomDriver` **étend**
|
|
725
|
+
`OracleDriver` (un seul navigateur, une seule discrétion). Garde-fou : budget
|
|
726
|
+
`options.agent.max_steps` (défaut 40) ; un échec d'action est une **observation** (résilience),
|
|
727
|
+
pas la mort du run. Observabilité par `progress`/`step_started`/`step_finished` (`step_id`
|
|
728
|
+
`agent[N]`), sans nouvel événement. Sorties : `finish` sous `{{ steps.agent.* }}`, ou l'issue de
|
|
729
|
+
l'agent renvoyée telle quelle sans `outputs`. Exemple zéro config :
|
|
730
|
+
`examples/phantom/quotes-find-author.blueprint.json`. [docs/acts/phantom.md](docs/acts/phantom.md),
|
|
731
|
+
[docs/phase-2/2-c-phantom.md](docs/phase-2/2-c-phantom.md).
|
|
732
|
+
- [x] **2-D** — Composition multi-Act par step + self-healing : un Blueprint mélange les Acts —
|
|
733
|
+
`act` **par step** (hérité dans les branches de flux, validé contre l'act effectif), les Acts
|
|
734
|
+
navigateur partageant **un seul navigateur** (une instance du plus haut Act atteignable, par
|
|
735
|
+
subsomption de la chaîne d'héritage des drivers ; drivers démarrés à la demande,
|
|
736
|
+
`core/runtime/drivers.py`). **Self-healing** opt-in : un step navigateur qui échoue est rejoué
|
|
737
|
+
sur l'Act supérieur via sa chaîne `options.fallback`/`fallback` (ordonnée, `oracle`/`phantom`)
|
|
738
|
+
et son **`describe`** (intention en langage naturel, jamais devinée) — escalade Oracle = rejeu
|
|
739
|
+
vision du même step (`fill`→`type`), escalade Phantom = **micro-objectif** d'agent borné
|
|
740
|
+
(6 actions) capable d'écarter un obstacle ; ponctuelle (le step suivant repart sur son act),
|
|
741
|
+
step guéri = succès tracé (`healed_by` + événements `progress` warning, aucun nouveau type
|
|
742
|
+
d'événement), chaîne épuisée = l'erreur d'origine inchangée. Exemples zéro config :
|
|
743
|
+
`examples/composition/` (run mixte + self-healing, vérifiés en réel).
|
|
744
|
+
[docs/composition.md](docs/composition.md),
|
|
745
|
+
[docs/phase-2/2-d-composition.md](docs/phase-2/2-d-composition.md).
|
|
746
|
+
- [x] **2-E** — Human-in-the-loop : l'action **`confirm`** (orthogonale aux Acts, héritée par tous les
|
|
747
|
+
drivers) **gare le run** jusqu'à une décision humaine puis reprend — attente bloquante sur un
|
|
748
|
+
rendez-vous mémoire (`core/runtime/approvals.py`), le worker parqué, jamais la boucle ; le statut
|
|
749
|
+
reste `running` (nouveaux events `input_requested`/`input_provided`, aucun nouveau statut). Timeout
|
|
750
|
+
**obligatoire** (`on_timeout` `approve`/`reject`/`fail:CODE`, défaut **reject** deny-by-default) ;
|
|
751
|
+
run non surveillé (bibliothèque) = timeout immédiat. **Quatre surfaces, un seul rendez-vous** :
|
|
752
|
+
Console (`ConfirmModal` sur `input_requested`), CLI/in-process (invite stdin `questionary`), API
|
|
753
|
+
daemon (`POST /v1/runs/{id}/decisions`, token opaque lié au run, 404/409), et **réponse de
|
|
754
|
+
notification** (boutons ntfy Approve/Reject POSTant la route via `Notification.data`, URL publique
|
|
755
|
+
`AETHERIUS_DAEMON_PUBLIC_URL`). Piste d'audit `approvals` (migration store v1→v2) écrite depuis le
|
|
756
|
+
flux d'événements. Exemple zéro config : `examples/vector/confirm-before-post.blueprint.json`.
|
|
757
|
+
[docs/human-in-the-loop.md](docs/human-in-the-loop.md),
|
|
758
|
+
[docs/phase-2/2-e-human-in-loop.md](docs/phase-2/2-e-human-in-loop.md).
|
|
759
|
+
|
|
760
|
+
**Phase 2 terminée (A–E).** Aetherius est désormais autonome (Oracle/Phantom, composition,
|
|
761
|
+
self-healing) **et** pilotable (human-in-the-loop).
|
|
685
762
|
|
|
686
763
|
## Sources de référence
|
|
687
764
|
|
|
@@ -48,7 +48,7 @@ Blueprint choisit l'Act adapté à la tâche.
|
|
|
48
48
|
|-----|-----|--------|------------------|
|
|
49
49
|
| **I** | **Vector** | Requêtes HTTP/API | Les données sont derrière une API ou des endpoints stables. Le cas « axios ». Le plus rapide. |
|
|
50
50
|
| **II** | **Continuum** | Navigateur scripté (Playwright) | Il faut un vrai navigateur : login, JS, session, DOM. Sélecteurs connus et stables. |
|
|
51
|
-
| **III** | **Oracle** | Navigateur guidé par vision + discrétion | L'UI est fragile/obfusquée : Aetherius « voit » l'écran via un
|
|
51
|
+
| **III** | **Oracle** | Navigateur guidé par vision + discrétion | L'UI est fragile/obfusquée : Aetherius « voit » l'écran via un modèle vision-langage (grounding VLM) et agit avec discrétion. |
|
|
52
52
|
| **IV** | **Phantom** | Agent autonome | Objectif non scripté. Perçoit, raisonne, agit en boucle. Résilience maximale. Le plus lourd. |
|
|
53
53
|
|
|
54
54
|
Plus l'Act est élevé, plus le Blueprint est **haut-niveau** (on décrit *quoi*, plus *comment*) et
|
|
@@ -67,10 +67,11 @@ exigent un navigateur : login, cookies de session, contenu rendu par JS. C'est l
|
|
|
67
67
|
et réutilisable d'une « WebView cachée qui scrape ». Discrétion optionnelle.
|
|
68
68
|
|
|
69
69
|
### Act III — Oracle
|
|
70
|
-
Quand les sélecteurs sont trop fragiles ou absents, Oracle **regarde l'écran**. Un
|
|
71
|
-
vision
|
|
72
|
-
captures d'écran ; Aetherius clique par coordonnées à travers la
|
|
73
|
-
|
|
70
|
+
Quand les sélecteurs sont trop fragiles ou absents, Oracle **regarde l'écran**. Un modèle
|
|
71
|
+
vision-langage (VLM — Claude par défaut, un détecteur local reste une option) localise en langage
|
|
72
|
+
naturel les éléments cibles sur des captures d'écran ; Aetherius clique par coordonnées à travers la
|
|
73
|
+
couche de discrétion. Le flux reste scripté et déterministe (un appel de grounding par cible). Idéal
|
|
74
|
+
pour les interfaces qui changent souvent ou piègent les bots.
|
|
74
75
|
|
|
75
76
|
### Act IV — Phantom
|
|
76
77
|
Un agent décisionnel autonome. Boucle **percevoir → raisonner → agir** : il perçoit la page (vision
|
|
@@ -253,8 +254,9 @@ aetherius # ouvre la Console
|
|
|
253
254
|
> **État actuel** : la Console est navigable de bout en bout. Library, Runs, **Schedules** (runs
|
|
254
255
|
> récurrents : liste, tir manuel, historique, création guidée), Catalog, le **Recorder**, le
|
|
255
256
|
> **Blueprint Studio** et **Settings** (démarrer/arrêter le daemon) sont pleinement fonctionnels
|
|
256
|
-
> pour Act I (Vector)
|
|
257
|
-
> honnêtement son jalon en attente
|
|
257
|
+
> pour Act I (Vector), Act II (Continuum, extra `[browser]`), Act III (Oracle) et Act IV (Phantom)
|
|
258
|
+
> (extras `[cognition]`+`[browser]`) ; seul **Sessions** affiche honnêtement son jalon en attente
|
|
259
|
+
> (stealth/session). Détails : [docs/console.md](docs/console.md).
|
|
258
260
|
|
|
259
261
|
Depuis la Console, sans écrire de JSON à la main :
|
|
260
262
|
- **Créer et éditer des Blueprints** via le **Blueprint Studio** (voir plus bas).
|
|
@@ -392,7 +394,8 @@ console.log(result.outputs.events);
|
|
|
392
394
|
```
|
|
393
395
|
src/aetherius/
|
|
394
396
|
core/ blueprint (models/loader/validator/template), actions (le dictionnaire),
|
|
395
|
-
runtime (engine/
|
|
397
|
+
runtime (engine/drivers/steps/flow/healing/context/selector/result), extraction,
|
|
398
|
+
events, errors, driver
|
|
396
399
|
acts/ vector (I), continuum (II), oracle (III), phantom (IV)
|
|
397
400
|
stealth/ policy, humanizer (mouse/keyboard/scroll/timing), gestures, fingerprint,
|
|
398
401
|
session (store/warmup), ml (optionnel)
|
|
@@ -421,10 +424,10 @@ typées (jamais avalées) ; les Acts sont des drivers interchangeables derrière
|
|
|
421
424
|
## Installation (cible)
|
|
422
425
|
|
|
423
426
|
```bash
|
|
424
|
-
pip install aetherius
|
|
425
|
-
pip install aetherius[browser]
|
|
426
|
-
pip install aetherius[
|
|
427
|
-
pip install aetherius[
|
|
427
|
+
pip install aetherius # cœur + Act I (Vector) + daemon + Console
|
|
428
|
+
pip install aetherius[browser] # + Act II (Continuum)
|
|
429
|
+
pip install aetherius[cognition] # + Acts III/IV (Oracle, Phantom) : cognition Claude par défaut
|
|
430
|
+
pip install aetherius[vision] # optionnel : grounder local (ONNX/VLM) derrière la même interface
|
|
428
431
|
pip install aetherius[all]
|
|
429
432
|
```
|
|
430
433
|
|
|
@@ -606,10 +609,83 @@ couche stealth, le rendre invisible **au niveau réseau** (proxy, rotation d'IP)
|
|
|
606
609
|
`examples/vector/http-headers-identity.blueprint.json`. [docs/stealth.md](docs/stealth.md),
|
|
607
610
|
[docs/phase-1.5/h-fingerprint.md](docs/phase-1.5/h-fingerprint.md).
|
|
608
611
|
|
|
609
|
-
### Phase 2 —
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
612
|
+
### Phase 2 — Autonomie & Contrôle (terminée)
|
|
613
|
+
|
|
614
|
+
Cadrage complet et **spécifications par jalon** : [docs/phase-2/](docs/phase-2/README.md). La phase
|
|
615
|
+
livre les **Acts cognitifs** et rend le bot à la fois plus **autonome** (il gère les parties non
|
|
616
|
+
scriptées, voit l'écran, s'auto-répare) et plus **pilotable** (il demande une confirmation humaine à
|
|
617
|
+
distance). Oracle est **redéfini** : ciblage par **grounding VLM** (Claude par défaut, modèle local
|
|
618
|
+
optionnel), sans entraînement obligatoire.
|
|
619
|
+
|
|
620
|
+
- [x] **2-A** — Substrat de perception & cognition : la fondation partagée d'Oracle et Phantom.
|
|
621
|
+
Interface `CognitionProvider` ségrégée en trois rôles (`Grounder`/`Extractor`/`Planner`),
|
|
622
|
+
`ClaudeProvider` par défaut — grounding et extraction sémantique par **tool use forcé** (réponse
|
|
623
|
+
structurée, un appel par cible, `claude-opus-4-8` écrasé par `vision.model`) —, `LocalGrounder`
|
|
624
|
+
optionnel derrière la même interface, résolution `vision.provider` (`claude`/`local`).
|
|
625
|
+
Perception de page en **pixels CSS** (`capture` : screenshot `scale="css"`, DOM optionnel),
|
|
626
|
+
cible unifiée `Target` (sélecteur **ou** `{vision: "description"}`), et **clic par coordonnées à
|
|
627
|
+
travers le stealth** (`HumanInput.click_at`/`type_at`, gestes rejoués + timing humain, vérifié
|
|
628
|
+
sur Chromium réel). Extras refondus : `[cognition]` (anthropic + pillow, absorbe `[agent]`),
|
|
629
|
+
`[vision]` repositionné en grounder local. `import aetherius` reste léger.
|
|
630
|
+
[docs/cognition.md](docs/cognition.md),
|
|
631
|
+
[docs/phase-2/2-a-cognition.md](docs/phase-2/2-a-cognition.md).
|
|
632
|
+
- [x] **2-B** — Act III Oracle : `oracle` est **runnable**. Ciblage par description en langage
|
|
633
|
+
naturel (`target: {vision}`) sur `click`/`type`/`upload`/`hover`/`wait_for` : capture en pixels
|
|
634
|
+
CSS → grounding (un appel par cible, seuil de confiance 0.5, `min_confidence` par step) → action
|
|
635
|
+
par coordonnées **off-center (bande 30–70 %) à travers le stealth** (`hover_at` rejoint la façade
|
|
636
|
+
`HumanInput`) ; une cible hors viewport est trouvée par **recherche par défilement** (scan borné
|
|
637
|
+
à 8 coups d'œil, scroll humanisé, opt-out `scan: false`) ; `wait_for` par vision sonde l'écran
|
|
638
|
+
(un grounding par sonde), `upload` alimente le file chooser ouvert par le clic. Action **`read`** (extraction sémantique) : `vision` + `schema`
|
|
639
|
+
objet → les champs deviennent les sorties du step, sans schéma → valeur sous `data`.
|
|
640
|
+
`OracleDriver` **étend** le driver Continuum — un seul navigateur, une seule discrétion, steps à
|
|
641
|
+
sélecteur inchangés. Capability `read` (specs `core/actions/vision.py`, hint « requires
|
|
642
|
+
act='oracle' »), et l'action `wait` gagne `min_ms`/`max_ms` (durée aléatoire uniforme,
|
|
643
|
+
act-agnostique). Exemples zéro config : `examples/oracle/quotes-vision-demo.blueprint.json` et
|
|
644
|
+
`books-scan-below-fold.blueprint.json` (vérifiés en réel, Claude + Chromium).
|
|
645
|
+
[docs/acts/oracle.md](docs/acts/oracle.md), [docs/phase-2/2-b-oracle.md](docs/phase-2/2-b-oracle.md).
|
|
646
|
+
- [x] **2-C** — Act IV Phantom : `act: "phantom"` est **runnable**. Un Blueprint sans `steps`
|
|
647
|
+
déclare un `goal` et des `constraints` ; le moteur invoque la boucle **percevoir → raisonner →
|
|
648
|
+
agir** (`RunEngine` route vers `driver.run_goal` quand `steps` est vide). Le **planner** (Claude
|
|
649
|
+
par défaut, rôle `Planner` du substrat) choisit chaque action via un vocabulaire d'outils
|
|
650
|
+
restreint (tool use forcé, ciblage **vision uniquement**, plus `finish`/`abort`) ; l'action est
|
|
651
|
+
jouée par le ciblage vision d'Oracle à travers la discrétion. `PhantomDriver` **étend**
|
|
652
|
+
`OracleDriver` (un seul navigateur, une seule discrétion). Garde-fou : budget
|
|
653
|
+
`options.agent.max_steps` (défaut 40) ; un échec d'action est une **observation** (résilience),
|
|
654
|
+
pas la mort du run. Observabilité par `progress`/`step_started`/`step_finished` (`step_id`
|
|
655
|
+
`agent[N]`), sans nouvel événement. Sorties : `finish` sous `{{ steps.agent.* }}`, ou l'issue de
|
|
656
|
+
l'agent renvoyée telle quelle sans `outputs`. Exemple zéro config :
|
|
657
|
+
`examples/phantom/quotes-find-author.blueprint.json`. [docs/acts/phantom.md](docs/acts/phantom.md),
|
|
658
|
+
[docs/phase-2/2-c-phantom.md](docs/phase-2/2-c-phantom.md).
|
|
659
|
+
- [x] **2-D** — Composition multi-Act par step + self-healing : un Blueprint mélange les Acts —
|
|
660
|
+
`act` **par step** (hérité dans les branches de flux, validé contre l'act effectif), les Acts
|
|
661
|
+
navigateur partageant **un seul navigateur** (une instance du plus haut Act atteignable, par
|
|
662
|
+
subsomption de la chaîne d'héritage des drivers ; drivers démarrés à la demande,
|
|
663
|
+
`core/runtime/drivers.py`). **Self-healing** opt-in : un step navigateur qui échoue est rejoué
|
|
664
|
+
sur l'Act supérieur via sa chaîne `options.fallback`/`fallback` (ordonnée, `oracle`/`phantom`)
|
|
665
|
+
et son **`describe`** (intention en langage naturel, jamais devinée) — escalade Oracle = rejeu
|
|
666
|
+
vision du même step (`fill`→`type`), escalade Phantom = **micro-objectif** d'agent borné
|
|
667
|
+
(6 actions) capable d'écarter un obstacle ; ponctuelle (le step suivant repart sur son act),
|
|
668
|
+
step guéri = succès tracé (`healed_by` + événements `progress` warning, aucun nouveau type
|
|
669
|
+
d'événement), chaîne épuisée = l'erreur d'origine inchangée. Exemples zéro config :
|
|
670
|
+
`examples/composition/` (run mixte + self-healing, vérifiés en réel).
|
|
671
|
+
[docs/composition.md](docs/composition.md),
|
|
672
|
+
[docs/phase-2/2-d-composition.md](docs/phase-2/2-d-composition.md).
|
|
673
|
+
- [x] **2-E** — Human-in-the-loop : l'action **`confirm`** (orthogonale aux Acts, héritée par tous les
|
|
674
|
+
drivers) **gare le run** jusqu'à une décision humaine puis reprend — attente bloquante sur un
|
|
675
|
+
rendez-vous mémoire (`core/runtime/approvals.py`), le worker parqué, jamais la boucle ; le statut
|
|
676
|
+
reste `running` (nouveaux events `input_requested`/`input_provided`, aucun nouveau statut). Timeout
|
|
677
|
+
**obligatoire** (`on_timeout` `approve`/`reject`/`fail:CODE`, défaut **reject** deny-by-default) ;
|
|
678
|
+
run non surveillé (bibliothèque) = timeout immédiat. **Quatre surfaces, un seul rendez-vous** :
|
|
679
|
+
Console (`ConfirmModal` sur `input_requested`), CLI/in-process (invite stdin `questionary`), API
|
|
680
|
+
daemon (`POST /v1/runs/{id}/decisions`, token opaque lié au run, 404/409), et **réponse de
|
|
681
|
+
notification** (boutons ntfy Approve/Reject POSTant la route via `Notification.data`, URL publique
|
|
682
|
+
`AETHERIUS_DAEMON_PUBLIC_URL`). Piste d'audit `approvals` (migration store v1→v2) écrite depuis le
|
|
683
|
+
flux d'événements. Exemple zéro config : `examples/vector/confirm-before-post.blueprint.json`.
|
|
684
|
+
[docs/human-in-the-loop.md](docs/human-in-the-loop.md),
|
|
685
|
+
[docs/phase-2/2-e-human-in-loop.md](docs/phase-2/2-e-human-in-loop.md).
|
|
686
|
+
|
|
687
|
+
**Phase 2 terminée (A–E).** Aetherius est désormais autonome (Oracle/Phantom, composition,
|
|
688
|
+
self-healing) **et** pilotable (human-in-the-loop).
|
|
613
689
|
|
|
614
690
|
## Sources de référence
|
|
615
691
|
|
{aetherius-0.3.0/src/aetherius/_contracts → aetherius-0.4.0/contracts}/blueprint.schema.json
RENAMED
|
@@ -40,8 +40,17 @@
|
|
|
40
40
|
"options": { "$ref": "#/$defs/options" },
|
|
41
41
|
"vision": {
|
|
42
42
|
"type": "object",
|
|
43
|
-
"description": "
|
|
44
|
-
"properties": {
|
|
43
|
+
"description": "Cognition configuration for Oracle/Phantom (see docs/cognition.md).",
|
|
44
|
+
"properties": {
|
|
45
|
+
"provider": {
|
|
46
|
+
"enum": ["claude", "local"],
|
|
47
|
+
"description": "Cognition backend: claude (default, [cognition] extra) or local ([vision] extra, on-device grounder)."
|
|
48
|
+
},
|
|
49
|
+
"model": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"description": "Model name, not backend: an Anthropic model id for claude, a local asset name@version for local."
|
|
52
|
+
}
|
|
53
|
+
},
|
|
45
54
|
"additionalProperties": true
|
|
46
55
|
},
|
|
47
56
|
"goal": {
|
|
@@ -107,7 +116,25 @@
|
|
|
107
116
|
"backoff": { "enum": ["none", "linear", "exponential"] }
|
|
108
117
|
}
|
|
109
118
|
},
|
|
110
|
-
"proxy": { "$ref": "#/$defs/proxy" }
|
|
119
|
+
"proxy": { "$ref": "#/$defs/proxy" },
|
|
120
|
+
"agent": {
|
|
121
|
+
"type": "object",
|
|
122
|
+
"additionalProperties": false,
|
|
123
|
+
"description": "Phantom (Act IV) guardrails; ignored by the other Acts.",
|
|
124
|
+
"properties": {
|
|
125
|
+
"max_steps": {
|
|
126
|
+
"type": "integer",
|
|
127
|
+
"minimum": 1,
|
|
128
|
+
"default": 40,
|
|
129
|
+
"description": "Upper bound on the perceive->reason->act loop: the agent fails cleanly if the goal is not reached within this many steps."
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"fallback": {
|
|
134
|
+
"type": "array",
|
|
135
|
+
"description": "Self-healing (Jalon 2-D): default escalation chain tried, in order, when a browser step fails and carries a 'describe' (or a vision target). A step's own 'fallback' overrides it.",
|
|
136
|
+
"items": { "enum": ["oracle", "phantom"] }
|
|
137
|
+
}
|
|
111
138
|
}
|
|
112
139
|
},
|
|
113
140
|
"proxy": {
|
|
@@ -161,7 +188,7 @@
|
|
|
161
188
|
},
|
|
162
189
|
"step": {
|
|
163
190
|
"type": "object",
|
|
164
|
-
"description": "A single action. Parameters depend on the action; extra properties are allowed and validated per-action by the engine.",
|
|
191
|
+
"description": "A single action. Parameters depend on the action; extra properties are allowed and validated per-action by the engine. Act III+ adds 'read' (semantic extraction: 'vision' description plus optional 'schema' object shaping the reply).",
|
|
165
192
|
"properties": {
|
|
166
193
|
"id": { "type": "string" },
|
|
167
194
|
"action": { "type": "string" },
|
|
@@ -169,6 +196,34 @@
|
|
|
169
196
|
"type": "string",
|
|
170
197
|
"description": "Guard expression rendered before dispatch; the step is skipped unless it yields true/1/yes."
|
|
171
198
|
},
|
|
199
|
+
"act": {
|
|
200
|
+
"enum": ["vector", "continuum", "oracle", "phantom"],
|
|
201
|
+
"description": "Multi-Act composition (Jalon 2-D): overrides the Blueprint act for this step (nested flow steps inherit it). Browser Acts share a single browser within the run."
|
|
202
|
+
},
|
|
203
|
+
"describe": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"description": "Self-healing: natural-language intent of the step, replayed on a higher Act (vision grounding or agent micro-goal) when its selector fails. Without it a failing selector step is not escalated."
|
|
206
|
+
},
|
|
207
|
+
"fallback": {
|
|
208
|
+
"type": "array",
|
|
209
|
+
"description": "Self-healing: per-step escalation chain; overrides options.fallback ([] disables it for this step).",
|
|
210
|
+
"items": { "enum": ["oracle", "phantom"] }
|
|
211
|
+
},
|
|
212
|
+
"target": {
|
|
213
|
+
"description": "Unified target of an interactive action. Either the drop selector of drag (string), or an object aiming at a DOM selector ({selector, selector_type}) or, on Act III+, at a natural-language description resolved by vision grounding ({vision}). Top-level 'selector' and 'target' are mutually exclusive on a step.",
|
|
214
|
+
"oneOf": [
|
|
215
|
+
{ "type": "string", "description": "drag only: selector to drop onto." },
|
|
216
|
+
{
|
|
217
|
+
"type": "object",
|
|
218
|
+
"properties": {
|
|
219
|
+
"vision": { "type": "string", "description": "Natural-language description of the on-screen element (Act III+)." },
|
|
220
|
+
"selector": { "type": "string", "description": "DOM selector (nested form of the top-level 'selector')." },
|
|
221
|
+
"selector_type": { "enum": ["css", "xpath", "text"] }
|
|
222
|
+
},
|
|
223
|
+
"additionalProperties": true
|
|
224
|
+
}
|
|
225
|
+
]
|
|
226
|
+
},
|
|
172
227
|
"then": {
|
|
173
228
|
"type": "array",
|
|
174
229
|
"description": "Steps run when an if condition holds.",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"run_id": { "type": "string" },
|
|
11
11
|
"ts": { "type": "string", "format": "date-time" },
|
|
12
12
|
"type": {
|
|
13
|
-
"enum": ["progress", "step_started", "step_finished", "step_skipped", "debug", "artifact", "error", "done"]
|
|
13
|
+
"enum": ["progress", "step_started", "step_finished", "step_skipped", "debug", "artifact", "error", "done", "input_requested", "input_provided"]
|
|
14
14
|
},
|
|
15
15
|
"step_id": { "type": "string" },
|
|
16
16
|
"level": { "enum": ["debug", "info", "warning", "error"] },
|