codex-agent-framework 0.1.15__tar.gz → 0.1.16__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 (102) hide show
  1. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/CHANGELOG.md +8 -0
  2. {codex_agent_framework-0.1.15/codex_agent_framework.egg-info → codex_agent_framework-0.1.16}/PKG-INFO +4 -1
  3. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/README.md +3 -0
  4. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/agent.py +4 -1
  5. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/config.py +8 -0
  6. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/mainloop.py +1 -1
  7. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/plugin.py +2 -0
  8. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16/codex_agent_framework.egg-info}/PKG-INFO +4 -1
  9. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/pyproject.toml +1 -1
  10. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_agent.py +23 -0
  11. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/LICENSE +0 -0
  12. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/MANIFEST.in +0 -0
  13. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/__init__.py +0 -0
  14. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/__main__.py +0 -0
  15. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/agent_runtime.py +0 -0
  16. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/ai.py +0 -0
  17. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_commands.py +0 -0
  18. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_plugins/__init__.py +0 -0
  19. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  20. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_plugins/browser/controller.py +0 -0
  21. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  22. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_plugins/desktop/controller.py +0 -0
  23. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_plugins/desktop/screenshot.py +0 -0
  24. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  25. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  26. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  27. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_providers.py +0 -0
  28. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_tools/__init__.py +0 -0
  29. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_tools/files.py +0 -0
  30. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_tools/server_tools.py +0 -0
  31. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_tools/shell.py +0 -0
  32. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_tools/system.py +0 -0
  33. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/builtin_tools/vision.py +0 -0
  34. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/chat.py +0 -0
  35. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/cli/__init__.py +0 -0
  36. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/cli/headless.py +0 -0
  37. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/cli/main.py +0 -0
  38. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/cli/output.py +0 -0
  39. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/cli/root.py +0 -0
  40. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/cli/runner.py +0 -0
  41. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/client.py +0 -0
  42. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/command.py +0 -0
  43. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/context.py +0 -0
  44. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/event.py +0 -0
  45. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/get_text/__init__.py +0 -0
  46. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/get_text/default_gitignore +0 -0
  47. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/get_text/get_text.py +0 -0
  48. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/get_text/simpler_get_text.py +0 -0
  49. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/hooks.py +0 -0
  50. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/image.py +0 -0
  51. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/latex.py +0 -0
  52. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/memory.py +0 -0
  53. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/message.py +0 -0
  54. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/prompts/image_generation_system_prompt.txt +0 -0
  55. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/prompts/system_prompt.txt +0 -0
  56. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/provider.py +0 -0
  57. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/registry.py +0 -0
  58. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/runtime.py +0 -0
  59. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/scheduler.py +0 -0
  60. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  61. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/server.py +0 -0
  62. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/service.py +0 -0
  63. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/sessions.py +0 -0
  64. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/status.py +0 -0
  65. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/stream_utils.py +0 -0
  66. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/tool.py +0 -0
  67. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/tray.py +0 -0
  68. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/tui.py +0 -0
  69. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/utils.py +0 -0
  70. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/voice.py +0 -0
  71. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent/worker.py +0 -0
  72. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  73. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  74. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  75. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent_framework.egg-info/requires.txt +0 -0
  76. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/codex_agent_framework.egg-info/top_level.txt +0 -0
  77. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/dependencies.txt +0 -0
  78. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/setup.cfg +0 -0
  79. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_agent_runtime.py +0 -0
  80. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_ai.py +0 -0
  81. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_browser.py +0 -0
  82. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_builtin_config.py +0 -0
  83. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_chat.py +0 -0
  84. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_cli.py +0 -0
  85. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_cli_headless.py +0 -0
  86. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_cli_root.py +0 -0
  87. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_client.py +0 -0
  88. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_events.py +0 -0
  89. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_get_text_browser.py +0 -0
  90. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_hooks.py +0 -0
  91. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_image_message.py +0 -0
  92. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_local_desktop.py +0 -0
  93. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_memory.py +0 -0
  94. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_messages.py +0 -0
  95. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_planner.py +0 -0
  96. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_scheduler.py +0 -0
  97. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_server.py +0 -0
  98. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_service.py +0 -0
  99. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_tray.py +0 -0
  100. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_tui.py +0 -0
  101. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_utils.py +0 -0
  102. {codex_agent_framework-0.1.15 → codex_agent_framework-0.1.16}/tests/test_worker.py +0 -0
@@ -4,6 +4,14 @@ 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.16] - 2026-05-08
8
+ ### Fixed
9
+ - Allow agent startup without an OpenAI API key by disabling OpenAI-dependent capabilities such as voice defaults and the built-in memory plugin instead of failing during initialization.
10
+ - Skip automatic memory archiving when the memory plugin is unavailable.
11
+
12
+ ### Tests
13
+ - Add regression coverage for agent initialization with and without an OpenAI API key.
14
+
7
15
  ## [0.1.15] - 2026-05-08
8
16
  ### Added
9
17
  - Add `AgentRuntime` as the canonical external runtime contract for HTTP server, headless CLI, in-process, and process-backed integrations.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.15
3
+ Version: 0.1.16
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -393,6 +393,8 @@ agent = Agent(
393
393
 
394
394
  Configuration is persisted to `agent_config.json` in the runtime directory when updated through agent helpers, slash commands, the HTTP API, or `codex-agent config set`.
395
395
 
396
+ If no OpenAI API key is configured through `openai_api_key` or `OPENAI_API_KEY`, the agent can still start, but OpenAI-dependent capabilities such as voice defaults and the built-in memory plugin are disabled.
397
+
396
398
  ## Project layout
397
399
 
398
400
  ```text
@@ -440,6 +442,7 @@ python -m build
440
442
  The distribution includes prompt text files, `codex_agent/get_text/default_gitignore`, and the packaged Linux system dependency installer through package data and `MANIFEST.in`.
441
443
 
442
444
  ## Recent changes
445
+ - `0.1.16`: tolerate missing OpenAI API keys at startup by disabling OpenAI-dependent voice and memory features, and skip memory archiving when the memory plugin is unavailable.
443
446
  - `0.1.15`: add the `AgentRuntime` interface for server/CLI/process adapters, split the CLI into a package with headless runtime commands, add `codex-agent config set` plus `PATCH /config`, and make built-in tools/providers/plugins configurable.
444
447
  - `0.1.14`: add HookManager infrastructure, planner/scheduler robustness fixes, documented system dependencies, `codex-agent install-system-deps`, `codex-agent bootstrap`, and improved TUI SSE reconnect/replay handling.
445
448
  - `0.1.13`: reorganize built-in tools into a `codex_agent.builtin_tools` package, keeping the public import surface compatible while separating file, shell, vision, system, and server-tool modules.
@@ -344,6 +344,8 @@ agent = Agent(
344
344
 
345
345
  Configuration is persisted to `agent_config.json` in the runtime directory when updated through agent helpers, slash commands, the HTTP API, or `codex-agent config set`.
346
346
 
347
+ If no OpenAI API key is configured through `openai_api_key` or `OPENAI_API_KEY`, the agent can still start, but OpenAI-dependent capabilities such as voice defaults and the built-in memory plugin are disabled.
348
+
347
349
  ## Project layout
348
350
 
349
351
  ```text
@@ -391,6 +393,7 @@ python -m build
391
393
  The distribution includes prompt text files, `codex_agent/get_text/default_gitignore`, and the packaged Linux system dependency installer through package data and `MANIFEST.in`.
392
394
 
393
395
  ## Recent changes
396
+ - `0.1.16`: tolerate missing OpenAI API keys at startup by disabling OpenAI-dependent voice and memory features, and skip memory archiving when the memory plugin is unavailable.
394
397
  - `0.1.15`: add the `AgentRuntime` interface for server/CLI/process adapters, split the CLI into a package with headless runtime commands, add `codex-agent config set` plus `PATCH /config`, and make built-in tools/providers/plugins configurable.
395
398
  - `0.1.14`: add HookManager infrastructure, planner/scheduler robustness fixes, documented system dependencies, `codex-agent install-system-deps`, `codex-agent bootstrap`, and improved TUI SSE reconnect/replay handling.
396
399
  - `0.1.13`: reorganize built-in tools into a `codex_agent.builtin_tools` package, keeping the public import surface compatible while separating file, shell, vision, system, and server-tool modules.
@@ -1,4 +1,4 @@
1
- from .utils import text_content, ensure_runtime_dir, upload_file_to_folder, project_python_env
1
+ from .utils import text_content, ensure_runtime_dir, upload_file_to_folder, project_python_env, runtime_join
2
2
  from modict import modict
3
3
  import os
4
4
  import sys
@@ -17,6 +17,7 @@ from .status import StatusManager
17
17
  from .tool import ImageGenerationTool, reset_current_agent, set_current_agent
18
18
  from .ai import AIBadRequestError, AIClient
19
19
  from .voice import VoiceProcessor
20
+ from .memory import RAGMemory
20
21
  from .latex import LaTeXProcessor
21
22
  from .event import AgentInterruptRequestedEvent, AgentInterrupted, AgentInterruptedEvent, AudioPlaybackEvent, EventBus
22
23
  from pynteract import Shell
@@ -39,6 +40,7 @@ class Agent:
39
40
  self.config=self.config_manager.config
40
41
  self.config_manager.load()
41
42
  self.config_manager.update(kwargs, save=False)
43
+ self.config_manager.apply_openai_capability_defaults()
42
44
  self.events=EventBus()
43
45
  self.registry=RegistryManager(self)
44
46
  self.tools=self.registry.tools
@@ -65,6 +67,7 @@ class Agent:
65
67
  self.registry.init_providers_folder()
66
68
  self.command_manager.init_folder()
67
69
  self.ai=AIClient(self)
70
+ self.memory=RAGMemory(file=runtime_join("memory.json"))
68
71
  self.voice=VoiceProcessor(self)
69
72
  self.latex=LaTeXProcessor()
70
73
  self.content_processors=[self.voice]
@@ -121,6 +121,14 @@ class ConfigManager:
121
121
  self.save()
122
122
  return self.config
123
123
 
124
+ def has_openai_api_key(self):
125
+ return bool(self.config.get("openai_api_key") or os.getenv("OPENAI_API_KEY"))
126
+
127
+ def apply_openai_capability_defaults(self):
128
+ if not self.has_openai_api_key():
129
+ self.config.voice_enabled = False
130
+ return self.config
131
+
124
132
  def system_message(self):
125
133
  return SystemMessage(content=self.system_prompt())
126
134
 
@@ -265,7 +265,7 @@ class MainLoopManager:
265
265
 
266
266
  if self.require_next_step and not self.stop_agentic_loop:
267
267
  continue
268
- if self.agent.config.get("auto_archive_memory", True):
268
+ if self.agent.config.get("auto_archive_memory", True) and self.agent.plugins.get("memory"):
269
269
  self.agent.plugins.memory.archive_last_turn_async()
270
270
  return True
271
271
  except AgentInterrupted:
@@ -62,6 +62,8 @@ class PluginsManager:
62
62
  continue
63
63
  if not self.agent.config_manager.builtin_enabled("plugins", module_info.name):
64
64
  continue
65
+ if module_info.name == "memory" and not self.agent.config_manager.has_openai_api_key():
66
+ continue
65
67
  module = importlib.import_module(f"{builtin_plugins.__name__}.{module_info.name}")
66
68
  self.add_builtin_from_module(module)
67
69
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.15
3
+ Version: 0.1.16
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -393,6 +393,8 @@ agent = Agent(
393
393
 
394
394
  Configuration is persisted to `agent_config.json` in the runtime directory when updated through agent helpers, slash commands, the HTTP API, or `codex-agent config set`.
395
395
 
396
+ If no OpenAI API key is configured through `openai_api_key` or `OPENAI_API_KEY`, the agent can still start, but OpenAI-dependent capabilities such as voice defaults and the built-in memory plugin are disabled.
397
+
396
398
  ## Project layout
397
399
 
398
400
  ```text
@@ -440,6 +442,7 @@ python -m build
440
442
  The distribution includes prompt text files, `codex_agent/get_text/default_gitignore`, and the packaged Linux system dependency installer through package data and `MANIFEST.in`.
441
443
 
442
444
  ## Recent changes
445
+ - `0.1.16`: tolerate missing OpenAI API keys at startup by disabling OpenAI-dependent voice and memory features, and skip memory archiving when the memory plugin is unavailable.
443
446
  - `0.1.15`: add the `AgentRuntime` interface for server/CLI/process adapters, split the CLI into a package with headless runtime commands, add `codex-agent config set` plus `PATCH /config`, and make built-in tools/providers/plugins configurable.
444
447
  - `0.1.14`: add HookManager infrastructure, planner/scheduler robustness fixes, documented system dependencies, `codex-agent install-system-deps`, `codex-agent bootstrap`, and improved TUI SSE reconnect/replay handling.
445
448
  - `0.1.13`: reorganize built-in tools into a `codex_agent.builtin_tools` package, keeping the public import surface compatible while separating file, shell, vision, system, and server-tool modules.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "codex-agent-framework"
7
- version = "0.1.15"
7
+ version = "0.1.16"
8
8
  description = "A lightweight event-driven Codex agent runtime."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -693,6 +693,29 @@ def test_agent_initializes_new_session(isolated_runtime_dir):
693
693
  assert agent.shell.silent is True
694
694
 
695
695
 
696
+ def test_agent_disables_openai_dependent_features_without_api_key(monkeypatch):
697
+ monkeypatch.delenv("OPENAI_API_KEY", raising=False)
698
+
699
+ agent = Agent(session="new", voice_enabled=True)
700
+
701
+ assert agent.config.voice_enabled is False
702
+ assert "memory" not in agent.plugins
703
+ assert "memory_add" not in agent.tools
704
+ assert "retrieved_memory" not in agent.providers
705
+ assert agent.memory.messages == []
706
+
707
+
708
+ def test_agent_loads_memory_plugin_with_configured_openai_key(monkeypatch):
709
+ monkeypatch.delenv("OPENAI_API_KEY", raising=False)
710
+
711
+ agent = Agent(session="new", openai_api_key="sk-test", voice_enabled=True)
712
+
713
+ assert agent.config.voice_enabled is True
714
+ assert "memory" in agent.plugins
715
+ assert "memory_add" in agent.tools
716
+ assert "retrieved_memory" in agent.providers
717
+
718
+
696
719
  def test_agent_instantiates_stateful_builtin_plugin_classes():
697
720
  import types
698
721
  from codex_agent import Plugin, command, provider, tool