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.
Files changed (250) hide show
  1. {aetherius-0.3.0 → aetherius-0.4.0}/.github/workflows/ci.yml +1 -1
  2. {aetherius-0.3.0 → aetherius-0.4.0}/CHANGELOG.md +123 -1
  3. {aetherius-0.3.0 → aetherius-0.4.0}/CONTRIBUTING.md +5 -1
  4. {aetherius-0.3.0 → aetherius-0.4.0}/Makefile +1 -1
  5. {aetherius-0.3.0 → aetherius-0.4.0}/PKG-INFO +97 -20
  6. {aetherius-0.3.0 → aetherius-0.4.0}/README.md +92 -16
  7. {aetherius-0.3.0/src/aetherius/_contracts → aetherius-0.4.0/contracts}/blueprint.schema.json +59 -4
  8. {aetherius-0.3.0 → aetherius-0.4.0}/contracts/events.schema.json +1 -1
  9. {aetherius-0.3.0 → aetherius-0.4.0}/contracts/openapi.yaml +37 -0
  10. {aetherius-0.3.0 → aetherius-0.4.0}/pyproject.toml +11 -10
  11. {aetherius-0.3.0/contracts → aetherius-0.4.0/src/aetherius/_contracts}/blueprint.schema.json +59 -4
  12. aetherius-0.4.0/src/aetherius/acts/_cognition/__init__.py +12 -0
  13. aetherius-0.4.0/src/aetherius/acts/_cognition/claude.py +217 -0
  14. aetherius-0.4.0/src/aetherius/acts/_cognition/local.py +47 -0
  15. aetherius-0.4.0/src/aetherius/acts/_cognition/planning.py +240 -0
  16. aetherius-0.4.0/src/aetherius/acts/_cognition/provider.py +61 -0
  17. aetherius-0.4.0/src/aetherius/acts/_perception.py +48 -0
  18. aetherius-0.4.0/src/aetherius/acts/_shared.py +280 -0
  19. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/bridge.py +6 -3
  20. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/driver.py +2 -0
  21. aetherius-0.4.0/src/aetherius/acts/oracle/driver.py +220 -0
  22. aetherius-0.4.0/src/aetherius/acts/oracle/locator.py +62 -0
  23. aetherius-0.4.0/src/aetherius/acts/oracle/model.py +7 -0
  24. aetherius-0.4.0/src/aetherius/acts/oracle/perception.py +6 -0
  25. aetherius-0.4.0/src/aetherius/acts/oracle/scan.py +98 -0
  26. aetherius-0.4.0/src/aetherius/acts/phantom/driver.py +92 -0
  27. aetherius-0.4.0/src/aetherius/acts/phantom/loop.py +145 -0
  28. aetherius-0.4.0/src/aetherius/acts/phantom/memory.py +70 -0
  29. aetherius-0.4.0/src/aetherius/acts/phantom/perception.py +21 -0
  30. aetherius-0.4.0/src/aetherius/acts/phantom/planner.py +47 -0
  31. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/driver.py +2 -0
  32. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/factory.py +6 -4
  33. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/validation.py +9 -0
  34. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/cli/__init__.py +11 -1
  35. aetherius-0.4.0/src/aetherius/cli/approvals.py +51 -0
  36. aetherius-0.4.0/src/aetherius/console/approvals.py +56 -0
  37. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/runs.py +13 -1
  38. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screenshots.py +21 -0
  39. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/confirm.py +8 -2
  40. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/base.py +23 -3
  41. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/flow.py +14 -2
  42. aetherius-0.4.0/src/aetherius/core/actions/human.py +67 -0
  43. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/registry.py +2 -2
  44. aetherius-0.4.0/src/aetherius/core/actions/vision.py +35 -0
  45. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/blueprint/models.py +20 -0
  46. aetherius-0.4.0/src/aetherius/core/blueprint/validator.py +130 -0
  47. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/errors.py +23 -0
  48. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/events/models.py +4 -0
  49. aetherius-0.4.0/src/aetherius/core/runtime/approvals.py +154 -0
  50. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/context.py +4 -0
  51. aetherius-0.4.0/src/aetherius/core/runtime/drivers.py +119 -0
  52. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/engine.py +25 -24
  53. aetherius-0.4.0/src/aetherius/core/runtime/flow.py +143 -0
  54. aetherius-0.4.0/src/aetherius/core/runtime/healing.py +246 -0
  55. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/result.py +3 -0
  56. aetherius-0.4.0/src/aetherius/core/runtime/selector.py +77 -0
  57. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/steps.py +72 -121
  58. aetherius-0.4.0/src/aetherius/models/registry.py +39 -0
  59. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/ntfy.py +39 -0
  60. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/base.py +1 -1
  61. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/app.py +5 -1
  62. aetherius-0.4.0/src/aetherius/server/approvals.py +40 -0
  63. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/config.py +10 -6
  64. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/jobs.py +48 -3
  65. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/runs.py +24 -1
  66. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/schemas.py +20 -0
  67. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/input.py +26 -0
  68. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/mouse.py +18 -3
  69. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/__init__.py +2 -0
  70. aetherius-0.4.0/src/aetherius/store/approvals.py +48 -0
  71. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/engine.py +6 -0
  72. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/schema.py +18 -0
  73. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/version.py +1 -1
  74. aetherius-0.3.0/src/aetherius/acts/_shared.py +0 -116
  75. aetherius-0.3.0/src/aetherius/acts/oracle/driver.py +0 -1
  76. aetherius-0.3.0/src/aetherius/acts/oracle/locator.py +0 -1
  77. aetherius-0.3.0/src/aetherius/acts/oracle/model.py +0 -1
  78. aetherius-0.3.0/src/aetherius/acts/oracle/perception.py +0 -1
  79. aetherius-0.3.0/src/aetherius/acts/phantom/driver.py +0 -1
  80. aetherius-0.3.0/src/aetherius/acts/phantom/loop.py +0 -1
  81. aetherius-0.3.0/src/aetherius/acts/phantom/memory.py +0 -1
  82. aetherius-0.3.0/src/aetherius/acts/phantom/perception.py +0 -1
  83. aetherius-0.3.0/src/aetherius/acts/phantom/planner.py +0 -1
  84. aetherius-0.3.0/src/aetherius/core/blueprint/validator.py +0 -83
  85. aetherius-0.3.0/src/aetherius/core/runtime/selector.py +0 -1
  86. aetherius-0.3.0/src/aetherius/models/registry.py +0 -1
  87. {aetherius-0.3.0 → aetherius-0.4.0}/.dockerignore +0 -0
  88. {aetherius-0.3.0 → aetherius-0.4.0}/.env.example +0 -0
  89. {aetherius-0.3.0 → aetherius-0.4.0}/.github/workflows/release.yml +0 -0
  90. {aetherius-0.3.0 → aetherius-0.4.0}/.gitignore +0 -0
  91. {aetherius-0.3.0 → aetherius-0.4.0}/LICENSE +0 -0
  92. {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/UKIT.king.blueprint.json +0 -0
  93. {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/direct.linkaetherius.blueprint.json +0 -0
  94. {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/github.aetherius.blueprint.json +0 -0
  95. {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/github.github.blueprint.json +0 -0
  96. {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/github.zeb.blueprint.json +0 -0
  97. {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/licence.aetherius.blueprint.json +0 -0
  98. {aetherius-0.3.0 → aetherius-0.4.0}/blueprints/record.aetherius.blueprint.json +0 -0
  99. {aetherius-0.3.0 → aetherius-0.4.0}/deploy/.env.example +0 -0
  100. {aetherius-0.3.0 → aetherius-0.4.0}/deploy/Dockerfile +0 -0
  101. {aetherius-0.3.0 → aetherius-0.4.0}/deploy/aetherius.service +0 -0
  102. {aetherius-0.3.0 → aetherius-0.4.0}/deploy/blueprints/.gitkeep +0 -0
  103. {aetherius-0.3.0 → aetherius-0.4.0}/deploy/docker-compose.yml +0 -0
  104. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/__init__.py +0 -0
  105. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/__main__.py +0 -0
  106. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/_contracts/__init__.py +0 -0
  107. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/__init__.py +0 -0
  108. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/__init__.py +0 -0
  109. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/actions.py +0 -0
  110. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/browser.py +0 -0
  111. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/debug_overlay.py +0 -0
  112. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/continuum/human_actions.py +0 -0
  113. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/oracle/__init__.py +0 -0
  114. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/phantom/__init__.py +0 -0
  115. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/__init__.py +0 -0
  116. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/auth.py +0 -0
  117. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/client.py +0 -0
  118. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/acts/vector/impersonate.py +0 -0
  119. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/__init__.py +0 -0
  120. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/catalog.py +0 -0
  121. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/builder/templates.py +0 -0
  122. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/cli/_shared.py +0 -0
  123. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/cli/schedule.py +0 -0
  124. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/config/__init__.py +0 -0
  125. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/config/secrets.py +0 -0
  126. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/config/settings.py +0 -0
  127. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/__init__.py +0 -0
  128. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/app.py +0 -0
  129. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/console.tcss +0 -0
  130. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/daemon_control.py +0 -0
  131. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/run_bridge.py +0 -0
  132. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/__init__.py +0 -0
  133. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/_pending.py +0 -0
  134. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/__init__.py +0 -0
  135. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/act_picker.py +0 -0
  136. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/io_editor.py +0 -0
  137. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/options_editor.py +0 -0
  138. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/preview.py +0 -0
  139. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/screen.py +0 -0
  140. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/builder/step_editor.py +0 -0
  141. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/catalog.py +0 -0
  142. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/home.py +0 -0
  143. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/library.py +0 -0
  144. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/library_scan.py +0 -0
  145. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/recorder.py +0 -0
  146. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/__init__.py +0 -0
  147. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/_common.py +0 -0
  148. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/detail.py +0 -0
  149. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/form.py +0 -0
  150. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/schedules/screen.py +0 -0
  151. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/sessions.py +0 -0
  152. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/screens/settings.py +0 -0
  153. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/theme.py +0 -0
  154. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/__init__.py +0 -0
  155. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/event_log.py +0 -0
  156. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/form.py +0 -0
  157. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/json_preview.py +0 -0
  158. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/console/widgets/run_summary.py +0 -0
  159. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/__init__.py +0 -0
  160. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/__init__.py +0 -0
  161. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/data.py +0 -0
  162. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/interaction.py +0 -0
  163. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/navigation.py +0 -0
  164. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/notification.py +0 -0
  165. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/actions/spec.py +0 -0
  166. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/blueprint/__init__.py +0 -0
  167. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/blueprint/loader.py +0 -0
  168. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/blueprint/template.py +0 -0
  169. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/driver.py +0 -0
  170. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/events/__init__.py +0 -0
  171. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/events/bus.py +0 -0
  172. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/events/sinks.py +0 -0
  173. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/extraction/__init__.py +0 -0
  174. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/extraction/html_extractor.py +0 -0
  175. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/extraction/json_extractor.py +0 -0
  176. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/core/runtime/__init__.py +0 -0
  177. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/models/__init__.py +0 -0
  178. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/models/store/.gitkeep +0 -0
  179. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/__init__.py +0 -0
  180. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/geo.py +0 -0
  181. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/identity.py +0 -0
  182. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/pool.py +0 -0
  183. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/proxy.py +0 -0
  184. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/network/transport.py +0 -0
  185. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/__init__.py +0 -0
  186. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/base.py +0 -0
  187. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/__init__.py +0 -0
  188. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/_http.py +0 -0
  189. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/discord.py +0 -0
  190. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/telegram.py +0 -0
  191. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/channels/webhook.py +0 -0
  192. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/message.py +0 -0
  193. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/registry.py +0 -0
  194. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/notify/sink.py +0 -0
  195. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/plugins.py +0 -0
  196. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/__init__.py +0 -0
  197. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_capture_js.py +0 -0
  198. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_gesture_js.py +0 -0
  199. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_names.py +0 -0
  200. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_overlay_js.py +0 -0
  201. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_playwright.py +0 -0
  202. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_selector_js.py +0 -0
  203. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_transform.py +0 -0
  204. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/_vector_js.py +0 -0
  205. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/blueprint_recorder.py +0 -0
  206. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/capture.py +0 -0
  207. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/continuum_backend.py +0 -0
  208. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/gesture_recorder.py +0 -0
  209. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/selector_synth.py +0 -0
  210. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/session.py +0 -0
  211. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/recorder/vector_backend.py +0 -0
  212. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/__init__.py +0 -0
  213. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/deps.py +0 -0
  214. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/__init__.py +0 -0
  215. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/blueprints.py +0 -0
  216. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/recorder.py +0 -0
  217. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/schedules.py +0 -0
  218. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/routes/stream.py +0 -0
  219. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/__init__.py +0 -0
  220. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/alerts.py +0 -0
  221. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/manual.py +0 -0
  222. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/misfire.py +0 -0
  223. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/service.py +0 -0
  224. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/server/scheduler/triggers.py +0 -0
  225. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/__init__.py +0 -0
  226. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/__init__.py +0 -0
  227. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/hardening.py +0 -0
  228. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/headers.py +0 -0
  229. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/patch.py +0 -0
  230. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/profile.py +0 -0
  231. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/fingerprint/webrtc.py +0 -0
  232. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/gestures/__init__.py +0 -0
  233. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/gestures/data/human_library.json +0 -0
  234. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/gestures/library.py +0 -0
  235. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/gestures/seed.py +0 -0
  236. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/__init__.py +0 -0
  237. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/keyboard.py +0 -0
  238. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/scroll.py +0 -0
  239. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/humanizer/timing.py +0 -0
  240. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/ml/__init__.py +0 -0
  241. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/ml/fingerprint_model.py +0 -0
  242. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/ml/motion_model.py +0 -0
  243. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/policy.py +0 -0
  244. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/session/__init__.py +0 -0
  245. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/session/store.py +0 -0
  246. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/stealth/session/warmup.py +0 -0
  247. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/models.py +0 -0
  248. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/runs.py +0 -0
  249. {aetherius-0.3.0 → aetherius-0.4.0}/src/aetherius/store/schedules.py +0 -0
  250. {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/agent skip themselves when their dependency is absent.
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.3.0...HEAD
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 agent and not slow"
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.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.25; extra == 'all'
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 petit modèle entraîné et agit avec discrétion. |
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 petit modèle de
143
- vision entraîné spécifiquement pour la tâche (exporté en ONNX) localise les éléments cibles sur des
144
- captures d'écran ; Aetherius clique par coordonnées à travers la couche de discrétion. Idéal pour
145
- les interfaces qui changent souvent ou piègent les bots.
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) et Act II (Continuum, avec l'extra `[browser]`) ; seul **Sessions** affiche
329
- > honnêtement son jalon en attente (stealth/session). Détails : [docs/console.md](docs/console.md).
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/context/steps/selector/result), extraction, events, errors, driver
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 # cœur + Act I (Vector) + daemon + Console
497
- pip install aetherius[browser] # + Act II (Continuum)
498
- pip install aetherius[vision] # + Act III (Oracle)
499
- pip install aetherius[agent] # + Act IV (Phantom)
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 — les Acts autonomes (à venir)
682
-
683
- - [ ] Act III — Oracle (vision + entraînement).
684
- - [ ] Act IV — Phantom (agent).
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 petit modèle entraîné et agit avec discrétion. |
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 petit modèle de
71
- vision entraîné spécifiquement pour la tâche (exporté en ONNX) localise les éléments cibles sur des
72
- captures d'écran ; Aetherius clique par coordonnées à travers la couche de discrétion. Idéal pour
73
- les interfaces qui changent souvent ou piègent les bots.
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) et Act II (Continuum, avec l'extra `[browser]`) ; seul **Sessions** affiche
257
- > honnêtement son jalon en attente (stealth/session). Détails : [docs/console.md](docs/console.md).
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/context/steps/selector/result), extraction, events, errors, driver
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 # cœur + Act I (Vector) + daemon + Console
425
- pip install aetherius[browser] # + Act II (Continuum)
426
- pip install aetherius[vision] # + Act III (Oracle)
427
- pip install aetherius[agent] # + Act IV (Phantom)
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 — les Acts autonomes (à venir)
610
-
611
- - [ ] Act III — Oracle (vision + entraînement).
612
- - [ ] Act IV — Phantom (agent).
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
 
@@ -40,8 +40,17 @@
40
40
  "options": { "$ref": "#/$defs/options" },
41
41
  "vision": {
42
42
  "type": "object",
43
- "description": "Vision configuration for Oracle/Phantom.",
44
- "properties": { "model": { "type": "string" } },
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"] },