codex-agent-framework 0.1.78__tar.gz → 0.1.80__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.
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/CHANGELOG.md +7 -0
- {codex_agent_framework-0.1.78/codex_agent_framework.egg-info → codex_agent_framework-0.1.80}/PKG-INFO +1 -1
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/content/vision.py +9 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/root.py +1 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/client.py +12 -0
- codex_agent_framework-0.1.80/codex_agent/version.py +1 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80/codex_agent_framework.egg-info}/PKG-INFO +1 -1
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/pyproject.toml +1 -1
- codex_agent_framework-0.1.78/codex_agent/version.py +0 -1
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/LICENSE +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/MANIFEST.in +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/README.md +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/__main__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/agent.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/agent_runtime.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/ai.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/browser.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_commands.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/content/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/content/system.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/context/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/files/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/files/tools.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/python/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/session.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/web_search/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/headless.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/main.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/output.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/runner.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/command.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/config.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/context.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/desktop.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/event.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/default_gitignore +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/get_text.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/simpler_get_text.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/hooks.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/image.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/latex.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/mainloop.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/message.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/plugin.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/prompts/compaction_prompt.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/prompts/system_prompt.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/provider.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/runtime.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/scheduler.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/scripts/install-system-dependencies.sh +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/server/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/server/app.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/server/core.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/service.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/sessions.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/status.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/stream.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/stream_utils.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/token_counter.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tool.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tray.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/__init__.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/app.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/chat.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/lifecycle.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/log.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/perf.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/state.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/status_bar.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/stream_debug.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/style.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/transcript.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/widgets.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/utils.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/worker.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/entry_points.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/requires.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/top_level.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/dependencies.txt +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/setup.cfg +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_audio_hooks.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_commands.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_context.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_desktop.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_environment.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_image_generation.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_observe.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_plugins.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_providers_config.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_realtime.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_response.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_runtime.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_sessions.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_subagents.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_tools.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_turns.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_ai.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_browser.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_builtin_config.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_chat.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_cli.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_cli_headless.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_cli_root.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_client.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_events.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_get_text_browser.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_hooks.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_image_message.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_local_desktop.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_memory.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_messages.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_planner.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_scheduler.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_server.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_service.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_token_counter.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_tui.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_utils.py +0 -0
- {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_worker.py +0 -0
|
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
This project loosely follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and uses semantic versioning where practical.
|
|
6
6
|
|
|
7
|
+
## [0.1.80] - 2026-05-18
|
|
8
|
+
### Changed
|
|
9
|
+
- Document `AgentClient` event-stream, SSE parsing, sequence resume, URL, and HTTP request helper contracts with concise docstrings.
|
|
10
|
+
|
|
11
|
+
### Tests
|
|
12
|
+
- Validate the client documentation pass with targeted client tests plus the full offline CI suite (618 passed).
|
|
13
|
+
|
|
7
14
|
## [0.1.60] - 2026-05-18
|
|
8
15
|
### Fixed
|
|
9
16
|
- Count compacted summary messages with observed compaction `usage.output_tokens` instead of `usage.input_tokens`, so future context estimates reflect the size of the produced summary rather than the size of the compacted input.
|
|
@@ -96,6 +96,7 @@ def observe(sources):
|
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
def normalize_observe_source(source):
|
|
99
|
+
"""Normalize legacy string sources and mapping sources to observe objects."""
|
|
99
100
|
if isinstance(source, str):
|
|
100
101
|
target = "url" if source.startswith(("http://", "https://")) else "path"
|
|
101
102
|
key = "url" if target == "url" else "path"
|
|
@@ -106,6 +107,7 @@ def normalize_observe_source(source):
|
|
|
106
107
|
|
|
107
108
|
|
|
108
109
|
def observe_source(source):
|
|
110
|
+
"""Dispatch one normalized observe source to the matching capture helper."""
|
|
109
111
|
item = normalize_observe_source(source)
|
|
110
112
|
if not item:
|
|
111
113
|
return "failed: source must be an object."
|
|
@@ -123,6 +125,7 @@ def observe_source(source):
|
|
|
123
125
|
|
|
124
126
|
|
|
125
127
|
def resolve_agent_path(path):
|
|
128
|
+
"""Resolve paths relative to the active agent when one is available."""
|
|
126
129
|
try:
|
|
127
130
|
return get_agent().resolve_path(path)
|
|
128
131
|
except RuntimeError:
|
|
@@ -130,6 +133,7 @@ def resolve_agent_path(path):
|
|
|
130
133
|
|
|
131
134
|
|
|
132
135
|
def observe_path(item):
|
|
136
|
+
"""Validate a local image path observe source."""
|
|
133
137
|
path = item.get("path") or item.get("source")
|
|
134
138
|
if not isinstance(path, str) or not path:
|
|
135
139
|
return "failed: path target requires a non-empty 'path'."
|
|
@@ -138,6 +142,7 @@ def observe_path(item):
|
|
|
138
142
|
|
|
139
143
|
|
|
140
144
|
def observe_url(item):
|
|
145
|
+
"""Observe a URL as an image, falling back to a page screenshot."""
|
|
141
146
|
url = item.get("url") or item.get("source")
|
|
142
147
|
if not isinstance(url, str) or not url:
|
|
143
148
|
return "failed: url target requires a non-empty 'url'."
|
|
@@ -161,6 +166,7 @@ def observe_url(item):
|
|
|
161
166
|
|
|
162
167
|
|
|
163
168
|
def observe_screen(item):
|
|
169
|
+
"""Capture and validate a screenshot of the local screen."""
|
|
164
170
|
output_path = item.get("output_path")
|
|
165
171
|
if output_path:
|
|
166
172
|
output_path = resolve_agent_path(output_path)
|
|
@@ -172,6 +178,7 @@ def observe_screen(item):
|
|
|
172
178
|
|
|
173
179
|
|
|
174
180
|
def observe_window(item):
|
|
181
|
+
"""Capture and validate a screenshot of a local desktop window."""
|
|
175
182
|
window_id = item.get("window_id") or item.get("id")
|
|
176
183
|
output_path = item.get("output_path")
|
|
177
184
|
if output_path:
|
|
@@ -184,6 +191,7 @@ def observe_window(item):
|
|
|
184
191
|
|
|
185
192
|
|
|
186
193
|
def validated_image(path, image_name=None, original_source=None, url_fallback=False):
|
|
194
|
+
"""Return an ImageMessage or a readable failure string for invalid input."""
|
|
187
195
|
image = ImageMessage(content=path, image_name=image_name, turns_left=3)
|
|
188
196
|
if not image.is_valid():
|
|
189
197
|
label = "URL fallback screenshot" if url_fallback else "image source"
|
|
@@ -192,6 +200,7 @@ def validated_image(path, image_name=None, original_source=None, url_fallback=Fa
|
|
|
192
200
|
|
|
193
201
|
|
|
194
202
|
def screenshot_page_url(url, item=None):
|
|
203
|
+
"""Capture a webpage screenshot using caller options or a runtime path."""
|
|
195
204
|
item = item or {}
|
|
196
205
|
path = item.get("output_path")
|
|
197
206
|
if path:
|
|
@@ -276,6 +276,7 @@ class AgentClient:
|
|
|
276
276
|
self._event_stop.wait(0.1)
|
|
277
277
|
|
|
278
278
|
def event_error_payload(self, exc):
|
|
279
|
+
"""Build a local client error event from an event-stream exception."""
|
|
279
280
|
payload = modict(type="client_event_error", error=str(exc), source="event_stream")
|
|
280
281
|
if isinstance(exc, requests.HTTPError) and exc.response is not None:
|
|
281
282
|
payload.status_code = exc.response.status_code
|
|
@@ -289,11 +290,13 @@ class AgentClient:
|
|
|
289
290
|
return payload
|
|
290
291
|
|
|
291
292
|
def is_event_idle_timeout(self, exc):
|
|
293
|
+
"""Return whether an event-stream exception is an idle read timeout."""
|
|
292
294
|
if isinstance(exc, (requests.exceptions.ReadTimeout, requests.exceptions.Timeout)):
|
|
293
295
|
return True
|
|
294
296
|
return "read timed out" in str(exc).lower()
|
|
295
297
|
|
|
296
298
|
def iter_sse(self, lines):
|
|
299
|
+
"""Yield parsed SSE payloads from decoded or byte line chunks."""
|
|
297
300
|
event = None
|
|
298
301
|
data_lines = []
|
|
299
302
|
event_id = None
|
|
@@ -339,6 +342,7 @@ class AgentClient:
|
|
|
339
342
|
yield payload
|
|
340
343
|
|
|
341
344
|
def remember_event_sequence(self, event):
|
|
345
|
+
"""Track the highest numeric event sequence seen for replay resume."""
|
|
342
346
|
sequence = event.get("sequence") if isinstance(event, dict) else None
|
|
343
347
|
if sequence is None:
|
|
344
348
|
return
|
|
@@ -348,17 +352,22 @@ class AgentClient:
|
|
|
348
352
|
return
|
|
349
353
|
if self._last_event_sequence is None or sequence > self._last_event_sequence:
|
|
350
354
|
self._last_event_sequence = sequence
|
|
355
|
+
|
|
351
356
|
def events_url(self):
|
|
357
|
+
"""Build the SSE endpoint URL with replay and compaction parameters."""
|
|
352
358
|
params = {"client_pid": int(self.client_pid)}
|
|
353
359
|
if self.compact_events:
|
|
354
360
|
params["compact"] = 1
|
|
355
361
|
if self._last_event_sequence is not None:
|
|
356
362
|
params["after_sequence"] = int(self._last_event_sequence)
|
|
357
363
|
return self.url(f"/events?{urlencode(params)}")
|
|
364
|
+
|
|
358
365
|
def url(self, path):
|
|
366
|
+
"""Return an absolute server URL for an API path."""
|
|
359
367
|
return self.base_url + path
|
|
360
368
|
|
|
361
369
|
def request(self, method, path, **kwargs):
|
|
370
|
+
"""Send an HTTP request and decode its JSON response as a modict."""
|
|
362
371
|
kwargs.setdefault("timeout", self.timeout)
|
|
363
372
|
response = requests.request(method, self.url(path), **kwargs)
|
|
364
373
|
response.raise_for_status()
|
|
@@ -367,12 +376,15 @@ class AgentClient:
|
|
|
367
376
|
return modict(response.json())
|
|
368
377
|
|
|
369
378
|
def get(self, path):
|
|
379
|
+
"""Send a GET request to a server API path."""
|
|
370
380
|
return self.request("GET", path)
|
|
371
381
|
|
|
372
382
|
def post(self, path, payload=None):
|
|
383
|
+
"""Send a JSON POST request to a server API path."""
|
|
373
384
|
return self.request("POST", path, json=payload or {})
|
|
374
385
|
|
|
375
386
|
def delete(self, path):
|
|
387
|
+
"""Send a DELETE request to a server API path."""
|
|
376
388
|
return self.request("DELETE", path)
|
|
377
389
|
|
|
378
390
|
def health(self):
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.80"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.1.78"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_commands.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/__init__.py
RENAMED
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/default_gitignore
RENAMED
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/get_text.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/prompts/system_prompt.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/server/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/stream_debug.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_audio_hooks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_environment.py
RENAMED
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_image_generation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_providers_config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_get_text_browser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|