feat: EDDI 6.2.0 release - #605
Conversation
- Add welcome.html + IRestWelcomeResource for the landing page chooser - Add workforce.html + IRestWorkforceResource for the workforce module - Update index.html to smart-redirect (localStorage pref or /welcome) - Permit /, /welcome/*, /workforce/* in auth policy so HTML shells load before keycloak-js handles auth client-side
- Add welcome.html + RestWelcomeResource for landing page chooser - Add workforce.html + RestWorkforceResource for workforce module - Update index.html to smart-redirect (localStorage pref or /welcome) - Permit /, /welcome/*, /workforce/* in auth policy - Bump version 6.1.2 → 6.2.0 across all manifests
Dependency ReviewThe following issues were found:
License Issuespom.xml
OpenSSF ScorecardScorecard details
Scanned Files
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe change adds welcome and workforce SPA entrypoints, preference-based landing redirects, static HTML bootstraps, and endpoint tests. It also updates dependencies, runtime and deployment metadata, release inputs, agent artifacts, frontend assets, and documentation for version 6.2.0. ChangesSPA entrypoints
6.2.0 release metadata
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant Browser
participant index_html
participant landing_redirect_js
participant RestWelcomeResource
participant welcome_html
Browser->>index_html: load root redirect page
index_html->>landing_redirect_js: load redirect script
landing_redirect_js->>Browser: read landing preference
Browser->>RestWelcomeResource: GET /welcome/{path}
RestWelcomeResource->>welcome_html: read static HTML
welcome_html-->>Browser: HTML with auth config and frontend assets
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Pull request overview
This PR updates the Quarkus backend to serve two new SPA entry points (/welcome/** and /workforce/**) alongside the existing SPA routes, and bumps the project release version to 6.2.0 across build, deployment, and documentation artifacts.
Changes:
- Added new HTML shells (
welcome.html,workforce.html) and matching JAX-RS catch-all resources to serve them for all subpaths. - Updated root
index.htmlto redirect based on a stored landing preference (or fall back to/welcome). - Bumped versions and tags to 6.2.0 across Maven, Docker, Helm, k8s, OpenAPI metadata, and docs.
Reviewed changes
Copilot reviewed 29 out of 30 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/main/resources/META-INF/resources/workforce.html | New Workforce SPA shell HTML. |
| src/main/resources/META-INF/resources/welcome.html | New Welcome/landing SPA shell HTML. |
| src/main/resources/META-INF/resources/index.html | Root redirect logic updated to preference-aware redirect. |
| src/main/resources/META-INF/resources/chat.html | Updated chat UI asset filenames (currently inconsistent with repo contents). |
| src/main/resources/initial-agents/available_agents.txt | Updated initial agent ZIP reference to 6.2.0. |
| src/main/resources/initial-agents/Agent+Father-6.2.0.zip | Added updated initial Agent Father bundle (binary). |
| src/main/resources/application.properties | Version bump + auth permit list extended for new SPA routes (and root). |
| src/main/java/ai/labs/eddi/ui/RestWorkforceResource.java | New JAX-RS resource to serve workforce.html for /workforce/**. |
| src/main/java/ai/labs/eddi/ui/RestWelcomeResource.java | New JAX-RS resource to serve welcome.html for /welcome/**. |
| src/main/java/ai/labs/eddi/ui/IRestWorkforceResource.java | New REST interface defining /workforce routes. |
| src/main/java/ai/labs/eddi/ui/IRestWelcomeResource.java | New REST interface defining /welcome routes. |
| src/main/java/ai/labs/eddi/configs/OpenApiConfig.java | OpenAPI annotation version updated to 6.2.0. |
| src/main/docker/Dockerfile | Container label/version arg updated to 6.2.0. |
| pom.xml | Project version bump + dependency/plugin version updates. |
| k8s/quickstart.yaml | k8s quickstart manifest version label bump to 6.2.0. |
| k8s/base/eddi-deployment.yaml | Base deployment version label bump to 6.2.0. |
| helm/eddi/Chart.yaml | Helm appVersion bump to 6.2.0. |
| docs/security.md | Doc header version updated to 6.2.0. |
| docs/redhat-openshift.md | Examples/version references updated to 6.2.0. |
| docs/putting-it-all-together.md | Doc header version updated to 6.2.0. |
| docs/properties.md | Doc header version updated to 6.2.0. |
| docs/langchain.md | Doc header version updated to 6.2.0. |
| docs/getting-started.md | Doc header version updated to 6.2.0. |
| docs/developer-quickstart.md | Doc header version updated to 6.2.0. |
| docs/conversation-memory.md | Doc header version updated to 6.2.0. |
| docs/architecture.md | Doc header version updated to 6.2.0. |
| docs/agent-manager-gui.md | Doc header version updated to 6.2.0. |
| docs/agent-father-langchain-tools-guide.md | EDDI version reference updated to 6.2.0. |
| docs/agent-father-deep-dive.md | Doc header version updated to 6.2.0. |
| .github/workflows/redhat-certify.yml | Workflow dispatch defaults/examples updated to 6.2.0. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
pom.xml (1)
59-65: 🔒 Security & Privacy | 🔵 TrivialVerify the resolved PostgreSQL driver in the packaged runtime.
The 42.7.13 override is appropriate: pgJDBC documents CVE-2026-42198 as fixed in 42.7.11, CVE-2026-54291 as fixed in 42.7.12, and 42.7.13 is released. Confirm the final dependency tree and runtime image contain 42.7.13 rather than an older mediated version. (jdbc.postgresql.org)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pom.xml` around lines 59 - 65, Verify the PostgreSQL dependency override in the Maven resolution and packaged runtime image, ensuring the final dependency tree and included JDBC driver both use org.postgresql:postgresql version 42.7.13 rather than an older mediated version.Source: MCP tools
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@k8s/base/eddi-deployment.yaml`:
- Line 8: Both Kubernetes deployments expose version 6.2.0 while using the
mutable image tag labsai/eddi:6. Pin the image to labsai/eddi:6.2.0 or an
equivalent digest and keep metadata synchronized in
k8s/base/eddi-deployment.yaml lines 8-8 and 26-26 and k8s/quickstart.yaml lines
172-172 and 190-190.
In `@src/main/resources/META-INF/resources/index.html`:
- Around line 7-17: Move the redirect logic from the inline script in index.html
into a same-origin external JavaScript file and load it with a regular script
reference permitted by the existing script-src 'self' CSP. Preserve the
localStorage lookup and routing behavior for the manage, workforce, and welcome
destinations, and remove the inline implementation.
---
Nitpick comments:
In `@pom.xml`:
- Around line 59-65: Verify the PostgreSQL dependency override in the Maven
resolution and packaged runtime image, ensuring the final dependency tree and
included JDBC driver both use org.postgresql:postgresql version 42.7.13 rather
than an older mediated version.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 1095a3af-a0aa-4a51-bac6-08dd7bc9108d
⛔ Files ignored due to path filters (1)
src/main/resources/initial-agents/Agent+Father-6.2.0.zipis excluded by!**/*.zip
📒 Files selected for processing (29)
.github/workflows/redhat-certify.ymldocs/agent-father-deep-dive.mddocs/agent-father-langchain-tools-guide.mddocs/agent-manager-gui.mddocs/architecture.mddocs/conversation-memory.mddocs/developer-quickstart.mddocs/getting-started.mddocs/langchain.mddocs/properties.mddocs/putting-it-all-together.mddocs/redhat-openshift.mddocs/security.mdhelm/eddi/Chart.yamlk8s/base/eddi-deployment.yamlk8s/quickstart.yamlpom.xmlsrc/main/docker/Dockerfilesrc/main/java/ai/labs/eddi/configs/OpenApiConfig.javasrc/main/java/ai/labs/eddi/ui/IRestWelcomeResource.javasrc/main/java/ai/labs/eddi/ui/IRestWorkforceResource.javasrc/main/java/ai/labs/eddi/ui/RestWelcomeResource.javasrc/main/java/ai/labs/eddi/ui/RestWorkforceResource.javasrc/main/resources/META-INF/resources/chat.htmlsrc/main/resources/META-INF/resources/index.htmlsrc/main/resources/META-INF/resources/welcome.htmlsrc/main/resources/META-INF/resources/workforce.htmlsrc/main/resources/application.propertiessrc/main/resources/initial-agents/available_agents.txt
- Move index.html redirect logic to external landing-redirect.js (script-src 'self' blocks inline scripts, so localStorage pref was silently ignored and meta-refresh always fired) - Remove unused @PathParam from welcome/workforce interfaces and implementations (path needed for routing only, not consumed)
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 30 out of 31 changed files in this pull request and generated 3 comments.
Comments suppressed due to low confidence (1)
src/main/resources/META-INF/resources/chat.html:40
- chat.html now references hashed JS/CSS bundles (chat-ui.p4wYUapg.js, chat-ui.D213XXZR.css) that are not present under src/main/resources/META-INF/resources/scripts/. This will break the /chat UI at runtime with 404s unless the corresponding assets are added.
<script type="module" crossorigin src="/scripts/js/chat-ui.p4wYUapg.js"></script>
<link rel="stylesheet" crossorigin href="/scripts/css/chat-ui.D213XXZR.css">
- Add /index.html to auth permit list (proxies/bookmarks) - Add RestWelcomeResourceTest (3 tests) - Add RestWorkforceResourceTest (3 tests)
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/test/java/ai/labs/eddi/ui/RestWelcomeResourceTest.java`:
- Around line 29-35: Strengthen RestWelcomeResourceTest.java sites 29-35, 41-47,
and 53-60, and RestWorkforceResourceTest.java sites 29-35, 41-47, and 53-60:
remove broad exception catches and status-only assertions; use a test double
overriding viewHtml() to verify viewDefault() delegates, assert each response
contains a non-null readable HTML entity/stream, and compare returned shell
content rather than only HTTP status.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: cad84b9b-5e01-4bcb-890c-ed558b959c52
📒 Files selected for processing (3)
src/main/resources/application.propertiessrc/test/java/ai/labs/eddi/ui/RestWelcomeResourceTest.javasrc/test/java/ai/labs/eddi/ui/RestWorkforceResourceTest.java
🚧 Files skipped from review as they are similar to previous changes (1)
- src/main/resources/application.properties
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 32 out of 33 changed files in this pull request and generated 4 comments.
Comments suppressed due to low confidence (2)
src/test/java/ai/labs/eddi/ui/RestWorkforceResourceTest.java:56
- This test currently swallows exceptions and only compares HTTP statuses. Adding entity assertions makes the test actually detect missing workforce.html (null entity) rather than always passing.
src/test/java/ai/labs/eddi/ui/RestWelcomeResourceTest.java:56 - This test currently swallows exceptions and only compares HTTP statuses. Adding entity assertions makes the test actually detect missing welcome.html (null entity) rather than always passing.
- Add null-guard in RestWelcomeResource/RestWorkforceResource: return 500 if HTML shell missing from classpath - Rewrite tests: remove exception swallowing, assert entity is non-null InputStream, verify delegation between viewDefault/viewHtml
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 32 out of 33 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
src/main/resources/META-INF/resources/chat.html:40
- The updated chat UI asset filenames referenced here don’t exist in the repository (only the previous chat-ui.* files are present under src/main/resources/META-INF/resources/scripts/). This will break /chat at runtime with 404s for the JS/CSS bundles.
<script type="module" crossorigin src="/scripts/js/chat-ui.p4wYUapg.js"></script>
<link rel="stylesheet" crossorigin href="/scripts/css/chat-ui.D213XXZR.css">
RuntimeUtilities.getResourceAsStream uses a Quarkus classloader that is unavailable in plain JUnit context. Tests now verify: - viewHtml returns 500 when HTML is not resolvable (null-guard) - viewDefault delegates to viewHtml (consistent status + entity) - No exception swallowing
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 32 out of 33 changed files in this pull request and generated 4 comments.
Comments suppressed due to low confidence (4)
src/main/resources/META-INF/resources/chat.html:40
- chat.html now references hashed chat-ui assets that are not present in META-INF/resources (the repo currently contains chat-ui.DkbQxm6F.js and chat-ui.CN68VwV9.css). This will break the /chat UI at runtime with 404s.
<script type="module" crossorigin src="/scripts/js/chat-ui.p4wYUapg.js"></script>
<link rel="stylesheet" crossorigin href="/scripts/css/chat-ui.D213XXZR.css">
src/test/java/ai/labs/eddi/ui/RestWelcomeResourceTest.java:57
- Comparing Response entities for equality is not reliable here: when the HTML is resolvable, each call will typically produce a distinct InputStream instance. This test will fail once viewHtml returns 200. Prefer asserting delegation via status code only (or asserting both entities are non-null).
src/test/java/ai/labs/eddi/ui/RestWorkforceResourceTest.java:57 - Comparing Response entities for equality is not reliable here: when the HTML is resolvable, each call will typically produce a distinct InputStream instance. This test will fail once viewHtml returns 200. Prefer asserting delegation via status code only (or asserting both entities are non-null).
src/main/resources/application.properties:248 - Both the permit-list and the authenticated catch-all include the exact path "/". Depending on Quarkus' permission tie-breaking, this can make the root (/) unexpectedly require auth (breaking the new landing redirect) or unexpectedly be permitted. To avoid ambiguity, keep "/" only in the static-assets permission and let authenticated cover everything else via "/*".
quarkus.http.auth.permission.static-assets.paths=\
/,/index.html,/manage,/manage/*,/chat,/chat/*,/welcome,/welcome/*,/workforce,/workforce/*,\
/scripts/*,/fonts/*,/css/*,/js/*,/img/*,/assets/*,\
/eddi-icon.svg,/eddi-icon.ico,/logo_eddi.png,/favicon.ico,/robots.txt,/mockServiceWorker.js
ClassLoader.getResourceAsStream expects paths without a leading '/'. The leading slash caused null returns in standard JVM (plain JUnit). With slashless paths, src/main/resources/META-INF/resources/*.html are now resolvable from the test classpath, so tests assert 200 + non-null InputStream entity instead of baking in a 500 failure mode.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 120 out of 150 changed files in this pull request and generated 3 comments.
Comments suppressed due to low confidence (1)
pom.xml:9
- The PR description focuses on new SPA entry points + version bump, but this PR also includes substantial backend behavior changes (attachments recall behavior, LLM builder parameter parsing/defaults, SSE log streaming heartbeat, GDPR deletion semantics, etc.). Please either expand the PR description to cover these additional changes (and their motivation/risk), or split them into separate PRs to keep review scope clear.
<groupId>ai.labs</groupId>
<artifactId>eddi</artifactId>
<version>6.2.0</version>
<properties>
The reflection lookup this test used could never succeed: AnthropicChatModel
has no 'maxTokens' field. The builder's maxTokens is stored as
defaultRequestParameters.maxOutputTokens, so getDeclaredField("maxTokens")
always threw NoSuchFieldException and the assertion inside the try was never
reached. The original catch swallowed it, so the test has verified nothing for
as long as it has existed; turning that catch into a fail() surfaced the truth
and turned CI red.
Now read via model.defaultRequestParameters().maxOutputTokens() — public API,
no reflection, nothing to drift on the next upgrade. Confirmed against the
pinned langchain4j 1.18.0 sources, where the builder maps maxTokens to
maxOutputTokens and otherwise falls back to 1024 output tokens: exactly the
footgun DEFAULT_MAX_TOKENS exists to avoid for extended-thinking models, and
what this test is meant to protect.
Also drops the static imports the previous sweep added to builders that do not
use all three helpers.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 120 out of 150 changed files in this pull request and generated 3 comments.
Comments suppressed due to low confidence (3)
src/main/java/ai/labs/eddi/engine/internal/GroupConversationService.java:2171
- If
feedbackexists but is null,String.valueOf(...)becomes "null" and passes theisBlank()check, so "null" is appended to the transcript. Guard against null values explicitly.
String feedback = map.containsKey("feedback") ? String.valueOf(map.get("feedback")) : "";
waic-2026/draft-reply-email.txt:5
- This PR is described as adding new SPA entry points and a version bump, but it also adds WAIC 2026 outreach/materials under
waic-2026/. That looks unrelated and will make release PRs harder to review/audit; consider moving these files to a separate PR or repository.
.claude/workflows/feature-pipeline.js:12 - This PR is described as a backend/UI entry-point change and version bump, but it also introduces a new Claude workflow (
.claude/workflows/feature-pipeline.js). If this is intended, it should be called out explicitly; otherwise it should likely be moved to a separate PR to keep the release change set focused.
export const meta = {
name: 'feature-pipeline',
description: 'Explore -> plan/decompose -> parallel worktree implementers -> merge -> high-effort review',
whenToUse: 'Use for a substantial coding task that can be split into independent workstreams. Runs three explorers, a planner that decomposes the task, one implementer per workstream in its own git worktree, a merge step that combines the branches, and a final high-effort review. Does NOT open a PR — review the result and push/PR yourself.',
phases: [
{ title: 'Explore' },
{ title: 'Plan' },
{ title: 'Implement' },
{ title: 'Merge' },
{ title: 'Review' },
],
}
| var sb = new StringBuilder("## Task Verification Results\n\n"); | ||
| for (Object item : items) { | ||
| if (item instanceof Map<?, ?> map) { | ||
| String subject = map.containsKey("subject") ? String.valueOf(map.get("subject")) : "Unknown Task"; |
| } else { | ||
| LOGGER.warnf("LLM response was null or blank for task '%s' (type=%s) — skipping output", | ||
| task.getId(), task.getType()); | ||
| } |
|
|
||
| Agent behavior is defined in versioned JSON configurations, enabling rapid deployment and updates without recompilation. EDDI supports 12 LLM providers, implements open standards (MCP, A2A, OpenAPI, OAuth 2.0), and offers built-in compliance for GDPR, HIPAA, EU AI Act, and international privacy regulations. | ||
|
|
||
| Key capabilities include multi-agent group conversations with six debate styles, smart model cascading for cost optimization, enterprise security with envelope-encrypted secrets vault, and cloud-native deployment on Docker, Kubernetes, and OpenShift. With 9,000+ tests and over 90% code coverage, EDDI is the enterprise-grade bridge between AI innovation and production governance. |
containsKey is true for an explicitly null JSON value, and String.valueOf then produces the four-character string "null". Both verification paths read the LLM's deserialized output that way, so "subject": null did not fall back: - formatVerificationForDisplay showed users a task named "null" instead of "Unknown Task", and "null" as its feedback instead of blank. - tryParseVerificationJson was worse than cosmetic: the "null" string is not null, so it passed the subject != null guard and went on to a task-name match that can never succeed — silently dropping the verification for that task rather than skipping the malformed entry. Both now test the value via a small stringOrNull helper. The adjacent 'passed' read is left alone: it already handles a null value without crashing or stringifying, and changing whether that counts as a failed task is a semantic decision rather than this cleanup. Also corrects the test-count claims. AGENTS.md said 11,000+ and the WAIC solution description said 9,000+; the suite currently runs 12,081 tests, so both are now 12,000+.
| // Check if pattern contains printf format specifiers (%s, %d, etc.) | ||
| if (msg.contains("%s") || msg.contains("%d") || msg.contains("%f") || msg.contains("%n") || msg.contains("%x")) { | ||
| try { | ||
| return String.format(msg, params); | ||
| } catch (Exception _) { | ||
| // ignore and try MessageFormat | ||
| } | ||
| } |
| ## 🔒 fix(ci): remove accidentally-committed langchain4j-mcp decompiled sources (2026-07-27) | ||
|
|
||
| **Repo:** EDDI (`feat/v6.2.0-prep`) | ||
|
|
||
| Both the **Dependency Review** and **Trivy Filesystem Scan** CI checks were failing on this branch with 3 HIGH-severity Jackson CVEs (GHSA-r7wm-3cxj-wff9, CVE-2026-54512, CVE-2026-54513). |
BoundedLogStore enumerated printf specifiers as "%s"/"%d"/"%f"/"%n"/"%x", which
matches no indexed, padded or grouped form: %1$s, %2$d, %03d, %,d, %5.2f. Those
patterns then fell through to MessageFormat, which does NOT throw on them —
with no {0} placeholders it returns the pattern unchanged, so the fallback
String.format below was never reached and the raw "%1$s" is what reached the
log viewer.
Any '%' now attempts printf and lets String.format decide, since it throws on a
malformed pattern and we fall through. A MessageFormat pattern containing a
literal percent is unaffected: "progress 50% for {0}" is rejected by
String.format ("% f") and falls through as before. Both paths are covered by
tests that fail against the old condition.
LlmTask: the blank-response log drops from WARN to DEBUG. It fires on an
outcome the surrounding comment documents as expected — a thinking-only turn or
an exhausted token budget — so at WARN it recurred in healthy operation while
naming only the task id and type, which is not enough to act on. It now carries
the conversation id, so turning debug on to chase "the agent didn't answer"
actually identifies which conversation.
AgentOrchestrator: the readAttachment gate counts only blob-backed files on the
current turn, matching what it already did for earlier turns. The tool can only
serve what the store holds, and an inline or URL-only attachment is inlined by
AttachmentForwarder on that same turn — offering a tool whose listAttachments
would report nothing only contradicts the document in the same message.
Also updates the stale test-count figure in the 6.2 article draft.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 121 out of 151 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
src/main/java/ai/labs/eddi/engine/runtime/BoundedLogStore.java:372
MessageFormat.format()does not throw when the message is actually a printf-style pattern without any{0}placeholders (it just returns the original pattern). In that case this code returns early and never reaches the String.format fallback, so raw patterns like%1$scan still leak to the log viewer when the first String.format attempt was skipped/failed.
Both arrived by accident in 702e2f7 ("fix: serialize SSE log events as JSON"), a commit whose stated change is a few dozen lines but which carried 147 files and ~14.7k lines from whatever was untracked in the working tree. The other passenger in that commit, the vendored lc4jmcp sources, was already removed in 4716d01 once it broke the Trivy and Dependency Review scans; these two broke nothing, so they stayed. - .claude/ is Claude Code tooling for one machine, referenced by nothing in the build. It sits alongside the existing .gemini/ ignore rule. - waic-2026/ is showcase material — logos, screenshots, a pptx and draft copy. Not part of the product and not referenced anywhere. Removed with --cached, so both directories stay on disk; only the tracking goes. Ignoring the directories stops the next over-broad `git add` from re-adding them.
| // first-time visitors go to the welcome chooser. | ||
| (function () { | ||
| var pref = null; | ||
| try { pref = localStorage.getItem('eddi-landing-preference'); } catch(e) {} |
| // Only add to conversation output if there is actual text. | ||
| // Null/blank responses (e.g. from token budget exhaustion or | ||
| // thinking-only turns) should not produce empty message bubbles. | ||
| if (producesRenderableOutput(responseContent)) { | ||
| var outputItem = new TextOutputItem(responseContent, 0); | ||
| currentStep.addConversationOutputList(MEMORY_OUTPUT_IDENTIFIER, List.of(outputItem)); |
Reading localStorage throws in private mode, with site data blocked, or in a sandboxed iframe. There is nothing to recover in any of those cases — the visitor just has no stored preference and falls through to the welcome chooser — but a bare empty catch does not say so.
Two gaps in the previous commit, both found in review. The conversion matched Integer.parseInt / Double.parseDouble / Long.parseLong, so Float.parseFloat was invisible to it. Two temperature sites still threw on a mistyped value: JlamaLanguageModelBuilder and VertexGeminiLanguageModelBuilder — the latter also contradicting the earlier claim that Vertex had no numeric parses. Both now read through applyDouble and narrow to float at the call site; a dedicated float helper would buy nothing, since every value a float accepts a double accepts too. A grep for any remaining throwing parse over the parameters map across the builder package now comes back empty. Blank values are absent rather than invalid. isNullOrEmpty only tests isEmpty(), so a parameter left as " " reached the parser and was reported as "not a valid integer" — a warning about a value nobody set. rawValue now trims and treats the result as absent when empty, which also lets each parser drop its own trim. Padded-but-valid values such as " 8192 " still parse. Boolean.parseBoolean sites are deliberately untouched: they never throw.
60s → 180sSKIPPED.readAttachmentno longer gated byenableBuiltInToolsor the whitelistfalseon every wizard-created agent.10k → 50kcharsToolResponseLimits.defaultMaxChars, the next limit in the chain. Raises per-call token cost forreadAttachment; tune per tool viaperToolLimitsif that matters.temperature/maxTokens/timeoutnow logs a warning and falls back to the model default instead of throwingNumberFormatExceptionout of every turn.WARN → DEBUG42.7.12 → 42.7.13What's in it
Release — version
6.1.2 → 6.2.0,Agent+Father-6.2.0.zip, ubi9/openjdk-25-runtime digest bump, Quarkus3.37.3 → 3.37.4, plus patch bumps for jandex, surefire/failsafe, jacoco and the postgresql CVE pin above.SPA entry points (the headline) —
/welcomeand/workforceserved byRestWelcomeResource/RestWorkforceResource, with CSP inline-script handling and/index.htmlpermit rules. 61 rebuilt Manager and Chat UI asset files ride along.Attachments — usable for a whole conversation, not one turn. A file was inlined only on the turn it arrived and was invisible afterwards; the model would insist no file had ever been shared. Three independent causes:
ResultSnapshot#getResult()is an untypedObject, so Jackson returns plain maps. Both stores repair onlycontext*entries on load, so everyinstanceof Attachmentfilter matched nothing from turn two onward. Entries are now coerced through one shared reader.ReadAttachmentToolsat behindenableBuiltInTools(see table).AttachmentForwardersilently forwarded nothing andContentTypeMatcherstopped matching content-type rules on resumed turns.Plus a reminder note naming earlier files on turns that carry none, so the model knows they exist.
LLM model builders — 36 unguarded
parseInt/parseDouble/parseLongsites across nine builders now read through a sharedModelParameterValueshelper (see table).Logging — SSE log-stream heartbeat, JSON event serialisation, CDI-safe injectable clock, and printf detection in
BoundedLogStorewidened so indexed and padded specifiers (%1$s,%03d) format instead of reaching the viewer raw.Memory / GDPR —
ConversationDescriptorscleaned up on permanent conversation deletion.Groups — verification display no longer renders a JSON
nullas the literal word "null" (and no longer silently drops that task's verification), empty task results handled.Deployment —
DeploymentInfoequals/hashCode fix that was causing a 10-second re-deployment loop.Chore —
.claude/andwaic-2026/untracked and gitignored; both arrived via an over-broadgit addin 702e2f7, the same commit whose vendoredlc4jmcpsources were already removed in 4716d01 after they broke Trivy and Dependency Review.Docs — README updates (HITL, attachments, group follow-up, error recovery, tool caching, JSON mode, tenant quotas) and changelog entries.
Testing
12,000+ tests, >90% instruction / >80% branch coverage, enforced by the build. New regression coverage at each layer of the attachment path — including a full
convertConversationMemory → Jackson → convertConversationMemorySnapshotround trip, which is exactly what the original mock-based tests missed.