Skip to content

feat(wren-ui): Support Databricks connector#2059

Merged
fredalai merged 1 commit into
mainfrom
feature/databricks
Nov 28, 2025
Merged

feat(wren-ui): Support Databricks connector#2059
fredalai merged 1 commit into
mainfrom
feature/databricks

Conversation

@fredalai
Copy link
Copy Markdown
Contributor

@fredalai fredalai commented Nov 26, 2025

This pull request introduces support for the Databricks data source.

Description

Support Databricks connector

  • Guide link: https://docs.getwren.ai/oss/guide/connect/databricks
  • When updating the connection settings:
    • if the project was onboarded using the corresponding authentication method:
      • The Server hostname and HTTP path fields cannot be edited.
    • Allow update authentication method

Databricks Data Source:

Engine API information

Development version: 0.22.0

1.  Service Principal

{
    "connectionInfo": {
        "databricks_type": "service_principal",
        "serverHostname": <server hostname>,
        "httpPath": <HTTP path>,
        "clientId": <Client ID>,
        "clientSecret": <Client secret>,
    }
}
Note: azureTenantId is Optional.
 
2. PAT

  "connectionInfo": {
      "databricks_type": "token",
      "serverHostname": <server hostname>,
      "httpPath": <HTTP path>,
      "accessToken": <PAT>,
  }

Ref UI

截圖 2025-11-26 下午4 12 03

PAT

截圖 2025-11-26 上午10 56 34 截圖 2025-11-26 下午4 11 16

Service Principal

截圖 2025-11-26 上午10 56 57 截圖 2025-11-26 下午5 00 02

Summary by CodeRabbit

  • New Features

    • Added Databricks as a supported data source in setup with icon, display name and guide link.
    • Two authentication methods: Personal Access Token and Service Principal.
    • Setup form collects Display name, Server hostname, HTTP path, and method-specific credentials; conditional fields shown per method.
  • Bug Fixes / Improvements

    • Validation messages added for HTTP path, personal access token, client ID, and client secret.
    • Access token and client secret are treated as sensitive and masked in UI.

✏️ Tip: You can customize this high-level summary in your review settings.

@fredalai fredalai changed the title feat(wren-ui): support Databricks connector feat(wren-ui): Support Databricks connector Nov 26, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 26, 2025

Walkthrough

Adds Databricks support across client and server: new enums/types, adaptor and repository connection types, data source mappings and MDL type, UI form component and setup flow changes for Personal Access Token and Service Principal auth, plus related error messages and utilities.

Changes

Cohort / File(s) Summary
GraphQL & client types
wren-ui/src/apollo/client/graphql/__types__.ts
Added DATABRICKS to DataSourceName and exported DatabricksConnectionType enum.
Server schema & types
wren-ui/src/apollo/server/schema.ts, wren-ui/src/apollo/server/types/dataSource.ts
Added DATABRICKS to DataSourceName and new DatabricksConnectionType enum in server schema/types.
Ibis adaptor & mapping
wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts, wren-ui/src/apollo/server/dataSource.ts
Introduced IbisDatabricksConnectionType, Databricks auth interfaces and union; added DATABRICKS to supported sources and dataSourceUrlMap; implemented toIbisConnectionInfo conversion with decryption and auth branching.
Repositories & connection registry
wren-ui/src/apollo/server/repositories/projectRepository.ts
Added DATABRICKS_PERSONAL_ACCESS_TOKEN_AUTH and DATABRICKS_SERVICE_PRINCIPAL_AUTH interfaces, DATABRICKS_CONNECTION_INFO union, and extended WREN_AI_CONNECTION_INFO.
Project service
wren-ui/src/apollo/server/services/projectService.ts
Added accessToken and clientSecret to sensitive-property masking.
MDL & engine types
wren-ui/src/apollo/server/mdl/mdlBuilder.ts, wren-ui/src/apollo/server/mdl/type.ts
Added WrenEngineDataSourceType.DATABRICKS and mapping in MDL builder.
UI: Databricks form component
wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx
New React component for Databricks config with PAT and Service Principal paths, validation, edit-mode handling, and conditional fields.
Setup flow & hooks
wren-ui/src/components/pages/setup/utils.tsx, wren-ui/src/hooks/useSetupConnectionDataSource.tsx
Added Databricks option and guide URL; implemented transformFormToProperties/transformPropertiesToForm handling and helper to map/filter databricks auth fields and placeholders.
UI utilities & enums
wren-ui/src/utils/dataSourceType.ts, wren-ui/src/utils/enum/dataSources.ts
Added DATABRICKS enum, mapped image/name/properties to Databricks component, and exported Databricks auth method alias.
Error messages
wren-ui/src/utils/error/dictionary.ts
Added required validation texts for HTTP_PATH, PERSONAL_ACCESS_TOKEN, CLIENT_ID, CLIENT_SECRET.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant UI as Setup UI
  participant Hook as useSetupConnectionDataSource
  participant Service as ProjectService
  participant Adaptor as IbisAdaptor

  Note over User,Adaptor: Databricks setup (PAT or Service Principal)

  User->>UI: Select Databricks, fill form
  UI->>Hook: transformFormToProperties(form)
  Hook->>Hook: getDatabricksAuthentication() (filter placeholders)
  Hook-->>Service: connectionInfo (databricksType + auth fields)

  UI->>Service: saveConnection(connectionInfo)
  Service->>Adaptor: toIbisConnectionInfo(connectionInfo)
  Adaptor->>Adaptor: decrypt sensitive fields
  Adaptor-->>Service: IbisDatabricksConnectionInfo (databricks_type, serverHostname, httpPath, auth)
  Service-->>UI: success / saved
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Review focus:
    • Consistency between client and server enum/type names (GraphQL vs server adapters).
    • Decryption and masking logic for accessToken and clientSecret.
    • Validation and edit-mode behavior in DatabricksProperties.tsx.
    • transformFormToProperties/transformPropertiesToForm correctness and placeholder handling.
    • MDL mapping placement and ordering of WrenEngineDataSourceType.DATABRICKS.

Possibly related PRs

Suggested labels

module/ui

Suggested reviewers

  • onlyjackfrost
  • andreashimin

Poem

🐰 I hopped through enums, fields, and form,
two auth paths sprouted safe and warm,
tokens tucked and secrets hid,
Databricks now joins the grid,
hop — the pipeline’s ready to perform!

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ 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(wren-ui): Support Databricks connector' directly and accurately summarizes the primary change—adding Databricks data source support to the wren-ui, which aligns with all the file changes throughout the changeset.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/databricks

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f187c20 and 919a188.

⛔ Files ignored due to path filters (1)
  • wren-ui/public/images/dataSource/databricks.svg is excluded by !**/*.svg
📒 Files selected for processing (15)
  • wren-ui/src/apollo/client/graphql/__types__.ts (2 hunks)
  • wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts (3 hunks)
  • wren-ui/src/apollo/server/dataSource.ts (3 hunks)
  • wren-ui/src/apollo/server/mdl/mdlBuilder.ts (1 hunks)
  • wren-ui/src/apollo/server/mdl/type.ts (1 hunks)
  • wren-ui/src/apollo/server/repositories/projectRepository.ts (3 hunks)
  • wren-ui/src/apollo/server/schema.ts (1 hunks)
  • wren-ui/src/apollo/server/services/projectService.ts (1 hunks)
  • wren-ui/src/apollo/server/types/dataSource.ts (1 hunks)
  • wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (1 hunks)
  • wren-ui/src/components/pages/setup/utils.tsx (1 hunks)
  • wren-ui/src/hooks/useSetupConnectionDataSource.tsx (4 hunks)
  • wren-ui/src/utils/dataSourceType.ts (4 hunks)
  • wren-ui/src/utils/enum/dataSources.ts (2 hunks)
  • wren-ui/src/utils/error/dictionary.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (8)
  • wren-ui/src/apollo/server/mdl/mdlBuilder.ts
  • wren-ui/src/apollo/server/schema.ts
  • wren-ui/src/components/pages/setup/utils.tsx
  • wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts
  • wren-ui/src/apollo/server/dataSource.ts
  • wren-ui/src/apollo/server/services/projectService.ts
  • wren-ui/src/apollo/server/types/dataSource.ts
  • wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx
🧰 Additional context used
🧠 Learnings (5)
📓 Common learnings
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1887
File: wren-launcher/commands/dbt/data_source.go:273-276
Timestamp: 2025-08-13T05:17:30.180Z
Learning: In the Wren AI codebase, there's an intentional distinction between dbt connection types and Wren AI data source types: dbt uses "sqlserver" as the connection type, while Wren AI expects "mssql" as the data source type. The conversion layer in convertConnectionToDataSource() correctly matches "sqlserver" from dbt profiles and the WrenMSSQLDataSource.GetType() method correctly returns "mssql" for Wren AI compatibility.
📚 Learning: 2025-08-13T05:17:30.180Z
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1887
File: wren-launcher/commands/dbt/data_source.go:273-276
Timestamp: 2025-08-13T05:17:30.180Z
Learning: In the Wren AI codebase, there's an intentional distinction between dbt connection types and Wren AI data source types: dbt uses "sqlserver" as the connection type, while Wren AI expects "mssql" as the data source type. The conversion layer in convertConnectionToDataSource() correctly matches "sqlserver" from dbt profiles and the WrenMSSQLDataSource.GetType() method correctly returns "mssql" for Wren AI compatibility.

Applied to files:

  • wren-ui/src/apollo/client/graphql/__types__.ts
  • wren-ui/src/utils/enum/dataSources.ts
  • wren-ui/src/apollo/server/mdl/type.ts
  • wren-ui/src/hooks/useSetupConnectionDataSource.tsx
  • wren-ui/src/apollo/server/repositories/projectRepository.ts
  • wren-ui/src/utils/dataSourceType.ts
📚 Learning: 2025-03-18T10:28:10.593Z
Learnt from: andreashimin
Repo: Canner/WrenAI PR: 1414
File: wren-ui/src/apollo/server/utils/error.ts:0-0
Timestamp: 2025-03-18T10:28:10.593Z
Learning: The typo in error code enum names ("IDENTIED_AS_GENERAL" and "IDENTIED_AS_MISLEADING_QUERY" instead of "IDENTIFIED_AS_GENERAL" and "IDENTIFIED_AS_MISLEADING_QUERY") in wren-ui/src/apollo/server/utils/error.ts was recognized but intentionally not fixed as it was considered out of scope for PR #1414.

Applied to files:

  • wren-ui/src/apollo/client/graphql/__types__.ts
  • wren-ui/src/utils/enum/dataSources.ts
  • wren-ui/src/utils/error/dictionary.ts
  • wren-ui/src/apollo/server/mdl/type.ts
📚 Learning: 2025-03-18T10:28:26.608Z
Learnt from: andreashimin
Repo: Canner/WrenAI PR: 1414
File: wren-ui/src/apollo/server/utils/error.ts:0-0
Timestamp: 2025-03-18T10:28:26.608Z
Learning: The enum names `IDENTIED_AS_GENERAL` and `IDENTIED_AS_MISLEADING_QUERY` in GeneralErrorCodes enum in wren-ui/src/apollo/server/utils/error.ts have typos (missing "FI" in "IDENTIFIED") but fixing them is not in scope for the current PR.

Applied to files:

  • wren-ui/src/apollo/client/graphql/__types__.ts
  • wren-ui/src/apollo/server/mdl/type.ts
📚 Learning: 2025-07-09T02:43:20.433Z
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1827
File: wren-launcher/commands/dbt/data_source.go:50-53
Timestamp: 2025-07-09T02:43:20.433Z
Learning: In wren-launcher/commands/dbt/data_source.go, when encountering unsupported database types in convertConnectionToDataSource function, the user prefers to log a warning and continue processing instead of failing. The function should return nil, nil to allow processing to continue.

Applied to files:

  • wren-ui/src/apollo/server/mdl/type.ts
🧬 Code graph analysis (3)
wren-ui/src/apollo/client/graphql/__types__.ts (1)
wren-ui/src/utils/enum/dataSources.ts (1)
  • DatabricksConnectionType (3-3)
wren-ui/src/hooks/useSetupConnectionDataSource.tsx (1)
wren-ui/migrations/20240531085916_transfer_model_properties.js (1)
  • dataSourceType (11-11)
wren-ui/src/utils/dataSourceType.ts (1)
wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (1)
  • DatabricksProperties (11-136)
🔇 Additional comments (13)
wren-ui/src/apollo/server/mdl/type.ts (1)

99-100: LGTM!

The new DATABRICKS enum member follows the established naming convention and is correctly placed among the supported data sources (before the DATAFUSION comment block for unsupported sources).

wren-ui/src/utils/error/dictionary.ts (1)

79-90: LGTM! Databricks validation messages are well-structured.

The new error messages for Databricks authentication fields follow the existing pattern and align with the PR objectives. The messages cover all required fields for both PAT (HTTP_PATH, PERSONAL_ACCESS_TOKEN) and Service Principal (HTTP_PATH, CLIENT_ID, CLIENT_SECRET) authentication methods.

wren-ui/src/apollo/client/graphql/__types__.ts (1)

333-347: LGTM!

The DATABRICKS entry in DataSourceName is correctly placed alphabetically, and the new DatabricksConnectionType enum follows the established pattern from RedshiftConnectionType with snake_case values (service_principal, token).

wren-ui/src/utils/enum/dataSources.ts (2)

1-4: LGTM!

The re-export of DatabricksConnectionType as DATABRICKS_AUTH_METHOD follows the established pattern used for REDSHIFT_AUTH_METHOD.


18-18: LGTM!

The DATABRICKS entry is correctly added to the DATA_SOURCES enum.

wren-ui/src/hooks/useSetupConnectionDataSource.tsx (3)

3-7: LGTM!

Import of DATABRICKS_AUTH_METHOD follows the established pattern.


83-87: LGTM!

The Databricks handling in transformFormToProperties correctly follows the Snowflake pattern by delegating to a dedicated authentication helper.


134-145: LGTM!

The Databricks handling in transformPropertiesToForm correctly applies password placeholders based on the authentication type, following the Redshift pattern.

wren-ui/src/utils/dataSourceType.ts (2)

13-13: LGTM!

The import of DatabricksProperties follows the established pattern for other data source property components.


39-40: All verifications passed - no issues found.

The Databricks image file exists at wren-ui/public/images/dataSource/databricks.svg, and all three utility functions have been consistently extended with Databricks support:

  • getDataSourceImage() (lines 39-40): Returns correct image path
  • getDataSourceName() (lines 70-71): Returns 'Databricks'
  • getDataSourceProperties() (lines 101-102): Returns DatabricksProperties component

The DatabricksProperties component is properly imported (line 13), and the implementation follows established patterns.

wren-ui/src/apollo/server/repositories/projectRepository.ts (3)

12-15: LGTM!

Import of IbisDatabricksConnectionType follows the established pattern used for IbisRedshiftConnectionType.


123-145: LGTM!

The Databricks connection info interfaces are well-structured:

  • DATABRICKS_PERSONAL_ACCESS_TOKEN_AUTH for PAT authentication
  • DATABRICKS_SERVICE_PRINCIPAL_AUTH for Service Principal authentication with optional azureTenantId
  • DATABRICKS_CONNECTION_INFO union type correctly combines both

This follows the established pattern from the Redshift connection types.


147-159: LGTM!

The WREN_AI_CONNECTION_INFO union type is correctly extended to include DATABRICKS_CONNECTION_INFO.


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.

@fredalai fredalai marked this pull request as ready for review November 26, 2025 09:03
Copy link
Copy Markdown
Contributor

@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: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 98d2e55 and b9f498a.

⛔ Files ignored due to path filters (1)
  • wren-ui/public/images/dataSource/databricks.svg is excluded by !**/*.svg
📒 Files selected for processing (15)
  • wren-ui/src/apollo/client/graphql/__types__.ts (2 hunks)
  • wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts (3 hunks)
  • wren-ui/src/apollo/server/dataSource.ts (3 hunks)
  • wren-ui/src/apollo/server/mdl/mdlBuilder.ts (1 hunks)
  • wren-ui/src/apollo/server/mdl/type.ts (1 hunks)
  • wren-ui/src/apollo/server/repositories/projectRepository.ts (3 hunks)
  • wren-ui/src/apollo/server/schema.ts (1 hunks)
  • wren-ui/src/apollo/server/services/projectService.ts (1 hunks)
  • wren-ui/src/apollo/server/types/dataSource.ts (1 hunks)
  • wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (1 hunks)
  • wren-ui/src/components/pages/setup/utils.tsx (1 hunks)
  • wren-ui/src/hooks/useSetupConnectionDataSource.tsx (4 hunks)
  • wren-ui/src/utils/dataSourceType.ts (4 hunks)
  • wren-ui/src/utils/enum/dataSources.ts (2 hunks)
  • wren-ui/src/utils/error/dictionary.ts (1 hunks)
🧰 Additional context used
🧠 Learnings (6)
📓 Common learnings
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1887
File: wren-launcher/commands/dbt/data_source.go:273-276
Timestamp: 2025-08-13T05:17:30.180Z
Learning: In the Wren AI codebase, there's an intentional distinction between dbt connection types and Wren AI data source types: dbt uses "sqlserver" as the connection type, while Wren AI expects "mssql" as the data source type. The conversion layer in convertConnectionToDataSource() correctly matches "sqlserver" from dbt profiles and the WrenMSSQLDataSource.GetType() method correctly returns "mssql" for Wren AI compatibility.
Learnt from: narsik123
Repo: Canner/WrenAI PR: 1606
File: wren-ui/src/apollo/server/dataSource.ts:135-150
Timestamp: 2025-04-28T20:09:06.106Z
Learning: The Oracle data source in WrenAI includes an SSL toggle in the UI (OracleProperties component) and should pass this setting to the connection info using the pattern `...(ssl && { kwargs: { ssl: true } })` for consistency with other host-based connections like MS SQL.
📚 Learning: 2025-08-13T05:17:30.180Z
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1887
File: wren-launcher/commands/dbt/data_source.go:273-276
Timestamp: 2025-08-13T05:17:30.180Z
Learning: In the Wren AI codebase, there's an intentional distinction between dbt connection types and Wren AI data source types: dbt uses "sqlserver" as the connection type, while Wren AI expects "mssql" as the data source type. The conversion layer in convertConnectionToDataSource() correctly matches "sqlserver" from dbt profiles and the WrenMSSQLDataSource.GetType() method correctly returns "mssql" for Wren AI compatibility.

Applied to files:

  • wren-ui/src/apollo/client/graphql/__types__.ts
  • wren-ui/src/apollo/server/schema.ts
  • wren-ui/src/apollo/server/repositories/projectRepository.ts
  • wren-ui/src/apollo/server/types/dataSource.ts
  • wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts
  • wren-ui/src/apollo/server/mdl/type.ts
  • wren-ui/src/utils/enum/dataSources.ts
  • wren-ui/src/components/pages/setup/utils.tsx
  • wren-ui/src/apollo/server/dataSource.ts
  • wren-ui/src/utils/dataSourceType.ts
  • wren-ui/src/apollo/server/mdl/mdlBuilder.ts
  • wren-ui/src/hooks/useSetupConnectionDataSource.tsx
📚 Learning: 2025-03-18T10:28:10.593Z
Learnt from: andreashimin
Repo: Canner/WrenAI PR: 1414
File: wren-ui/src/apollo/server/utils/error.ts:0-0
Timestamp: 2025-03-18T10:28:10.593Z
Learning: The typo in error code enum names ("IDENTIED_AS_GENERAL" and "IDENTIED_AS_MISLEADING_QUERY" instead of "IDENTIFIED_AS_GENERAL" and "IDENTIFIED_AS_MISLEADING_QUERY") in wren-ui/src/apollo/server/utils/error.ts was recognized but intentionally not fixed as it was considered out of scope for PR #1414.

Applied to files:

  • wren-ui/src/apollo/client/graphql/__types__.ts
  • wren-ui/src/apollo/server/schema.ts
  • wren-ui/src/apollo/server/types/dataSource.ts
  • wren-ui/src/apollo/server/mdl/type.ts
  • wren-ui/src/utils/enum/dataSources.ts
  • wren-ui/src/apollo/server/services/projectService.ts
  • wren-ui/src/apollo/server/mdl/mdlBuilder.ts
📚 Learning: 2025-03-18T10:28:26.608Z
Learnt from: andreashimin
Repo: Canner/WrenAI PR: 1414
File: wren-ui/src/apollo/server/utils/error.ts:0-0
Timestamp: 2025-03-18T10:28:26.608Z
Learning: The enum names `IDENTIED_AS_GENERAL` and `IDENTIED_AS_MISLEADING_QUERY` in GeneralErrorCodes enum in wren-ui/src/apollo/server/utils/error.ts have typos (missing "FI" in "IDENTIFIED") but fixing them is not in scope for the current PR.

Applied to files:

  • wren-ui/src/apollo/server/mdl/type.ts
📚 Learning: 2025-07-09T02:43:20.433Z
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1827
File: wren-launcher/commands/dbt/data_source.go:50-53
Timestamp: 2025-07-09T02:43:20.433Z
Learning: In wren-launcher/commands/dbt/data_source.go, when encountering unsupported database types in convertConnectionToDataSource function, the user prefers to log a warning and continue processing instead of failing. The function should return nil, nil to allow processing to continue.

Applied to files:

  • wren-ui/src/apollo/server/mdl/type.ts
📚 Learning: 2025-07-09T02:43:07.560Z
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1827
File: wren-launcher/commands/dbt/data_source.go:154-156
Timestamp: 2025-07-09T02:43:07.560Z
Learning: In the WrenAI codebase, the MapType methods for data sources should return the original type name for unknown types, rather than a default fallback like "string". This maintains consistency across all data source implementations.

Applied to files:

  • wren-ui/src/apollo/server/mdl/mdlBuilder.ts
🧬 Code graph analysis (6)
wren-ui/src/apollo/client/graphql/__types__.ts (1)
wren-ui/src/utils/enum/dataSources.ts (1)
  • DatabricksConnectionType (3-3)
wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (2)
wren-ui/src/utils/validator/hostValidator.ts (1)
  • hostValidator (3-13)
wren-ui/src/utils/error/dictionary.ts (1)
  • ERROR_TEXTS (1-192)
wren-ui/src/components/pages/setup/utils.tsx (1)
wren-ui/src/utils/dataSourceType.ts (1)
  • getDataSourceConfig (108-114)
wren-ui/src/apollo/server/dataSource.ts (2)
wren-ui/src/apollo/server/repositories/projectRepository.ts (3)
  • DATABRICKS_CONNECTION_INFO (143-145)
  • DATABRICKS_PERSONAL_ACCESS_TOKEN_AUTH (123-128)
  • DATABRICKS_SERVICE_PRINCIPAL_AUTH (130-137)
wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts (1)
  • IbisDatabricksConnectionInfo (135-137)
wren-ui/src/utils/dataSourceType.ts (1)
wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (1)
  • DatabricksProperties (133-209)
wren-ui/src/hooks/useSetupConnectionDataSource.tsx (1)
wren-ui/migrations/20240531085916_transfer_model_properties.js (1)
  • dataSourceType (11-11)
🔇 Additional comments (15)
wren-ui/src/apollo/server/services/projectService.ts (1)

37-38: LGTM! Sensitive fields correctly masked.

The addition of accessToken and clientSecret to the sensitive properties set ensures that Databricks authentication credentials are properly filtered out when exposing connection info, consistent with the existing security pattern for other data sources.

wren-ui/src/utils/enum/dataSources.ts (1)

1-4: LGTM! Databricks enum additions are consistent.

The export of DatabricksConnectionType as DATABRICKS_AUTH_METHOD follows the same pattern as REDSHIFT_AUTH_METHOD, and the DATABRICKS enum member is correctly added to the DATA_SOURCES enum.

Also applies to: 18-18

wren-ui/src/apollo/server/mdl/mdlBuilder.ts (1)

517-518: LGTM! Databricks data source mapping is correct.

The case statement correctly maps DataSourceName.DATABRICKS to WrenEngineDataSourceType.DATABRICKS, consistent with all other data source mappings in the switch statement.

wren-ui/src/apollo/server/mdl/type.ts (1)

99-99: LGTM! Enum member correctly added.

The DATABRICKS member is appropriately added to the WrenEngineDataSourceType enum, positioned before DATAFUSION which is noted as not supported by the UI.

wren-ui/src/apollo/server/schema.ts (1)

72-72: LGTM! GraphQL schema additions are correct.

The DATABRICKS member is properly added to the DataSourceName enum, and the new DatabricksConnectionType enum follows the established pattern from RedshiftConnectionType. The snake_case enum values (service_principal, token) are consistent with the codebase convention.

Also applies to: 80-83

wren-ui/src/apollo/server/types/dataSource.ts (1)

13-13: LGTM! Enum member addition is correct.

The DATABRICKS member is properly added to the DataSourceName enum, maintaining consistency with the GraphQL schema definition.

wren-ui/src/apollo/client/graphql/__types__.ts (1)

333-333: LGTM! Client types correctly mirror server schema.

The DataSourceName enum and DatabricksConnectionType enum on the client side correctly mirror the GraphQL schema definitions from schema.ts, ensuring type consistency across the client-server boundary.

Also applies to: 344-347

wren-ui/src/hooks/useSetupConnectionDataSource.tsx (2)

134-145: Placeholder handling for Databricks authentication fields is correctly implemented.

Verification confirms the placeholder logic properly scopes PASSWORD_PLACEHOLDER to only sensitive authentication fields. The hook applies placeholders only to clientSecret (for service_principal auth) and accessToken (for token auth), while non-sensitive fields like serverHostname, httpPath, clientId, and azureTenantId retain their original values without placeholder treatment. The UI component appropriately uses Input.Password for sensitive fields and regular Input components for others.


83-87: The review comment contains an inaccurate technical claim about pattern consistency.

The Databricks authentication implementation is functionally correct and handles all required fields properly, but it does not mirror the Snowflake authentication pattern at the client level:

Pattern Differences:

Aspect Snowflake Databricks
Client-side handling Explicitly sets unused field to null Only returns the used field
Server-side handling Extracts both password and privateKey Conditionally extracts only relevant field
Result Both credentials sent, server normalizes Only used credential sent

Verification Results:

✓ Service Principal: clientSecret correctly filters out PASSWORD_PLACEHOLDER
✓ Token: accessToken correctly filters out PASSWORD_PLACEHOLDER
✓ All required fields handled: serverHostname, httpPath, clientId, clientSecret, azureTenantId, accessToken are all properly processed at server-side
✓ Server-side filtering in toIbisConnectionInfo ensures only relevant credentials are used

The implementation is correct and actually more selective than Snowflake (server only uses the intended credential), but the client-side approach differs: Snowflake explicitly clears the unused field to null, while Databricks omits it from the return object.

wren-ui/src/apollo/server/repositories/projectRepository.ts (1)

12-15: LGTM! Databricks type definitions follow established patterns.

The type structure mirrors the existing Redshift implementation with multiple authentication methods. The interfaces are well-defined with appropriate required and optional fields.

Also applies to: 123-159

wren-ui/src/components/pages/setup/utils.tsx (1)

115-119: LGTM! Databricks data source option configured correctly.

The configuration follows the established pattern and includes the guide URL specified in the PR objectives.

wren-ui/src/utils/error/dictionary.ts (1)

79-90: LGTM! Error messages complete for Databricks fields.

All required validation messages for both authentication methods are properly defined with clear, consistent wording.

wren-ui/src/utils/dataSourceType.ts (1)

13-13: LGTM! Databricks properly integrated into data source mappings.

The image, name, and properties mappings are consistent with other data sources in the codebase.

Also applies to: 39-40, 70-71, 101-102

wren-ui/src/apollo/server/dataSource.ts (1)

442-492: LGTM! Databricks data source mapping implemented correctly.

The implementation properly handles:

  • Decryption of sensitive fields (accessToken, clientSecret)
  • Both authentication methods with appropriate field mappings
  • Error handling for invalid authentication types
  • Consistent pattern with the existing Redshift implementation

The mix of snake_case (databricks_type) and camelCase (other fields) matches the expected Ibis adaptor interface.

wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts (1)

110-137: LGTM! Databricks adaptor types and mappings are well-defined.

The connection type enum, authentication interfaces, and data source mapping are properly implemented. The field naming convention (snake_case for databricks_type, camelCase for other fields) is intentional and defines the contract with the Ibis server API.

Also applies to: 150-150, 164-164

Comment thread wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx Outdated
Copy link
Copy Markdown
Contributor

@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: 1

🧹 Nitpick comments (1)
wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (1)

95-100: Remove unused helper function.

The getIsEditModeForComponent helper is defined but never used in the component. The shared fields (serverHostname and httpPath) are correctly disabled using isEditMode directly, which prevents the bypass issue mentioned in previous reviews.

-  const getIsEditModeForComponent = (componentType: DATABRICKS_AUTH_METHOD) => {
-    if (!isEditMode) return false;
-
-    const initialType = initialDatabricksTypeRef.current || databricksType;
-    return initialType === componentType;
-  };
-
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b9f498a and dfecdb2.

⛔ Files ignored due to path filters (1)
  • wren-ui/public/images/dataSource/databricks.svg is excluded by !**/*.svg
📒 Files selected for processing (15)
  • wren-ui/src/apollo/client/graphql/__types__.ts (2 hunks)
  • wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts (3 hunks)
  • wren-ui/src/apollo/server/dataSource.ts (3 hunks)
  • wren-ui/src/apollo/server/mdl/mdlBuilder.ts (1 hunks)
  • wren-ui/src/apollo/server/mdl/type.ts (1 hunks)
  • wren-ui/src/apollo/server/repositories/projectRepository.ts (3 hunks)
  • wren-ui/src/apollo/server/schema.ts (1 hunks)
  • wren-ui/src/apollo/server/services/projectService.ts (1 hunks)
  • wren-ui/src/apollo/server/types/dataSource.ts (1 hunks)
  • wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (1 hunks)
  • wren-ui/src/components/pages/setup/utils.tsx (1 hunks)
  • wren-ui/src/hooks/useSetupConnectionDataSource.tsx (4 hunks)
  • wren-ui/src/utils/dataSourceType.ts (4 hunks)
  • wren-ui/src/utils/enum/dataSources.ts (2 hunks)
  • wren-ui/src/utils/error/dictionary.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (7)
  • wren-ui/src/components/pages/setup/utils.tsx
  • wren-ui/src/utils/error/dictionary.ts
  • wren-ui/src/utils/enum/dataSources.ts
  • wren-ui/src/apollo/server/mdl/mdlBuilder.ts
  • wren-ui/src/apollo/server/schema.ts
  • wren-ui/src/apollo/server/services/projectService.ts
  • wren-ui/src/apollo/server/types/dataSource.ts
🧰 Additional context used
🧠 Learnings (6)
📓 Common learnings
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1887
File: wren-launcher/commands/dbt/data_source.go:273-276
Timestamp: 2025-08-13T05:17:30.180Z
Learning: In the Wren AI codebase, there's an intentional distinction between dbt connection types and Wren AI data source types: dbt uses "sqlserver" as the connection type, while Wren AI expects "mssql" as the data source type. The conversion layer in convertConnectionToDataSource() correctly matches "sqlserver" from dbt profiles and the WrenMSSQLDataSource.GetType() method correctly returns "mssql" for Wren AI compatibility.
📚 Learning: 2025-03-18T10:28:10.593Z
Learnt from: andreashimin
Repo: Canner/WrenAI PR: 1414
File: wren-ui/src/apollo/server/utils/error.ts:0-0
Timestamp: 2025-03-18T10:28:10.593Z
Learning: The typo in error code enum names ("IDENTIED_AS_GENERAL" and "IDENTIED_AS_MISLEADING_QUERY" instead of "IDENTIFIED_AS_GENERAL" and "IDENTIFIED_AS_MISLEADING_QUERY") in wren-ui/src/apollo/server/utils/error.ts was recognized but intentionally not fixed as it was considered out of scope for PR #1414.

Applied to files:

  • wren-ui/src/apollo/client/graphql/__types__.ts
  • wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts
  • wren-ui/src/apollo/server/mdl/type.ts
📚 Learning: 2025-08-13T05:17:30.180Z
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1887
File: wren-launcher/commands/dbt/data_source.go:273-276
Timestamp: 2025-08-13T05:17:30.180Z
Learning: In the Wren AI codebase, there's an intentional distinction between dbt connection types and Wren AI data source types: dbt uses "sqlserver" as the connection type, while Wren AI expects "mssql" as the data source type. The conversion layer in convertConnectionToDataSource() correctly matches "sqlserver" from dbt profiles and the WrenMSSQLDataSource.GetType() method correctly returns "mssql" for Wren AI compatibility.

Applied to files:

  • wren-ui/src/apollo/client/graphql/__types__.ts
  • wren-ui/src/hooks/useSetupConnectionDataSource.tsx
  • wren-ui/src/apollo/server/dataSource.ts
  • wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts
  • wren-ui/src/apollo/server/repositories/projectRepository.ts
  • wren-ui/src/utils/dataSourceType.ts
  • wren-ui/src/apollo/server/mdl/type.ts
📚 Learning: 2025-03-18T10:28:26.608Z
Learnt from: andreashimin
Repo: Canner/WrenAI PR: 1414
File: wren-ui/src/apollo/server/utils/error.ts:0-0
Timestamp: 2025-03-18T10:28:26.608Z
Learning: The enum names `IDENTIED_AS_GENERAL` and `IDENTIED_AS_MISLEADING_QUERY` in GeneralErrorCodes enum in wren-ui/src/apollo/server/utils/error.ts have typos (missing "FI" in "IDENTIFIED") but fixing them is not in scope for the current PR.

Applied to files:

  • wren-ui/src/apollo/client/graphql/__types__.ts
  • wren-ui/src/apollo/server/mdl/type.ts
📚 Learning: 2025-04-28T20:09:06.106Z
Learnt from: narsik123
Repo: Canner/WrenAI PR: 1606
File: wren-ui/src/apollo/server/dataSource.ts:135-150
Timestamp: 2025-04-28T20:09:06.106Z
Learning: The Oracle data source in WrenAI includes an SSL toggle in the UI (OracleProperties component) and should pass this setting to the connection info using the pattern `...(ssl && { kwargs: { ssl: true } })` for consistency with other host-based connections like MS SQL.

Applied to files:

  • wren-ui/src/hooks/useSetupConnectionDataSource.tsx
📚 Learning: 2025-07-09T02:43:20.433Z
Learnt from: goldmedal
Repo: Canner/WrenAI PR: 1827
File: wren-launcher/commands/dbt/data_source.go:50-53
Timestamp: 2025-07-09T02:43:20.433Z
Learning: In wren-launcher/commands/dbt/data_source.go, when encountering unsupported database types in convertConnectionToDataSource function, the user prefers to log a warning and continue processing instead of failing. The function should return nil, nil to allow processing to continue.

Applied to files:

  • wren-ui/src/apollo/server/mdl/type.ts
🧬 Code graph analysis (5)
wren-ui/src/apollo/client/graphql/__types__.ts (1)
wren-ui/src/utils/enum/dataSources.ts (1)
  • DatabricksConnectionType (3-3)
wren-ui/src/hooks/useSetupConnectionDataSource.tsx (1)
wren-ui/migrations/20240531085916_transfer_model_properties.js (1)
  • dataSourceType (11-11)
wren-ui/src/apollo/server/dataSource.ts (2)
wren-ui/src/apollo/server/repositories/projectRepository.ts (3)
  • DATABRICKS_CONNECTION_INFO (143-145)
  • DATABRICKS_PERSONAL_ACCESS_TOKEN_AUTH (123-128)
  • DATABRICKS_SERVICE_PRINCIPAL_AUTH (130-137)
wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts (1)
  • IbisDatabricksConnectionInfo (135-137)
wren-ui/src/utils/dataSourceType.ts (1)
wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (1)
  • DatabricksProperties (65-167)
wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (2)
wren-ui/src/utils/error/dictionary.ts (1)
  • ERROR_TEXTS (1-192)
wren-ui/src/utils/validator/hostValidator.ts (1)
  • hostValidator (3-13)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Analyze (go)
🔇 Additional comments (26)
wren-ui/src/apollo/server/mdl/type.ts (1)

99-100: LGTM!

The DATABRICKS enum member is correctly added to WrenEngineDataSourceType, following the established naming convention and placed appropriately before DATAFUSION.

wren-ui/src/apollo/client/graphql/__types__.ts (2)

333-333: LGTM!

The DATABRICKS member is correctly added to the DataSourceName enum, following the established naming convention.


344-347: LGTM!

The DatabricksConnectionType enum is correctly defined with both authentication methods (token for PAT and service_principal), following the same pattern as the existing RedshiftConnectionType enum.

wren-ui/src/utils/dataSourceType.ts (4)

13-13: LGTM!

The import statement correctly brings in the DatabricksProperties component, consistent with other data source property imports in this file.


39-40: LGTM!

The data source image mapping for Databricks is correctly implemented, following the established pattern and naming convention.


70-71: LGTM!

The data source name mapping returns 'Databricks' with appropriate capitalization, consistent with other data source name mappings.


101-102: LGTM!

The data source properties mapping correctly returns the DatabricksProperties component, following the pattern established for other data sources.

wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx (4)

11-27: LGTM!

The DatabricksTokenFields component correctly implements the Personal Access Token authentication form with appropriate validation and placeholder text.


29-63: LGTM!

The DatabricksServicePrincipalFields component correctly implements the Service Principal authentication form. The azureTenantId field is appropriately optional, consistent with the PR description.


77-93: LGTM!

The useEffect hooks correctly handle initialization of databricksType to 'token' in create mode and track the initial authentication method in edit mode.


102-167: LGTM!

The main form implementation correctly handles both authentication methods with proper validation and conditional field rendering. The serverHostname and httpPath fields are appropriately disabled in edit mode to prevent modification as specified in the PR requirements.

wren-ui/src/apollo/server/adaptors/ibisAdaptor.ts (4)

110-129: LGTM!

The Databricks connection types and interfaces are well-defined, following the established pattern used for Redshift authentication. The enum, interfaces, and union type correctly model both Personal Access Token and Service Principal authentication methods.


135-137: LGTM!

The IbisDatabricksConnectionInfo union type correctly combines both authentication methods, following the pattern established for IbisRedshiftConnectionInfo.


150-150: LGTM!

DATABRICKS is correctly added to the SupportedDataSource enum, maintaining alphabetical ordering with other data sources.


164-164: LGTM!

The dataSourceUrlMap entry correctly maps DATABRICKS to the 'databricks' API endpoint string, following the established pattern.

wren-ui/src/apollo/server/repositories/projectRepository.ts (4)

12-15: LGTM!

The import statement is correctly updated to include IbisDatabricksConnectionType from the Ibis adaptor, following the same pattern as IbisRedshiftConnectionType.


123-137: LGTM!

The Databricks authentication interfaces are well-defined with appropriate fields for both Personal Access Token and Service Principal authentication. The interfaces correctly use the IbisDatabricksConnectionType discriminator and match the corresponding Ibis adaptor interfaces.


143-145: LGTM!

The DATABRICKS_CONNECTION_INFO union type correctly combines both authentication interfaces, following the pattern established for other data sources with multiple authentication methods.


158-159: LGTM!

The WREN_AI_CONNECTION_INFO union is correctly extended to include DATABRICKS_CONNECTION_INFO, maintaining consistency with the addition of other data source connection types.

wren-ui/src/apollo/server/dataSource.ts (3)

11-12: LGTM!

The import statements correctly bring in the Databricks connection types and info from the Ibis adaptor, following the pattern established for other data sources.


29-31: LGTM!

The repository imports correctly include all three Databricks connection info types needed for the data source mapping.


442-492: LGTM!

The Databricks data source implementation is comprehensive and correct:

  • Sensitive properties (accessToken, clientSecret) are properly identified for encryption
  • The toIbisConnectionInfo function correctly handles both authentication methods with proper field mapping
  • The databricks_type discriminator is correctly passed through for both branches
  • Error handling appropriately throws for invalid authentication types
  • The field naming convention (databricks_type in snake_case, other fields in camelCase) matches the example payloads in the PR description

The implementation follows the established pattern for multi-authentication data sources (similar to Redshift) and correctly integrates with the repository and Ibis adaptor layers.

wren-ui/src/hooks/useSetupConnectionDataSource.tsx (4)

3-7: LGTM - Import follows established pattern.

The addition of DATABRICKS_AUTH_METHOD follows the same pattern as the existing REDSHIFT_AUTH_METHOD import.


83-87: Good pattern following Snowflake implementation.

The structure correctly delegates authentication-specific field handling to the helper function while preserving all other properties.


134-145: Correct placeholder handling for UI.

The conditional logic properly provides password placeholders for the appropriate authentication field based on the selected Databricks authentication type.


174-174: DATABRICKS_AUTH_METHOD enum values are correct and consistent throughout the codebase.

Verification confirms that DATABRICKS_AUTH_METHOD.service_principal equals "service_principal" and the token variant equals "token", matching the connectionInfo payload structure. The enum is imported from the GraphQL type definition and consistently used across form components, hooks, and server-side data transformations.

Comment on lines +173 to +189
function getDatabricksAuthentication(properties: Record<string, any>) {
if (properties?.databricksType === DATABRICKS_AUTH_METHOD.service_principal) {
return {
clientSecret:
properties?.clientSecret === PASSWORD_PLACEHOLDER
? undefined
: properties?.clientSecret,
};
}

return {
accessToken:
properties?.accessToken === PASSWORD_PLACEHOLDER
? undefined
: properties?.accessToken,
};
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Missing explicit nullification of unused authentication field.

Unlike the getSnowflakeAuthentication helper (lines 156-171), this function doesn't explicitly set the unused authentication field to null. This creates a potential issue when switching authentication methods:

Scenario: User switches from Service Principal to Token

  • Form properties may still contain clientSecret from previous configuration
  • getDatabricksAuthentication returns only { accessToken: 'token456' }
  • Final spread { ...properties, ...getDatabricksAuthentication(properties) } preserves old clientSecret
  • Server receives both clientSecret and accessToken instead of just accessToken

This could cause:

  1. Security issues (old credentials sent unnecessarily)
  2. Server-side confusion about which authentication method to use
  3. Inconsistency with the established Snowflake pattern

Apply this diff to match the Snowflake pattern:

 function getDatabricksAuthentication(properties: Record<string, any>) {
   if (properties?.databricksType === DATABRICKS_AUTH_METHOD.service_principal) {
     return {
       clientSecret:
         properties?.clientSecret === PASSWORD_PLACEHOLDER
           ? undefined
           : properties?.clientSecret,
+      accessToken: null,
     };
   }
 
   return {
     accessToken:
       properties?.accessToken === PASSWORD_PLACEHOLDER
         ? undefined
         : properties?.accessToken,
+    clientSecret: null,
   };
 }
📝 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
function getDatabricksAuthentication(properties: Record<string, any>) {
if (properties?.databricksType === DATABRICKS_AUTH_METHOD.service_principal) {
return {
clientSecret:
properties?.clientSecret === PASSWORD_PLACEHOLDER
? undefined
: properties?.clientSecret,
};
}
return {
accessToken:
properties?.accessToken === PASSWORD_PLACEHOLDER
? undefined
: properties?.accessToken,
};
}
function getDatabricksAuthentication(properties: Record<string, any>) {
if (properties?.databricksType === DATABRICKS_AUTH_METHOD.service_principal) {
return {
clientSecret:
properties?.clientSecret === PASSWORD_PLACEHOLDER
? undefined
: properties?.clientSecret,
accessToken: null,
};
}
return {
accessToken:
properties?.accessToken === PASSWORD_PLACEHOLDER
? undefined
: properties?.accessToken,
clientSecret: null,
};
}
🤖 Prompt for AI Agents
In wren-ui/src/hooks/useSetupConnectionDataSource.tsx around lines 173 to 189,
the databricks auth helper returns only the selected credential field and does
not explicitly null out the unused field; update getDatabricksAuthentication to
mirror the Snowflake helper by returning both fields with the unused one set to
null (i.e., when databricksType is service_principal return clientSecret (or
undefined if placeholder) and accessToken: null; otherwise return accessToken
(or undefined if placeholder) and clientSecret: null) so that spreading
properties into the final payload will not preserve old credentials.

Comment thread wren-ui/src/components/pages/setup/dataSources/DatabricksProperties.tsx Outdated
Copy link
Copy Markdown
Contributor

@andreashimin andreashimin left a comment

Choose a reason for hiding this comment

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

lgtm

@fredalai fredalai merged commit cdf17aa into main Nov 28, 2025
10 checks passed
@fredalai fredalai deleted the feature/databricks branch November 28, 2025 02:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants