feat(agents): add tool_agent_class parameter to AgentFactory and create_executor #74

Merged
hurui200320 merged 1 commit from feature/m1-tool-agent-class-injection into master 2026-07-08 09:44:17 +00:00
Member

Summary

Eliminates the monkey-patching workaround used by cleveragents-webapp to substitute a platform-controlled ToolAgent subclass at runtime. Adds a keyword-only tool_agent_class: type[ToolAgent] = ToolAgent parameter to AgentFactory.__init__, Executor.__init__, create_executor(), and LLMAgent.__init__. Every internal site that constructs an ephemeral ToolAgent — including the LLM agent's multi-turn tool-call loop and all six dispatch paths — now uses the injected subclass.

Motivation

cleveragents-webapp currently monkey-patches five cleveractors module namespaces at import time to replace the ToolAgent class with PlatformAwareToolAgent. This approach is fragile against library evolution (any new module that imports ToolAgent at import time would be missed), import-order sensitive, and breaks static analysis. This PR provides the upstream API extension that removes the need for the monkey-patch entirely — including the LLM tool-calling path and the multi-actor path, which earlier drafts missed.

What Changed

src/cleveractors/agents/factory.py (AgentFactory.__init__, _create_agent_instance)

  • Accepts a keyword-only tool_agent_class: type[ToolAgent] = ToolAgent argument.
  • Validates it is a ToolAgent subclass at construction time (fail-fast per CONTRIBUTING.md §Argument Validation).
  • Stores as self._tool_agent_class and uses it to populate self.agent_types["tool"], so create_agent("tool") instantiates the supplied subclass.
  • Forwards tool_agent_class=self._tool_agent_class to LLMAgent when creating "llm"-typed agents, so the LLM tool-calling loop honours the injected subclass.

src/cleveractors/agents/llm.py (LLMAgent.__init__, _execute_tool_loop)

  • LLMAgent.__init__ accepts a keyword-only tool_agent_class: type[ToolAgent] = ToolAgent argument, validated as a ToolAgent subclass at construction time.
  • The multi-turn tool-call loop constructs its ephemeral tool executors via self._tool_agent_class(...) across all three dispatch sites (the regular loop, the budget-exhaustion synthesis round, and the post-loop stuck-model synthesis round). Previously these sites imported ToolAgent as _TA locally and constructed the base class directly, which silently bypassed the injected subclass.

src/cleveractors/runtime.py (Executor, create_executor)

  • Executor.__init__ accepts and validates tool_agent_class, stored as self.tool_agent_class.
  • create_executor() accepts tool_agent_class (keyword-only) and forwards it to Executor.

src/cleveractors/runtime_dispatch.py (all six dispatch paths)

  • _execute_tool: uses executor.tool_agent_class(...) instead of the module-level ToolAgent(...).
  • _execute_graph and _execute_graph_stream: pass tool_agent_class=executor.tool_agent_class to AgentFactory so graph nodes with tool-typed agents pick up the subclass.
  • _execute_llm and _execute_llm_stream: pass tool_agent_class=executor.tool_agent_class to AgentFactory so the single-LLM actor's internally-created LLMAgent (and its tool-calling loop) honours the injected subclass. (Review-fix round 2) — without this, a single LLM actor that makes tool calls silently fell back to the base ToolAgent.
  • _execute_multi_actor: passes tool_agent_class=executor.tool_agent_class to the sub-Executor so every actor inside a multi-actor bundle (tool, graph, or LLM) honours the injected subclass. (Review-fix round 2) — without this, all dispatch paths reachable through a multi-actor bundle fell back to the base ToolAgent.
  • Removed the now-unused module-level ToolAgent import; the _execute_tool docstring cross-reference is fully qualified so it still resolves.

src/cleveractors/core/application.py (load_configuration, _create_agents)

  • Removed the redundant register_agent_type("tool", ToolAgent) call from load_configuration and the dead type_map re-registration block in _create_agents; AgentFactory.__init__ already owns the "tool" registration. The "llm" registration is retained as a defensive no-op.

features/tool_agent_class_injection.feature + features/steps/tool_agent_class_injection_steps.py

  • 17 BDD scenarios covering: default class when parameter omitted; custom subclass stored on factory and executor; invalid class rejected with ConfigurationError (factory, executor, and LLMAgent); create_agent() returns custom instance; _execute_tool dispatch instantiates custom subclass; the LLM tool loop instantiates the injected subclass; isinstance LSP compatibility through the factory; the _execute_llm dispatch path forwarding tool_agent_class to AgentFactory (single-LLM actor making a tool call); and the _execute_multi_actor dispatch path forwarding tool_agent_class to the sub-Executor.
  • The two new dispatch-path scenarios were verified to fail without the source fixes (instantiation_count=0), confirming they guard the injection contract for the single-LLM and multi-actor paths.

Test cleanups (consequence of the dispatch-path changes)

  • features/steps/runtime_coverage_steps.py and features/steps/runtime_extended_coverage_steps.py: removed the now-dead patch("cleveractors.runtime_dispatch.ToolAgent") mocks that no longer intercept _execute_tool after it switched to executor.tool_agent_class.
  • features/steps/credential_executor_paths_steps.py: the _execute_multi_actor credentials-forwarding scenario intercepts Executor.__init__ with a capturing_init to assert the credentials dict reaches the sub-Executor. Now that _execute_multi_actor forwards tool_agent_class to the sub-Executor, capturing_init accepts and forwards that keyword so the assertion continues to pass.
  • features/application_coverage_gaps.feature: dropped the obsolete _create_agents registers built-in agent types scenario since the redundant re-registration it asserted was removed.

CHANGELOG.md

  • Updated the dispatch-path coverage description to accurately list all six paths (_execute_tool, _execute_graph, _execute_graph_stream, _execute_llm, _execute_llm_stream, _execute_multi_actor) instead of the earlier "All three dispatch paths" wording.

Review Fix Rounds

Round 1 (pre-review):

  • LLMAgent tool loop now uses the injected tool_agent_class (was constructing base ToolAgent).
  • Added LLM-tool-loop test coverage; removed application.py redundant ToolAgent registrations; removed unused imports from the new step file.
  • Repurposed the tautological isinstance scenario into a factory-created LSP check; removed the stale ToolAgent import in runtime_dispatch.py; renamed the _fake_process parameter that shadowed Behave's context.

Round 2 (this revision):

  • Major fix: _execute_llm and _execute_llm_stream now forward tool_agent_class=executor.tool_agent_class to AgentFactory (previously omitted, so single-LLM actors with tools fell back to the base ToolAgent).
  • Major fix: _execute_multi_actor now forwards tool_agent_class=executor.tool_agent_class to the sub-Executor (previously omitted, so every actor inside a multi-actor bundle fell back to the base ToolAgent).
  • Minor fix: Added two BDD scenarios covering the single-LLM and multi-actor injection paths (verified they fail without the source fixes).
  • Minor fix: Updated CHANGELOG.md to list all six dispatch paths accurately.
  • Test update: Updated the existing _execute_multi_actor credentials-forwarding test's capturing_init to accept/forward the new tool_agent_class keyword.

Backward Compatibility

Callers that do not pass tool_agent_class receive identical behaviour to the previous release — the default is ToolAgent itself. No existing callers are affected.

cleveragents-webapp Migration

After this PR merges, update the webapp call site to:

executor = create_executor(
    config_dict=config,
    credentials=credentials,
    limits=limits,
    pricing=pricing,
    tool_agent_class=PlatformAwareToolAgent,  # replaces _install_platform_tool_hook
)

The five-module setattr loop and _install_platform_tool_hook machinery can then be deleted — including for the LLM tool-calling path and the multi-actor path, which are now covered.

Quality Gates

  • nox -e lint: pass
  • nox -e typecheck (pyright strict): 0 errors
  • nox -e unit_tests: 2756 scenarios, 0 failures
  • nox -e coverage_report: 97.0% (threshold 96.5%)
  • nox -e integration_tests: pass

Closes #73

## Summary Eliminates the monkey-patching workaround used by `cleveragents-webapp` to substitute a platform-controlled `ToolAgent` subclass at runtime. Adds a keyword-only `tool_agent_class: type[ToolAgent] = ToolAgent` parameter to `AgentFactory.__init__`, `Executor.__init__`, `create_executor()`, and `LLMAgent.__init__`. Every internal site that constructs an ephemeral `ToolAgent` — including the LLM agent's multi-turn tool-call loop and **all six dispatch paths** — now uses the injected subclass. ## Motivation `cleveragents-webapp` currently monkey-patches five `cleveractors` module namespaces at import time to replace the `ToolAgent` class with `PlatformAwareToolAgent`. This approach is fragile against library evolution (any new module that imports `ToolAgent` at import time would be missed), import-order sensitive, and breaks static analysis. This PR provides the upstream API extension that removes the need for the monkey-patch entirely — **including the LLM tool-calling path and the multi-actor path**, which earlier drafts missed. ## What Changed ### `src/cleveractors/agents/factory.py` (`AgentFactory.__init__`, `_create_agent_instance`) - Accepts a keyword-only `tool_agent_class: type[ToolAgent] = ToolAgent` argument. - Validates it is a `ToolAgent` subclass at construction time (fail-fast per `CONTRIBUTING.md §Argument Validation`). - Stores as `self._tool_agent_class` and uses it to populate `self.agent_types["tool"]`, so `create_agent("tool")` instantiates the supplied subclass. - Forwards `tool_agent_class=self._tool_agent_class` to `LLMAgent` when creating `"llm"`-typed agents, so the LLM tool-calling loop honours the injected subclass. ### `src/cleveractors/agents/llm.py` (`LLMAgent.__init__`, `_execute_tool_loop`) - `LLMAgent.__init__` accepts a keyword-only `tool_agent_class: type[ToolAgent] = ToolAgent` argument, validated as a `ToolAgent` subclass at construction time. - The multi-turn tool-call loop constructs its ephemeral tool executors via `self._tool_agent_class(...)` across **all three** dispatch sites (the regular loop, the budget-exhaustion synthesis round, and the post-loop stuck-model synthesis round). Previously these sites imported `ToolAgent as _TA` locally and constructed the base class directly, which silently bypassed the injected subclass. ### `src/cleveractors/runtime.py` (`Executor`, `create_executor`) - `Executor.__init__` accepts and validates `tool_agent_class`, stored as `self.tool_agent_class`. - `create_executor()` accepts `tool_agent_class` (keyword-only) and forwards it to `Executor`. ### `src/cleveractors/runtime_dispatch.py` (all six dispatch paths) - `_execute_tool`: uses `executor.tool_agent_class(...)` instead of the module-level `ToolAgent(...)`. - `_execute_graph` and `_execute_graph_stream`: pass `tool_agent_class=executor.tool_agent_class` to `AgentFactory` so graph nodes with tool-typed agents pick up the subclass. - `_execute_llm` and `_execute_llm_stream`: pass `tool_agent_class=executor.tool_agent_class` to `AgentFactory` so the single-LLM actor's internally-created `LLMAgent` (and its tool-calling loop) honours the injected subclass. **(Review-fix round 2)** — without this, a single LLM actor that makes tool calls silently fell back to the base `ToolAgent`. - `_execute_multi_actor`: passes `tool_agent_class=executor.tool_agent_class` to the sub-`Executor` so every actor inside a multi-actor bundle (tool, graph, or LLM) honours the injected subclass. **(Review-fix round 2)** — without this, all dispatch paths reachable through a multi-actor bundle fell back to the base `ToolAgent`. - Removed the now-unused module-level `ToolAgent` import; the `_execute_tool` docstring cross-reference is fully qualified so it still resolves. ### `src/cleveractors/core/application.py` (`load_configuration`, `_create_agents`) - Removed the redundant `register_agent_type("tool", ToolAgent)` call from `load_configuration` and the dead `type_map` re-registration block in `_create_agents`; `AgentFactory.__init__` already owns the `"tool"` registration. The `"llm"` registration is retained as a defensive no-op. ### `features/tool_agent_class_injection.feature` + `features/steps/tool_agent_class_injection_steps.py` - 17 BDD scenarios covering: default class when parameter omitted; custom subclass stored on factory and executor; invalid class rejected with `ConfigurationError` (factory, executor, **and `LLMAgent`**); `create_agent()` returns custom instance; `_execute_tool` dispatch instantiates custom subclass; the LLM tool loop instantiates the injected subclass; `isinstance` LSP compatibility through the factory; the **`_execute_llm` dispatch path forwarding `tool_agent_class` to `AgentFactory`** (single-LLM actor making a tool call); and the **`_execute_multi_actor` dispatch path forwarding `tool_agent_class` to the sub-`Executor`**. - The two new dispatch-path scenarios were verified to **fail without the source fixes** (`instantiation_count=0`), confirming they guard the injection contract for the single-LLM and multi-actor paths. ### Test cleanups (consequence of the dispatch-path changes) - `features/steps/runtime_coverage_steps.py` and `features/steps/runtime_extended_coverage_steps.py`: removed the now-dead `patch("cleveractors.runtime_dispatch.ToolAgent")` mocks that no longer intercept `_execute_tool` after it switched to `executor.tool_agent_class`. - `features/steps/credential_executor_paths_steps.py`: the `_execute_multi_actor` credentials-forwarding scenario intercepts `Executor.__init__` with a `capturing_init` to assert the credentials dict reaches the sub-Executor. Now that `_execute_multi_actor` forwards `tool_agent_class` to the sub-Executor, `capturing_init` accepts and forwards that keyword so the assertion continues to pass. - `features/application_coverage_gaps.feature`: dropped the obsolete `_create_agents registers built-in agent types` scenario since the redundant re-registration it asserted was removed. ### `CHANGELOG.md` - Updated the dispatch-path coverage description to accurately list all six paths (`_execute_tool`, `_execute_graph`, `_execute_graph_stream`, `_execute_llm`, `_execute_llm_stream`, `_execute_multi_actor`) instead of the earlier "All three dispatch paths" wording. ## Review Fix Rounds **Round 1** (pre-review): - `LLMAgent` tool loop now uses the injected `tool_agent_class` (was constructing base `ToolAgent`). - Added LLM-tool-loop test coverage; removed `application.py` redundant `ToolAgent` registrations; removed unused imports from the new step file. - Repurposed the tautological `isinstance` scenario into a factory-created LSP check; removed the stale `ToolAgent` import in `runtime_dispatch.py`; renamed the `_fake_process` parameter that shadowed Behave's `context`. **Round 2** (this revision): - **Major fix:** `_execute_llm` and `_execute_llm_stream` now forward `tool_agent_class=executor.tool_agent_class` to `AgentFactory` (previously omitted, so single-LLM actors with tools fell back to the base `ToolAgent`). - **Major fix:** `_execute_multi_actor` now forwards `tool_agent_class=executor.tool_agent_class` to the sub-`Executor` (previously omitted, so every actor inside a multi-actor bundle fell back to the base `ToolAgent`). - **Minor fix:** Added two BDD scenarios covering the single-LLM and multi-actor injection paths (verified they fail without the source fixes). - **Minor fix:** Updated `CHANGELOG.md` to list all six dispatch paths accurately. - **Test update:** Updated the existing `_execute_multi_actor` credentials-forwarding test's `capturing_init` to accept/forward the new `tool_agent_class` keyword. ## Backward Compatibility Callers that do not pass `tool_agent_class` receive identical behaviour to the previous release — the default is `ToolAgent` itself. No existing callers are affected. ## `cleveragents-webapp` Migration After this PR merges, update the webapp call site to: ```python executor = create_executor( config_dict=config, credentials=credentials, limits=limits, pricing=pricing, tool_agent_class=PlatformAwareToolAgent, # replaces _install_platform_tool_hook ) ``` The five-module `setattr` loop and `_install_platform_tool_hook` machinery can then be deleted — **including for the LLM tool-calling path and the multi-actor path**, which are now covered. ## Quality Gates - `nox -e lint`: pass ✅ - `nox -e typecheck` (pyright strict): 0 errors ✅ - `nox -e unit_tests`: 2756 scenarios, 0 failures ✅ - `nox -e coverage_report`: 97.0% (threshold 96.5%) ✅ - `nox -e integration_tests`: pass ✅ Closes #73
feat(agents): add tool_agent_class parameter to AgentFactory and create_executor
All checks were successful
CI / lint (pull_request) Successful in 47s
CI / typecheck (pull_request) Successful in 50s
CI / security (pull_request) Successful in 50s
CI / quality (pull_request) Successful in 35s
CI / unit_tests (pull_request) Successful in 3m8s
CI / integration_tests (pull_request) Successful in 1m8s
CI / build (pull_request) Successful in 33s
CI / coverage (pull_request) Successful in 3m8s
CI / status-check (pull_request) Successful in 3s
20f68e9ae4
Extends AgentFactory.__init__ and create_executor() with a keyword-only
tool_agent_class: type[ToolAgent] = ToolAgent parameter so callers can
inject a custom ToolAgent subclass at runtime without monkey-patching
module globals (resolves the five-module setattr loop in cleveragents-webapp).

**AgentFactory** (agents/factory.py):
- Accepts tool_agent_class keyword argument; validates it is a ToolAgent
  subclass at construction time (fail-fast, CONTRIBUTING.md §Argument
  Validation).
- Stores as self._tool_agent_class and uses it to populate
  self.agent_types['tool'], so every create_agent('tool') call
  instantiates the supplied subclass.
- Default ToolAgent is preserved, so all existing callers are
  unaffected.

**Executor / create_executor** (runtime.py):
- Executor.__init__ accepts and validates tool_agent_class; stores as
  self.tool_agent_class.
- create_executor() accepts tool_agent_class and forwards it to Executor.

**Dispatch paths** (runtime_dispatch.py):
- _execute_tool: replaces ToolAgent(...) with executor.tool_agent_class(...)
  so the direct-construction path (bypassing AgentFactory) also honours
  the injected subclass.
- _execute_graph and _execute_graph_stream: pass
  tool_agent_class=executor.tool_agent_class to AgentFactory so graph
  nodes using tool-typed agents pick up the subclass.

**Tests** (features/tool_agent_class_injection.feature + steps):
- 13 BDD scenarios covering: default class when parameter omitted;
  custom subclass stored on factory and executor; invalid class rejected
  with ConfigurationError; factory create_agent returns custom instance;
  _execute_tool dispatch instantiates custom subclass; isinstance LSP
  compatibility.

**Updated test** (features/steps/runtime_extended_coverage_steps.py):
- _execute_tool now uses executor.tool_agent_class instead of the
  module-level ToolAgent name; updated the mock strategy from
  patch('cleveractors.runtime_dispatch.ToolAgent') to
  patch.object(ToolAgent, 'process_message', ...) so the existing
  coverage scenario continues to pass.

ISSUES CLOSED: #73
hurui200320 added this to the v2.1.0 milestone 2026-07-07 08:06:00 +00:00
Author
Member

LGTM — self-review complete. Implementation is correct, tests pass, CI green, coverage 97.0%.

LGTM ✅ — self-review complete. Implementation is correct, tests pass, CI green, coverage 97.0%.
hurui200320 force-pushed feature/m1-tool-agent-class-injection from 20f68e9ae4
All checks were successful
CI / lint (pull_request) Successful in 47s
CI / typecheck (pull_request) Successful in 50s
CI / security (pull_request) Successful in 50s
CI / quality (pull_request) Successful in 35s
CI / unit_tests (pull_request) Successful in 3m8s
CI / integration_tests (pull_request) Successful in 1m8s
CI / build (pull_request) Successful in 33s
CI / coverage (pull_request) Successful in 3m8s
CI / status-check (pull_request) Successful in 3s
to 3ead0cc7a8
Some checks failed
CI / lint (pull_request) Failing after 49s
CI / typecheck (pull_request) Successful in 54s
CI / security (pull_request) Successful in 52s
CI / quality (pull_request) Successful in 37s
CI / unit_tests (pull_request) Successful in 3m16s
CI / coverage (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 1m10s
CI / build (pull_request) Successful in 38s
CI / status-check (pull_request) Has been cancelled
2026-07-07 09:52:25 +00:00
Compare
hurui200320 force-pushed feature/m1-tool-agent-class-injection from 3ead0cc7a8
Some checks failed
CI / lint (pull_request) Failing after 49s
CI / typecheck (pull_request) Successful in 54s
CI / security (pull_request) Successful in 52s
CI / quality (pull_request) Successful in 37s
CI / unit_tests (pull_request) Successful in 3m16s
CI / coverage (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 1m10s
CI / build (pull_request) Successful in 38s
CI / status-check (pull_request) Has been cancelled
to 8ad12ac075
All checks were successful
CI / lint (pull_request) Successful in 39s
CI / typecheck (pull_request) Successful in 54s
CI / security (pull_request) Successful in 53s
CI / quality (pull_request) Successful in 37s
CI / unit_tests (pull_request) Successful in 3m13s
CI / integration_tests (pull_request) Successful in 1m12s
CI / build (pull_request) Successful in 38s
CI / coverage (pull_request) Successful in 3m8s
CI / status-check (pull_request) Successful in 3s
2026-07-07 10:09:50 +00:00
Compare
hurui200320 force-pushed feature/m1-tool-agent-class-injection from 8ad12ac075
All checks were successful
CI / lint (pull_request) Successful in 39s
CI / typecheck (pull_request) Successful in 54s
CI / security (pull_request) Successful in 53s
CI / quality (pull_request) Successful in 37s
CI / unit_tests (pull_request) Successful in 3m13s
CI / integration_tests (pull_request) Successful in 1m12s
CI / build (pull_request) Successful in 38s
CI / coverage (pull_request) Successful in 3m8s
CI / status-check (pull_request) Successful in 3s
to 0646b3e958
All checks were successful
CI / lint (pull_request) Successful in 34s
CI / typecheck (pull_request) Successful in 50s
CI / security (pull_request) Successful in 49s
CI / quality (pull_request) Successful in 33s
CI / unit_tests (pull_request) Successful in 3m6s
CI / integration_tests (pull_request) Successful in 1m7s
CI / build (pull_request) Successful in 33s
CI / coverage (pull_request) Successful in 3m8s
CI / status-check (pull_request) Successful in 3s
2026-07-07 11:23:21 +00:00
Compare
Author
Member

Self-QA Approval

This PR has passed internal self-QA review after 3 review/fix cycles.

Summary

  • tool_agent_class injection is correctly implemented across AgentFactory, Executor, create_executor, and LLMAgent.
  • The parameter is validated fail-fast at construction time.
  • All six dispatch paths forward the injected subclass: _execute_tool, _execute_graph, _execute_graph_stream, _execute_llm, _execute_llm_stream, _execute_multi_actor.
  • Backward compatibility is preserved (default = ToolAgent).
  • No critical or major issues remain.

Quality Gates

Gate Result
format
lint
typecheck (pyright strict) 0 errors
security_scan
unit_tests 2756 scenarios, 0 failures
coverage_report 97.0%
integration_tests 319 passed
CI run #30677 success

Approved for merge. 🚀

## Self-QA Approval This PR has passed internal self-QA review after **3 review/fix cycles**. ### Summary - `tool_agent_class` injection is correctly implemented across `AgentFactory`, `Executor`, `create_executor`, and `LLMAgent`. - The parameter is validated fail-fast at construction time. - All six dispatch paths forward the injected subclass: `_execute_tool`, `_execute_graph`, `_execute_graph_stream`, `_execute_llm`, `_execute_llm_stream`, `_execute_multi_actor`. - Backward compatibility is preserved (default = `ToolAgent`). - No critical or major issues remain. ### Quality Gates | Gate | Result | |------|--------| | format | ✅ | | lint | ✅ | | typecheck (pyright strict) | ✅ 0 errors | | security_scan | ✅ | | unit_tests | ✅ 2756 scenarios, 0 failures | | coverage_report | ✅ 97.0% | | integration_tests | ✅ 319 passed | | CI run #30677 | ✅ success | Approved for merge. 🚀
hurui200320 force-pushed feature/m1-tool-agent-class-injection from 0646b3e958
All checks were successful
CI / lint (pull_request) Successful in 34s
CI / typecheck (pull_request) Successful in 50s
CI / security (pull_request) Successful in 49s
CI / quality (pull_request) Successful in 33s
CI / unit_tests (pull_request) Successful in 3m6s
CI / integration_tests (pull_request) Successful in 1m7s
CI / build (pull_request) Successful in 33s
CI / coverage (pull_request) Successful in 3m8s
CI / status-check (pull_request) Successful in 3s
to 9ec578f229
All checks were successful
CI / lint (pull_request) Successful in 44s
CI / typecheck (pull_request) Successful in 49s
CI / security (pull_request) Successful in 47s
CI / quality (pull_request) Successful in 33s
CI / unit_tests (pull_request) Successful in 3m4s
CI / integration_tests (pull_request) Successful in 1m2s
CI / build (pull_request) Successful in 33s
CI / coverage (pull_request) Successful in 3m5s
CI / status-check (pull_request) Successful in 2s
CI / lint (push) Successful in 31s
CI / typecheck (push) Successful in 46s
CI / security (push) Successful in 46s
CI / quality (push) Successful in 31s
CI / unit_tests (push) Successful in 3m2s
CI / integration_tests (push) Successful in 1m2s
CI / build (push) Successful in 31s
CI / coverage (push) Successful in 3m4s
CI / status-check (push) Successful in 6s
2026-07-08 09:23:35 +00:00
Compare
hurui200320 deleted branch feature/m1-tool-agent-class-injection 2026-07-08 09:44:17 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
cleveragents/cleveractors-core!74
No description provided.