Branch: refs/heads/main Home: https://github.com/xwiki-contrib/ai-llm Commit: 6dd8578e7e409d0f303fcda0beadd8388d742005 https://github.com/xwiki-contrib/ai-llm/commit/6dd8578e7e409d0f303fcda0beadd... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPDocumentAccess.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPWikiReach.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPDocumentAccess.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPListWikisTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPToolSupport.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWikiReach.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/resources/META-INF/components.txt M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPDocumentAccessTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentToolTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPWikiReachTest.java Log Message: ----------- LLMAI-152: MCP add get_tree navigation tool * Survey mode (no root): one summary line per top-level space with authorized page counts, hidden-page count and last content activity; small spaces expanded inline with space-relative names * Explore mode (root): breadth-first indented descent with depth/limit/offset, object-class/attachment markers and re-root paging signals; bare space-name roots follow the space home * Hidden pages always excluded by default, decoupled from the profile preference (explicit HQL clauses); showHidden=true to include * Cross-wiki: reach-gated wiki parameter (MCPWikiReach.resolveSingleWiki) and a wiki-context resolveAndAuthorize overload with a contradiction check * Resolve hierarchy rows explicitly into the target wiki: the document query filter resolves into the context wiki and ignores setWiki * Neutralize untrusted page text for the tree line grammar; share stripLineBreaks and harden get_document's Reference line with it Commit: 6b1810104b9e47cb7885e0a49b9d9c5f47f97601 https://github.com/xwiki-contrib/ai-llm/commit/6b1810104b9e47cb7885e0a49b9d9... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-index/application-ai-llm-index-api/src/main/java/org/xwiki/contrib/llm/internal/mcp/MCPListCollectionsTool.java M application-ai-llm-index/application-ai-llm-index-api/src/main/java/org/xwiki/contrib/llm/internal/mcp/MCPSearchCollectionsTool.java M application-ai-llm-index/application-ai-llm-index-api/src/test/java/org/xwiki/contrib/llm/internal/mcp/MCPListCollectionsToolTest.java M application-ai-llm-index/application-ai-llm-index-api/src/test/java/org/xwiki/contrib/llm/internal/mcp/MCPSearchCollectionsToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPManTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPQueryDocumentsTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteDocumentToolTest.java Log Message: ----------- [Misc] MCP: agent-facing text QA fixes across all tools * Fix false or misleading claims: get_document full-read promise (output is always budget-capped), rendered-disabled error blaming the wiki instead of the endpoint, edit_document create-guidance contradiction, xwiki-syntax anchor rule (digits are kept), list_collections access-filtered wording * Drop dead reach conditionals from schema texts that only ship when cross-wiki reach is enabled * Error hygiene: corrective next action must be agent-actionable (report to an administrator instead of 'see the server logs'), added missing next steps to offset errors, index tools keep root causes off the wire (fixed message + WARN/DEBUG logging) and quote parameter names * De-duplicate description vs schema texts (get_document description halved; query/edit/write/get_tree/man trimmed); man's tool parameter documents reference pages * Consistency: man-page section order, catalog separator Commit: 36928cf6475e21151a540b61809eba58a3f7f3fc https://github.com/xwiki-contrib/ai-llm/commit/36928cf6475e21151a540b61809eb... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPQueryDocumentsTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPServerConfiguration.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/script/MCPFarmScriptService.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPQueryDocumentsToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPServerConfigurationTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/script/MCPFarmScriptServiceTest.java Log Message: ----------- [Misc] MCP: fix three correctness issues found by the architecture audit * setEnabledToolIds no longer reports success when the deployed config class lacks the enabledTools field: the save is skipped and false is returned (WARN instead of DEBUG), so an admin's tool-policy save cannot silently have no effect * applyReach stops when the reach-defaults promotion fails: until that first save succeeds the reach list is not consulted, so the per-wiki writes would have reported changes that do not govern reach; every managed wiki is now counted as skipped instead * query_documents keeps the Solr root cause off the wire on a QueryException (it can name cores, fields or hosts), matching the error hygiene the other tools already follow; the root cause stays in the WARN/DEBUG logs Commit: a7829f09cb70ce6246477c5a08ec9b74bd5dd355 https://github.com/xwiki-contrib/ai-llm/commit/a7829f09cb70ce6246477c5a08ec9... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPQueryDocumentsTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPRenderedHtml.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentToolTest.java Log Message: ----------- [Misc] MCP: resolve the remaining audit flags * edit_document: a title-only save no longer writes the LF-normalized body back, so retitling a CRLF document stops silently rewriting its line endings into a whole-body diff (content is only set when it changed) * Rendered HTML serialization removes the root-element framing only when present (removeStart/removeEnd) instead of blind index math, so a change in the platform serializer's framing degrades to visible wrapper tags instead of corrupting the fragment's head and tail * Document the deliberate dependency on the platform-internal Solr FieldUtils in query_documents: it encodes the locale-suffix field logic and the compile-time coupling beats silent field-name drift Commit: 490032f993447356dba157357529524928f85448 https://github.com/xwiki-contrib/ai-llm/commit/490032f993447356dba1573575295... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-index/application-ai-llm-index-api/pom.xml M application-ai-llm-index/application-ai-llm-index-api/src/main/java/org/xwiki/contrib/llm/internal/mcp/MCPListCollectionsTool.java M application-ai-llm-index/application-ai-llm-index-api/src/main/java/org/xwiki/contrib/llm/internal/mcp/MCPSearchCollectionsTool.java M application-ai-llm-index/application-ai-llm-index-api/src/test/java/org/xwiki/contrib/llm/internal/mcp/MCPListCollectionsToolTest.java M application-ai-llm-index/application-ai-llm-index-api/src/test/java/org/xwiki/contrib/llm/internal/mcp/MCPSearchCollectionsToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-api/pom.xml A application-ai-llm-mcp/application-ai-llm-mcp-api/src/main/java/org/xwiki/contrib/llm/mcp/MCPAccessDeniedException.java A application-ai-llm-mcp/application-ai-llm-mcp-api/src/main/java/org/xwiki/contrib/llm/mcp/MCPDocumentAccess.java A application-ai-llm-mcp/application-ai-llm-mcp-api/src/main/java/org/xwiki/contrib/llm/mcp/MCPDocumentSearch.java A application-ai-llm-mcp/application-ai-llm-mcp-api/src/main/java/org/xwiki/contrib/llm/mcp/MCPSourceText.java A application-ai-llm-mcp/application-ai-llm-mcp-api/src/main/java/org/xwiki/contrib/llm/mcp/MCPToolSupport.java A application-ai-llm-mcp/application-ai-llm-mcp-api/src/main/java/org/xwiki/contrib/llm/mcp/MCPWikiReach.java A application-ai-llm-mcp/application-ai-llm-mcp-api/src/test/java/org/xwiki/contrib/llm/mcp/MCPSourceTextTest.java A application-ai-llm-mcp/application-ai-llm-mcp-api/src/test/java/org/xwiki/contrib/llm/mcp/MCPToolSupportTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPDocumentAccess.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPDocumentSearch.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPWikiReach.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPAccessDeniedException.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPDocumentAccess.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPDocumentSearch.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPListWikisTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPManTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPQueryDocumentsTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPRenderedHtml.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPSourceText.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPToolSupport.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWikiReach.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPDocumentAccessTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPListWikisToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPQueryDocumentsToolTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPRenderedHtmlTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPToolSupportTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPWikiReachTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteDocumentToolTest.java Log Message: ----------- LLMAI-153: Promote the MCP tool-support layer and door roles to mcp-api * Move MCPToolSupport, MCPSourceText, MCPAccessDeniedException and the MCPDocumentAccess/MCPDocumentSearch/MCPWikiReach role interfaces from the server module's internal package to the api module as public API (@Unstable, @since 0.9.1), so modules contributing MCP tools can reuse the declarative parameter layer, the result/error builders, the text neutralizers and the access doors instead of forking them; implementations and their registrations stay in mcp-server * Add declared string-array parameter support to MCPToolSupport (Builder.stringArray + stringList accessor; elements trimmed, blanks dropped, non-string elements rejected) * Migrate the index module's search_collections and list_collections tools off their hand-rolled schema/coercion/result code onto the shared layer; accepted deltas: query is trimmed, fractional and padded integers follow the shared rules, the required-query message uses the shared wording; schema property order is now deterministic declaration order * mcp-api gains the platform deps its new signatures need (model-api, security-authorization-api, query-manager) plus commons-lang3, test infrastructure, and a real jacoco floor (0 -> 0.85); index-api declares its previously transitive commons-collections4 use * MCPToolSupportTest moves to mcp-api and now covers the promoted statics directly (booleanValue, isoInstant, stripLineBreaks); new MCPSourceTextTest gives that class its first direct coverage; index tools gain schema tests Commit: 09e504466a49e209b462eecf2dbbd2e3f75280fb https://github.com/xwiki-contrib/ai-llm/commit/09e504466a49e209b462eecf2dbbd... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: A application-ai-llm-mcp/application-ai-llm-mcp-api/src/main/java/org/xwiki/contrib/llm/mcp/MCPReachAwareParams.java A application-ai-llm-mcp/application-ai-llm-mcp-api/src/test/java/org/xwiki/contrib/llm/mcp/MCPReachAwareParamsTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPQueryDocumentsTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteDocumentTool.java Log Message: ----------- LLMAI-153: Share the reach-conditional tool parameters in MCPReachAwareParams * New mcp-api holder built once from a tool's params(boolean) function: advertised(reachEnabled) picks the schema variant, parser() is always the cross-wiki superset - so a stray cross-wiki argument on a reach-off endpoint parses and hits the reach gate's refusal instead of being silently ignored; the previously javadoc-only superset rule is now enforced by construction * Migrate get_tree, query_documents, edit_document and write_document off their duplicated PARAMS/PARAMS_LOCAL pairs; schema texts are unchanged byte-for-byte (reach-on/off definition tests confirm) * Share the cross-wiki reference sentence as a constant (was triplicated) * get_document keeps the two-field pattern for now: it sits at the class-fan-out cap and cannot reference the holder type until its rendered-HTML machinery is extracted (next commit) Commit: 099057c1c87bb597ea037aada8c7cfd3ce1da256 https://github.com/xwiki-contrib/ai-llm/commit/099057c1c87bb597ea037aada8c7c... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPRenderedHtmlResponses.java Log Message: ----------- LLMAI-153: Extract get_document's rendered-HTML response composer * Move the rendered-HTML response family (budget dispatch, section and chunk rendering, chunk-map paging and their dedicated constants) from MCPGetDocumentTool into MCPRenderedHtmlResponses, a package-private composer that also owns the MCPRenderedHtml parse; the tool keeps the shared header/provenance composition, the rendered gate and the parameter cross-validation, so error precedence is unchanged * Pure relocation: response output is byte-for-byte identical (the tool's 107 tests pass unchanged) and the tool shrinks from 1701 to 1162 lines * Complete the tool's migration onto MCPReachAwareParams, dropping the last PARAMS/PARAMS_LOCAL pair (was blocked by the class-fan-out cap the extraction just relieved) Commit: 8fe3a610e71873f572fb6b047fdc0aa7a2697291 https://github.com/xwiki-contrib/ai-llm/commit/8fe3a610e71873f572fb6b047fdc0... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteDocumentTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteSupport.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteSupportTest.java Log Message: ----------- LLMAI-153: Share the write-path plumbing in MCPWriteSupport * New package-private helper owning the authenticated-user guard, the target-wiki switch with finally-restore (loading the document and handing it to the tool's body), the [AI] comment builder, the minor-edit rule, the review-line/compare-URL builders and the shared base-version message fragments; deliberately not in mcp-api so oldcore types stay off the API surface * edit_document and write_document keep only their divergent policies (optional vs mandatory base_version, their comment summaries and no-changes texts) - both tools' tests pass unchanged; -93/-104 lines * The third write tool (write_object) will compose these pieces instead of copying the scaffold a third time Commit: 01ca97b84b8d51e89720ab51ad67a5c3f7c10501 https://github.com/xwiki-contrib/ai-llm/commit/01ca97b84b8d51e89720ab51ad67a... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/src/checkstyle/checkstyle-suppressions.xml A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPRowQuery.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPRowQuery.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/resources/META-INF/components.txt A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPRowQueryTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeToolTest.java Log Message: ----------- LLMAI-153: Extract the authorized HQL row-query pipeline into MCPRowQuery * New internal door owning statement composition (explicit hidden-document/ hidden-space clauses), wiki scoping, bind plumbing, the 2000-row fetch ceiling and per-row authorization (space filter before view rights); its javadoc records why addFilter is never used: the platform document query filter resolves rows into the context wiki and ignores setWiki() * get_tree drops four injected components behind the door and loses its ClassFanOutComplexity suppression annotation; the remaining fan-out is the tool's own record shape plus contract types (verified by enumeration), so it is now documented in the suppressions file next to the composition-root entry instead of inline * Tree tests pass unchanged, wired through the real DefaultMCPRowQuery so every composed statement still flows textually into the test's HQL fake; 12 new door tests cover clause composition, plumbing and the authorization short-circuit * The coming object/attachment/history tools query rows through this door instead of copying the pipeline; kept internal until they prove the shape (promotion to mcp-api deferred) Commit: e5b075860d514bab952973afcd803f38f739b5e5 https://github.com/xwiki-contrib/ai-llm/commit/e5b075860d514bab952973afcd803... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPSpaceFilter.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPConfigChangeEventListener.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPSpaceFilter.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPSpaceFilterTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPConfigChangeEventListenerTest.java Log Message: ----------- LLMAI-153: Cache the parsed space filter, invalidated by config saves * DefaultMCPSpaceFilter caches the parsed per-wiki filter state (mode + resolved space/document references) instead of re-reading and re-parsing the configuration for every document checked - a get_tree survey was performing thousands of config reads per call through the row-query door * Only successful parses are cached and both methods keep their exact fail-closed fallbacks, so a config-read error still refuses (whitelist) or matches nothing (search) and is re-attempted on the next call * MCPConfigChangeEventListener drops the cache with the same granularity as the server invalidation (targeted per wiki, whole cache on a main-wiki save); the listener is cluster-global so every node invalidates its own cache Commit: 23d7e87c926003e93d5f7f0b841284ae3aa34d21 https://github.com/xwiki-contrib/ai-llm/commit/23d7e87c926003e93d5f7f0b84128... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPRowQuery.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPSpaceFilter.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPConfigChangeEventListener.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPRowQuery.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteSupport.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPRowQueryTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPSpaceFilterTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPConfigChangeEventListenerTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteSupportTest.java Log Message: ----------- LLMAI-153: Harden the extracted infrastructure per the cumulative review * MCPRowQuery clamps the fetch limit on both sides: the store applies a limit only when strictly positive, so a non-positive value meant an unbounded row fetch - the exact opposite of the door's documented ceiling contract; contract javadoc updated and pinned by a test * The config-change listener also registers DocumentDeletedEvent: deleting a config document now drops the cached server and space-filter state so the defaults take effect instead of the last saved configuration persisting until restart * A malformed space-filter entry logs at WARN (root cause) instead of DEBUG: a dropped entry can widen access relative to the admin's intent, and with caching the message appears once per cache lifetime * Pin the write scaffold's finally-restore on the failure path (document load throwing) and correct MCPWriteSupport's @since to 0.9.1 Commit: 391b184a6e081a8bd8d4ff2857d10f853ff0abc0 https://github.com/xwiki-contrib/ai-llm/commit/391b184a6e081a8bd8d4ff2857d10... Author: Paul Pantiru <[email protected]> Date: 2026-07-10 (Fri, 10 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/pom.xml R application-ai-llm-mcp/application-ai-llm-mcp-server/src/checkstyle/checkstyle-suppressions.xml M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/XWikiMCPServerManager.java Log Message: ----------- LLMAI-153: Use inline checkstyle suppressions instead of a suppressions file * Convert the two ClassFanOutComplexity suppressions (XWikiMCPServerManager, MCPGetTreeTool) to inline @SuppressWarnings annotations carrying their justification comments at the class site, matching how the module already suppresses elsewhere (MCPQueryDocumentsTool) * Drop the suppressions file and its per-module checkstyle plugin wiring - one mechanism instead of two, and the justification now sits where the reader is Commit: fe6d5a9f8ba89e19ca84177bdf284fe3a39415b6 https://github.com/xwiki-contrib/ai-llm/commit/fe6d5a9f8ba89e19ca84177bdf284... Author: Paul Pantiru <[email protected]> Date: 2026-07-11 (Sat, 11 Jul 2026) Changed paths: R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPDocumentAccess.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPDocumentSearch.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPResource.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPRowQuery.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPSpaceFilter.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPWikiReach.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPConfigChangeEventListener.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentTool.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentTool.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeTool.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPListWikisTool.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPManTool.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPQueryDocumentsTool.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPRenderedHtml.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPRenderedHtmlResponses.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPRowQuery.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPServerConfiguration.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPSpaceFilter.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteDocumentTool.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteSupport.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/XWikiMCPServerManager.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/access/DefaultMCPDocumentAccess.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/access/DefaultMCPDocumentSearch.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/access/DefaultMCPRowQuery.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/access/DefaultMCPSpaceFilter.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/access/DefaultMCPWikiReach.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/access/MCPRowQuery.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/access/MCPSpaceFilter.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/server/DefaultMCPResource.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/server/MCPConfigChangeEventListener.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/server/MCPServerConfiguration.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/server/XWikiMCPServerManager.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPEditDocumentTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPGetDocumentTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPGetTreeTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPListWikisTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPManTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPQueryDocumentsTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPRenderedHtml.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPRenderedHtmlResponses.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPWriteDocumentTool.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPWriteSupport.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/script/MCPFarmScriptService.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/resources/META-INF/components.txt R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPDocumentAccessTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPDocumentSearchTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPResourceTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPRowQueryTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/DefaultMCPSpaceFilterTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPConfigChangeEventListenerTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPEditDocumentToolTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPGetDocumentToolTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPGetTreeToolTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPListWikisToolTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPManToolTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPQueryDocumentsToolTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPRenderedHtmlTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPServerConfigurationTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPWikiReachTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteDocumentToolTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/MCPWriteSupportTest.java R application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/XWikiMCPServerManagerTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/access/DefaultMCPDocumentAccessTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/access/DefaultMCPDocumentSearchTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/access/DefaultMCPRowQueryTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/access/DefaultMCPSpaceFilterTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/access/MCPWikiReachTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/server/DefaultMCPResourceTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/server/MCPConfigChangeEventListenerTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/server/MCPServerConfigurationTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/server/XWikiMCPServerManagerTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPEditDocumentToolTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPGetDocumentToolTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPGetTreeToolTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPListWikisToolTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPManToolTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPQueryDocumentsToolTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPRenderedHtmlTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPWriteDocumentToolTest.java A application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPWriteSupportTest.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/script/MCPFarmScriptServiceTest.java Log Message: ----------- LLMAI-153: Organize the mcp-server internal package into subpackages * internal.tool (the seven tools + their package-private machinery: MCPWriteSupport, MCPRenderedHtml, MCPRenderedHtmlResponses), internal.access (the internal door roles and all Default* door implementations), internal.server (server manager, REST resource, configuration, config-change listener) - the grouping follows the package-private seams so they stay compiler-enforced * Pure rename refactor: tests move in lockstep, components.txt FQNs updated, three space-filter-mode constants widened to public (the only cross-boundary accesses) * MCPConfigChangeEventListener.NAME keeps its historical value (a stable registration identifier, deliberately decoupled from the class location); DefaultMCPResource's @Named hint follows the class FQN because Jersey resolves REST components by the current class name Commit: 039d5d94fc41a3857266c8629605a6c424a1ee23 https://github.com/xwiki-contrib/ai-llm/commit/039d5d94fc41a3857266c8629605a... Author: Paul Pantiru <[email protected]> Date: 2026-07-11 (Sat, 11 Jul 2026) Changed paths: M application-ai-llm-mcp/application-ai-llm-mcp-server/src/main/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPGetTreeTool.java M application-ai-llm-mcp/application-ai-llm-mcp-server/src/test/java/org/xwiki/contrib/llm/mcp/internal/tool/MCPGetTreeToolTest.java Log Message: ----------- LLMAI-152: Make get_tree's man page reach-conditional like its schema * A reach-off endpoint's man page no longer teaches the wiki parameter its advertised schema does not carry (the NOTES paragraph and the 'Survey another wiki' example are appended only when cross-wiki reach is on), matching the reach-conditional tool definitions * Found by the post-redeploy smoke run: the schemas were conditional since the reach-conditional definitions landed, but this hand-written prose was static Compare: https://github.com/xwiki-contrib/ai-llm/compare/60e2d4042686...039d5d94fc41 To unsubscribe from these emails, change your notification settings at https://github.com/xwiki-contrib/ai-llm/settings/notifications