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>
Reflect the session management refactor from single sessionId to
(conversationId, agentKey) dual-key: update all hook signatures to
parameterless style with ctx(), add curl/wget to shell whitelist,
and remove obsolete SlotAttachmentTest.
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>
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>
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>
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>