codex-agent-framework 0.1.61__tar.gz → 0.1.62__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.61/codex_agent_framework.egg-info → codex_agent_framework-0.1.62}/PKG-INFO +1 -1
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/cli/headless.py +2 -16
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/command.py +1 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/config.py +1 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/service.py +5 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/stream_utils.py +0 -6
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/utils.py +6 -10
- codex_agent_framework-0.1.62/codex_agent/version.py +1 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62/codex_agent_framework.egg-info}/PKG-INFO +1 -1
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/pyproject.toml +1 -1
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_builtin_config.py +30 -1
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_cli_headless.py +26 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_service.py +4 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_utils.py +12 -0
- codex_agent_framework-0.1.61/codex_agent/version.py +0 -1
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/CHANGELOG.md +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/LICENSE +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/MANIFEST.in +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/README.md +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/__main__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/agent.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/agent_runtime.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/ai.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/browser.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_commands.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/content/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/content/system.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/content/vision.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/context/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/files/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/files/tools.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/python/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/realtime/session.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/builtin_plugins/web_search/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/cli/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/cli/main.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/cli/output.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/cli/root.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/cli/runner.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/client.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/context.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/desktop.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/event.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/get_text/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/get_text/default_gitignore +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/get_text/get_text.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/get_text/simpler_get_text.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/hooks.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/image.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/latex.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/mainloop.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/message.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/plugin.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/prompts/compaction_prompt.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/prompts/system_prompt.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/provider.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/runtime.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/scheduler.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/scripts/install-system-dependencies.sh +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/server/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/server/app.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/server/core.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/sessions.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/status.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/stream.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/token_counter.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tool.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tray.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/__init__.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/app.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/chat.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/lifecycle.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/log.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/perf.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/state.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/status_bar.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/stream_debug.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/style.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/transcript.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/tui/widgets.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/worker.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent_framework.egg-info/entry_points.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent_framework.egg-info/requires.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent_framework.egg-info/top_level.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/dependencies.txt +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/setup.cfg +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_audio_hooks.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_commands.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_context.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_desktop.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_environment.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_image_generation.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_observe.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_plugins.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_providers_config.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_realtime.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_response.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_runtime.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_sessions.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_subagents.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_tools.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_turns.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_ai.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_browser.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_chat.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_cli.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_cli_root.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_client.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_events.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_get_text_browser.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_hooks.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_image_message.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_local_desktop.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_memory.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_messages.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_planner.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_scheduler.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_server.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_token_counter.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_tui.py +0 -0
- {codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_worker.py +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import json
|
|
2
1
|
import sys
|
|
3
2
|
import threading
|
|
4
3
|
|
|
4
|
+
from codex_agent.config import parse_config_value
|
|
5
|
+
|
|
5
6
|
from .output import dump_ndjson, output_payload, key_value_text
|
|
6
7
|
from .runner import in_process_runner, process_runner, server_runner
|
|
7
8
|
|
|
@@ -71,21 +72,6 @@ def run_tools(args, extra_args=None):
|
|
|
71
72
|
return payload
|
|
72
73
|
|
|
73
74
|
|
|
74
|
-
def parse_config_value(value):
|
|
75
|
-
text = str(value)
|
|
76
|
-
lowered = text.lower()
|
|
77
|
-
if lowered == "true":
|
|
78
|
-
return True
|
|
79
|
-
if lowered == "false":
|
|
80
|
-
return False
|
|
81
|
-
if lowered == "null" or lowered == "none":
|
|
82
|
-
return None
|
|
83
|
-
try:
|
|
84
|
-
return json.loads(text)
|
|
85
|
-
except json.JSONDecodeError:
|
|
86
|
-
return value
|
|
87
|
-
|
|
88
|
-
|
|
89
75
|
def parse_config_set_args(extra_args):
|
|
90
76
|
args = list(extra_args or [])
|
|
91
77
|
if not args:
|
|
@@ -17,6 +17,7 @@ DEFAULT_COMPACTION_PROMPT = text_content(DEFAULT_COMPACTION_PROMPT_PATH)
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def parse_config_value(value):
|
|
20
|
+
"""Parse CLI/config scalar strings into bool, null, numeric, or JSON values."""
|
|
20
21
|
if isinstance(value, bool):
|
|
21
22
|
return value
|
|
22
23
|
if not isinstance(value, str):
|
|
@@ -11,15 +11,18 @@ from .utils import project_python_env, runtime_join
|
|
|
11
11
|
|
|
12
12
|
SERVER_SERVICE_NAME = "codex-agent.service"
|
|
13
13
|
TRAY_SERVICE_NAME = "codex-agent-tray.service"
|
|
14
|
+
# Backwards-compatible alias for callers that predate the tray/server split.
|
|
14
15
|
SERVICE_NAME = SERVER_SERVICE_NAME
|
|
15
16
|
RESTART_WAKEUP_FILE = "restart_wakeup.json"
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
def restart_wakeup_file():
|
|
20
|
+
"""Return the runtime file used to resume work after a service restart."""
|
|
19
21
|
return Path(runtime_join(RESTART_WAKEUP_FILE))
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
def write_restart_wakeup(prompt, title=""):
|
|
25
|
+
"""Persist a prompt for the next server startup to consume as a wakeup."""
|
|
23
26
|
if not prompt or not str(prompt).strip():
|
|
24
27
|
raise ValueError("prompt must not be empty")
|
|
25
28
|
path = restart_wakeup_file()
|
|
@@ -33,6 +36,7 @@ def write_restart_wakeup(prompt, title=""):
|
|
|
33
36
|
|
|
34
37
|
|
|
35
38
|
def pop_restart_wakeup():
|
|
39
|
+
"""Read and remove any pending post-restart wakeup payload."""
|
|
36
40
|
path = restart_wakeup_file()
|
|
37
41
|
if not path.is_file():
|
|
38
42
|
return None
|
|
@@ -47,6 +51,7 @@ def pop_restart_wakeup():
|
|
|
47
51
|
|
|
48
52
|
|
|
49
53
|
def restart_server_service(check=False):
|
|
54
|
+
"""Restart only the local server service without blocking the caller."""
|
|
50
55
|
return service_controller().restart(SERVER_SERVICE_NAME, check=check, no_block=True)
|
|
51
56
|
|
|
52
57
|
|
|
@@ -262,6 +262,7 @@ def truncate(string, max_tokens=2000, start_line=1, model=None):
|
|
|
262
262
|
return result
|
|
263
263
|
|
|
264
264
|
def pack_msgs(messages):
|
|
265
|
+
"""Format named text messages into a compact transcript string."""
|
|
265
266
|
return "".join(f"{message.name}:\n{message.content.strip()}\n\n" for message in messages)
|
|
266
267
|
|
|
267
268
|
def msg_token_count(msg, model=None):
|
|
@@ -318,20 +319,15 @@ def split_history_turns(messages):
|
|
|
318
319
|
return turns, current
|
|
319
320
|
|
|
320
321
|
def find_pattern(text, pattern=None):
|
|
321
|
-
"""
|
|
322
|
-
Renvoie une liste de tuples contenant TOUS les groupes capturés par le pattern.
|
|
322
|
+
"""Return captured regex groups for every match in ``text``.
|
|
323
323
|
|
|
324
|
-
|
|
325
|
-
|
|
324
|
+
The default pattern extracts fenced Python code blocks. Each result is a
|
|
325
|
+
tuple containing all capture groups for one match, even when there is only
|
|
326
|
+
one group.
|
|
326
327
|
"""
|
|
327
|
-
|
|
328
328
|
pattern = pattern or r'```python(.*?)```'
|
|
329
329
|
iterator = re.finditer(pattern, text, re.DOTALL)
|
|
330
|
-
|
|
331
|
-
return [
|
|
332
|
-
tuple(match.groups()) # groups() renvoie *tous* les groupes capturés
|
|
333
|
-
for match in iterator
|
|
334
|
-
]
|
|
330
|
+
return [tuple(match.groups()) for match in iterator]
|
|
335
331
|
|
|
336
332
|
def format(string, context=None):
|
|
337
333
|
# Si aucun contexte n'est fourni, utiliser un dictionnaire vide
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.62"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from codex_agent.config import ConfigManager
|
|
1
|
+
from codex_agent.config import ConfigManager, parse_config_value
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
class DummyAgent:
|
|
@@ -12,6 +12,35 @@ def manager_with_builtin_field(field, value):
|
|
|
12
12
|
return manager
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
def test_parse_config_value_handles_cli_scalars_and_json():
|
|
16
|
+
cases = {
|
|
17
|
+
"true": True,
|
|
18
|
+
"yes": True,
|
|
19
|
+
"on": True,
|
|
20
|
+
"1": True,
|
|
21
|
+
"false": False,
|
|
22
|
+
"no": False,
|
|
23
|
+
"off": False,
|
|
24
|
+
"0": False,
|
|
25
|
+
"none": None,
|
|
26
|
+
"null": None,
|
|
27
|
+
"128": 128,
|
|
28
|
+
"-7": -7,
|
|
29
|
+
"3.5": 3.5,
|
|
30
|
+
"1e3": 1000.0,
|
|
31
|
+
'{"model":"test"}': {"model": "test"},
|
|
32
|
+
'["memory"]': ["memory"],
|
|
33
|
+
}
|
|
34
|
+
for raw, expected in cases.items():
|
|
35
|
+
assert parse_config_value(raw) == expected
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_parse_config_value_preserves_unknown_strings_and_values():
|
|
39
|
+
assert parse_config_value("gpt-test") == "gpt-test"
|
|
40
|
+
assert parse_config_value(True) is True
|
|
41
|
+
assert parse_config_value({"already": "parsed"}) == {"already": "parsed"}
|
|
42
|
+
|
|
43
|
+
|
|
15
44
|
def test_builtin_plugin_enabled_none_loads_everything():
|
|
16
45
|
manager = manager_with_builtin_field("builtin_plugins", None)
|
|
17
46
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import importlib
|
|
2
|
+
import json
|
|
3
|
+
|
|
2
4
|
cli_main = importlib.import_module("codex_agent.cli.main")
|
|
3
5
|
headless = importlib.import_module("codex_agent.cli.headless")
|
|
4
6
|
runner = importlib.import_module("codex_agent.cli.runner")
|
|
@@ -99,6 +101,30 @@ def test_config_get_key(monkeypatch, capsys):
|
|
|
99
101
|
assert capsys.readouterr().out.strip() == "test-model"
|
|
100
102
|
|
|
101
103
|
|
|
104
|
+
def test_config_set_key_value_parses_central_config_scalars(monkeypatch, capsys):
|
|
105
|
+
patch_client(monkeypatch)
|
|
106
|
+
|
|
107
|
+
cli_main.main([
|
|
108
|
+
"config",
|
|
109
|
+
"set",
|
|
110
|
+
"enabled",
|
|
111
|
+
"yes",
|
|
112
|
+
"limit",
|
|
113
|
+
"128000",
|
|
114
|
+
"disabled",
|
|
115
|
+
"off",
|
|
116
|
+
"plugins",
|
|
117
|
+
'["memory"]',
|
|
118
|
+
"--json",
|
|
119
|
+
])
|
|
120
|
+
|
|
121
|
+
payload = json.loads(capsys.readouterr().out)
|
|
122
|
+
assert payload["enabled"] is True
|
|
123
|
+
assert payload["limit"] == 128000
|
|
124
|
+
assert payload["disabled"] is False
|
|
125
|
+
assert payload["plugins"] == ["memory"]
|
|
126
|
+
|
|
127
|
+
|
|
102
128
|
def test_config_set_key_value(monkeypatch, capsys):
|
|
103
129
|
patch_client(monkeypatch)
|
|
104
130
|
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
from codex_agent import service
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
def test_service_name_alias_points_to_server_service_for_compatibility():
|
|
5
|
+
assert service.SERVICE_NAME == service.SERVER_SERVICE_NAME
|
|
6
|
+
|
|
7
|
+
|
|
4
8
|
def test_install_user_service_writes_server_and_tray_units(tmp_path, monkeypatch):
|
|
5
9
|
calls = []
|
|
6
10
|
monkeypatch.setenv("HOME", str(tmp_path))
|
|
@@ -43,6 +43,18 @@ def test_pack_msgs_formats_named_messages():
|
|
|
43
43
|
assert utils.pack_msgs(messages) == "user:\nhello\n\nassistant:\ndone\n\n"
|
|
44
44
|
|
|
45
45
|
|
|
46
|
+
def test_find_pattern_returns_capture_groups_for_default_python_fences():
|
|
47
|
+
text = "before\n```python\nprint('hello')\n```\nafter"
|
|
48
|
+
|
|
49
|
+
assert utils.find_pattern(text) == [("\nprint('hello')\n",)]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_find_pattern_returns_all_capture_groups_for_custom_pattern():
|
|
53
|
+
text = "ticket ABC-123 and ticket XYZ-999"
|
|
54
|
+
|
|
55
|
+
assert utils.find_pattern(text, r"ticket ([A-Z]+)-(\d+)") == [("ABC", "123"), ("XYZ", "999")]
|
|
56
|
+
|
|
57
|
+
|
|
46
58
|
def test_logger_creates_parent_directory_and_truncates_file(tmp_path):
|
|
47
59
|
log_file = tmp_path / "logs" / "log.txt"
|
|
48
60
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.1.61"
|
|
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.61 → codex_agent_framework-0.1.62}/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.61 → codex_agent_framework-0.1.62}/codex_agent/get_text/__init__.py
RENAMED
|
File without changes
|
{codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/codex_agent/get_text/default_gitignore
RENAMED
|
File without changes
|
{codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/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.61 → codex_agent_framework-0.1.62}/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.61 → codex_agent_framework-0.1.62}/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
|
{codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/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
|
{codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_audio_hooks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_environment.py
RENAMED
|
File without changes
|
{codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/tests/test_agent_image_generation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/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
|
{codex_agent_framework-0.1.61 → codex_agent_framework-0.1.62}/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
|