- 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>
The root POM hardcodes skipTests=true in pluginManagement. Override
at module level with ${maven.test.skip} so tests actually execute
when invoked.
Co-Authored-By: Claude Opus 4.8 <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>
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>
Remove the maven-surefire-plugin skipTests=false override in
liteflow-testcase-el-react-agent, leaving the test module to inherit
the parent configuration.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add focused feature suites under react-agent test resources for
conversation/agentKey isolation, compatible-custom platform handshake,
managed shell mode, workspace file tools, skills loading, and a live
platform connectivity probe — each with its own EL chain, properties,
and prepare/record components.
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>
Remove the per-platform model/factory/entry tests and the unit-style
tool/session/component tests; keep a single Spring Boot integration
test that exercises the full ReAct chain against Gemini.
The pruned tests were tightly coupled to the older ModelSpec/Builder
APIs and largely duplicated coverage now provided by the integration
flow plus the new logging hook visibility.
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>
Replaces buildModel(ctx) overrides with model(ctx) returning
DeepSeek/OpenAI/Anthropic/Gemini/DashScope spec instances.
Also updates TestAgent inner classes in ReActAgentComponentTest
and MemoryStoragePersistenceTest.
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.