diff --git a/bex/ensemble.py b/bex/ensemble.py index ab37a20..5073c0e 100644 --- a/bex/ensemble.py +++ b/bex/ensemble.py @@ -395,7 +395,7 @@ def _run_kore(sequences, kmax, N, method='langsize'): return None, float('inf') -def infer_ensemble(sequences, kmax=2, N=3, prefer=None, min_coverage=1.0, include_kore=False, method='langsize'): +def infer_ensemble(sequences, kmax=2, N=3, prefer=None, min_coverage=1.0, include_kore=False, include_idregex=False, method='langsize'): """Run all applicable algorithms and return the best by scoring. Args: @@ -408,6 +408,7 @@ def infer_ensemble(sequences, kmax=2, N=3, prefer=None, min_coverage=1.0, includ of sequences. Outliers (worst-fitting) are iteratively removed until at least this fraction remains. The core grammar and outlier list are included in the response. + include_idregex: Run iDRegEx (slow, opt-in). method: Scoring method — 'langsize' (default, Bex et al. arXiv:1004.2372) or 'mdl' (fallback). @@ -443,10 +444,11 @@ def infer_ensemble(sequences, kmax=2, N=3, prefer=None, min_coverage=1.0, includ crx_score = mdl_score_simple(crx_g, sequences, method=method) if crx_g and crx_g != '∅' else float('inf') results.append(('CRX', crx_g if crx_g and crx_g != '∅' else '∅', crx_score)) - # 2. iDRegEx (standalone, langsize-based) - idr_g, idr_score = _run_idregex(sequences, kmax, N, method=method) - if idr_g: - results.append(('iDRegEx', idr_g, idr_score)) + # 2. iDRegEx (opt-in via include_idregex=True — slow on large groups) + if include_idregex: + idr_g, idr_score = _run_idregex(sequences, kmax, N, method=method) + if idr_g: + results.append(('iDRegEx', idr_g, idr_score)) # 3. kOREInference (opt-in via include_kore=True) if include_kore: @@ -494,7 +496,7 @@ def infer_ensemble(sequences, kmax=2, N=3, prefer=None, min_coverage=1.0, includ if match_strs: why_parts.append(f"Match rates: {', '.join(match_strs)}.") - why_parts.append(f"{best[0]} selected (MDL score {best[2]:.1f}).") + why_parts.append(f"{best[0]} selected (MDL score {best[2]}).") result = { 'best': { diff --git a/bex/gbnf.py b/bex/gbnf.py index 546f64a..d8bdc15 100644 --- a/bex/gbnf.py +++ b/bex/gbnf.py @@ -66,6 +66,8 @@ def _tokenize(sore): i += 1 lit = sore[start:i] if lit: + # Strip newlines/extra whitespace from symbol names + lit = ' '.join(lit.split()) tokens.append(('LITERAL', lit)) return tokens diff --git a/bex/tag_preprocessor/analyze.py b/bex/tag_preprocessor/analyze.py index 6ac4013..1eb9a88 100644 --- a/bex/tag_preprocessor/analyze.py +++ b/bex/tag_preprocessor/analyze.py @@ -282,7 +282,7 @@ def analyze_clusters(file_paths, extension, project_root="", min_coverage=DEFAUL return [("(all methods)", result, len(sequences), meta)] -def _infer_group(label, group_seqs, group_files, project_root, min_coverage, prefer, kmax, N, include_kore=False, method='langsize', min_methods=5, crx_method='standard'): +def _infer_group(label, group_seqs, group_files, project_root, min_coverage, prefer, kmax, N, include_kore=False, include_idregex=False, method='langsize', min_methods=5, crx_method='standard'): """Infer grammar for one package group. Module-level for ProcessPoolExecutor.""" filtered = frequency_filter(group_seqs, min_coverage=min_coverage) imports = _extract_imports(group_files) @@ -311,12 +311,12 @@ def _infer_group(label, group_seqs, group_files, project_root, min_coverage, pre 'why': f"CRX-refined (confidence={info['confidence']:.2f})", } else: - result = infer_ensemble(symbol_seqs, kmax=kmax, N=N, prefer=prefer, min_coverage=min_coverage, include_kore=include_kore) + result = infer_ensemble(symbol_seqs, kmax=kmax, N=N, prefer=prefer, min_coverage=min_coverage, include_kore=include_kore, include_idregex=include_idregex) meta = {"files": group_files, "imports": imports, "arg_patterns": arg_patterns, "packages": packages} return (label, result, len(filtered), meta) -def analyze_by_package(file_paths, extension, project_root="", min_coverage=DEFAULT_COVERAGE, prefer=None, kmax=2, N=3, min_pkg_size=3, include_kore=False, method='langsize', min_methods=5, crx_method='standard'): +def analyze_by_package(file_paths, extension, project_root="", min_coverage=DEFAULT_COVERAGE, prefer=None, kmax=2, N=3, min_pkg_size=3, include_kore=False, include_idregex=False, method='langsize', min_methods=5, crx_method='standard'): """Preprocess and group by package directory, infer per group. Groups methods by their file's relative directory path, merging @@ -351,7 +351,7 @@ def analyze_by_package(file_paths, extension, project_root="", min_coverage=DEFA gs = [sequences[i] for i in indices] gf = set(seq_files[i] for i in indices) f = ex.submit(_infer_group, label, gs, gf, project_root, - min_coverage, prefer, kmax, N, include_kore, method, min_methods, crx_method) + min_coverage, prefer, kmax, N, include_kore, include_idregex, method, min_methods, crx_method) futures[f] = label for f in as_completed(futures): @@ -460,6 +460,7 @@ def analyze_directory( exclude=None, main_only=False, include_kore=False, + include_idregex=False, method='langsize', min_methods=5, crx_method='standard', @@ -497,6 +498,7 @@ def analyze_directory( prefer=prefer, kmax=kmax, include_kore=include_kore, + include_idregex=include_idregex, method=method, min_methods=min_methods, crx_method=crx_method, @@ -617,6 +619,10 @@ def _parse_args(argv=None): "--kore", action="store_true", help="Include kORE in ensemble (off by default for speed)", ) + parser.add_argument( + "--idregex", action="store_true", + help="Include iDRegEx in ensemble (off by default — slow on large groups)", + ) parser.add_argument( "--kmax", type=int, default=2, help="Maximum k for k-ORE algorithms (default: 2)", @@ -684,6 +690,7 @@ def main(): exclude=args.exclude, main_only=args.main_only, include_kore=args.kore, + include_idregex=args.idregex, method=args.scoring_method, min_methods=args.min_methods, crx_method=args.crx_method, diff --git a/experiments/gbnf_eval.py b/experiments/gbnf_eval.py new file mode 100644 index 0000000..61eb543 --- /dev/null +++ b/experiments/gbnf_eval.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +"""Run pipeline + GBNF conversion on a codebase. Output results to JSON.""" +import sys +import json +import time +from pathlib import Path +from bex.tag_preprocessor.analyze import analyze_directory +from bex.gbnf import to_gbnf + +def run(codebase_name, dir_path): + print(f"\n{'='*60}") + print(f" {codebase_name}: {dir_path}") + print(f"{'='*60}") + + t0 = time.time() + results = analyze_directory( + dir_path, slice='package', method='langsize', + min_coverage=0.05, min_methods=3, + ) + elapsed = time.time() - t0 + + output = [] + sore_count = 0 + gbnf_ok = 0 + gbnf_fail = 0 + total_pkgs = 0 + + for ext, pkgs in results.items(): + for pkg, info in sorted(pkgs.items()): + grammar = info.get('grammar', '') + if grammar and grammar not in ('∅', 'ε', ''): + sore_count += 1 + total_pkgs += 1 + entry = {'package': pkg, 'ext': ext, 'sore': grammar, 'methods': info.get('methods', 0)} + try: + gbnf = to_gbnf(grammar) + entry['gbnf'] = gbnf + gbnf_ok += 1 + except Exception as e: + entry['gbnf_error'] = str(e) + gbnf_fail += 1 + output.append(entry) + elif grammar in ('∅', 'ε', ''): + pass # skip trivial + else: + total_pkgs += 1 + + print(f"\nTime: {elapsed:.1f}s") + print(f"Packages with grammar: {sore_count}") + print(f"GBNF OK: {gbnf_ok}, FAIL: {gbnf_fail}") + + # Print all conversions + print(f"\n{'─'*60}") + for e in output: + if 'gbnf' in e: + print(f" {e['package']}") + print(f" SORE: {e['sore']}") + print(f" GBNF: {e['gbnf']}") + elif 'gbnf_error' in e: + print(f" {e['package']}") + print(f" SORE: {e['sore']}") + print(f" ERR: {e['gbnf_error']}") + + # Save to file + out_path = Path(f"/tmp/gbnf_{codebase_name.lower().replace(' ','_')}.json") + with open(out_path, 'w') as f: + json.dump(output, f, indent=2) + print(f"\nSaved to {out_path}") + + return output + +if __name__ == '__main__': + name = sys.argv[1] + path = sys.argv[2] + run(name, path) diff --git a/experiments/results/ragsak_gbnf.json b/experiments/results/ragsak_gbnf.json new file mode 100644 index 0000000..9e52e4e --- /dev/null +++ b/experiments/results/ragsak_gbnf.json @@ -0,0 +1,816 @@ +[ + { + "package": "agents", + "ext": ".kt", + "methods": 5, + "sore": "slot?.(defaultCapabilityId+summarize)?.ToolInvocationRequest?.ToolingRequest?.ToolInvocationResult?.(String+answer+any+assertEquals+capture+captured+every+generateText+invoke+invokeTools+promptRunner+toolProfile+verify)+?.prompt?.contains+?", + "gbnf": "root ::= \"slot\"? (\"defaultCapabilityId\" | \"summarize\")? \"ToolInvocationRequest\"? \"ToolingRequest\"? \"ToolInvocationResult\"? (\"String\" | \"answer\" | \"any\" | \"assertEquals\" | \"capture\" | \"captured\" | \"every\" | \"generateText\" | \"invoke\" | \"invokeTools\" | \"promptRunner\" | \"toolProfile\" | \"verify\")* \"prompt\"? \"contains\"*", + "gbnf_ok": true + }, + { + "package": "agents/capability/ports/src/main/kotlin/eu/corentic/springrag/agent/capability", + "ext": ".kt", + "methods": 5, + "sore": "listCapabilities?.AgentExecutionContext?.DescribedAgentCapability?.firstOrNull+?.TransportExposedAgentCapability?.id?.return AgentCapabilityDescriptor(\n id = id,\n capabilityType = capabilityType,\n displayName = describedCapability?.displayName ?: id,\n description = describedCapability?.description,\n exposedOverHttp = exposedCapability?.exposedOverHttp ?: false,\n exposedOverMcp = exposedCapability?.exposedOverMcp ?: false\n )?.AgentCapabilityDescriptor?.displayName?.description?.exposedOverHttp?.exposedOverMcp?", + "gbnf_error": "Expected RPAREN, got ('LITERAL', ': id, description = describedCapability')", + "gbnf_ok": false + }, + { + "package": "agents/capability/support/src/main/kotlin/eu/corentic/springrag/agent/capability/support", + "ext": ".kt", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "agents/capability/support/src/test/kotlin/eu/corentic/springrag/agent/capability/support", + "ext": ".kt", + "methods": 6, + "sore": "runTest?.TestRequest?.(AgentCapabilityDescriptor+DefaultAgentCapabilityDirectory+IllegalStateException+assertEquals+assertFailsWith+authorize+capabilityDescriptors+coEvery+coVerify+defaultCapabilityId+every+id+invoke+listOf+message+resolve+verify)+.(any+listCapabilities)+?", + "gbnf": "root ::= \"runTest\"? \"TestRequest\"? (\"AgentCapabilityDescriptor\" | \"DefaultAgentCapabilityDirectory\" | \"IllegalStateException\" | \"assertEquals\" | \"assertFailsWith\" | \"authorize\" | \"capabilityDescriptors\" | \"coEvery\" | \"coVerify\" | \"defaultCapabilityId\" | \"every\" | \"id\" | \"invoke\" | \"listOf\" | \"message\" | \"resolve\" | \"verify\")+ (\"any\" | \"listCapabilities\")*", + "gbnf_ok": true + }, + { + "package": "agents/examples/simple-rag/src/main/kotlin/eu/corentic/springrag/example/rag/simple", + "ext": ".kt", + "methods": 9, + "skip": "too_diverse" + }, + { + "package": "agents/examples/simple-rag/src/test/kotlin/eu/corentic/springrag/example/rag/simple", + "ext": ".kt", + "methods": 14, + "skip": "too_diverse" + }, + { + "package": "agents/rag/embabel/src/main/kotlin/eu/corentic/springrag/agent/rag/embabel", + "ext": ".kt", + "methods": 58, + "sore": "shouldRetrieve?.buildObservationContext?.(ASK+ChatResponse+EmbabelJudgeDecision+Exception+JudgeOutcome+ResponseDraft+RetrievedEvidence+String+WORKFLOW_ORIGIN_CAPABILITY_KEY+WORKFLOW_TRANSPORT_KEY+advisors+agent+agents+allowAsk+allowRetrieve+applyRetrieveCost+askCost+asksSoFar+budgetRemaining+build+builder+call+canAffordRetrieve+catch+chatOptions+confidence+consumeBudget+contains+content+conversationId+copy+debug+decision+decisionState+docs+draftAnswer+else+emptyList+enoughEvidence+entity+equals+error+evidence+expandContext+find+get+if+ifBlank+info+invoke+isEmpty+isNotBlank+isNotEmpty+isNullOrBlank+java+joinToString+knowledgeBaseId+length+let+lowercase+maxRetrievalRounds+memoryContext+message+name+nextAction+of+options+orEmpty+originCapabilityId+param+prompt+promptClient+refinedQuery+removePrefix+removeSuffix+request+resultOfType+retrievalRounds+retrieve+retrieveCost+return false+return null+return this+return true+run+runWithCircuitBreaker+simpleName+size+system+take+takeIf+text+transport+trim+trimIndent+try+user+warn+withConversationId+withObservationContext+withWorkflowStep)+?.map+?.hasDefaultKb?.coerceIn+?", + "gbnf": "root ::= \"shouldRetrieve\"? \"buildObservationContext\"? (\"ASK\" | \"ChatResponse\" | \"EmbabelJudgeDecision\" | \"Exception\" | \"JudgeOutcome\" | \"ResponseDraft\" | \"RetrievedEvidence\" | \"String\" | \"WORKFLOW_ORIGIN_CAPABILITY_KEY\" | \"WORKFLOW_TRANSPORT_KEY\" | \"advisors\" | \"agent\" | \"agents\" | \"allowAsk\" | \"allowRetrieve\" | \"applyRetrieveCost\" | \"askCost\" | \"asksSoFar\" | \"budgetRemaining\" | \"build\" | \"builder\" | \"call\" | \"canAffordRetrieve\" | \"catch\" | \"chatOptions\" | \"confidence\" | \"consumeBudget\" | \"contains\" | \"content\" | \"conversationId\" | \"copy\" | \"debug\" | \"decision\" | \"decisionState\" | \"docs\" | \"draftAnswer\" | \"else\" | \"emptyList\" | \"enoughEvidence\" | \"entity\" | \"equals\" | \"error\" | \"evidence\" | \"expandContext\" | \"find\" | \"get\" | \"if\" | \"ifBlank\" | \"info\" | \"invoke\" | \"isEmpty\" | \"isNotBlank\" | \"isNotEmpty\" | \"isNullOrBlank\" | \"java\" | \"joinToString\" | \"knowledgeBaseId\" | \"length\" | \"let\" | \"lowercase\" | \"maxRetrievalRounds\" | \"memoryContext\" | \"message\" | \"name\" | \"nextAction\" | \"of\" | \"options\" | \"orEmpty\" | \"originCapabilityId\" | \"param\" | \"prompt\" | \"promptClient\" | \"refinedQuery\" | \"removePrefix\" | \"removeSuffix\" | \"request\" | \"resultOfType\" | \"retrievalRounds\" | \"retrieve\" | \"retrieveCost\" | \"return false\" | \"return null\" | \"return this\" | \"return true\" | \"run\" | \"runWithCircuitBreaker\" | \"simpleName\" | \"size\" | \"system\" | \"take\" | \"takeIf\" | \"text\" | \"transport\" | \"trim\" | \"trimIndent\" | \"try\" | \"user\" | \"warn\" | \"withConversationId\" | \"withObservationContext\" | \"withWorkflowStep\")* \"map\"* \"hasDefaultKb\"? \"coerceIn\"*", + "gbnf_ok": true + }, + { + "package": "agents/rag/embabel/src/main/kotlin/eu/corentic/springrag/agent/rag/embabel/librechat", + "ext": ".kt", + "methods": 13, + "skip": "too_diverse" + }, + { + "package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/agent/rag/embabel", + "ext": ".kt", + "methods": 36, + "sore": "very?.messageWindowMemory?.removeFirst+?.ery {?.unmockkAll?.(mockkObject+runTest)?.istKnowledgeBases(+?.add+?.return ChatResponse(listOf(Generation(AssistantMessage(content))))?.stKnowledgeBases()+?.(agRequest(+equest.+f(+heckKnowledgeBase(+nowledgeBaseId)+ssertEquals(+ssertNull()+?.(ASSISTANT+Agent+AgentProcess+AssistantMessage+ChatGraphLookupPort+ChatResponse+Companion+ConversationMemoryContext+DEFAULT_CONVERSATION_ID+DefaultEmbabelRagResponseInvoker+DirectAnswerDecision+EmbabelJudgeDecision+EmbabelLibreChatRetrievalAgent+EmbabelPlatformRagAgent+EmbabelRagDecisionPolicy+EmbabelRagWorkflowAgentProperties+EmbabelWorkflowObservationContext+EmbabelWorkflowObservationConvention+EmbabelWorkflowPromptService+Generation+InMemoryChatMemoryRepository+JudgeOutcome+LibreChatRetrievalRequest+NOOP+NoOpCircuitBreakerFactory+PageTextElement+ProcessOptions+Prompt+RagDecisionState+RagInvocation+RagRequest+RecordingChatModel+RetrievalPort+RetrievalQueryDraft+RetrievedEvidence+SpringAiEmbabelWorkflowPromptService+USER+UserMessage+VectorChunk+VectorDocumentPort+WORKFLOW_ORIGIN_CAPABILITY_KEY+WORKFLOW_STEP_KEY+WORKFLOW_TRANSPORT_KEY+advisors+agents+answer+any+anyMatch+applyRetrieveCost+asKnowledgeBaseId+assertEquals+assertNull+assertTrue+blackboard+build+builder+capture+captured+chatMemoryRepository+contains+context+contextId+conversationId+copy+createAgentProcessFrom+decision+decisionState+docs+draftAnswer+draftClarification+emptyList+enoughEvidence+every+executionContext+findExpandedTableMarkdown+findTextOnSamePage+first+get+getLowCardinalityKeyValues+http+invoke+isEmpty+java+judgeDecision+judgeEvidence+key+knowledgeBaseId+last+listOf+mapOf+maxMessages+message+messageType+mockk+name+nextAction+normalize+of+options+orEmpty+outcome+prompt+prompts+query+request+requireNotNull+resultOfType+retrievalRounds+retrieveInitialEvidence+retrieveMoreEvidence+run+searchByJobIds+searchSimilar+single+size+slot+stream+systemMessage+text+userMessage+value+verify)+?.ptyList()+?.vailableKnowledgeBases.?.gRequest(m?.ize)?.eckKnowledgeBase(r+?.ckKnowledgeBase(re+?.(sertEquals(f+sertNull(o)?.sertEquals(K?.ertEquals(Kn?.(\"+?.\"k+?.(owledgeBaseId =+quest.k+sDefaultKb)+sertEquals(t)+?.uest.kn?.owledgeBaseId)?.wledgeBaseId)?", + "gbnf_error": "Unexpected token: ('PLUS', '+')", + "gbnf_ok": false + }, + { + "package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/testsupport", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "agents/rag/ports/src/main/kotlin/eu/corentic/springrag/agent/rag", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "agents/rag/ports/src/test/kotlin/eu/corentic/springrag/agent/rag", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "agents/rag/ports/src/test/kotlin/eu/corentic/springrag/model", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "agents/rag/support/src/main/kotlin/eu/corentic/springrag/agent/rag/support", + "ext": ".kt", + "methods": 13, + "skip": "too_diverse" + }, + { + "package": "agents/rag/support/src/test/kotlin/eu/corentic/springrag/agent/rag/support", + "ext": ".kt", + "methods": 11, + "skip": "too_diverse" + }, + { + "package": "agents/summarizer/embabel/src/main/kotlin/eu/corentic/springrag/agent/summarizer/embabel", + "ext": ".kt", + "methods": 13, + "skip": "too_diverse" + }, + { + "package": "agents/summarizer/embabel/src/test/kotlin/eu/corentic/springrag/agent/summarizer/embabel", + "ext": ".kt", + "methods": 14, + "skip": "too_diverse" + }, + { + "package": "agents/tooling/agent/src/main/kotlin/eu/corentic/springrag/agent/tooling/agent", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "agents/tooling/embabel/src/main/kotlin/eu/corentic/springrag/agent/tooling/embabel", + "ext": ".kt", + "methods": 12, + "skip": "too_diverse" + }, + { + "package": "agents/tooling/embabel/src/main/kotlin/eu/corentic/springrag/agent/tooling/embabel/recording", + "ext": ".kt", + "methods": 11, + "skip": "too_diverse" + }, + { + "package": "agents/tooling/embabel/src/test/kotlin/eu/corentic/springrag/agent/tooling/embabel", + "ext": ".kt", + "methods": 6, + "skip": "too_diverse" + }, + { + "package": "agents/wikipedia/adapters/src/main/kotlin/eu/corentic/springrag/agent/wikipedia", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "agents/wikipedia/adapters/src/test/kotlin/eu/corentic/springrag/agent/wikipedia", + "ext": ".kt", + "methods": 8, + "skip": "too_diverse" + }, + { + "package": "agents/wikipedia/static/src/main/kotlin/eu/corentic/springrag/agent/wikipedia", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "agents/wikipedia/static/src/test/kotlin/eu/corentic/springrag/agent/wikipedia", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "app/src", + "ext": ".kt", + "methods": 6, + "skip": "too_diverse" + }, + { + "package": "app/src/e2eTest/kotlin/eu/corentic/springrag/e2e/cucumber/steps", + "ext": ".kt", + "methods": 17, + "sore": "(File+absoluteFile+listOf)+?.@?.randomUUID+?.requireNotNull+?.createKnowledgeBase?.(pollJobToCompletion+reset)+?.for?.Suppress+?.toString+?.currentTimeMillis+?.if?.substring+?.exists+?.registerUser?.return f?.login?.(APPLICATION_JSON+Any+MULTIPART_FORM_DATA+Map+MultipartBodyBuilder+String+assertNotNull+atMost+await+blockFirst+body+bodyValue+build+contentType+currentJobId+else+error+exchange+expectBody+expectStatus+findTestFile+fromMultipartData+get+header+isAccepted+isCreated+isOk+java+knowledgeBaseId+mapOf+name+ofMinutes+ofSeconds+part+pollInterval+post+readBytes+responseBody+return body ?: error(\"Create KB response body was null\")+return response?.get(\"answer\") as? String ?: \"\"+return response?.get(\"token\") as? String\n ?: error(\"Login response missing token\")+return@until false+returnResult+secondKnowledgeBaseId+status+until+uri+value+when)+?.authToken?.lastChatResponse?.assertEquals?.chat?", + "gbnf_error": "Expected RPAREN, got ('LITERAL', ': error')", + "gbnf_ok": false + }, + { + "package": "app/src/integrationTest/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 15, + "sore": "(ChatModel+Driver+QdrantClient+Session+String+also+any+close+every+mockk+run+session)+?.return JobRepositoryTestUtils(jobRepository)?.defaultOptions?.JobRepositoryTestUtils?.builder+?.build+?", + "gbnf": "root ::= (\"ChatModel\" | \"Driver\" | \"QdrantClient\" | \"Session\" | \"String\" | \"also\" | \"any\" | \"close\" | \"every\" | \"mockk\" | \"run\" | \"session\")* \"return JobRepositoryTestUtils\" \"jobRepository\"? \"defaultOptions\"? \"JobRepositoryTestUtils\"? \"builder\"* \"build\"*", + "gbnf_ok": true + }, + { + "package": "app/src/integrationTest/kotlin/eu/corentic/springrag/controller", + "ext": ".kt", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "app/src/integrationTest/kotlin/eu/corentic/springrag/service", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "app/src/systemTest/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 14, + "skip": "too_diverse" + }, + { + "package": "app/src/systemTest/kotlin/eu/corentic/springrag/system", + "ext": ".kt", + "methods": 46, + "sore": "queryForObject+?.session+?.MultipartBodyBuilder?.(createKnowledgeBase+newClient+runBlocking)+?.Long+?.use+?.part+?.run+?.readBytes+?.parameters+?.header+?.(COMPLETED+CallToolRequest+ClassPathResource+FAILED+IllegalStateException+JobStatus+List+MULTIPART_FORM_DATA+Map+McpSchema+PARTIAL_SUCCESS+String+TextContent+VectorChunk+absolutePath+add+adminClient+any+asJobId+assertEquals+assertNotEquals+assertNotNull+assertTrue+atMost+await+blockFirst+body+bodyValue+build+callTool+contains+content+contentType+copyTestDocument+count+countKnowledgeBaseNodes+countNodesByJobId+delete+documents+else+error+exchange+exists+expectBody+expectStatus+fail+fetchByJobId+file+filename+filter+first+fromMultipartData+get+getJobStatus+if+isAccepted+isCreated+isEmpty+isNoContent+isNotEmpty+isOk+java+length+listOf+map+mapNotNull+mapOf+metadata+mutate+name+ofMinutes+ofSeconds+path+pollInterval+post+queryParam+responseBody+responseTimeout+result+return response?.get(\"id\") as? String\n ?: error(\"Create knowledge base response missing id: $response\")+return response?.get(\"jobId\") as? String\n ?: error(\"Upload response missing jobId: $response\")+return terminalStatus ?: error(\"Job $jobId did not reach a terminal state in time\")+returnResult+searchSimilar+single+size+startJob+status+structuredContent+take+text+throw+try+until+uploadAsync+uploadAsyncMulti+uploadAsyncToKb+uri+value+waitForCompletedJob+waitForIndexedChunks+waitForTerminalStatus+waitUntil+when)+.finally?.asLong+?.toPath+?.closeGracefully+?.resolve+?.copy+?.REPLACE_EXISTING?.return target.toFile()?.toFile+?", + "gbnf_error": "Expected RPAREN, got ('LITERAL', 'as')", + "gbnf_ok": false + }, + { + "package": "app/src/test/kotlin/eu/corentic/springrag/architecture", + "ext": ".kt", + "methods": 87, + "sore": "eFromProject()+?.(filesIn+productionClasses+scopeFromProject)+?.ses()+?.(any+assertTrue+containingFile+contains+endsWith+exists+fileName+filter+filterNot+flatMap+forEach+functions+hasImport+if+listOf+name+path+productionFiles+readString+resideInPackage+resolve+startsWith+text+toString)+?.(.con+==+rtTrue(+t { i)+?", + "gbnf_error": "Unexpected token: ('RPAREN', ')')", + "gbnf_ok": false + }, + { + "package": "app/src/test/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "buildSrc/src/main/kotlin", + "ext": ".kt", + "methods": 8, + "skip": "too_diverse" + }, + { + "package": "buildSrc/src/test/kotlin", + "ext": ".kt", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "entrypoints/agent-mcp-server/src/main/kotlin/eu/corentic/springrag/mcp", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "entrypoints/agent-mcp-server/src/test/kotlin/eu/corentic/springrag/mcp", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller", + "ext": ".kt", + "methods": 58, + "sore": "getJobStatus+?.bindingResult?.return ResponseEntity.noContent().build()?.(mutableListOf+return ResponseEntity.ok(response))+?.return if (status != null) {\n ResponseEntity.ok(status)\n } else {\n ResponseEntity.notFound().build()\n }?.fieldErrors?.noContent+?.joinToString+?.field?.defaultMessage?.(BAD_REQUEST+CONFLICT+CREATED+DataBuffer+ErrorResponse+InvalidUploadRequestException+KnowledgeBaseNotFoundException+NOT_FOUND+PAYLOAD_TOO_LARGE+RuntimeException+TimeoutCancellationException+accepted+add+agentId+batchUploadRoot+body+buffer+catch+cleanupManagedUpload+content+conversationId+core+else+error+errorCode+filename+handle+headers+if+io+knowledgeBaseExists+knowledgeBaseId+map+mapOf+maxFileError+maxUploadBytes+message+name+next+of+ok+password+randomUUID+readableByteCount+registerBatch+release+return ResponseEntity.status(HttpStatus.BAD_REQUEST)\n .body(ErrorResponse(\"VALIDATION_ERROR\", \"Validation failed\", errors))+size+springframework+startBulkJob+startJob+status+throw+throw KnowledgeBaseNotFoundException(knowledgeBaseId)+throw e+toString+try+username+value+warn+withTimeout)+?.ChatResponse?.let+?.notFound+?.emptyList+?.write+?.build+?.then+?.awaitSingleOrNull+?", + "gbnf_error": "Unexpected token: ('RPAREN', ')')", + "gbnf_ok": false + }, + { + "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller/librechat", + "ext": ".kt", + "methods": 29, + "skip": "too_diverse" + }, + { + "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller/web", + "ext": ".kt", + "methods": 6, + "skip": "too_diverse" + }, + { + "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 4, + "sore": "bindToWebHandler+?.webTestClient?.from+?.WebHandler?.post+?.(OK+response+setStatusCode)+?.setComplete+?.webFilter+?.build+?.(AtomicReference+String)+?.WebFilterChain?.(assertEquals+assertNull+block+empty+filter+get+set)+?.uri+?.exchange+?.expectStatus+?.isOk?", + "gbnf": "root ::= \"bindToWebHandler\"* \"webTestClient\"? \"from\"* \"WebHandler\"? \"post\"* (\"OK\" | \"response\" | \"setStatusCode\")* \"setComplete\"* \"webFilter\"* \"build\"* (\"AtomicReference\" | \"String\")* \"WebFilterChain\"? (\"assertEquals\" | \"assertNull\" | \"block\" | \"empty\" | \"filter\" | \"get\" | \"set\")* \"uri\"* \"exchange\"* \"expectStatus\"* \"isOk\"?", + "gbnf_ok": true + }, + { + "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/controller", + "ext": ".kt", + "methods": 83, + "sore": "runTest?.(BAD_REQUEST+COMPLETED+ChatRequest+ChatResponse+GlobalExceptionHandler+JobStatus+MULTIPART_FORM_DATA+MultipartBodyBuilder+NOT_FOUND+SessionChatRequest+StorageProperties+String+any+assertEquals+bindToController+body+bodyValue+build+chatWithSources+chatWithSourcesAndMemory+coEvery+contentType+controllerAdvice+emptyList+every+exchange+expectBody+expectStatus+fromMultipartData+get+getJobStatus+header+isAccepted+isBadRequest+isEqualTo+isNotFound+isOk+jsonPath+knowledgeBaseExists+listOf+minusMinutes+mockk+now+part+post+runBlocking+startBulkJob+statusCode+toByteArray+toString+uri+value+verify)+?.error?", + "gbnf": "root ::= \"runTest\"? (\"BAD_REQUEST\" | \"COMPLETED\" | \"ChatRequest\" | \"ChatResponse\" | \"GlobalExceptionHandler\" | \"JobStatus\" | \"MULTIPART_FORM_DATA\" | \"MultipartBodyBuilder\" | \"NOT_FOUND\" | \"SessionChatRequest\" | \"StorageProperties\" | \"String\" | \"any\" | \"assertEquals\" | \"bindToController\" | \"body\" | \"bodyValue\" | \"build\" | \"chatWithSources\" | \"chatWithSourcesAndMemory\" | \"coEvery\" | \"contentType\" | \"controllerAdvice\" | \"emptyList\" | \"every\" | \"exchange\" | \"expectBody\" | \"expectStatus\" | \"fromMultipartData\" | \"get\" | \"getJobStatus\" | \"header\" | \"isAccepted\" | \"isBadRequest\" | \"isEqualTo\" | \"isNotFound\" | \"isOk\" | \"jsonPath\" | \"knowledgeBaseExists\" | \"listOf\" | \"minusMinutes\" | \"mockk\" | \"now\" | \"part\" | \"post\" | \"runBlocking\" | \"startBulkJob\" | \"statusCode\" | \"toByteArray\" | \"toString\" | \"uri\" | \"value\" | \"verify\")* \"error\"?", + "gbnf_ok": true + }, + { + "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/controller/auth", + "ext": ".kt", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/controller/librechat", + "ext": ".kt", + "methods": 46, + "sore": "runTest?.coEvery?.mockk?.mockFilePart?.FilePart?.(APPLICATION_JSON+APPLICATION_PDF+COMPLETED+DocumentImageInfo+EmbedOutcome+FAILED+GraphDocument+InvalidUploadRequestException+JobStatus+LibreChatRagIngestionService+LibreChatRetrievalRequest+LibreChatRetrievalResult+MULTIPART_FORM_DATA+MultipartBodyBuilder+ParsedDocument+RuntimeException+String+VectorChunk+any+asStorageUri+assertEquals+assertFailsWith+assertNotNull+batchUploadFile+batchUploadRoot+body+bodyValue+build+capture+captured+coVerify+contentType+emptyList+emptyMap+every+exchange+expectBody+expectStatus+fetchByJobId+fileId+fileIds+filename+findPageRendering+fromMultipartData+get+getJobStatus+getOrCreateAgentKnowledgeBase+header+ingestLocalFile+ingestMultipart+invoke+isEqualTo+isObjectStorageRoot+isOk+java+jsonPath+knowledgeBaseId+listOf+loadImage+mapOf+of+parse+part+post+slot+startJobWithId+toByteArray+uri+value+verify)+.(assertContains+message)+?.(assertTrue+doesNotExist+isNotFound)+?", + "gbnf": "root ::= \"runTest\"? \"coEvery\"? \"mockk\"? \"mockFilePart\"? \"FilePart\"? (\"APPLICATION_JSON\" | \"APPLICATION_PDF\" | \"COMPLETED\" | \"DocumentImageInfo\" | \"EmbedOutcome\" | \"FAILED\" | \"GraphDocument\" | \"InvalidUploadRequestException\" | \"JobStatus\" | \"LibreChatRagIngestionService\" | \"LibreChatRetrievalRequest\" | \"LibreChatRetrievalResult\" | \"MULTIPART_FORM_DATA\" | \"MultipartBodyBuilder\" | \"ParsedDocument\" | \"RuntimeException\" | \"String\" | \"VectorChunk\" | \"any\" | \"asStorageUri\" | \"assertEquals\" | \"assertFailsWith\" | \"assertNotNull\" | \"batchUploadFile\" | \"batchUploadRoot\" | \"body\" | \"bodyValue\" | \"build\" | \"capture\" | \"captured\" | \"coVerify\" | \"contentType\" | \"emptyList\" | \"emptyMap\" | \"every\" | \"exchange\" | \"expectBody\" | \"expectStatus\" | \"fetchByJobId\" | \"fileId\" | \"fileIds\" | \"filename\" | \"findPageRendering\" | \"fromMultipartData\" | \"get\" | \"getJobStatus\" | \"getOrCreateAgentKnowledgeBase\" | \"header\" | \"ingestLocalFile\" | \"ingestMultipart\" | \"invoke\" | \"isEqualTo\" | \"isObjectStorageRoot\" | \"isOk\" | \"java\" | \"jsonPath\" | \"knowledgeBaseId\" | \"listOf\" | \"loadImage\" | \"mapOf\" | \"of\" | \"parse\" | \"part\" | \"post\" | \"slot\" | \"startJobWithId\" | \"toByteArray\" | \"uri\" | \"value\" | \"verify\")+ (\"assertContains\" | \"message\")* (\"assertTrue\" | \"doesNotExist\" | \"isNotFound\")*", + "gbnf_ok": true + }, + { + "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/controller/web", + "ext": ".kt", + "methods": 10, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/ai-provider/src/main/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/ai-provider/src/main/kotlin/eu/corentic/springrag/health", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 6, + "sore": "assertThrows?.IllegalArgumentException?.java?.OllamaClientProperties?.EmbabelAiHttpClientProperties?.Timeout+?.(assertEquals+baseUrl+ofSeconds+readTimeout+writeTimeout)+.timeout?.connectTimeout?.read?", + "gbnf": "root ::= \"assertThrows\"? \"IllegalArgumentException\"? \"java\"? \"OllamaClientProperties\"? \"EmbabelAiHttpClientProperties\"? \"Timeout\"* (\"assertEquals\" | \"baseUrl\" | \"ofSeconds\" | \"readTimeout\" | \"writeTimeout\")+ \"timeout\"? \"connectTimeout\"? \"read\"?", + "gbnf_ok": true + }, + { + "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/health", + "ext": ".kt", + "methods": 4, + "sore": "`when`.listModels+.thenThrow+?.thenReturn+?.RuntimeException?.ListModelResponse+?.listOf+?.(Model+now)+?.requireNotNull+.OllamaHealthIndicator.NoOpCircuitBreakerFactory.health+.block+.assertEquals.status.code", + "gbnf": "root ::= \"`when`\" \"listModels\"+ \"thenThrow\"* \"thenReturn\"* \"RuntimeException\"? \"ListModelResponse\"* \"listOf\"* (\"Model\" | \"now\")* \"requireNotNull\"+ \"OllamaHealthIndicator\" \"NoOpCircuitBreakerFactory\" \"health\"+ \"block\"+ \"assertEquals\" \"status\" \"code\"", + "gbnf_ok": true + }, + { + "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/service/embedding", + "ext": ".kt", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/testsupport", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/chat-memory/src/test/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 6, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/doc-parser/src", + "ext": ".kt", + "methods": 6, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/doc-parser/src/main/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/doc-parser/src/main/kotlin/eu/corentic/springrag/service/docling", + "ext": ".kt", + "methods": 21, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/doc-parser/src/systemTest/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 6, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 12, + "sore": "DoclingConfig?.doclingServeApi+?.PipelineOptions?.trimIndent+?.baseUrl?.assertNotNull+?.(assertNull+concurrency+layoutBatchSize+ocrBatchSize+tableBatchSize)+?.lines+?.(imageExportMode+includeImages+options+useS3Target)+?.toString+?.documentTimeout?.(indexOfFirst+startsWith+trimStart)+?.s3Target?.(assertThat+contains+doesNotContain+isGreaterThan)+?.bucket?.assertThatThrownBy?.validateCriticalSettings+?.isInstanceOf+?.IllegalStateException?.java?.hasMessageContaining+?", + "gbnf": "root ::= \"DoclingConfig\"? \"doclingServeApi\"* \"PipelineOptions\"? \"trimIndent\"* \"baseUrl\"? \"assertNotNull\"* (\"assertNull\" | \"concurrency\" | \"layoutBatchSize\" | \"ocrBatchSize\" | \"tableBatchSize\")* \"lines\"* (\"imageExportMode\" | \"includeImages\" | \"options\" | \"useS3Target\")* \"toString\"* \"documentTimeout\"? (\"indexOfFirst\" | \"startsWith\" | \"trimStart\")* \"s3Target\"? (\"assertThat\" | \"contains\" | \"doesNotContain\" | \"isGreaterThan\")* \"bucket\"? \"assertThatThrownBy\"? \"validateCriticalSettings\"* \"isInstanceOf\"* \"IllegalStateException\"? \"java\"? \"hasMessageContaining\"*", + "gbnf_ok": true + }, + { + "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/health", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/service/docling", + "ext": ".kt", + "methods": 10, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/testsupport", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/health", + "ext": ".kt", + "methods": 7, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/model/graph", + "ext": ".kt", + "methods": 9, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/repository", + "ext": ".kt", + "methods": 24, + "sore": "n(+?.ace(\"\\\\+?.ithCircuitBreaker { v?.peFilterValue(val?.mutableListOf+?.Document?.debug+?.((+Empty()+stinct()+turn)+?.VectorChunk?.pplier {?.ace(\"'\"+?.te(fil+?.String+?.orEmpty+?.size?.turn emptyList()?.inToString(s+?.NotEmpty()+?.toMap+?.tion()?.toMutableMap+?.(add+build+builder+distinct+emptyList+escapeFilterValue+filterExpression+if+isEmpty+isNullOrEmpty+joinToString+query+return emptyList()+return runWithCircuitBreaker { vectorStore.similaritySearch(request).map { it.toVectorChunk() } }+runWithCircuitBreaker+topK+value)+?.ptyList()+?.legalStateException(\"?.apply+?.similaritySearch+?.inToString(\"+?.rn {+?.putIfAbsent?.map+?.capeFilterValue(i?.ssage}\"?.(toSpringDocument+toVectorChunk)+?.ilder()+?.w cause?.ery(\"+?.w cau?.pK(5+?.pK(1+?.ze)?.lterExpression(\"+?.lterExpression(f+?.lterExpression(+?.(capeFilterValue(j+capeFilterValue(k)?.capeFilterValue(d?.inToString(+?.capeFilterValue(l?.lue)}?.leteByFilter(f?.ild()+?.lterEquals(M?.turn runWithCircuitBreaker { vectorStore.similaritySearch(request).map { it.toVectorChunk() } }?.lue))?.nWithCircuitBreaker {?.milaritySearch(r+?.lete(i+?.p {+?.VectorChunk()+?", + "gbnf_error": "Unexpected token: ('PLUS', '+')", + "gbnf_ok": false + }, + { + "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/agent", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/cleanup", + "ext": ".kt", + "methods": 4, + "sore": "info+.(deleteByJobId+deleteByKnowledgeBaseId+jobId+knowledgeBaseId+value)+", + "gbnf": "root ::= \"info\"+ (\"deleteByJobId\" | \"deleteByKnowledgeBaseId\" | \"jobId\" | \"knowledgeBaseId\" | \"value\")+", + "gbnf_ok": true + }, + { + "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/graph", + "ext": ".kt", + "methods": 12, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/port/adapter", + "ext": ".kt", + "methods": 45, + "sore": "(Regex+emptyList+if+isNullOrBlank+replace+return emptyList())+?.save+?.deleteByJobId+?.of+?.findById+?.toNode+?.value+?.map+?.orElse+?.text?.toDomain+?.let+?.storageUri?.(imageType+pageNo)+?", + "gbnf_error": "Unexpected token: ('RPAREN', ')')", + "gbnf_ok": false + }, + { + "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/storage", + "ext": ".kt", + "methods": 40, + "sore": "replace+?.loadObject?.when?.buildImageKey?.(listObjects+return parseStorageUri(storageUri)\n ?: S3Location(bucket = properties.bucket, key = storageUri.trimStart('/')))?.ifBlank+?.return storeObject(key, bytes, contentTypeFor(format))?.lowercase+?.storeObject?.return StorageUri.of(\"images/${jobId.value}/$sanitizedId.$extension\")?.contentTypeFor?.(BlobListOption+GcsLocation+NoSuchBucketException+ObjectIdentifier+S3Exception+S3Location+amazon+awssdk+bucket+build+builder+catch+chunked+contentType+contents+create+credentialsProvider+delete+deleteObject+deleteObjects+else+fromBytes+get+getObject+headObject+if+isBlank+isEmpty+iterateAll+key+list+listObjectsV2+map+mapNotNull+model+name+objects+of+parseS3Location+parseStorageUri+prefix+putObject+readAllBytes+region+resolveLocation+return 0+return StorageUri.of(\"s3://${location.bucket}/${location.key}\")+return false+return null+return parseS3Location(storageUri, properties.bucket)\n ?: run {\n if (storageUri.startsWith(\"s3://\")) {\n logger.warn { \"Invalid storage URI: $storageUri\" }\n }\n null\n }+return response.contents().map { obj -> StorageUri.of(\"s3://${location.bucket}/${obj.key()}\") }+return try {\n s3Client.deleteObject(\n DeleteObjectRequest.builder()\n .bucket(location.bucket)\n .key(location.key)\n .build()\n )\n true\n } catch (ex: S3Exception) {\n if (ex.statusCode() == 404) false else throw ex\n }+return try {\n s3Client.getObject({ builder ->\n builder.bucket(location.bucket).key(location.key)\n }).readAllBytes()\n } catch (ex: NoSuchBucketException) {\n logger.warn { \"S3 bucket missing for object retrieval: ${location.bucket}\" }\n null\n } catch (ex: S3Exception) {\n logger.warn(ex) { \"Failed to load object from S3: ${storageUri.value}\" }\n null\n }+return try {\n s3Client.headObject(\n HeadObjectRequest.builder()\n .bucket(location.bucket)\n .key(location.key)\n .build()\n )\n true\n } catch (_: NoSuchBucketException) {\n false\n } catch (ex: S3Exception) {\n if (ex.statusCode() == 404) false else throw ex\n }+run+s3+services+startsWith+statusCode+sumOf+toList+trimEnd+trimStart+try+value+warn)+?.size?.throw ex?.throw?", + "gbnf_error": "Expected RPAREN, got ('LITERAL', '')", + "gbnf_ok": false + }, + { + "package": "infrastructure/adapters/search/src/systemTest/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/systemTest/kotlin/eu/corentic/springrag/repository/graph", + "ext": ".kt", + "methods": 23, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/systemTest/kotlin/eu/corentic/springrag/system", + "ext": ".kt", + "methods": 6, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/health", + "ext": ".kt", + "methods": 6, + "sore": "(HealthCheckReply+`when`+collectionExistsAsync+getDefaultInstance+healthCheckAsync+immediateFuture+thenReturn+verifyConnectivityAsync)+.failedFuture+?.immediateFailedFuture+?.completedFuture+?.IllegalStateException?.(InterruptedException+TimeoutException)?.(Neo4jDriverHealthIndicator+QdrantVectorStoreHealthIndicator+assertEquals+assertTrue+block+code+currentThread+health+interrupted+isInterrupted+requireNotNull+status)+", + "gbnf": "root ::= (\"HealthCheckReply\" | \"`when`\" | \"collectionExistsAsync\" | \"getDefaultInstance\" | \"healthCheckAsync\" | \"immediateFuture\" | \"thenReturn\" | \"verifyConnectivityAsync\")+ \"failedFuture\"* \"immediateFailedFuture\"* \"completedFuture\"* \"IllegalStateException\"? (\"InterruptedException\" | \"TimeoutException\")? (\"Neo4jDriverHealthIndicator\" | \"QdrantVectorStoreHealthIndicator\" | \"assertEquals\" | \"assertTrue\" | \"block\" | \"code\" | \"currentThread\" | \"health\" | \"interrupted\" | \"isInterrupted\" | \"requireNotNull\" | \"status\")+", + "gbnf_ok": true + }, + { + "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/model/graph", + "ext": ".kt", + "methods": 7, + "sore": "(ImageData+PageNode)+?.(PictureElement+SectionHeaderElement)?.copy+?.assertEquals+?.assertNotEquals?.(hashCode+label)+?", + "gbnf": "root ::= (\"ImageData\" | \"PageNode\")* (\"PictureElement\" | \"SectionHeaderElement\")? \"copy\"* \"assertEquals\"* \"assertNotEquals\"? (\"hashCode\" | \"label\")*", + "gbnf_ok": true + }, + { + "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/repository", + "ext": ".kt", + "methods": 19, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/cleanup", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/graph", + "ext": ".kt", + "methods": 30, + "sore": "assertThrows?.GraphDocument?.IllegalArgumentException?.java?.(DocumentGraphJob+DocumentJobNode+GraphImagePayload+GraphPage+GraphPictureElement+GraphTableElement+GraphTextElement+Instant+String+activateDocument+activateDocumentGraph+adjustCounters+adjustSizeInBytes+any+arg+asDocumentId+asFilename+asJobId+asKnowledgeBaseId+asLogicalDocumentId+asStorageUri+assertDoesNotThrow+byteArrayOf+capture+corentic+countActiveDocumentsByLogicalDocumentId+countActiveElementsByLogicalDocumentId+createBelongsToRelationship+deactivateByLogicalDocumentId+deactivateByLogicalDocumentIdExcept+deleteByJobId+deleteObject+deleteObjects+emptyGraphDocument+emptyList+eu+every+existsById+findByJobId+findByKnowledgeBaseId+findByLogicalDocumentId+findOrCreateInactive+forEach+graph+isActive+listOf+minusSeconds+model+now+parse+repeat+saveDocumentGraph+slot+springrag+stageDocumentGraph+storeDocumentGraph+storeImage+stubDocumentGraphJob+sumActiveFileSizeBytesByLogicalDocumentId+time+value+verify+verifyOrder)+?.GraphIngestionOrchestrator?.captured?.NoOpCircuitBreakerFactory?.(assertEquals+assertNotNull+assertNull+doclingId+first+height+imageData+imageType+page+pageNo+pages+pictureElements+rendering+size+storageUri+textElements+width)+?.text?", + "gbnf": "root ::= \"assertThrows\"? \"GraphDocument\"? \"IllegalArgumentException\"? \"java\"? (\"DocumentGraphJob\" | \"DocumentJobNode\" | \"GraphImagePayload\" | \"GraphPage\" | \"GraphPictureElement\" | \"GraphTableElement\" | \"GraphTextElement\" | \"Instant\" | \"String\" | \"activateDocument\" | \"activateDocumentGraph\" | \"adjustCounters\" | \"adjustSizeInBytes\" | \"any\" | \"arg\" | \"asDocumentId\" | \"asFilename\" | \"asJobId\" | \"asKnowledgeBaseId\" | \"asLogicalDocumentId\" | \"asStorageUri\" | \"assertDoesNotThrow\" | \"byteArrayOf\" | \"capture\" | \"corentic\" | \"countActiveDocumentsByLogicalDocumentId\" | \"countActiveElementsByLogicalDocumentId\" | \"createBelongsToRelationship\" | \"deactivateByLogicalDocumentId\" | \"deactivateByLogicalDocumentIdExcept\" | \"deleteByJobId\" | \"deleteObject\" | \"deleteObjects\" | \"emptyGraphDocument\" | \"emptyList\" | \"eu\" | \"every\" | \"existsById\" | \"findByJobId\" | \"findByKnowledgeBaseId\" | \"findByLogicalDocumentId\" | \"findOrCreateInactive\" | \"forEach\" | \"graph\" | \"isActive\" | \"listOf\" | \"minusSeconds\" | \"model\" | \"now\" | \"parse\" | \"repeat\" | \"saveDocumentGraph\" | \"slot\" | \"springrag\" | \"stageDocumentGraph\" | \"storeDocumentGraph\" | \"storeImage\" | \"stubDocumentGraphJob\" | \"sumActiveFileSizeBytesByLogicalDocumentId\" | \"time\" | \"value\" | \"verify\" | \"verifyOrder\")* \"GraphIngestionOrchestrator\"? \"captured\"? \"NoOpCircuitBreakerFactory\"? (\"assertEquals\" | \"assertNotNull\" | \"assertNull\" | \"doclingId\" | \"first\" | \"height\" | \"imageData\" | \"imageType\" | \"page\" | \"pageNo\" | \"pages\" | \"pictureElements\" | \"rendering\" | \"size\" | \"storageUri\" | \"textElements\" | \"width\")* \"text\"?", + "gbnf_ok": true + }, + { + "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/port/adapter", + "ext": ".kt", + "methods": 28, + "skip": "too_diverse" + }, + { + "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/storage", + "ext": ".kt", + "methods": 3, + "sore": "assertNull?.parseS3Location.error+?.(assertEquals+bucket)+?.key?", + "gbnf": "root ::= \"assertNull\"? \"parseS3Location\" \"error\"* (\"assertEquals\" | \"bucket\")* \"key\"?", + "gbnf_ok": true + }, + { + "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/testsupport", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "modules/chat/src/integrationTest/kotlin/eu/corentic/springrag/service/chat", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "modules/chat/src/main/kotlin/eu/corentic/springrag/service/chat", + "ext": ".kt", + "methods": 6, + "sore": "let+?.info+?.KnowledgeBaseId?.defaultAgentId+?.(RagInvocation+RagRequest+invoke+return ragAgentInvocationGateway.invoke(\n RagInvocation(\n request = request,\n executionContext = AgentExecutionContext.http()\n )\n )+return ragAgentInvocationGateway.invoke(\n RagInvocation(\n request = request,\n executionContext = AgentExecutionContext.http(contextId = conversationId)\n )\n ))+?.listCapabilities+?.http+?.map+?.filter+?.id?.AgentCapabilityDescriptor?", + "gbnf_error": "Unexpected token: ('RPAREN', ')')", + "gbnf_ok": false + }, + { + "package": "modules/chat/src/systemTest/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 15, + "skip": "too_diverse" + }, + { + "package": "modules/chat/src/systemTest/kotlin/eu/corentic/springrag/system", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "modules/chat/src/test/kotlin/eu/corentic/springrag/service/chat", + "ext": ".kt", + "methods": 8, + "skip": "too_diverse" + }, + { + "package": "modules/common/src/main/kotlin/eu/corentic/springrag/common", + "ext": ".kt", + "methods": 7, + "skip": "too_diverse" + }, + { + "package": "modules/common/src/main/kotlin/eu/corentic/springrag/common/ids", + "ext": ".kt", + "methods": 18, + "sore": "of+?.(removeSuffix+trim)+?.requireNonBlankNoWhitespace?.(DocumentId+JobId+KnowledgeBaseId+LogicalDocumentId)?.trimStart+?.requireSafeId?.return StorageUri(\"$base/$relative\")?.StorageUri?.requireNonBlank?.(contains+isNotEmpty+require)+?.return Filename(normalized)?.any+?.matches+?.return BatchId(normalized)?.Filename?.isWhitespace+?.BatchId?.return normalized?", + "gbnf": "root ::= \"of\"* (\"removeSuffix\" | \"trim\")* \"requireNonBlankNoWhitespace\"? (\"DocumentId\" | \"JobId\" | \"KnowledgeBaseId\" | \"LogicalDocumentId\")? \"trimStart\"* \"requireSafeId\"? \"return StorageUri\" \"\\\"$base/$relative\\\"\"? \"StorageUri\"? \"requireNonBlank\"? (\"contains\" | \"isNotEmpty\" | \"require\")* \"return Filename\" \"normalized\"? \"any\"* \"matches\"* \"return BatchId\" \"normalized\"? \"Filename\"? \"isWhitespace\"* \"BatchId\"? \"return normalized\"?", + "gbnf_ok": true + }, + { + "package": "modules/common/src/test/kotlin/eu/corentic/springrag/common/ids", + "ext": ".kt", + "methods": 8, + "sore": "(IllegalArgumentException+asBatchId+asDocumentId+asFilename+asJobId+asKnowledgeBaseId+asLogicalDocumentId+asStorageUri+assertEquals+assertFailsWith+of+value)+", + "gbnf": "root ::= (\"IllegalArgumentException\" | \"asBatchId\" | \"asDocumentId\" | \"asFilename\" | \"asJobId\" | \"asKnowledgeBaseId\" | \"asLogicalDocumentId\" | \"asStorageUri\" | \"assertEquals\" | \"assertFailsWith\" | \"of\" | \"value\")+", + "gbnf_ok": true + }, + { + "package": "modules/ingestion/src/integrationTest/kotlin/eu/corentic/springrag/service/job", + "ext": ".kt", + "methods": 34, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch", + "ext": ".kt", + "methods": 16, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/listener", + "ext": ".kt", + "methods": 16, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/model", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/partition", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/reader", + "ext": ".kt", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/writer", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/config", + "ext": ".kt", + "methods": 26, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/service/chunk", + "ext": ".kt", + "methods": 18, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/service/document", + "ext": ".kt", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/service/job", + "ext": ".kt", + "methods": 62, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch", + "ext": ".kt", + "methods": 17, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/listener", + "ext": ".kt", + "methods": 34, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/model", + "ext": ".kt", + "methods": 8, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/partition", + "ext": ".kt", + "methods": 7, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/processor", + "ext": ".kt", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/reader", + "ext": ".kt", + "methods": 12, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/writer", + "ext": ".kt", + "methods": 14, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/service/chunk", + "ext": ".kt", + "methods": 8, + "skip": "too_diverse" + }, + { + "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/service/job", + "ext": ".kt", + "methods": 49, + "skip": "too_diverse" + }, + { + "package": "modules/knowledgebase/ports/src/main/kotlin/eu/corentic/springrag/model", + "ext": ".kt", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "modules/knowledgebase/src/main/kotlin/eu/corentic/springrag/service/knowledgebase", + "ext": ".kt", + "methods": 11, + "skip": "too_diverse" + }, + { + "package": "modules/knowledgebase/src/test/kotlin/eu/corentic/springrag/service/knowledgebase", + "ext": ".kt", + "methods": 16, + "skip": "too_diverse" + }, + { + "package": "modules/security/src/main/kotlin/eu/corentic/springrag/security/config", + "ext": ".kt", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "modules/security/src/main/kotlin/eu/corentic/springrag/security/service", + "ext": ".kt", + "methods": 10, + "skip": "too_diverse" + }, + { + "package": "modules/security/src/test/kotlin/eu/corentic/springrag/security/config", + "ext": ".kt", + "methods": 6, + "skip": "too_diverse" + }, + { + "package": "modules/security/src/test/kotlin/eu/corentic/springrag/security/service", + "ext": ".kt", + "methods": 15, + "sore": "(encode+every+existsByUsername)+?.JwtService?.init+?.JwtProperties?.UserService?.hmacShaKeyFor+?.generateToken+?.toByteArray+?.assertFalse?.UTF_8?.builder+?.subject+?.issuedAt+?.(Date+expiration)+?.currentTimeMillis+?.signWith+?.compact+?.(Err+Outcome+PasswordPolicyViolationException+ROLE_USER+String+UserAlreadyExistsException+any+assertEquals+assertThrows+assertTrue+authorities+authority+emptyList+error+extractAuthorities+extractUsername+firstArg+getOrThrow+java+listOf+map+match+parseToken+password+registerUser+role+save+username+validateToken+verify)+?.errorCode?.JwtValidationError?.(Expired+InvalidSignature+Malformed)?", + "gbnf": "root ::= (\"encode\" | \"every\" | \"existsByUsername\")* \"JwtService\"? \"init\"* \"JwtProperties\"? \"UserService\"? \"hmacShaKeyFor\"* \"generateToken\"* \"toByteArray\"* \"assertFalse\"? \"UTF_8\"? \"builder\"* \"subject\"* \"issuedAt\"* (\"Date\" | \"expiration\")* \"currentTimeMillis\"* \"signWith\"* \"compact\"* (\"Err\" | \"Outcome\" | \"PasswordPolicyViolationException\" | \"ROLE_USER\" | \"String\" | \"UserAlreadyExistsException\" | \"any\" | \"assertEquals\" | \"assertThrows\" | \"assertTrue\" | \"authorities\" | \"authority\" | \"emptyList\" | \"error\" | \"extractAuthorities\" | \"extractUsername\" | \"firstArg\" | \"getOrThrow\" | \"java\" | \"listOf\" | \"map\" | \"match\" | \"parseToken\" | \"password\" | \"registerUser\" | \"role\" | \"save\" | \"username\" | \"validateToken\" | \"verify\")* \"errorCode\"? \"JwtValidationError\"? (\"Expired\" | \"InvalidSignature\" | \"Malformed\")?", + "gbnf_ok": true + }, + { + "package": "platform/test-support/src/main/kotlin/eu/corentic/springrag/testcontainers", + "ext": ".kt", + "methods": 13, + "skip": "too_diverse" + }, + { + "package": "platform/test-support/src/test/kotlin/eu/corentic/springrag/testcontainers", + "ext": ".kt", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "(other)", + "ext": ".kt", + "methods": 6 + }, + { + "package": "compose/patches", + "ext": ".js", + "methods": 17, + "skip": "too_diverse" + }, + { + "package": "testing/steps", + "ext": ".js", + "methods": 68, + "sore": "(Promise+TEST_FILE+all+await+btn+chip+click+document+evaluate+expect+fc+fill+filter+first+form+generateSuffix+getByRole+goto+idPara+if+includes+isClosed+last+locator+modelBtn+querySelector+setFiles+suffix+textContent+waitFor+waitForEvent+waitForTimeout+waitForURL)+.url?.(toBeTruthy+toBeVisible)?.toContain?", + "gbnf": "root ::= (\"Promise\" | \"TEST_FILE\" | \"all\" | \"await\" | \"btn\" | \"chip\" | \"click\" | \"document\" | \"evaluate\" | \"expect\" | \"fc\" | \"fill\" | \"filter\" | \"first\" | \"form\" | \"generateSuffix\" | \"getByRole\" | \"goto\" | \"idPara\" | \"if\" | \"includes\" | \"isClosed\" | \"last\" | \"locator\" | \"modelBtn\" | \"querySelector\" | \"setFiles\" | \"suffix\" | \"textContent\" | \"waitFor\" | \"waitForEvent\" | \"waitForTimeout\" | \"waitForURL\")+ \"url\"? (\"toBeTruthy\" | \"toBeVisible\")? \"toContain\"?", + "gbnf_ok": true + }, + { + "package": "testing/support", + "ext": ".js", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "(other)", + "ext": ".js", + "methods": 1 + }, + { + "package": "tools/setup-ui", + "ext": ".go", + "methods": 44, + "sore": "g)?.wStyle()+?.([]s+?.(ng{}+rr)+?.lor(\"+?.ng, 0,+?.i :?.m.s+?..s?.s[i].?.(\"BA+\"NE+\"SP+(cfg+Cmd+Index = i+Quit+StepModel()+String+Update+View+_,+al+case+cfg+edKeys(cfg+en+errMessage+fg+if+iles, \",+input+key+kind+lServices, \",+lServicesMode ==+ldRun(&m.+list+menu+mode+model+nd(cfg+optionItem+oyChoice !=+oyChoice ==+return+rn\n\t\t}+rn \"\"+rn tru+shouldStart+shouldWriteEnv+stepIndex+steps+switch+syncStepModel+te+tea+title+{)+?.ocalService(\"ol+?.map?.rn str?.turn s?.string+?.(lin+?.in([+?.ader(\"+?", + "gbnf": "root ::= \"g\"", + "gbnf_ok": true + } +] \ No newline at end of file