For the complete documentation index, see llms.txt. This page is also available as Markdown.

v6.0 Development Snapshot (archived)

[!CAUTION] Do not follow anything on this page. It is a frozen snapshot of early v6.0 development, last updated 2026-03-30, kept only so the reasoning behind those decisions stays recoverable.

It names classes that have been renamed (LangchainTaskLlmTask, HttpCallsTaskApiCallsTask), REST paths that have moved, and phase plans that were superseded. It lived at the repository root until it was archived here, which meant AI coding assistants loaded 70 KB of stale identifiers as context on every session.

For anything current:

Completed

Phase 0: Security Quick Wins ✅ (commit 71448a89)

Phase 1, Item 1: Extract ConversationService from RestAgentEngine ✅ (commit 7dd1488e)

Key files:

  • src/main/java/ai/labs/eddi/engine/IConversationService.java

  • src/main/java/ai/labs/eddi/engine/internal/ConversationService.java

  • src/main/java/ai/labs/eddi/engine/internal/RestAgentEngine.java

  • src/test/java/ai/labs/eddi/engine/internal/ConversationServiceTest.java

Phase 1, Item 2: Typed Memory Accessors ✅

Key files:

  • src/main/java/ai/labs/eddi/engine/memory/MemoryKey.java

  • src/main/java/ai/labs/eddi/engine/memory/MemoryKeys.java

  • src/main/java/ai/labs/eddi/engine/memory/IConversationMemory.java

  • src/test/java/ai/labs/eddi/engine/memory/MemoryKeyTest.java

Phase 1, Item 3: Consolidate Configuration Stores ✅ (commit 201c5f99)

Key files:

  • src/main/java/ai/labs/eddi/datastore/mongo/AbstractMongoResourceStore.java

  • src/test/java/ai/labs/eddi/datastore/mongo/AbstractMongoResourceStoreTest.java

Phase 1, Item 4: Centralize REST Error Handling ✅ (commit d4ab62bd)

Key files:

  • src/main/java/ai/labs/eddi/engine/exception/SneakyThrow.java

  • src/main/java/ai/labs/eddi/engine/exception/Resource*ExceptionMapper.java (4 files)

Phase 1, Item 5: Streaming API (SSE endpoint, StreamingChatModel) ✅

Key files:

  • src/main/java/ai/labs/eddi/engine/lifecycle/ConversationEventSink.java

  • src/main/java/ai/labs/eddi/modules/langchain/impl/StreamingLegacyChatExecutor.java

  • src/main/java/ai/labs/eddi/engine/IRestAgentEngineStreaming.java

  • src/main/java/ai/labs/eddi/engine/internal/RestAgentEngineStreaming.java

  • src/test/java/ai/labs/eddi/modules/langchain/impl/StreamingLegacyChatExecutorTest.java

  • src/test/java/ai/labs/eddi/modules/langchain/impl/ChatModelRegistryTest.java

  • src/test/java/ai/labs/eddi/engine/lifecycle/internal/LifecycleManagerStreamingTest.java

Phase 1, Item 6: Decompose LangchainTask

Key files:

  • src/main/java/ai/labs/eddi/modules/langchain/impl/ChatModelRegistry.java

  • src/main/java/ai/labs/eddi/modules/langchain/impl/ConversationHistoryBuilder.java

  • src/main/java/ai/labs/eddi/modules/langchain/impl/LegacyChatExecutor.java

  • src/main/java/ai/labs/eddi/modules/langchain/impl/AgentOrchestrator.java

  • src/main/java/ai/labs/eddi/modules/langchain/impl/LangchainTask.java

Phase 2: Testing Infrastructure ✅ (commit 0956cefd)

Note: EDDI-integration-tests repo is now fully superseded. All tests migrated into main repo.

Phase 3: API Consistency Fixes (N.7) ✅

Key files:

  • IRestAgentAdministration.java, RestAgentAdministration.java — deployment status JSON

  • RestVersionInfo.javadelete(id, version, permanent) overload

  • All 8 IRest*Store interfaces and Rest*Store implementations — ?permanent param

  • All integration tests updated for JSON deployment status

Chat UI Vite Build + Agent Father Enhancements ✅

Phase 5, Items 5.27-5.28: Event Bus Abstraction + NATS JetStream Adapter ✅ (commit e220f4c0)

Key files:

  • src/main/java/ai/labs/eddi/engine/runtime/IEventBus.java

  • src/main/java/ai/labs/eddi/engine/runtime/internal/InMemoryConversationCoordinator.java

  • src/main/java/ai/labs/eddi/engine/runtime/internal/NatsConversationCoordinator.java

  • src/main/java/ai/labs/eddi/engine/runtime/internal/NatsHealthCheck.java

  • src/main/java/ai/labs/eddi/engine/runtime/internal/NatsMetrics.java

  • docker-compose.nats.yml

Phase 5, Item 5.29: Async Conversation Processing ✅

Phase 5, Item 5.30: Coordinator Dashboard + Dead-Letter Admin ✅

Key files (backend):

  • src/main/java/ai/labs/eddi/engine/IRestCoordinatorAdmin.java

  • src/main/java/ai/labs/eddi/engine/internal/RestCoordinatorAdmin.java

  • src/main/java/ai/labs/eddi/engine/model/CoordinatorStatus.java

  • src/main/java/ai/labs/eddi/engine/model/DeadLetterEntry.java

  • src/main/java/ai/labs/eddi/engine/runtime/IConversationCoordinator.java

  • src/main/java/ai/labs/eddi/engine/runtime/internal/InMemoryConversationCoordinator.java

  • src/main/java/ai/labs/eddi/engine/runtime/internal/NatsConversationCoordinator.java

Key files (Manager):

  • src/pages/coordinator.tsx, src/lib/api/coordinator.ts, src/hooks/use-coordinator.ts

Phase 6, Item 6.30: Repository Interface Abstraction ✅ (commit e8d09f77)

Key files (new):

  • src/main/java/ai/labs/eddi/datastore/IResourceStorageFactory.java

  • src/main/java/ai/labs/eddi/datastore/mongo/MongoResourceStorageFactory.java

  • src/main/java/ai/labs/eddi/datastore/AbstractResourceStore.java

  • src/main/java/ai/labs/eddi/datastore/HistorizedResourceStore.java

  • src/main/java/ai/labs/eddi/datastore/ModifiableHistorizedResourceStore.java

Key files (modified):

  • src/main/java/ai/labs/eddi/datastore/mongo/AbstractMongoResourceStore.java — extends AbstractResourceStore, @Deprecated

  • src/main/java/ai/labs/eddi/engine/memory/ConversationMemoryStore.java — added @DefaultBean

Phase 6, Item 6.31: PostgreSQL Adapter ✅

Key files (new):

  • src/main/java/ai/labs/eddi/datastore/postgres/PostgresResourceStorage.java

  • src/main/java/ai/labs/eddi/datastore/postgres/PostgresResourceStorageFactory.java

  • src/main/java/ai/labs/eddi/datastore/postgres/PostgresHealthCheck.java

  • docker-compose.postgres.yml

Key files (migrated):

  • src/main/java/ai/labs/eddi/configs/langchain/mongo/LangChainStore.java

  • src/main/java/ai/labs/eddi/configs/parser/mongo/ParserStore.java

  • src/main/java/ai/labs/eddi/configs/propertysetter/mongo/PropertySetterStore.java

  • src/main/java/ai/labs/eddi/configs/http/mongo/HttpCallsStore.java

  • src/main/java/ai/labs/eddi/configs/behavior/mongo/BehaviorStore.java

  • src/main/java/ai/labs/eddi/configs/output/mongo/OutputStore.java

  • src/main/java/ai/labs/eddi/configs/regulardictionary/mongo/RegularDictionaryStore.java

Phase 6, Item 6.32: Full Store Migration — All Stores DB-Agnostic ✅

Key files (new):

  • src/main/java/ai/labs/eddi/configs/deployment/IDeploymentStorage.java

  • src/main/java/ai/labs/eddi/configs/deployment/mongo/MongoDeploymentStorage.java

  • src/main/java/ai/labs/eddi/datastore/DescriptorStore.java

  • src/main/java/ai/labs/eddi/datastore/postgres/PostgresDeploymentStorage.java

  • src/main/java/ai/labs/eddi/datastore/postgres/PostgresConversationMemoryStore.java

Key files (modified):

  • AgentStore.java, WorkflowStore.java — extends AbstractResourceStore

  • DeploymentStore.java — thin delegate to IDeploymentStorage

  • DocumentDescriptorStore.java, ConversationDescriptorStore.java, TestCaseDescriptorStore.java — use IResourceStorageFactory

  • IResourceStorage.java, MongoResourceStorage.java, PostgresResourceStorage.java — new query methods

Phase 6A: MongoDB Sync Driver Migration ✅

Phase 6B: PostgreSQL Integration Test Parity ✅ (commit 0eda70d9, e77b6f23)

Key files:

  • src/main/java/ai/labs/eddi/utils/RestUtilities.javaisValidId() UUID fix

  • src/main/java/ai/labs/eddi/engine/runtime/rest/interceptors/DocumentDescriptorFilter.javaisResourceIdValid guard

  • src/main/java/ai/labs/eddi/modules/templating/impl/dialects/uuid/UUIDWrapper.javaextractId/extractVersion

  • src/main/resources/initial-agents/Agent+Father-4.0.0.zip — re-zipped with updated httpcalls

  • src/test/java/ai/labs/eddi/integration/PostgresIntegrationTestProfile.java — PG test profile

  • src/test/java/ai/labs/eddi/integration/postgres/ — 8 PG IT subclasses

  • src/test/java/ai/labs/eddi/integration/AgentUseCaseIT.java — stale trigger cleanup

  • docs/output-templating.md#uuidUtils documentation

Agent Lifecycle API: Cascade Delete + Orphan Detection ✅

Key files (new):

  • src/main/java/ai/labs/eddi/configs/admin/model/OrphanInfo.java

  • src/main/java/ai/labs/eddi/configs/admin/model/OrphanReport.java

  • src/main/java/ai/labs/eddi/configs/admin/IRestOrphanAdmin.java

  • src/main/java/ai/labs/eddi/configs/admin/rest/RestOrphanAdmin.java

  • src/test/java/ai/labs/eddi/configs/admin/rest/RestOrphanAdminTest.java

  • src/test/java/ai/labs/eddi/configs/agents/rest/RestAgentStoreTest.java

  • src/test/java/ai/labs/eddi/configs/packages/rest/RestWorkflowStoreTest.java

Key files (modified):

  • IRestAgentStore.java, RestAgentStore.java — cascade + shared-resource check

  • IRestWorkflowStore.java, RestWorkflowStore.java — cascade + shared-resource check

  • IResourceClientLibrary.java, ResourceClientLibrary.javadeleteResource method

  • docs/deployment-management-of-agents.md — deletion + orphan docs

Phase 6C: Infinispan → Caffeine ✅

Key files:

  • src/main/java/ai/labs/eddi/engine/caching/CacheFactory.java — rewritten

  • src/main/java/ai/labs/eddi/engine/caching/CacheImpl.java — rewritten

  • pom.xml — 4 deps removed, caffeine via quarkus-cache

  • src/main/resources/infinispan-embedded.xml — deleted

  • src/main/resources/application.properties — cleaned

Phase 6E: quarkus-langchain4j → langchain4j Core ✅

Key files:

  • pom.xml — 6 deps removed, 7 added, version properties updated

  • src/main/java/.../impl/ObservableChatModel.javaNEW provider-agnostic timeout + logging decorator

  • src/main/java/.../impl/ChatModelRegistry.java — wires ObservableChatModel

  • src/main/java/.../builder/VertexGeminiLanguageModelBuilder.java — rewritten

  • src/main/java/.../builder/HuggingFaceLanguageModelBuilder.java — rewritten

  • src/main/java/.../builder/JlamaLanguageModelBuilder.java — updated

  • src/test/java/.../impl/ObservableChatModelTest.javaNEW 19 tests

  • src/test/java/.../impl/ChatModelRegistryTest.java — 5 new observability tests

Phase 6D: Lombok Removal ✅ (commit ca3e45da)

Phase 7, Item 33: Secrets Vault — Security Remediation ✅

Key files (new):

  • src/main/java/ai/labs/eddi/secrets/ — model, crypto, sanitize, rest packages

  • src/test/java/ai/labs/eddi/secrets/ — EnvelopeCryptoTest, SecretResolverTest, SecretRedactionFilterTest, SecretScrubberTest, SecretReferenceTest

  • docs/secrets-vault.md — full feature documentation

Key files (modified):

  • PropertySetterTask.java — secret scope auto-vault, removed dead secretResolver

  • HttpCallExecutor.java — header scrubbing, vault ref resolution

  • RestExportService.java — export sanitization

  • OutputConfiguration.java + 6 OutputItem subclasses — Lombok bug fixes

Phase 7, Item 34: Immutable Audit Ledger — EU AI Act Compliance ✅

Key files (new):

  • src/main/java/ai/labs/eddi/engine/audit/model/AuditEntry.java

  • src/main/java/ai/labs/eddi/engine/audit/IAuditStore.java

  • src/main/java/ai/labs/eddi/engine/audit/IAuditEntryCollector.java

  • src/main/java/ai/labs/eddi/engine/audit/AuditHmac.java

  • src/main/java/ai/labs/eddi/engine/audit/AuditLedgerService.java

  • src/main/java/ai/labs/eddi/engine/audit/AuditStore.java (MongoDB)

  • src/main/java/ai/labs/eddi/datastore/postgres/PostgresAuditStore.java (PostgreSQL)

  • src/main/java/ai/labs/eddi/engine/audit/rest/IRestAuditStore.java

  • src/main/java/ai/labs/eddi/engine/audit/rest/RestAuditStore.java

  • src/test/java/ai/labs/eddi/engine/audit/AuditLedgerServiceTest.java

  • docs/audit-ledger.md

Key files (modified):

  • IConversationMemory.java / ConversationMemory.javagetAuditCollector / setAuditCollector

  • LifecycleManager.javabuildAuditEntry() + audit hook

  • ConversationService.java — injected AuditLedgerService, environment-enriched audit collector

  • LangchainTask.java — writes audit:* memory keys after each LLM call

  • LangchainTaskTest.java — updated storeData expected counts

  • ConversationServiceTest.java — updated constructor

Scheduled Triggers & Heartbeats ✅

Two trigger types on a shared engine:

Trigger
Config
Default Strategy
Next Fire Logic

CRON

cronExpression (5-field)

new (fresh conversation per fire)

Recomputed from cron

HEARTBEAT

heartbeatIntervalSeconds

persistent (single conversation)

now + interval (drift-proof)

Exactly-once execution: Atomic CAS via MongoDB findOneAndUpdate with PENDING + nextRetryAt ≤ now guards. Dead-lettering after configurable maxRetries with exponential backoff (base × multiplier^failCount).

Engine flow: SchedulePollerService.poll()tryClaim()ScheduleFireExecutor.fire()ConversationService.say()markCompleted() / markFailed() / markDeadLettered()

MCP tools (6): create_schedule, list_schedules, read_schedule, delete_schedule, fire_schedule_now, retry_failed_schedule

Key files:

  • src/main/java/ai/labs/eddi/configs/schedule/model/ScheduleConfiguration.javaTriggerType, FireStatus enums

  • src/main/java/ai/labs/eddi/configs/schedule/mongo/MongoScheduleStore.java — CAS, atomic ops, epoch-millis

  • src/main/java/ai/labs/eddi/engine/runtime/internal/SchedulePollerService.java — poll + claim + backoff

  • src/main/java/ai/labs/eddi/engine/runtime/internal/ScheduleFireExecutor.java — fire + context injection

  • src/main/java/ai/labs/eddi/configs/schedule/rest/RestScheduleStore.java — REST + validation

  • src/main/java/ai/labs/eddi/engine/mcp/McpAdminTools.java — 6 schedule MCP tools

  • Tests: SchedulePollerServiceTest (12), ScheduleFireExecutorTest (9), RestScheduleStoreTest (13), McpScheduleToolsTest (21), CronParserTest (16), CronDescriberTest (8)

Configuration (application.properties):

Agent ↔ Schedule Lifecycle Hooks:

Agent Event
Schedule Effect
Where

Deploy

Auto-enable all disabled schedules for agentId

RestAgentAdministration.enableSchedulesForAgent()

Undeploy

Auto-disable all enabled schedules for agentId

RestAgentAdministration.disableSchedulesForAgent()

Delete (cascade)

Delete all schedules for agentId (before package cascade)

RestAgentStore.deleteAgent()scheduleStore.deleteSchedulesByAgentId()

Export

Include schedules as {id}.schedule.json in export ZIP

RestExportService.exportSchedules()

All hooks are non-fatal — if schedule operations fail, the primary agent operation still succeeds (logged as warning).

EDDI Manager: No schedule UI yet. Backend REST API + MCP tools are the only interfaces.

Phase 10: Group Conversations — Multi-Agent Debate Orchestration ✅

Phase-based orchestration engine enabling structured multi-agent discussions with 6 preset styles, nested group-of-groups support, and moderator synthesis.

Sub-Phase
Deliverables

10.1 Data Models + Stores

AgentGroupConfiguration, GroupConversation, group/conversation stores (DB-agnostic)

10.2 Orchestration Service

GroupConversationService (~680 lines) — phases, context scoping, templates

10.3 REST + SSE + MCP

REST endpoints, SSE streaming, McpGroupTools (9 tools)

10.5 Discussion Styles

DiscussionPhase, DiscussionStylePresets — 6 styles + custom phases

10.5b MCP/REST Usability

describe_discussion_styles, list_group_conversations, GET /styles

10.6 Group-of-Groups

MemberType.GROUP, recursive executeGroupMemberTurn(), memberTypes param

Discussion styles: ROUND_TABLE, PEER_REVIEW, DEVIL_ADVOCATE, DELPHI, DEBATE, TASK_FORCE (+ fully custom phases)

Group-of-Groups: Members can be other groups — sub-group synthesized answer becomes member's response. Depth tracking prevents infinite recursion (eddi.groups.max-depth, default: 3).

Tests: 58 total

  • GroupConversationServiceTest (17) — orchestration, all styles, recursion, error handling

  • McpGroupToolsTest (22) — MCP tool layer

  • DiscussionStylePresetsTest (19) — style expansion

Key files:

  • src/main/java/ai/labs/eddi/configs/groups/model/AgentGroupConfiguration.java

  • src/main/java/ai/labs/eddi/configs/groups/model/GroupConversation.java

  • src/main/java/ai/labs/eddi/configs/groups/model/DiscussionStylePresets.java

  • src/main/java/ai/labs/eddi/engine/internal/GroupConversationService.java

  • src/main/java/ai/labs/eddi/engine/mcp/McpGroupTools.java

  • src/test/java/ai/labs/eddi/engine/internal/GroupConversationServiceTest.java

Templating Engine Migration: Thymeleaf → Quarkus Qute ✅

Replaced Thymeleaf 3.1.3 + OGNL 3.3.4 with Quarkus Qute for native image compatibility and CVE remediation.

Component
Key Files

Core Engine

TemplatingEngine.java — Qute Engine API with null-safety

Extensions

EddiTemplateExtensions.java (UUID, JSON, Encoder namespaces), StringTemplateExtensions.java (15 String methods)

Migrator

TemplateSyntaxMigrator.java — 10 regex patterns + close-tag scanner + string concat handler

Startup Migration

V6QuteMigration.java — idempotent startup hook for 4 MongoDB collections (apicalls, outputs, propertysetter, llms + history)

Import Migration

RestImportService.javaTemplateSyntaxMigrator wired as final-pass before deserialization

Migration patterns: [[${var}]]{var}, th:each{#for}, th:if{#if}, #strings.* → native method calls, #uuidUtils./#json./#encoder. → namespace, a + '/' + b{a}/{b}.

Consumers updated: McpApiToolBuilder, AgentSetupService, DiscussionStylePresets (10 templates), PrePostUtils, ChatModelRegistry, MigrationManager.

Tests: TemplatingEngineTest (20), TemplateSyntaxMigratorTest (29), OutputTemplateTaskTest (2), McpApiToolBuilderTest (14), CreateApiAgentIT (10).

Docs updated: output-templating.md (full rewrite), architecture.md, httpcalls.md, conversation-memory.md, agent-father-deep-dive.md, changelog.md.

Config:

Key files:

  • src/main/java/ai/labs/eddi/modules/templating/impl/TemplatingEngine.java

  • src/main/java/ai/labs/eddi/modules/templating/impl/extensions/EddiTemplateExtensions.java

  • src/main/java/ai/labs/eddi/modules/templating/impl/extensions/StringTemplateExtensions.java

  • src/main/java/ai/labs/eddi/configs/migration/TemplateSyntaxMigrator.java

  • src/main/java/ai/labs/eddi/configs/migration/V6QuteMigration.java

  • src/main/java/ai/labs/eddi/backup/impl/RestImportService.java

  • src/test/java/ai/labs/eddi/configs/migration/TemplateSyntaxMigratorTest.java

  • src/test/java/ai/labs/eddi/modules/templating/TemplatingEngineTest.java

  • docs/output-templating.md

A2A Protocol: Agent-to-Agent Communication ✅

Implements the A2A protocol for distributed peer-to-peer agent communication.

Component
Key Files

A2A Models

A2AModels.java — Protocol records (AgentCard, JSON-RPC, Task, Artifact)

Server

AgentCardService.java — Agent Card generation from AgentConfiguration

A2ATaskHandler.java — JSON-RPC → ConversationService.say() bridge

RestA2AEndpoint.java/.well-known/agent.json, /a2a/agents/{id}

Client

A2AToolProviderManager.java — Discovers remote agents, wraps skills as ToolSpecification

Config

AgentConfigurationa2aEnabled, a2aSkills, description

LlmConfiguration.Taska2aAgents[] with A2AAgentConfig

Integration

AgentOrchestrator + LlmTask — A2A tools merge with built-in/MCP/httpcall tools

Config properties:

Security: API keys must use vault references (${vault:my-key}). Runtime warning on raw key usage.

Documentation: docs/a2a-protocol.md

Multi-Model Cascading Routing ✅ (commit 514821d4)

Cost-optimized LLM execution via sequential model escalation with confidence-based routing.

Key files:

  • src/main/java/ai/labs/eddi/modules/llm/impl/CascadingModelExecutor.java (NEW)

  • src/main/java/ai/labs/eddi/modules/llm/impl/ConfidenceEvaluator.java (NEW)

  • src/main/java/ai/labs/eddi/modules/llm/model/LlmConfiguration.java

  • src/main/java/ai/labs/eddi/engine/lifecycle/ConversationEventSink.java

  • src/main/java/ai/labs/eddi/modules/llm/impl/LlmTask.java

  • docs/model-cascade.md

LLM Structured Output Hardening ✅

Production-grade reliability for LLM structured JSON output via three-layer defense:

Layer
Mechanism

System Prompt

## RESPONSE FORMAT (MANDATORY) section appended when convertToObject=true. Includes exact schema if responseSchema parameter provided

API Level

ChatRequest.responseFormat(ResponseFormatType.JSON) for providers that support it (OpenAI, Gemini, Mistral). Graceful fallback for unsupported providers

Validation

Pre-parse startsWith("{") check before deserialize(). Non-JSON stored as plain string with warning

Additional fixes:

Key files:

  • LlmTask.java — prompt reinforcement, raw storage, JSON validation, responseSchema param

  • LegacyChatExecutor.javaChatRequest with ResponseFormat.JSON + graceful fallback

  • ToolExecutionService.java — per-tool tagged metrics only

  • InputParserTask.java — blank expression guard

Tests: All 17 LlmTask tests pass. Compile verified.

Next Up

Quick Wins

Phase 7 (continued)

Phase 8a: MCP Servers ✅ (commits 1553b40e, b9a9c5e1, latest)

Key files:

  • src/main/java/ai/labs/eddi/engine/mcp/McpConversationTools.java

  • src/main/java/ai/labs/eddi/engine/mcp/McpAdminTools.java

  • src/main/java/ai/labs/eddi/engine/mcp/McpSetupTools.java

  • src/main/java/ai/labs/eddi/engine/mcp/McpApiToolBuilder.java

  • src/main/java/ai/labs/eddi/engine/mcp/McpToolUtils.java

  • src/test/java/ai/labs/eddi/engine/mcp/McpSetupToolsTest.java (+ 3 other test files)

  • src/test/java/ai/labs/eddi/integration/CreateApiAgentIT.java

  • docs/mcp-server.md

Phase 8a (continued): MCP Code Review, Resource Tools, Docs MCP Resources ✅

Key files (new):

  • src/main/java/ai/labs/eddi/engine/mcp/McpDocResources.java

Key files (modified):

  • McpConversationTools.java — N+1 fix, ConversationState import, removed unused import

  • McpAdminTools.java — simplified update_agent, added read_package + read_resource

  • McpToolUtils.java — shared getRestStore()

  • McpSetupTools.java — delegate getRestStore(), removed unused import

  • McpToolFilter.java — whitelist 18→20, added missing imports

  • Dockerfile.jvm — docs COPY + eddi.docs.path

  • docs/mcp-server.md — rewritten

Phase 8: MCP + RAG Foundation

Phase 8c: RAG Foundation ✅ (commit f10c0611)

Config-driven knowledge base retrieval integrated into the LLM pipeline. Knowledge bases are first-class versioned resources with full CRUD, embedding model caching, vector store isolation, and automatic context injection.

Component
Files
Description

Resource Stack

RagConfiguration, IRagStore, RagStore, IRestRagStore, RestRagStore

Full CRUD at /ragstore/rags/, MongoDB collection rags

LLM Config

LlmConfiguration.java

knowledgeBases, enableWorkflowRag, ragDefaults, httpCallRag

Embedding Factories

EmbeddingModelFactory, EmbeddingStoreFactory

Cached model/store creation with secret resolution

Runtime

RagContextProvider

Workflow discovery, retrieval, formatting, audit trace

Ingestion

RagIngestionService

Virtual-thread async ingestion with Caffeine status tracking

Integration

LlmTask.java

RAG context injection before LLM message building

Tests: RestRagStoreTest, EmbeddingModelFactoryTest, EmbeddingStoreFactoryTest, RagContextProviderTest, updated LlmTaskTest.

Documentation: docs/rag.md

Sub-phases completed:

  • ✅ Phase 8c-0: httpCall-based RAG — LlmTask.executeHttpCallRag(), audit trace, graceful failure

  • ✅ Phase 8c-β: pgvector persistent vector store — EmbeddingStoreFactory.buildPgVector(), SecretResolver, sanitizeTableName()

  • ✅ Phase 8c-γ: RAG provider expansion — 7 embedding models (openai, azure-openai, ollama, mistral, bedrock, cohere, vertex) + 5 vector stores (in-memory, pgvector, mongodb-atlas, elasticsearch, qdrant) + REST ingestion endpoint (POST /{id}/ingest, GET /{id}/ingestion/{ingestionId}/status)

  • Remaining: Manager UI RAG editor (Phase 13)

Phase 8a.2: MCP Resource CRUD + Batch Cascade ✅

5 new MCP tools for full resource lifecycle management:

Tool
Description

update_resource

Update any resource config (behavior, langchain, etc.) → returns new version URI

create_resource

Create a new resource → returns ID + URI

delete_resource

Delete a resource (soft or permanent)

apply_agent_changes

Batch-cascade multiple resource URI changes through package → agent in ONE pass, optional redeploy

list_agent_resources

Walk agent → packages → extensions to get a complete resource inventory in one call

Key files:

  • McpAdminTools.java — 5 new tools, getRestStore() shared helper

  • McpToolFilter.java — whitelist 20 → 27

  • McpAdminToolsCrudTest.java — 22 new tests

  • docs/mcp-server.md — updated

Phase 8a.3: Agent Discovery & Managed Conversations ✅ (commit 4ed7bce8)

6 new MCP tools for agent discovery and intent-based managed chat:

Tool
Description

discover_agents

Enriched agent list with intent cross-referencing from AgentTriggerConfiguration

chat_managed

Intent-based single-window conversations (one conv per intent+userId, auto-creates)

list_agent_triggers

List all intent→agent mappings

create_agent_trigger

Create intent-to-agent trigger

update_agent_trigger

Update existing trigger

delete_agent_trigger

Remove trigger by intent

Key design: Two-tier conversation model — low-level (create_conversation + talk_to_agent) for custom apps, managed (chat_managed) for single-window chat.

Key files:

  • McpConversationTools.javadiscover_agents + chat_managed + getOrCreateManagedConversation helper

  • McpAdminTools.java — 4 trigger CRUD tools

  • McpToolFilter.java — whitelist 27 → 33

  • McpConversationToolsTest.java — 7 new tests

  • McpAdminToolsCrudTest.java — 7 new tests

  • docs/mcp-server.md — comprehensive Tool Reference section (parameter tables, response schemas, end-to-end examples)

Live test results: All 6 tools tested against running backend — discover_agents (80 agents, filter works), triggers CRUD (create/update/delete), chat_managed (conversation auto-created, reused on follow-up).

Phase 8b: MCP Client + Quarkus 3.32.4 ✅

Agents can now consume external MCP servers as tool providers. Upgraded Quarkus to 3.32.4.

Component
Change

POM

Added langchain4j-mcp 1.12.2-beta22, upgraded Quarkus 3.30.8 → 3.32.4

McpToolProviderManager

NEW — StreamableHttpMcpTransport, connection caching, vault-ref, graceful errors

AgentOrchestrator

MCP tools merged into tool-calling loop with budget/rate-limiting

LangChainConfiguration

Added mcpServers + McpServerConfig (url, name, transport, apiKey, timeoutMs)

McpSetupTools

mcpServers param on setup_agent tool

Test results: 1045 tests, 0 failures. McpToolProviderManagerTest (8 tests), updated AgentOrchestratorTest + LangchainTaskTest + McpSetupToolsTest (21 calls). Also fixed pre-existing AgentFactoryTest failure.

Key files:

  • McpToolProviderManager.java (NEW)

  • McpToolProviderManagerTest.java (NEW)

  • AgentOrchestrator.java

  • LangChainConfiguration.java (McpServerConfig)

  • McpSetupTools.java

  • pom.xml

Httpcall Auto-Discovery from Workflow ✅

Agents now auto-discover httpcall configurations from their workflow and expose them as LLM tools at runtime. No version-coupled tools[] array needed in LLM configuration.

Key design: AgentOrchestrator.discoverHttpCallTools() traverses agent → workflow → httpcall steps at execution time. Uses direct IRestAgentStore/IRestWorkflowStore reads (not ResourceClientLibrary, which lacks agent/workflow URI mappings).

Config: enableHttpCallTools defaults to true in LlmConfiguration.Task. Not a standalone agent-mode trigger — only activates when agent mode is already triggered by tools, builtInTools, or mcpServers.

Key files:

  • src/main/java/ai/labs/eddi/modules/llm/impl/AgentOrchestrator.javadiscoverHttpCallTools(), HttpCallToolsResult

  • src/main/java/ai/labs/eddi/modules/llm/impl/LlmTask.java — injects stores into AgentOrchestrator

  • src/main/java/ai/labs/eddi/modules/llm/model/LlmConfiguration.javaenableHttpCallTools field

  • src/test/java/ai/labs/eddi/modules/llm/impl/AgentOrchestratorTest.java — 7 new tests (30 total)

See AGENTS.md for the full roadmap (Phases 7–14b) and docs/project-philosophy.md for the 9 architectural pillars.

LLM Provider Expansion: 7 → 12 Providers ✅

Expanded EDDI from 7 to 12 model providers for enterprise completeness. 4 new ILanguageModelBuilder implementations plus OpenAI baseUrl for compatible services.

Provider
Builder
Auth Pattern
Streaming

Mistral AI

MistralAiLanguageModelBuilder

apiKey

Azure OpenAI

AzureOpenAiLanguageModelBuilder

apiKey + endpoint + deploymentName

Amazon Bedrock

BedrockLanguageModelBuilder

AWS credential chain (no apiKey)

Oracle GenAI

OracleGenAiLanguageModelBuilder

OCI config (~/.oci/config)

❌ sync-only

Downstream integration:

  • AgentSetupService: isLocalLlmProvider (bedrock, oracle-genai bypass apiKey), supportsResponseFormat (mistral, azure-openai), createLlmConfig (provider-specific param mapping)

  • McpSetupTools: @ToolArg docs list all 11 provider types

  • LlmModule: 4 new type keys registered

API corrections (code review):

  • Bedrock: temperature()/maxTokens() don't exist on builder → uses defaultRequestParameters(BedrockChatRequestParameters)

  • Oracle GenAI: package dev.langchain4j.community.model.oracle.oci.genai (not .model.oci.genai), uses modelName (not modelId)

Key files:

  • src/main/java/ai/labs/eddi/modules/llm/impl/builder/MistralAiLanguageModelBuilder.java (NEW)

  • src/main/java/ai/labs/eddi/modules/llm/impl/builder/AzureOpenAiLanguageModelBuilder.java (NEW)

  • src/main/java/ai/labs/eddi/modules/llm/impl/builder/BedrockLanguageModelBuilder.java (NEW)

  • src/main/java/ai/labs/eddi/modules/llm/impl/builder/OracleGenAiLanguageModelBuilder.java (NEW)

  • src/main/java/ai/labs/eddi/modules/llm/bootstrap/LlmModule.java

  • src/main/java/ai/labs/eddi/engine/setup/AgentSetupService.java

  • src/main/java/ai/labs/eddi/engine/mcp/McpSetupTools.java

  • src/test/java/ai/labs/eddi/engine/mcp/McpSetupToolsTest.java — 11 new test cases

  • docs/langchain.md — all 12 providers documented with config examples

  • docs/changelog.md — full entry with design decisions

Platform Remediation: Thread Safety, A2A Hardening, Code Quality & Audit DLQ ✅

Critical architectural fixes from thorough v6 feature review. 12 files modified, 1 new file.

Change
Details

Virtual threads

CascadingModelExecutor + GroupConversationService — replaced CachedThreadPool

A2A security

@Authenticated POST, circuit breaker, 1MB limit, JSON-RPC validation

Code quality

WorkflowTraversal DRY, JsonStringEncoder escaping, maxToolIterations, isRetryableError HTTP status codes

Observability

Audit dead-letter: NATS JetStream first (eddi.deadletter.audit), file fallback (configurable eddi.audit.dead-letter-path)

Tests

1291 total (1289 pass, 2 pre-existing isolation failures)

One-Command Install & Onboarding Wizard ✅

New users can set up EDDI with curl ... | bash (Linux/macOS/WSL) or download-and-run install.ps1 (Windows). Interactive 5-step wizard.

File
Description

install.sh

Bash installer: platform-aware Docker install, DB/Security/Auth/Monitoring/Ports wizard, eddi CLI wrapper, Agent Father import

install.ps1

PowerShell installer: winget Docker Desktop auto-install, same wizard flow

docker-compose.postgres-only.yml

PostgreSQL-only compose (no MongoDB)

docker-compose.auth.yml

Keycloak overlay

docker-compose.monitoring.yml

Grafana + Prometheus overlay (placeholder)

README.md

Quick Start section

docs/getting-started.md

Option 0 — one-command install

Vault security: Step 2/5 generates a unique, cryptographically random vault master key (or accepts a custom passphrase). The key is stored in ~/.eddi/.env (chmod 600 / ACL-restricted) and passed to Docker Compose via --env-file. All compose files use ${EDDI_VAULT_MASTER_KEY:-} variable substitution — no hardcoded keys.

Edge cases handled: Idempotent re-runs (preserves existing vault key), CTRL+C cleanup, piped stdin (curl|bash auto-generates key), disk space warning, input validation, macOS wc -l whitespace, Docker auto-install (Linux/Windows), macOS-compatible sed (no grep -oP).

Phase 11a: Persistent User Memory ✅

Cross-conversation, agent-scoped fact retention with LLM tools, REST API, MCP management, and background consolidation.

Component
Key Files

Data Model

UserMemoryEntry.java, Property.java (Visibility enum)

Unified Store

IUserMemoryStore.java, MongoUserMemoryStore.java, PostgresUserMemoryStore.java

Agent Config

AgentConfiguration.java (UserMemoryConfig, Guardrails, DreamConfig)

LLM Tool

UserMemoryTool.java (@Vetoed, 4 tools: remember/recall/search/forget)

REST API

IRestUserMemoryStore.java, RestUserMemoryStore.java (9 endpoints + validation)

MCP Tools

McpMemoryTools.java (8 tools, GDPR-compliant)

Dream

DreamService.java (stale pruning, contradiction detection, LLM-driven summarization, Micrometer metrics)

Integration

AgentOrchestrator.java (groupId extraction), GroupConversationService.java (groupId context)

Docs

docs/user-memory.md, docs/changelog.md, docs/SUMMARY.md

Tests

107 new: UserMemoryToolTest (16), DreamServiceTest (51), UserMemoryEntryTest (22), RestUserMemoryStoreTest (15), SummarizationServiceTest (3 new)

Total tests: 1406 (all pass). Last commit: Phase 11a code review fixes.

Properties Consolidation: IPropertiesStoreIUserMemoryStore

Eliminated the legacy properties collection and unified all user-scoped persistent storage into usermemories. Removes a redundant storage layer.

Change
Details

Deleted

IPropertiesStore.java, PropertiesStore.java (Mongo), PostgresPropertiesStore.java

Renamed

enableUserMemoryenableMemoryTools (gates advanced tools only, not basic persistence)

Conversation.java

Consolidated dual load/store into single unified flow via IUserMemoryStore

REST preserved

RestPropertiesStore delegates to IUserMemoryStore flat property methods

Migration

PropertiesMigrationService (MongoDB startup migration, @IfBuildProfile("!postgres"))

Code review fixes (commit 7997da96):

  • Bug: Removed dead DELETE FROM properties in Postgres GDPR delete

  • Bug: Guarded PropertiesMigrationService with @IfBuildProfile("!postgres") (was @DefaultBean)

  • Fix: Added List type handling to Conversation.entryToProperty()

  • Fix: IPropertiesHandler javadoc consistency

  • Cleanup: Moved redundant set(FIELD_VISIBILITY) to setOnInsert in MongoDB merge

Docs updated: docs/user-memory.md, docs/changelog.md

Phase 11b: Token-Aware Conversation Window (Strategy 1) ✅

Config-driven token-budget windowing with anchored opening steps, replacing fixed step-count limits for LLM context management.

Component
Key Files

Config

LlmConfiguration.java (maxContextTokens, anchorFirstSteps fields)

Token Counting

TokenCounterFactory.java (OpenAI tiktoken + approximate chars/4 fallback)

Window Builder

ConversationHistoryBuilder.java (buildTokenAwareMessages() — anchor + gap marker + recent)

Integration

LlmTask.java (branch: token-aware vs step-count based on config)

Docs

docs/langchain.md (new "Conversation Window Management" section)

Tests

TokenCounterFactoryTest.java (20 tests), ConversationHistoryBuilderTest.java (+16 token-aware tests), LlmTaskTest.java (updated constructor)

Design: maxContextTokens=-1 (default) preserves existing step-count behavior. When set > 0, first N steps are anchored, remaining budget filled from most recent backward, gap marker inserted for omitted messages.

Code review fixes: Model name resolution (fallback chain: modelName→model→modelId→deploymentName), anchor budget overflow warning + Math.max(0, ...), gap marker shows count not indices, removed dead code, instance-level cache. 9 edge case tests added (empty conversation, anchor clamping, budget overflow, exact boundary, etc.).

Total tests: 1459 (all pass). Last commit: Phase 11b code review fixes.

Phase 11b-S2: Rolling Summary + Conversation Recall Tool ✅

Config-driven rolling summary that compresses older conversation turns into an incremental summary, injected as a context prefix. Includes a built-in LLM tool for drill-back into summarized turns.

Component
Key Files

SummarizationService

SummarizationService.java — stateless LLM summarization via ChatModelRegistry

ConversationSummarizer

ConversationSummarizer.java — incremental engine, self-correcting, conversation-property storage

ConversationRecallTool

ConversationRecallTool.java — built-in @Vetoed tool for LLM drill-back (natural language range parsing)

Config

LlmConfiguration.javaConversationSummaryConfig inner class (provider, model, window, recall limit)

History Builder

ConversationHistoryBuilder.java — summary-aware buildMessages() / buildTokenAwareMessages()

Orchestrator

AgentOrchestrator.java — auto-registers ConversationRecallTool when summary is active

LlmTask

LlmTask.java — summary prefix injection before history build + post-response summarization trigger

Tests

SummarizationServiceTest (5), ConversationSummarizerTest (11), ConversationRecallToolTest (12)

Design: Summaries stored as conversation-scoped properties (conversation:running_summary, conversation:summary_through_step) for O(1) retrieval. Synchronous trigger after LLM response. Self-correcting: if turn N fails, turn N+1 catches up. Defaults: claude-sonnet-4-6 provider, 20 max recall turns, 5 recent window steps.

Total tests: 1471 (all pass).

Important Rules

  • All work on feature/version-6.0.0 branch (never main)

  • Read AGENTS.md for development order and guidelines

  • Read docs/project-philosophy.md for architectural pillars

  • Read docs/v6-planning/ for architecture analysis, changelog, and business logic analysis

  • Commit often with conventional commits

  • Run .\mvnw test before committing

  • Suggest a new conversation when a phase or major item is completed

Last updated

Was this helpful?