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 (
LangchainTask→LlmTask,HttpCallsTask→ApiCallsTask), 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:
docs/changelog.md— the authoritative log of changes and decisions
AGENTS.md— how to work in this codebase today
docs/architecture.md— how the system is actually built
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.javasrc/main/java/ai/labs/eddi/engine/internal/ConversationService.javasrc/main/java/ai/labs/eddi/engine/internal/RestAgentEngine.javasrc/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.javasrc/main/java/ai/labs/eddi/engine/memory/MemoryKeys.javasrc/main/java/ai/labs/eddi/engine/memory/IConversationMemory.javasrc/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.javasrc/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.javasrc/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.javasrc/main/java/ai/labs/eddi/modules/langchain/impl/StreamingLegacyChatExecutor.javasrc/main/java/ai/labs/eddi/engine/IRestAgentEngineStreaming.javasrc/main/java/ai/labs/eddi/engine/internal/RestAgentEngineStreaming.javasrc/test/java/ai/labs/eddi/modules/langchain/impl/StreamingLegacyChatExecutorTest.javasrc/test/java/ai/labs/eddi/modules/langchain/impl/ChatModelRegistryTest.javasrc/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.javasrc/main/java/ai/labs/eddi/modules/langchain/impl/ConversationHistoryBuilder.javasrc/main/java/ai/labs/eddi/modules/langchain/impl/LegacyChatExecutor.javasrc/main/java/ai/labs/eddi/modules/langchain/impl/AgentOrchestrator.javasrc/main/java/ai/labs/eddi/modules/langchain/impl/LangchainTask.java
Phase 2: Testing Infrastructure ✅ (commit 0956cefd)
Note:
EDDI-integration-testsrepo 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 JSONRestVersionInfo.java—delete(id, version, permanent)overloadAll 8
IRest*Storeinterfaces andRest*Storeimplementations —?permanentparamAll 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.javasrc/main/java/ai/labs/eddi/engine/runtime/internal/InMemoryConversationCoordinator.javasrc/main/java/ai/labs/eddi/engine/runtime/internal/NatsConversationCoordinator.javasrc/main/java/ai/labs/eddi/engine/runtime/internal/NatsHealthCheck.javasrc/main/java/ai/labs/eddi/engine/runtime/internal/NatsMetrics.javadocker-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.javasrc/main/java/ai/labs/eddi/engine/internal/RestCoordinatorAdmin.javasrc/main/java/ai/labs/eddi/engine/model/CoordinatorStatus.javasrc/main/java/ai/labs/eddi/engine/model/DeadLetterEntry.javasrc/main/java/ai/labs/eddi/engine/runtime/IConversationCoordinator.javasrc/main/java/ai/labs/eddi/engine/runtime/internal/InMemoryConversationCoordinator.javasrc/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.javasrc/main/java/ai/labs/eddi/datastore/mongo/MongoResourceStorageFactory.javasrc/main/java/ai/labs/eddi/datastore/AbstractResourceStore.javasrc/main/java/ai/labs/eddi/datastore/HistorizedResourceStore.javasrc/main/java/ai/labs/eddi/datastore/ModifiableHistorizedResourceStore.java
Key files (modified):
src/main/java/ai/labs/eddi/datastore/mongo/AbstractMongoResourceStore.java— extends AbstractResourceStore, @Deprecatedsrc/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.javasrc/main/java/ai/labs/eddi/datastore/postgres/PostgresResourceStorageFactory.javasrc/main/java/ai/labs/eddi/datastore/postgres/PostgresHealthCheck.javadocker-compose.postgres.yml
Key files (migrated):
src/main/java/ai/labs/eddi/configs/langchain/mongo/LangChainStore.javasrc/main/java/ai/labs/eddi/configs/parser/mongo/ParserStore.javasrc/main/java/ai/labs/eddi/configs/propertysetter/mongo/PropertySetterStore.javasrc/main/java/ai/labs/eddi/configs/http/mongo/HttpCallsStore.javasrc/main/java/ai/labs/eddi/configs/behavior/mongo/BehaviorStore.javasrc/main/java/ai/labs/eddi/configs/output/mongo/OutputStore.javasrc/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.javasrc/main/java/ai/labs/eddi/configs/deployment/mongo/MongoDeploymentStorage.javasrc/main/java/ai/labs/eddi/datastore/DescriptorStore.javasrc/main/java/ai/labs/eddi/datastore/postgres/PostgresDeploymentStorage.javasrc/main/java/ai/labs/eddi/datastore/postgres/PostgresConversationMemoryStore.java
Key files (modified):
AgentStore.java,WorkflowStore.java— extendsAbstractResourceStoreDeploymentStore.java— thin delegate toIDeploymentStorageDocumentDescriptorStore.java,ConversationDescriptorStore.java,TestCaseDescriptorStore.java— useIResourceStorageFactoryIResourceStorage.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.java—isValidId()UUID fixsrc/main/java/ai/labs/eddi/engine/runtime/rest/interceptors/DocumentDescriptorFilter.java—isResourceIdValidguardsrc/main/java/ai/labs/eddi/modules/templating/impl/dialects/uuid/UUIDWrapper.java—extractId/extractVersionsrc/main/resources/initial-agents/Agent+Father-4.0.0.zip— re-zipped with updated httpcallssrc/test/java/ai/labs/eddi/integration/PostgresIntegrationTestProfile.java— PG test profilesrc/test/java/ai/labs/eddi/integration/postgres/— 8 PG IT subclassessrc/test/java/ai/labs/eddi/integration/AgentUseCaseIT.java— stale trigger cleanupdocs/output-templating.md—#uuidUtilsdocumentation
Agent Lifecycle API: Cascade Delete + Orphan Detection ✅
Key files (new):
src/main/java/ai/labs/eddi/configs/admin/model/OrphanInfo.javasrc/main/java/ai/labs/eddi/configs/admin/model/OrphanReport.javasrc/main/java/ai/labs/eddi/configs/admin/IRestOrphanAdmin.javasrc/main/java/ai/labs/eddi/configs/admin/rest/RestOrphanAdmin.javasrc/test/java/ai/labs/eddi/configs/admin/rest/RestOrphanAdminTest.javasrc/test/java/ai/labs/eddi/configs/agents/rest/RestAgentStoreTest.javasrc/test/java/ai/labs/eddi/configs/packages/rest/RestWorkflowStoreTest.java
Key files (modified):
IRestAgentStore.java,RestAgentStore.java— cascade + shared-resource checkIRestWorkflowStore.java,RestWorkflowStore.java— cascade + shared-resource checkIResourceClientLibrary.java,ResourceClientLibrary.java—deleteResourcemethoddocs/deployment-management-of-agents.md— deletion + orphan docs
Phase 6C: Infinispan → Caffeine ✅
Key files:
src/main/java/ai/labs/eddi/engine/caching/CacheFactory.java— rewrittensrc/main/java/ai/labs/eddi/engine/caching/CacheImpl.java— rewrittenpom.xml— 4 deps removed, caffeine via quarkus-cachesrc/main/resources/infinispan-embedded.xml— deletedsrc/main/resources/application.properties— cleaned
Phase 6E: quarkus-langchain4j → langchain4j Core ✅
Key files:
pom.xml— 6 deps removed, 7 added, version properties updatedsrc/main/java/.../impl/ObservableChatModel.java— NEW provider-agnostic timeout + logging decoratorsrc/main/java/.../impl/ChatModelRegistry.java— wires ObservableChatModelsrc/main/java/.../builder/VertexGeminiLanguageModelBuilder.java— rewrittensrc/main/java/.../builder/HuggingFaceLanguageModelBuilder.java— rewrittensrc/main/java/.../builder/JlamaLanguageModelBuilder.java— updatedsrc/test/java/.../impl/ObservableChatModelTest.java— NEW 19 testssrc/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 packagessrc/test/java/ai/labs/eddi/secrets/— EnvelopeCryptoTest, SecretResolverTest, SecretRedactionFilterTest, SecretScrubberTest, SecretReferenceTestdocs/secrets-vault.md— full feature documentation
Key files (modified):
PropertySetterTask.java— secret scope auto-vault, removed dead secretResolverHttpCallExecutor.java— header scrubbing, vault ref resolutionRestExportService.java— export sanitizationOutputConfiguration.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.javasrc/main/java/ai/labs/eddi/engine/audit/IAuditStore.javasrc/main/java/ai/labs/eddi/engine/audit/IAuditEntryCollector.javasrc/main/java/ai/labs/eddi/engine/audit/AuditHmac.javasrc/main/java/ai/labs/eddi/engine/audit/AuditLedgerService.javasrc/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.javasrc/main/java/ai/labs/eddi/engine/audit/rest/RestAuditStore.javasrc/test/java/ai/labs/eddi/engine/audit/AuditLedgerServiceTest.javadocs/audit-ledger.md
Key files (modified):
IConversationMemory.java/ConversationMemory.java—getAuditCollector/setAuditCollectorLifecycleManager.java—buildAuditEntry()+ audit hookConversationService.java— injectedAuditLedgerService, environment-enriched audit collectorLangchainTask.java— writesaudit:*memory keys after each LLM callLangchainTaskTest.java— updated storeData expected countsConversationServiceTest.java— updated constructor
Scheduled Triggers & Heartbeats ✅
Two trigger types on a shared engine:
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.java—TriggerType,FireStatusenumssrc/main/java/ai/labs/eddi/configs/schedule/mongo/MongoScheduleStore.java— CAS, atomic ops, epoch-millissrc/main/java/ai/labs/eddi/engine/runtime/internal/SchedulePollerService.java— poll + claim + backoffsrc/main/java/ai/labs/eddi/engine/runtime/internal/ScheduleFireExecutor.java— fire + context injectionsrc/main/java/ai/labs/eddi/configs/schedule/rest/RestScheduleStore.java— REST + validationsrc/main/java/ai/labs/eddi/engine/mcp/McpAdminTools.java— 6 schedule MCP toolsTests:
SchedulePollerServiceTest(12),ScheduleFireExecutorTest(9),RestScheduleStoreTest(13),McpScheduleToolsTest(21),CronParserTest(16),CronDescriberTest(8)
Configuration (application.properties):
Agent ↔ Schedule Lifecycle Hooks:
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.
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 handlingMcpGroupToolsTest(22) — MCP tool layerDiscussionStylePresetsTest(19) — style expansion
Key files:
src/main/java/ai/labs/eddi/configs/groups/model/AgentGroupConfiguration.javasrc/main/java/ai/labs/eddi/configs/groups/model/GroupConversation.javasrc/main/java/ai/labs/eddi/configs/groups/model/DiscussionStylePresets.javasrc/main/java/ai/labs/eddi/engine/internal/GroupConversationService.javasrc/main/java/ai/labs/eddi/engine/mcp/McpGroupTools.javasrc/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.
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.java — TemplateSyntaxMigrator 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.javasrc/main/java/ai/labs/eddi/modules/templating/impl/extensions/EddiTemplateExtensions.javasrc/main/java/ai/labs/eddi/modules/templating/impl/extensions/StringTemplateExtensions.javasrc/main/java/ai/labs/eddi/configs/migration/TemplateSyntaxMigrator.javasrc/main/java/ai/labs/eddi/configs/migration/V6QuteMigration.javasrc/main/java/ai/labs/eddi/backup/impl/RestImportService.javasrc/test/java/ai/labs/eddi/configs/migration/TemplateSyntaxMigratorTest.javasrc/test/java/ai/labs/eddi/modules/templating/TemplatingEngineTest.javadocs/output-templating.md
A2A Protocol: Agent-to-Agent Communication ✅
Implements the A2A protocol for distributed peer-to-peer agent communication.
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
AgentConfiguration — a2aEnabled, a2aSkills, description
LlmConfiguration.Task — a2aAgents[] 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.javasrc/main/java/ai/labs/eddi/engine/lifecycle/ConversationEventSink.javasrc/main/java/ai/labs/eddi/modules/llm/impl/LlmTask.javadocs/model-cascade.md
LLM Structured Output Hardening ✅
Production-grade reliability for LLM structured JSON output via three-layer defense:
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,responseSchemaparamLegacyChatExecutor.java—ChatRequestwithResponseFormat.JSON+ graceful fallbackToolExecutionService.java— per-tool tagged metrics onlyInputParserTask.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.javasrc/main/java/ai/labs/eddi/engine/mcp/McpAdminTools.javasrc/main/java/ai/labs/eddi/engine/mcp/McpSetupTools.javasrc/main/java/ai/labs/eddi/engine/mcp/McpApiToolBuilder.javasrc/main/java/ai/labs/eddi/engine/mcp/McpToolUtils.javasrc/test/java/ai/labs/eddi/engine/mcp/McpSetupToolsTest.java(+ 3 other test files)src/test/java/ai/labs/eddi/integration/CreateApiAgentIT.javadocs/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 importMcpAdminTools.java— simplifiedupdate_agent, addedread_package+read_resourceMcpToolUtils.java— sharedgetRestStore()McpSetupTools.java— delegategetRestStore(), removed unused importMcpToolFilter.java— whitelist 18→20, added missing importsDockerfile.jvm— docs COPY +eddi.docs.pathdocs/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.
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:
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 helperMcpToolFilter.java— whitelist 20 → 27McpAdminToolsCrudTest.java— 22 new testsdocs/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:
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.java—discover_agents+chat_managed+getOrCreateManagedConversationhelperMcpAdminTools.java— 4 trigger CRUD toolsMcpToolFilter.java— whitelist 27 → 33McpConversationToolsTest.java— 7 new testsMcpAdminToolsCrudTest.java— 7 new testsdocs/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.
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.javaLangChainConfiguration.java(McpServerConfig)McpSetupTools.javapom.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.java—discoverHttpCallTools(),HttpCallToolsResultsrc/main/java/ai/labs/eddi/modules/llm/impl/LlmTask.java— injects stores intoAgentOrchestratorsrc/main/java/ai/labs/eddi/modules/llm/model/LlmConfiguration.java—enableHttpCallToolsfieldsrc/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.
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:@ToolArgdocs list all 11 provider typesLlmModule: 4 new type keys registered
API corrections (code review):
Bedrock:
temperature()/maxTokens()don't exist on builder → usesdefaultRequestParameters(BedrockChatRequestParameters)Oracle GenAI: package
dev.langchain4j.community.model.oracle.oci.genai(not.model.oci.genai), usesmodelName(notmodelId)
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.javasrc/main/java/ai/labs/eddi/engine/setup/AgentSetupService.javasrc/main/java/ai/labs/eddi/engine/mcp/McpSetupTools.javasrc/test/java/ai/labs/eddi/engine/mcp/McpSetupToolsTest.java— 11 new test casesdocs/langchain.md— all 12 providers documented with config examplesdocs/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.
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.
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.
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: IPropertiesStore → IUserMemoryStore ✅
Eliminated the legacy properties collection and unified all user-scoped persistent storage into usermemories. Removes a redundant storage layer.
Deleted
IPropertiesStore.java, PropertiesStore.java (Mongo), PostgresPropertiesStore.java
Renamed
enableUserMemory → enableMemoryTools (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 propertiesin Postgres GDPR deleteBug: Guarded
PropertiesMigrationServicewith@IfBuildProfile("!postgres")(was@DefaultBean)Fix: Added
Listtype handling toConversation.entryToProperty()Fix:
IPropertiesHandlerjavadoc consistencyCleanup: Moved redundant
set(FIELD_VISIBILITY)tosetOnInsertin 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.
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.
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.java — ConversationSummaryConfig 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.0branch (nevermain)Read
AGENTS.mdfor development order and guidelinesRead
docs/project-philosophy.mdfor architectural pillarsRead
docs/v6-planning/for architecture analysis, changelog, and business logic analysisCommit often with conventional commits
Run
.\mvnw testbefore committingSuggest a new conversation when a phase or major item is completed
Last updated
Was this helpful?