Skip to content

feat: add multi-index query support (queryAll / query_all)#3

Open
mithun50 wants to merge 2 commits intomainfrom
feat/multi-index-query
Open

feat: add multi-index query support (queryAll / query_all)#3
mithun50 wants to merge 2 commits intomainfrom
feat/multi-index-query

Conversation

@mithun50
Copy link
Copy Markdown
Owner

@mithun50 mithun50 commented Apr 3, 2026

  • Fix docs/how-it-works.md — add language identifiers (text) to unlabeled fenced code blocks (MD040)
  • Fix examples/node/multi-index.ts — guard GEMINI_API_KEY explicitly instead of non-null assertion
  • Fix src/core.ts — validate LLM availability before firing Promise.all() (fail fast)
  • Fix treedex/core.py — validate LLM availability before fan-out (fail fast)

- Add MultiQueryResult class (TS + Python) with combined_context, labels,
  per-index results, and optional agentic answer
- Add static TreeDex.queryAll() (TS, parallel) and TreeDex.query_all()
  (Python) — queries N indexes, merges context with [Label] separators
- Export MultiQueryResult from src/index.ts and treedex/__init__.py
- Add 10 new tests in test/core.test.ts and tests/test_core.py covering
  multi-index queries, custom labels, shared LLM, agentic mode, and
  validation errors
- Add examples/multi_index.py and examples/node/multi-index.ts
- Add docs/how-it-works.md — full phase-by-phase pipeline walkthrough
- Update docs/api.md, README.md, DOCS.md with MultiQueryResult reference
- Fix docs nav_order conflict (how-it-works.md=3, shifted api.md+ up by 1)
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 3, 2026

📝 Walkthrough

Walkthrough

This pull request introduces a new multi-index querying API to TreeDex, enabling simultaneous queries across multiple TreeDex indexes with merged results. New query_all() (Python) and queryAll() (TypeScript) methods return combined context across indexes and optionally generate a single unified answer in agentic mode. Comprehensive documentation, examples, and test coverage included.

Changes

Cohort / File(s) Summary
Core Multi-Index API
src/core.ts, treedex/core.py
Added new MultiQueryResult class with results, labels, combinedContext/combined_context, and answer fields. Implemented TreeDex.queryAll() (TypeScript) and TreeDex.query_all() (Python) static methods that accept multiple indexes, execute queries concurrently, merge contexts with per-index labels and separators, and optionally generate a unified answer via LLM in agentic mode.
Package Exports
src/index.ts, treedex/__init__.py
Re-exported MultiQueryResult from core modules to make it publicly accessible from package root.
API & Documentation
DOCS.md, README.md, docs/api.md
Documented the new multi-index query API including method signatures, parameters, return type structure, and usage examples for both Python and TypeScript.
Workflow Documentation
docs/how-it-works.md
Added comprehensive new guide explaining TreeDex's end-to-end workflow: document loading, hierarchical structure detection, tree construction, single-index querying, and multi-index querying with flow diagram.
Navigation Reordering
docs/llm-backends.md, docs/benchmarks.md, docs/case-studies.md, docs/configuration.md, docs/benchmark-report.md
Updated nav_order front-matter values in multiple docs to accommodate new documentation pages.
Usage Examples
examples/multi_index.py, examples/node/multi-index.ts
Added complete example scripts demonstrating multi-index querying with custom labels, combined context output, and agentic answer generation in both Python and TypeScript.
Test Coverage
test/core.test.ts, tests/test_core.py
Expanded test suites with comprehensive coverage for MultiQueryResult constructor and formatting, queryAll()/query_all() with various options, validation of inputs, agentic mode behavior, and custom label support.

Sequence Diagram

sequenceDiagram
    participant Client
    participant TreeDex1 as TreeDex Index 1
    participant TreeDex2 as TreeDex Index 2
    participant TreeDex3 as TreeDex Index N
    participant ContextMerge as Context Merger
    participant LLM as LLM (Agentic)
    
    Client->>TreeDex1: query(question, agentic=false)
    Client->>TreeDex2: query(question, agentic=false)
    Client->>TreeDex3: query(question, agentic=false)
    par Concurrent Queries
        TreeDex1-->>Client: QueryResult (context)
        TreeDex2-->>Client: QueryResult (context)
        TreeDex3-->>Client: QueryResult (context)
    end
    
    Client->>ContextMerge: merge(results, labels)
    ContextMerge-->>Client: combinedContext [Label1]...[LabelN]
    
    alt Agentic Mode Enabled
        Client->>LLM: answerPrompt(combinedContext, question)
        LLM-->>Client: answer
    else Agentic Disabled
        Client-->>Client: answer = ""
    end
    
    Client-->>Client: MultiQueryResult(results, labels, combinedContext, answer)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~30 minutes

Poem

🐰 Hop, skip, and query all the way,
With indices merged in one display!
Labels and context dance together,
Agentic answers, light as a feather—
Multi-index magic, hop hop hooray! 🌟

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 10.53% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: add multi-index query support (queryAll / query_all)' clearly and concisely summarizes the primary change: introducing multi-index querying capability with language-specific API names.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/multi-index-query

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 17 files

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (2)
tests/test_core.py (1)

9-9: Cover the package-level re-export in one test.

This PR changes treedex/__init__.py, but these tests still import MultiQueryResult from treedex.core, so a broken root-level export would pass unnoticed. Adding one smoke test via from treedex import MultiQueryResult would lock down the public API.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/test_core.py` at line 9, Add a smoke test that imports the public
symbol from the package root to lock the public API: instead of only importing
MultiQueryResult from treedex.core, add a new test (or extend
tests/test_core.py) that does a simple from treedex import MultiQueryResult (and
optionally TreeDex, QueryResult) and asserts the imported names are not None or
usable; target the package-level re-export (MultiQueryResult) so a broken
treedex/__init__.py will fail the test.
README.md (1)

386-387: Consider making multi-index method signatures explicit in the API table.

Current table entry is concise, but adding llm/agentic/labels options there would reduce ambiguity for first-time users.

✍️ Suggested doc tweak
-| **Multi-index query** | **`TreeDex.query_all(indexes, q)`** | **`await TreeDex.queryAll(indexes, q)`** |
+| **Multi-index query** | **`TreeDex.query_all(indexes, q, llm=None, agentic=False, labels=None)`** | **`await TreeDex.queryAll(indexes, q, { llm?, agentic?, labels? })`** |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 386 - 387, The API table entry for the multi-index
query is ambiguous because it doesn't show optional parameters; update the
README row for the multi-index method to explicitly list the available options
(llm, agentic, labels) and their types/usage for both function variants
(TreeDex.query_all(indexes, q) and await TreeDex.queryAll(indexes, q)), e.g.,
indicate an optional options object like { llm, agentic, labels } after q and
briefly note defaults/valid values so first-time users know how to pass
LLM/agentic/labels settings when calling these methods.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/how-it-works.md`:
- Around line 39-45: Several fenced code blocks in the document are unlabeled
and trigger markdownlint rule MD040; update each unlabeled triple-backtick fence
(e.g., the blocks starting with "[H1] Chapter 1: Introduction", "You are a
document retrieval system...", the JSON snippet { "node_ids": ["0005"], ... },
the "[2: Safety Guidelines]" block, and the "Document (PDF / TXT / HTML / DOCX)"
/ "QueryResult ..." block) to include a language identifier such as text by
changing the opening ``` to ```text and leaving the closing ``` unchanged so
markdownlint no longer flags MD040.

In `@examples/node/multi-index.ts`:
- Line 11: Replace the non-null assertion when instantiating GeminiLLM by
explicitly guarding process.env.GEMINI_API_KEY: read it into a const (e.g.,
const apiKey = process.env.GEMINI_API_KEY), check if (!apiKey) throw a clear
Error (e.g., "GEMINI_API_KEY environment variable is required"), and then call
new GeminiLLM(apiKey); reference the GeminiLLM constructor and the
GEMINI_API_KEY env var in your change.

In `@src/core.ts`:
- Around line 538-549: Before calling Promise.all over indexes.map(idx =>
idx.query(...)), validate LLM availability and fail fast: if a global
options?.llm is provided use that, otherwise ensure each index has a non-null
llm (check idx.llm) and throw an Error if any index lacks an LLM before
dispatching any queries. Update the pre-flight logic around the llm/agentic
handling (the llm constant and the indexes.map(...) that calls idx.query) to
perform this check and only proceed to Promise.all when all required LLMs are
present.

In `@treedex/core.py`:
- Around line 445-455: Before calling idx.query for each index, validate that
every index has an effective LLM available: for each element in indexes compute
effective_llm = llm if llm is not None else idx.llm and if any effective_llm is
None raise ValueError("No LLM available for index X") (or a similar message) so
validation runs before any idx.query calls; then pass the effective_llm to
idx.query (i.e., replace idx.query(question, llm=llm, ...) with using the
precomputed effective_llm) while keeping the existing labels length check
intact.

---

Nitpick comments:
In `@README.md`:
- Around line 386-387: The API table entry for the multi-index query is
ambiguous because it doesn't show optional parameters; update the README row for
the multi-index method to explicitly list the available options (llm, agentic,
labels) and their types/usage for both function variants
(TreeDex.query_all(indexes, q) and await TreeDex.queryAll(indexes, q)), e.g.,
indicate an optional options object like { llm, agentic, labels } after q and
briefly note defaults/valid values so first-time users know how to pass
LLM/agentic/labels settings when calling these methods.

In `@tests/test_core.py`:
- Line 9: Add a smoke test that imports the public symbol from the package root
to lock the public API: instead of only importing MultiQueryResult from
treedex.core, add a new test (or extend tests/test_core.py) that does a simple
from treedex import MultiQueryResult (and optionally TreeDex, QueryResult) and
asserts the imported names are not None or usable; target the package-level
re-export (MultiQueryResult) so a broken treedex/__init__.py will fail the test.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 90e2f02a-9033-4778-a733-a324151aea79

📥 Commits

Reviewing files that changed from the base of the PR and between 250aa37 and 10cac13.

📒 Files selected for processing (17)
  • DOCS.md
  • README.md
  • docs/api.md
  • docs/benchmark-report.md
  • docs/benchmarks.md
  • docs/case-studies.md
  • docs/configuration.md
  • docs/how-it-works.md
  • docs/llm-backends.md
  • examples/multi_index.py
  • examples/node/multi-index.ts
  • src/core.ts
  • src/index.ts
  • test/core.test.ts
  • tests/test_core.py
  • treedex/__init__.py
  • treedex/core.py

Comment thread docs/how-it-works.md Outdated
Comment on lines +39 to +45
```
[H1] Chapter 1: Introduction
This chapter covers the background...

[H2] 1.1 Motivation
The problem we are solving is...
```
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add language identifiers to fenced code blocks to satisfy markdownlint.

Lines 39, 88, 100, and 141 use unlabeled fences (MD040), which can fail docs lint checks.

🧹 Suggested fix
-```
+```text
 [H1] Chapter 1: Introduction
 This chapter covers the background...
@@
-The problem we are solving is...
-```
+The problem we are solving is...
+```

-```
+```text
 You are a document retrieval system. Given this tree structure, pick
 the node_ids most relevant to the query. Return JSON only.
@@
-{ "node_ids": ["0005"], "reasoning": "Safety section covers this." }
-```
+{ "node_ids": ["0005"], "reasoning": "Safety section covers this." }
+```

-```
+```text
 [2: Safety Guidelines]
 Section 2 covers personal protective equipment...
-```
+```

-```
+```text
 Document (PDF / TXT / HTML / DOCX)
@@
-QueryResult { context, nodeIds, pageRanges, reasoning, answer }
-```
+QueryResult { context, nodeIds, pageRanges, reasoning, answer }
+```

Also applies to: 88-93, 100-103, 141-182

🧰 Tools
🪛 markdownlint-cli2 (0.22.0)

[warning] 39-39: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/how-it-works.md` around lines 39 - 45, Several fenced code blocks in the
document are unlabeled and trigger markdownlint rule MD040; update each
unlabeled triple-backtick fence (e.g., the blocks starting with "[H1] Chapter 1:
Introduction", "You are a document retrieval system...", the JSON snippet {
"node_ids": ["0005"], ... }, the "[2: Safety Guidelines]" block, and the
"Document (PDF / TXT / HTML / DOCX)" / "QueryResult ..." block) to include a
language identifier such as text by changing the opening ``` to ```text and
leaving the closing ``` unchanged so markdownlint no longer flags MD040.

Comment thread examples/node/multi-index.ts Outdated
import { TreeDex, GeminiLLM } from "../../src/index.js";

async function main() {
const llm = new GeminiLLM(process.env.GEMINI_API_KEY!);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
fd -i 'llm-backends.ts'
rg -n -C3 'class GeminiLLM|constructor\s*\(' src/llm-backends.ts

Repository: mithun50/TreeDex

Length of output: 4391


Guard GEMINI_API_KEY explicitly instead of using non-null assertion.

Line 11 uses non-null assertion on process.env.GEMINI_API_KEY, which suppresses type checks but doesn't prevent missing env vars at runtime. The GeminiLLM constructor expects apiKey: string with no undefined fallback, so an explicit guard provides clearer error handling.

💡 Suggested fix
-  const llm = new GeminiLLM(process.env.GEMINI_API_KEY!);
+  const apiKey = process.env.GEMINI_API_KEY;
+  if (!apiKey) {
+    throw new Error("Missing GEMINI_API_KEY environment variable.");
+  }
+  const llm = new GeminiLLM(apiKey);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const llm = new GeminiLLM(process.env.GEMINI_API_KEY!);
const apiKey = process.env.GEMINI_API_KEY;
if (!apiKey) {
throw new Error("Missing GEMINI_API_KEY environment variable.");
}
const llm = new GeminiLLM(apiKey);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@examples/node/multi-index.ts` at line 11, Replace the non-null assertion when
instantiating GeminiLLM by explicitly guarding process.env.GEMINI_API_KEY: read
it into a const (e.g., const apiKey = process.env.GEMINI_API_KEY), check if
(!apiKey) throw a clear Error (e.g., "GEMINI_API_KEY environment variable is
required"), and then call new GeminiLLM(apiKey); reference the GeminiLLM
constructor and the GEMINI_API_KEY env var in your change.

Comment thread src/core.ts
Comment on lines +538 to +549
const llm = options?.llm;
const agentic = options?.agentic ?? false;
const labels = options?.labels ?? indexes.map((_, i) => `Document ${i + 1}`);

if (labels.length !== indexes.length) {
throw new Error("labels length must match indexes length.");
}

// Query all indexes in parallel (no agentic per-index; answer at the end)
const results = await Promise.all(
indexes.map((idx) => idx.query(question, { llm, agentic: false })),
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Validate LLM availability before firing Promise.all().

Right now a single index with idx.llm === null can make queryAll() reject only after the other queries have already been dispatched. For a paid backend, that means the call can fail after partial external work has already happened. Fail fast before starting any retrievals.

💡 Suggested fix
     if (labels.length !== indexes.length) {
       throw new Error("labels length must match indexes length.");
     }
 
+    if (!llm && indexes.some((idx) => idx.llm === null)) {
+      throw new Error(
+        "No LLM provided for one or more indexes. Pass options.llm or set llm on every TreeDex.",
+      );
+    }
+
     // Query all indexes in parallel (no agentic per-index; answer at the end)
     const results = await Promise.all(
       indexes.map((idx) => idx.query(question, { llm, agentic: false })),
     );
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const llm = options?.llm;
const agentic = options?.agentic ?? false;
const labels = options?.labels ?? indexes.map((_, i) => `Document ${i + 1}`);
if (labels.length !== indexes.length) {
throw new Error("labels length must match indexes length.");
}
// Query all indexes in parallel (no agentic per-index; answer at the end)
const results = await Promise.all(
indexes.map((idx) => idx.query(question, { llm, agentic: false })),
);
const llm = options?.llm;
const agentic = options?.agentic ?? false;
const labels = options?.labels ?? indexes.map((_, i) => `Document ${i + 1}`);
if (labels.length !== indexes.length) {
throw new Error("labels length must match indexes length.");
}
if (!llm && indexes.some((idx) => idx.llm === null)) {
throw new Error(
"No LLM provided for one or more indexes. Pass options.llm or set llm on every TreeDex.",
);
}
// Query all indexes in parallel (no agentic per-index; answer at the end)
const results = await Promise.all(
indexes.map((idx) => idx.query(question, { llm, agentic: false })),
);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/core.ts` around lines 538 - 549, Before calling Promise.all over
indexes.map(idx => idx.query(...)), validate LLM availability and fail fast: if
a global options?.llm is provided use that, otherwise ensure each index has a
non-null llm (check idx.llm) and throw an Error if any index lacks an LLM before
dispatching any queries. Update the pre-flight logic around the llm/agentic
handling (the llm constant and the indexes.map(...) that calls idx.query) to
perform this check and only proceed to Promise.all when all required LLMs are
present.

Comment thread treedex/core.py
Comment on lines +445 to +455
if labels is None:
labels = [f"Document {i + 1}" for i in range(len(indexes))]

if len(labels) != len(indexes):
raise ValueError("labels length must match indexes length.")

# Query each index (no per-index agentic; single answer at the end)
results = [
idx.query(question, llm=llm, agentic=False)
for idx in indexes
]
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Fail fast when any index has no usable LLM.

If llm is omitted and one later TreeDex has idx.llm is None, earlier indexes may already have issued retrieval calls before query_all() raises. That turns a validation error into a partial, billable failure. Validate effective LLM availability for every index before starting the fan-out.

💡 Suggested fix
         if len(labels) != len(indexes):
             raise ValueError("labels length must match indexes length.")
 
+        if llm is None and any(idx.llm is None for idx in indexes):
+            raise ValueError(
+                "No LLM provided for one or more indexes. Pass llm= to "
+                "query_all() or set llm on every TreeDex instance."
+            )
+
         # Query each index (no per-index agentic; single answer at the end)
         results = [
             idx.query(question, llm=llm, agentic=False)
             for idx in indexes
         ]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if labels is None:
labels = [f"Document {i + 1}" for i in range(len(indexes))]
if len(labels) != len(indexes):
raise ValueError("labels length must match indexes length.")
# Query each index (no per-index agentic; single answer at the end)
results = [
idx.query(question, llm=llm, agentic=False)
for idx in indexes
]
if labels is None:
labels = [f"Document {i + 1}" for i in range(len(indexes))]
if len(labels) != len(indexes):
raise ValueError("labels length must match indexes length.")
if llm is None and any(idx.llm is None for idx in indexes):
raise ValueError(
"No LLM provided for one or more indexes. Pass llm= to "
"query_all() or set llm on every TreeDex instance."
)
# Query each index (no per-index agentic; single answer at the end)
results = [
idx.query(question, llm=llm, agentic=False)
for idx in indexes
]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@treedex/core.py` around lines 445 - 455, Before calling idx.query for each
index, validate that every index has an effective LLM available: for each
element in indexes compute effective_llm = llm if llm is not None else idx.llm
and if any effective_llm is None raise ValueError("No LLM available for index
X") (or a similar message) so validation runs before any idx.query calls; then
pass the effective_llm to idx.query (i.e., replace idx.query(question, llm=llm,
...) with using the precomputed effective_llm) while keeping the existing labels
length check intact.

@mithun50
Copy link
Copy Markdown
Owner Author

mithun50 commented Apr 5, 2026

@copilot see this once

…ard, and markdownlint MD040

Agent-Logs-Url: https://github.com/mithun50/TreeDex/sessions/94b91517-029d-4aa9-a905-030e116be523

Co-authored-by: mithun50 <99024517+mithun50@users.noreply.github.com>
Copy link
Copy Markdown

Copilot AI commented Apr 5, 2026

@copilot see this once

Reviewed the PR and addressed all four CodeRabbit review comments in commit ccdb385:

  1. docs/how-it-works.md — Added text language identifier to all unlabeled fenced code blocks (fixes MD040 markdownlint rule)
  2. examples/node/multi-index.ts — Replaced non-null assertion on GEMINI_API_KEY with an explicit guard that throws a clear error if the env var is missing
  3. src/core.ts — Added fail-fast LLM validation in queryAll() before Promise.all() so no external calls are dispatched when an index is missing an LLM
  4. treedex/core.py — Same fail-fast validation in query_all() before the fan-out loop

All 106 tests still pass.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • openaipublic.blob.core.windows.net
    • Triggering command: /usr/bin/python3 python3 -m pytest tests/ -q (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

@mithun50
Copy link
Copy Markdown
Owner Author

mithun50 commented Apr 7, 2026

@claude review this pr.

@claude
Copy link
Copy Markdown

claude bot commented Apr 7, 2026

Claude encountered an error —— View job


I'll analyze this and get back to you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants