diff --git a/src/server/models.py b/src/server/models.py index 97739416..18b8a0da 100644 --- a/src/server/models.py +++ b/src/server/models.py @@ -37,6 +37,8 @@ class IngestRequest(BaseModel): Glob/regex pattern string for file filtering. token : str | None GitHub personal access token (PAT) for accessing private repositories. + include_submodules : bool + Whether to include Git submodules in the analysis. """ @@ -45,6 +47,7 @@ class IngestRequest(BaseModel): pattern_type: PatternType = Field(default=PatternType.EXCLUDE, description="Pattern type for file filtering") pattern: str = Field(default="", description="Glob/regex pattern for file filtering") token: str | None = Field(default=None, description="GitHub PAT for private repositories") + include_submodules: bool = Field(default=False, description="Whether to include Git submodules") @field_validator("input_text") @classmethod diff --git a/src/server/query_processor.py b/src/server/query_processor.py index f2f2ae90..8aa78042 100644 --- a/src/server/query_processor.py +++ b/src/server/query_processor.py @@ -232,6 +232,8 @@ async def process_query( pattern_type: PatternType, pattern: str, token: str | None = None, + *, + include_submodules: bool = False, ) -> IngestResponse: """Process a query by parsing input, cloning a repository, and generating a summary. @@ -250,6 +252,8 @@ async def process_query( Pattern to include or exclude in the query, depending on the pattern type. token : str | None GitHub personal access token (PAT) for accessing private repositories. + include_submodules : bool + Whether to include Git submodules in the analysis. Returns ------- @@ -272,6 +276,7 @@ async def process_query( return IngestErrorResponse(error=str(exc)) query.url = cast("str", query.url) + query.include_submodules = include_submodules query.max_file_size = max_file_size * 1024 # Convert to bytes since we currently use KB in higher levels query.ignore_patterns, query.include_patterns = process_patterns( exclude_patterns=pattern if pattern_type == PatternType.EXCLUDE else None, diff --git a/src/server/routers/ingest.py b/src/server/routers/ingest.py index ce9e6512..5945f7bf 100644 --- a/src/server/routers/ingest.py +++ b/src/server/routers/ingest.py @@ -46,6 +46,7 @@ async def api_ingest( pattern_type=ingest_request.pattern_type.value, pattern=ingest_request.pattern, token=ingest_request.token, + include_submodules=ingest_request.include_submodules, ) # limit URL to 255 characters ingest_counter.labels(status=response.status_code, url=ingest_request.input_text[:255]).inc() diff --git a/src/server/routers_utils.py b/src/server/routers_utils.py index 3eaf0e59..bc1baf75 100644 --- a/src/server/routers_utils.py +++ b/src/server/routers_utils.py @@ -23,6 +23,8 @@ async def _perform_ingestion( pattern_type: str, pattern: str, token: str | None, + *, + include_submodules: bool = False, ) -> JSONResponse: """Run ``process_query`` and wrap the result in a ``FastAPI`` ``JSONResponse``. @@ -37,6 +39,7 @@ async def _perform_ingestion( pattern_type=pattern_type, pattern=pattern, token=token, + include_submodules=include_submodules, ) if isinstance(result, IngestErrorResponse): diff --git a/src/server/templates/components/git_form.jinja b/src/server/templates/components/git_form.jinja index e2e7c91c..6e2c3a10 100644 --- a/src/server/templates/components/git_form.jinja +++ b/src/server/templates/components/git_form.jinja @@ -86,94 +86,109 @@
-
-
- - + + diff --git a/src/static/js/utils.js b/src/static/js/utils.js index ce19e95e..5cd34a18 100644 --- a/src/static/js/utils.js +++ b/src/static/js/utils.js @@ -130,11 +130,17 @@ function collectFormData(form) { const patternType = document.getElementById('pattern_type'); const pattern = document.getElementById('pattern'); - if (inputText) {json_data.input_text = inputText.value;} - if (token) {json_data.token = token.value;} - if (hiddenInput) {json_data.max_file_size = hiddenInput.value;} - if (patternType) {json_data.pattern_type = patternType.value;} - if (pattern) {json_data.pattern = pattern.value;} + // Add this line to capture the submodule toggle + const includeSubmodules = document.getElementById('include_submodules'); + + if (inputText) { json_data.input_text = inputText.value; } + if (token) { json_data.token = token.value; } + if (hiddenInput) { json_data.max_file_size = hiddenInput.value; } + if (patternType) { json_data.pattern_type = patternType.value; } + if (pattern) { json_data.pattern = pattern.value; } + + // Set the boolean value for the backend + if (includeSubmodules) { json_data.include_submodules = includeSubmodules.checked; } return json_data; }