agentenv-framework-protocol 0.1.477__tar.gz → 0.1.479__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 (163) hide show
  1. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/PKG-INFO +4 -2
  2. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/README.md +3 -1
  3. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/pyproject.toml +1 -1
  4. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/app_data.py +6 -6
  5. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/app_runtime.py +9 -4
  6. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/conformance/fixture.py +41 -2
  7. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_app_data.py +13 -0
  8. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_conformance.py +71 -0
  9. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/.gitignore +0 -0
  10. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/LICENSE +0 -0
  11. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/NOTICE +0 -0
  12. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/THIRD_PARTY_NOTICES.md +0 -0
  13. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/__init__.py +0 -0
  14. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/advanced_agent.py +0 -0
  15. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/basic_agent.py +0 -0
  16. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/custom_extensions_agent.py +0 -0
  17. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/multimodal_agent.py +0 -0
  18. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/reference_model.py +0 -0
  19. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/streaming_agent.py +0 -0
  20. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/.gitignore +0 -0
  21. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/Dockerfile +0 -0
  22. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/Dockerfile.dockerignore +0 -0
  23. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/README.md +0 -0
  24. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/data/seed.json +0 -0
  25. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/env.toml +0 -0
  26. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/site.py +0 -0
  27. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/web/index.html +0 -0
  28. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/web/package-lock.json +0 -0
  29. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/web/package.json +0 -0
  30. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/web/src/main.js +0 -0
  31. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/web/src/style.css +0 -0
  32. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/examples/website/notes/web/vite.config.js +0 -0
  33. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/__init__.py +0 -0
  34. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/__init__.py +0 -0
  35. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/_trajectory_log.py +0 -0
  36. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/_triggers.py +0 -0
  37. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/extensions.py +0 -0
  38. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/framework.py +0 -0
  39. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/peer_agents.py +0 -0
  40. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/proxy.py +0 -0
  41. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/registry.py +0 -0
  42. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/staging.py +0 -0
  43. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/tasks/__init__.py +0 -0
  44. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/a2a_agent/tasks/v1.py +0 -0
  45. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/agent_env_environment.py +0 -0
  46. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/browser_cdp.py +0 -0
  47. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/client.py +0 -0
  48. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/__init__.py +0 -0
  49. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/_declare.py +0 -0
  50. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/_linux.py +0 -0
  51. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/_load.py +0 -0
  52. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/_macos.py +0 -0
  53. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/_with_fds.py +0 -0
  54. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/_x11.py +0 -0
  55. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/app.py +0 -0
  56. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/apps.py +0 -0
  57. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/card.py +0 -0
  58. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/checks.py +0 -0
  59. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/conformance/__init__.py +0 -0
  60. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/conformance/__main__.py +0 -0
  61. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/conformance/checks.py +0 -0
  62. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/conformance/client.py +0 -0
  63. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/conformance/mp4.py +0 -0
  64. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/conformance/page_fixture.py +0 -0
  65. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/conformance/report.py +0 -0
  66. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/dataplane.py +0 -0
  67. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/driver.py +0 -0
  68. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/errors.py +0 -0
  69. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/extensions.py +0 -0
  70. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/frames.py +0 -0
  71. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/keys.py +0 -0
  72. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/launch.py +0 -0
  73. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/manifest.py +0 -0
  74. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/operations.py +0 -0
  75. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/platform.py +0 -0
  76. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/queue.py +0 -0
  77. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/recording.py +0 -0
  78. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/results.py +0 -0
  79. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/run_install_step.py +0 -0
  80. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/runtime.py +0 -0
  81. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/seed.py +0 -0
  82. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/serve.py +0 -0
  83. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/serve_app.py +0 -0
  84. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/session.py +0 -0
  85. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/settings.py +0 -0
  86. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/skill.py +0 -0
  87. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/spaces.py +0 -0
  88. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/svc.py +0 -0
  89. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/computer/tools.py +0 -0
  90. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/errors.py +0 -0
  91. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/manifest.py +0 -0
  92. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/preflight.py +0 -0
  93. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/tool_access.py +0 -0
  94. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/tool_client.py +0 -0
  95. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/tool_context.py +0 -0
  96. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/transfers.py +0 -0
  97. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/types.py +0 -0
  98. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website/__init__.py +0 -0
  99. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website/clock.py +0 -0
  100. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website/conformance.py +0 -0
  101. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website/environment.py +0 -0
  102. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website/errors.py +0 -0
  103. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website/readiness.py +0 -0
  104. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website/routes.py +0 -0
  105. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website/session.py +0 -0
  106. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website_browser/__init__.py +0 -0
  107. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website_browser/control.py +0 -0
  108. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website_browser/data.py +0 -0
  109. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website_browser/devtools.py +0 -0
  110. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website_browser/environment.py +0 -0
  111. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/src/agentenv_protocol/website_browser/shapes.py +0 -0
  112. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/computer_fake.py +0 -0
  113. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/probe_fake.py +0 -0
  114. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_a2a_agent.py +0 -0
  115. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_a2a_agent_examples.py +0 -0
  116. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_a2a_cdp_config.py +0 -0
  117. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_a2a_object_transfers.py +0 -0
  118. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_a2a_peer_agents.py +0 -0
  119. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_a2a_proxy.py +0 -0
  120. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_a2a_staging.py +0 -0
  121. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_a2a_trajectory_log.py +0 -0
  122. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_agent_env_environment.py +0 -0
  123. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_browser_cdp.py +0 -0
  124. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_browser_data.py +0 -0
  125. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_browser_state.py +0 -0
  126. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_client.py +0 -0
  127. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_app_server.py +0 -0
  128. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_conformance_checks.py +0 -0
  129. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_conformance_page.py +0 -0
  130. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_conformance_recording.py +0 -0
  131. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_dataplane.py +0 -0
  132. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_declare.py +0 -0
  133. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_driver.py +0 -0
  134. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_extensions.py +0 -0
  135. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_frames.py +0 -0
  136. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_macos.py +0 -0
  137. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_page.py +0 -0
  138. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_queue.py +0 -0
  139. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_recording.py +0 -0
  140. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_seed.py +0 -0
  141. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_serve.py +0 -0
  142. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_spaces.py +0 -0
  143. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_computer_svc_forward.py +0 -0
  144. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_control_token.py +0 -0
  145. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_data_objects.py +0 -0
  146. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_errors.py +0 -0
  147. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_extension_methods.py +0 -0
  148. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_intake.py +0 -0
  149. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_manifest.py +0 -0
  150. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_preflight.py +0 -0
  151. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_tool_access.py +0 -0
  152. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_tool_annotations.py +0 -0
  153. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_tool_client.py +0 -0
  154. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_tool_context.py +0 -0
  155. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_tool_context_fastmcp.py +0 -0
  156. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_tool_context_injection.py +0 -0
  157. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_website_api.py +0 -0
  158. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_website_browser.py +0 -0
  159. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_website_conformance.py +0 -0
  160. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_website_environment.py +0 -0
  161. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_website_mcp.py +0 -0
  162. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_website_notes_example.py +0 -0
  163. {agentenv_framework_protocol-0.1.477 → agentenv_framework_protocol-0.1.479}/tests/test_website_readiness.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentenv-framework-protocol
3
- Version: 0.1.477
3
+ Version: 0.1.479
4
4
  Summary: Open data-plane protocol and server SDK for agent environments.
5
5
  Project-URL: Homepage, https://www.agentenvframework.com
6
6
  Project-URL: Documentation, https://www.agentenvframework.com/docs
@@ -761,7 +761,9 @@ driver booted with a control token is probed with it: `--token`, by default
761
761
 
762
762
  At `full` the probe writes the Fixture Desk, a Tk window (`conformance/fixture.py`), into
763
763
  `~/.agentenv-probe` with `data/add` and starts it with `computer-exec`. It aims at the boxes the
764
- window's widgets report, reads back what reached them, and then removes the fixture. When the
764
+ window's widgets report, reads back what reached them, and then removes the fixture. On X11 the
765
+ window is maximized and kept above other windows, raising itself again when one covers it, so a
766
+ window an app keeps on top doesn't take the clicks aimed at it; elsewhere it is full screen. When the
765
767
  fixture can't be staged, the `full` checks are unverified rather than failed.
766
768
 
767
769
  On a driver whose card says `screen: "page"`, the desk is an HTML page with the same widgets at the
@@ -696,7 +696,9 @@ driver booted with a control token is probed with it: `--token`, by default
696
696
 
697
697
  At `full` the probe writes the Fixture Desk, a Tk window (`conformance/fixture.py`), into
698
698
  `~/.agentenv-probe` with `data/add` and starts it with `computer-exec`. It aims at the boxes the
699
- window's widgets report, reads back what reached them, and then removes the fixture. When the
699
+ window's widgets report, reads back what reached them, and then removes the fixture. On X11 the
700
+ window is maximized and kept above other windows, raising itself again when one covers it, so a
701
+ window an app keeps on top doesn't take the clicks aimed at it; elsewhere it is full screen. When the
700
702
  fixture can't be staged, the `full` checks are unverified rather than failed.
701
703
 
702
704
  On a driver whose card says `screen: "page"`, the desk is an HTML page with the same widgets at the
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentenv-framework-protocol"
3
- version = "0.1.477"
3
+ version = "0.1.479"
4
4
  description = "Open data-plane protocol and server SDK for agent environments."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -18,6 +18,7 @@ from typing import TYPE_CHECKING, Any, Optional
18
18
  from ..agent_env_environment import OP_ADD_DATA, OP_GET_DATA, OP_RESET_DATA
19
19
  from ..transfers import WriteNamespaceGrant
20
20
  from ..types import METHOD_ADD, METHOD_RESET, FilePart, uploaded_object_path
21
+ from .app_runtime import paused_app
21
22
  from .dataplane import data_files, file_parts, part_bytes
22
23
 
23
24
  if TYPE_CHECKING:
@@ -131,7 +132,7 @@ class AppDataPlane:
131
132
  if not self.paths:
132
133
  return None
133
134
  return {OP_ADD_DATA: functools.partial(add, paths=self.paths),
134
- OP_GET_DATA: functools.partial(get, self.paths, self.runtime.paused),
135
+ OP_GET_DATA: functools.partial(get, self.paths),
135
136
  OP_RESET_DATA: functools.partial(reset, self.paths)}[op]
136
137
 
137
138
  async def _within(self, op: str, served: Callable, args: tuple, answer: asyncio.Future) -> Any:
@@ -177,13 +178,12 @@ async def add(parts: list, paths: list[str]) -> None:
177
178
  await in_thread(write_within, Path.home(), files, paths)
178
179
 
179
180
 
180
- async def get(paths: list[str], paused: Callable[[], contextlib.AbstractContextManager],
181
- write_namespace: Optional[WriteNamespaceGrant]) -> list:
182
- """A part for each file under ``paths``, copied with the app ``paused``, so they are of one moment, and sent from
183
- the copy once it runs again."""
181
+ async def get(paths: list[str], write_namespace: Optional[WriteNamespaceGrant]) -> list:
182
+ """A part for each file under ``paths``, copied with the app this server launched paused (``paused_app``), so they
183
+ are of one moment, and sent from the copy once it runs again; an app's own data/get hook calls it so too."""
184
184
  INITIAL.parent.mkdir(parents=True, exist_ok=True)
185
185
  with tempfile.TemporaryDirectory(dir=INITIAL.parent) as staging:
186
- with paused():
186
+ with paused_app():
187
187
  await in_thread(_stage, Path.home(), paths, Path(staging))
188
188
  return await file_parts(Path(staging), paths, write_namespace)
189
189
 
@@ -139,10 +139,8 @@ class AppRuntime:
139
139
  return _running() is not None
140
140
 
141
141
  def paused(self) -> contextlib.AbstractContextManager:
142
- """The app this server launched last, every process of it, paused while the block runs, so a copy of its files
143
- taken meanwhile is of one moment."""
144
- pid = _running()
145
- return session.paused(pid) if pid is not None else contextlib.nullcontext()
142
+ """The app this server launched last paused while the block runs (``paused_app``)."""
143
+ return paused_app()
146
144
 
147
145
  def exited(self) -> bool:
148
146
  """Log that the app this server launched last ended on its own, with its exit code or the signal that ended
@@ -242,6 +240,13 @@ def _running() -> Optional[int]:
242
240
  return pid if pid is not None and session.alive(pid) else None
243
241
 
244
242
 
243
+ def paused_app() -> contextlib.AbstractContextManager:
244
+ """The app this server launched last, every process of it, paused while the block runs, so a copy of its files
245
+ taken meanwhile is of one moment; nothing when it isn't running."""
246
+ pid = _running()
247
+ return session.paused(pid) if pid is not None else contextlib.nullcontext()
248
+
249
+
245
250
  async def _bounded(name: str, check: Awaitable[Optional[str]]) -> Optional[str]:
246
251
  """What ``check`` finds wrong, within ``CHECK_TIMEOUT_S``; a check that runs past it or raises says so."""
247
252
  try:
@@ -2,13 +2,15 @@
2
2
  Desk, whose widgets' screen boxes are written to <state-dir>/layout.json and every effect that reaches it, with
3
3
  whatever lands in <state-dir>/inbox.txt, to <state-dir>/state.json, so the probe can aim at it and read back what
4
4
  arrived. It records the same effects under X11, macOS's Aqua and Windows, whose Tk names keys, binds select-all and
5
- reports the wheel differently. Run as ``python3 fixture.py <state-dir>``; it needs a 1280x800 screen or larger."""
5
+ reports the wheel differently. On X11 it stays above an app's windows (``keep_on_top``); elsewhere it's full screen.
6
+ Run as ``python3 fixture.py <state-dir>``; it needs a 1280x800 screen or larger."""
6
7
  from __future__ import annotations
7
8
 
8
9
  import ctypes
9
10
  import json
10
11
  import os
11
12
  import sys
13
+ import time
12
14
  import tkinter as tk
13
15
  from pathlib import Path
14
16
 
@@ -29,6 +31,8 @@ NOTCH_DELTA = 120
29
31
  Y_BITS = 16
30
32
  #: The pixels of a scrolled line, macOS's for a scroll posted in lines.
31
33
  LINE_PX = 10
34
+ #: The least time between two of the fixture's raises over other windows, so it can't fight one that raises itself.
35
+ LIFT_GAP_S = 0.5
32
36
 
33
37
 
34
38
  def main(state_dir: Path) -> None:
@@ -37,7 +41,10 @@ def main(state_dir: Path) -> None:
37
41
  root.title("Fixture Desk")
38
42
  width, height = root.winfo_screenwidth(), root.winfo_screenheight()
39
43
  root.geometry(f"{width}x{height}+0+0")
40
- root.attributes("-fullscreen", True)
44
+ if root.tk.call("tk", "windowingsystem") == "x11":
45
+ keep_on_top(root)
46
+ else:
47
+ root.attributes("-fullscreen", True)
41
48
  root.configure(bg="#f0f0f0")
42
49
  state: dict = {"name": "", "notes": "", "keys": [], "saved_count": 0, "subscribed": False, "selected": None,
43
50
  "scroll_top": 0.0, "cells": {}, "right_clicks": 0, "double_clicks": 0, "drags": [],
@@ -227,6 +234,38 @@ def main(state_dir: Path) -> None:
227
234
  root.mainloop()
228
235
 
229
236
 
237
+ def keep_on_top(root: tk.Tk) -> None:
238
+ """Keep the fixture over the windows an app opens, which would take the probe's clicks: maximized and above other
239
+ windows rather than full screen, since xfwm4 keeps a window an app puts above over a full-screen one, and raised
240
+ again, giving the focus back to the widget that last had it, whenever another window covers some of it, at most once
241
+ each LIFT_GAP_S."""
242
+ root.attributes("-zoomed", True)
243
+ root.attributes("-topmost", True)
244
+ seen: dict = {"state": "VisibilityUnobscured", "lifted": 0.0, "pending": None}
245
+
246
+ def lift() -> None:
247
+ seen["pending"] = None
248
+ if seen["state"] == "VisibilityUnobscured":
249
+ return
250
+ seen["lifted"] = time.monotonic()
251
+ # Taking the layer above again restacks it on top, which a raise request alone doesn't get from xfwm4.
252
+ root.attributes("-topmost", False)
253
+ root.attributes("-topmost", True)
254
+ root.lift()
255
+ # The widget that last had the focus gets it back, so keys the probe types into a text box still reach it.
256
+ (root.focus_lastfor() or root).focus_force()
257
+
258
+ def visibility(event: tk.Event) -> None:
259
+ if event.widget is not root:
260
+ return
261
+ seen["state"] = event.state
262
+ if event.state != "VisibilityUnobscured" and seen["pending"] is None:
263
+ wait = max(0.0, seen["lifted"] + LIFT_GAP_S - time.monotonic())
264
+ seen["pending"] = root.after(round(wait * 1000), lift)
265
+
266
+ root.bind("<Visibility>", visibility, add="+")
267
+
268
+
230
269
  def wheel_steps(delta: int) -> int:
231
270
  """The wheel steps a <MouseWheel> event's ``delta`` holds, up positive: whole notches of 120 where Tk scales them
232
271
  so (Windows, and Tk 9 everywhere), else one a unit (Aqua's Tk 8.6)."""
@@ -138,6 +138,19 @@ async def test_an_app_with_only_paths_loads_exports_and_resets_them_as_installed
138
138
  assert reset == {"Mail/inbox.txt": b"installed"}
139
139
 
140
140
 
141
+ @pytest.mark.asyncio
142
+ async def test_get_takes_paths_and_a_write_namespace_and_pauses_the_running_app_as_exported_apps_call_it(home,
143
+ desktop):
144
+ (home / "Mail").mkdir()
145
+ (home / "Mail/inbox.txt").write_text("kept")
146
+ await PathsMail()._computer_app.launch_app()
147
+
148
+ parts = await app_data.get(["Mail"], None)
149
+
150
+ assert [await part_bytes(part) for part in parts] == [b"kept"]
151
+ assert desktop == [("launch", 4242), ("pause", 4242), ("continue", 4242)]
152
+
153
+
141
154
  @pytest.mark.asyncio
142
155
  async def test_a_file_under_none_of_its_paths_or_through_a_link_out_of_them_is_refused_and_nothing_is_written(home):
143
156
  (home / "Documents").mkdir()
@@ -323,6 +323,77 @@ def test_the_fixture_counts_a_scroll_tk_9_reports_in_pixels_by_the_lines_it_move
323
323
  assert _fixture(monkeypatch).touchpad_steps(delta) == steps
324
324
 
325
325
 
326
+ class _Root:
327
+ """A Tk root stood in for: the attributes set on it in order, its bindings, the calls made to it, and what
328
+ ``after`` was given to run, with its delay."""
329
+
330
+ def __init__(self):
331
+ self.set, self.calls, self.bound, self.timers = [], [], {}, []
332
+ self.last = self
333
+
334
+ def focus_lastfor(self):
335
+ return self.last
336
+
337
+ def attributes(self, name, value):
338
+ self.set.append((name, value))
339
+
340
+ def bind(self, sequence, handler, add=None):
341
+ self.bound[sequence] = handler
342
+
343
+ def after(self, ms, callback):
344
+ self.timers.append((ms, callback))
345
+ return f"after#{len(self.timers)}"
346
+
347
+ def lift(self):
348
+ self.calls.append("lift")
349
+
350
+ def focus_force(self):
351
+ self.calls.append("focus_force")
352
+
353
+
354
+ def test_the_fixture_on_x11_stays_maximized_above_other_windows_and_takes_the_top_back_once_one_covers_it(monkeypatch):
355
+ """A window an app keeps above, as Typora's licence dialog is for its first seconds, otherwise takes the clicks the
356
+ probe aims at the fixture."""
357
+ fixture = _fixture(monkeypatch)
358
+ now = [100.0]
359
+ monkeypatch.setattr(fixture.time, "monotonic", lambda: now[0])
360
+ root = _Root()
361
+ fixture.keep_on_top(root)
362
+ seen = root.bound["<Visibility>"]
363
+
364
+ seen(SimpleNamespace(widget="a child", state="VisibilityFullyObscured"))
365
+ for_child = list(root.timers)
366
+ seen(SimpleNamespace(widget=root, state="VisibilityPartiallyObscured"))
367
+ seen(SimpleNamespace(widget=root, state="VisibilityPartiallyObscured"))
368
+ (first, lift), = root.timers
369
+ lift()
370
+ lifted = (root.set[2:], list(root.calls))
371
+ now[0] += 0.1
372
+ seen(SimpleNamespace(widget=root, state="VisibilityFullyObscured"))
373
+ second, again = root.timers[1]
374
+ seen(SimpleNamespace(widget=root, state="VisibilityUnobscured"))
375
+ again()
376
+
377
+ assert root.set[:2] == [("-zoomed", True), ("-topmost", True)] and for_child == []
378
+ assert first == 0 and lifted == ([("-topmost", False), ("-topmost", True)], ["lift", "focus_force"])
379
+ assert second == round((fixture.LIFT_GAP_S - 0.1) * 1000) and root.calls == ["lift", "focus_force"]
380
+
381
+
382
+ def test_the_fixture_gives_the_focus_back_to_the_text_box_that_had_it_when_it_takes_the_top_back(monkeypatch):
383
+ """A window an app opens during a typing check would otherwise leave the probe's keys with the fixture's root."""
384
+ fixture = _fixture(monkeypatch)
385
+ monkeypatch.setattr(fixture.time, "monotonic", lambda: 100.0)
386
+ root, name = _Root(), _Root()
387
+ root.last = name
388
+ fixture.keep_on_top(root)
389
+
390
+ root.bound["<Visibility>"](SimpleNamespace(widget=root, state="VisibilityPartiallyObscured"))
391
+ (_, lift), = root.timers
392
+ lift()
393
+
394
+ assert root.calls == ["lift"] and name.calls == ["focus_force"]
395
+
396
+
326
397
  def _fixture(monkeypatch):
327
398
  """The fixture module, which runs in the computer, read with Tk stood in for, as this Python may have none."""
328
399
  monkeypatch.setitem(sys.modules, "tkinter", ModuleType("tkinter"))