- Switch SkillBoxFactory to SkillToolResolver, which resolves tool classes from
the framework container (enabling DI) and falls back to no-arg reflection,
resolving tools per AgentSkill instead of by name.
- Remove the obsolete SkillToolManifest.
- Move ReActAgentComponentTest from liteflow-react-agent-core to
liteflow-testcase-el per the test-placement convention.
- Drop the temporary surefire skipTests=false override in react-agent-core.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add ChatUsageTrackingHook that accumulates ChatUsage from every
PostReasoningEvent within a single process() call, expose it via
ReActAgentContext#getChatUsage(), and emit a per-step usage line in
ReActLoggingHook. The hook is cached on AgentSession and reset at the
start of each process() so the snapshot reflects the full invocation
(not just the last reasoning step).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add DEFAULT_SYSTEM_PROMPT and effectiveSystemPrompt() to ReActAgentComponent
- Block unsupported shell syntax (pipes, redirections, chaining) in ManagedShellCommandTool
- Fix process I/O to prevent hangs when command waits for stdin
- Fix missing sessionId in ReActLoggingHook result log line
- Introduce FakeEchoModel for deterministic local testing
- Add unit tests for ReActAgentComponent, ReActLoggingHook, and shell syntax rejection
- Remove LiveTestSupport credential skip calls from feature tests
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Update all calling sites of truncate() method to pass the max length
parameter as required by the updated method signature.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The truncate method now accepts a maxLen parameter instead of using
the hardcoded MAX_TEXT_LEN constant. This allows different types of
content to use different truncation lengths. Note: calling sites will
need to be updated to pass the maxLen parameter.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Pass the ReAct agent context workspace directory through SkillBoxFactory
so SkillBox's code execution runs against the conversation workspace
instead of the process default.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Introduce FlowEvent/FlowEventListener/FlowEventPublisher on the Slot so
callers can subscribe via ExecuteOption.eventListener and receive
incremental events while a chain is running. ReActAgentComponent wires
agentscope reasoning/tool_result/summary/result events into this channel
when a listener is registered, keeping the non-listener path as a plain
blocking call.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Subscribe to agentscope Pre/PostReasoningEvent, Pre/PostActingEvent
and ErrorEvent through a new ReActLoggingHook, surfacing the agent's
internal think-act loop in standard logs. Each line carries the
LiteFlow agent sessionId so concurrent sessions stay distinguishable.
ReActAgentComponent attaches the hook automatically alongside any
user-provided hooks. Toggle via liteflow.agent.logging.react-enabled
(default true) or override enableReActLogging() per component.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The module had hardcoded agentscope:1.0.9 and google-genai:1.0.0,
which conflicted with parent pom's 1.0.11/1.38.0 properties and
caused NoSuchMethodError on Part.thoughtSignature() at runtime.
Use the property placeholders so versions stay centrally managed.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add MemoryStorageConfig/MemoryStorageMode and per-backend configs (Redis, MySQL, workspace file)
- Add AgentSessionFactoryRegistry with NONE, JVM, WORKSPACE_FILE, REDIS, MYSQL implementations
- Add integration test suite with EL-orchestrated Spring Boot tests
- Remove per-module READMEs in favor of unified guide
- Update POMs, CLAUDE.md, AGENTS.md
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ReActAgentComponent now requires subclasses to override model(ctx)
returning a ModelSpec. The legacy buildModel(ctx) becomes a
non-abstract escape hatch with a default implementation delegating
to model(ctx).resolve(agentConfig()).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
DashScope.of(modelName) returns DashScopeSpec with a thinking
sub-builder using DashScope's native budget term.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Gemini.of(modelName) returns GeminiSpec exposing a thinking sub-builder
that supports both Gemini 2.5's level() and the legacy budget() form.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Anthropic.of(modelName) and AnthropicCompatible.custom(configKey,
modelName) return AnthropicSpec, with a thinking sub-builder using
Anthropic's native budget/enabled terms.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
DeepSeek/Kimi/GLM/Minimax static entries with default baseUrls,
plus OpenAICompatible.custom() fallback for arbitrary vendors.
All read credentials from liteflow.agent.openai-compatible.<key>.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
OpenAI.of(modelName) returns an OpenAISpec exposing reasoningEffort,
frequencyPenalty, and presencePenalty in addition to the common
ModelSpec setters; resolve() reads liteflow.agent.openai credential.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Centralizes credential lookup with consistent AgentConfigException
messages that point at the relevant liteflow.agent.* config path.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
resolve() is the framework SPI: ReActAgentComponent (in a different
package) needs to call spec.resolve(cfg), which protected access
does not permit. The test's TestSpec override is widened in lockstep
since Java forbids narrowing visibility on override.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Vendor-neutral model descriptor with common fluent setters
(temperature/topP/topK/maxTokens/seed/stream/cacheControl) and an
abstract resolve(AgentConfig) SPI that provider modules implement.