Full Code of redis/RedisInsight for AI

main 95022ae1f308 cached
6242 files
18.1 MB
5.2M tokens
7959 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (20,485K chars total). Download the full file to get everything.
Repository: redis/RedisInsight
Branch: main
Commit: 95022ae1f308
Files: 6242
Total size: 18.1 MB

Directory structure:
gitextract_fr3fg8ca/

├── .ai/
│   ├── README.md
│   ├── commands/
│   │   ├── commit-message.md
│   │   ├── e2e-fix.md
│   │   ├── e2e-generate.md
│   │   ├── generate-release-notes.md
│   │   ├── pr-plan.md
│   │   └── pull-request-review.md
│   ├── rules/
│   │   ├── backend.md
│   │   ├── code-quality.md
│   │   ├── e2e-testing.md
│   │   ├── frontend.md
│   │   ├── git-safety.md
│   │   └── testing.md
│   └── skills/
│       ├── branches/
│       │   └── SKILL.md
│       ├── commits/
│       │   └── SKILL.md
│       └── pull-requests/
│           └── SKILL.md
├── .cursor/
│   └── agents/
│       └── test-runner.md
├── .cursorignore
├── .dockerignore
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── actions/
│   │   ├── deploy-test-reports/
│   │   │   └── action.yml
│   │   ├── get-current-date/
│   │   │   └── action.yml
│   │   ├── install-all-build-libs/
│   │   │   └── action.yml
│   │   ├── install-apple-certs/
│   │   │   └── action.yml
│   │   ├── install-deps/
│   │   │   └── action.yml
│   │   ├── install-windows-certs/
│   │   │   └── action.yml
│   │   ├── remove-artifacts/
│   │   │   └── action.yml
│   │   └── setup-e2e-playwright/
│   │       └── action.yml
│   ├── build/
│   │   ├── build.Dockerfile
│   │   ├── build.sh
│   │   ├── build_modules.sh
│   │   ├── release-docker.sh
│   │   └── sum_sha256.sh
│   ├── codeql/
│   │   └── config.yml
│   ├── copilot-instructions.md
│   ├── deps-audit-report.js
│   ├── deps-licenses-report.js
│   ├── e2e/
│   │   ├── test.app-image.sh
│   │   └── test.app-image.sso.sh
│   ├── e2e-results.js
│   ├── generate-build-summary.js
│   ├── generate-checksums-summary.js
│   ├── itest-results.js
│   ├── lint-report.js
│   ├── redisstack/
│   │   ├── app-image.repack.sh
│   │   └── dmg.repack.sh
│   ├── virustotal-report.js
│   └── workflows/
│       ├── approval-dedupe.yml
│       ├── aws-upload-dev.yml
│       ├── aws-upload-enterprise.yml
│       ├── aws-upload-prod.yml
│       ├── build.yml
│       ├── clean-deployments.yml
│       ├── clean-s3-dev-builds.yml
│       ├── code-coverage.yml
│       ├── codeql-analysis.yml
│       ├── compress-images.yml
│       ├── enforce-branch-name-rules.yml
│       ├── licenses-check.yml
│       ├── lint.yml
│       ├── manual-build-enterprise.yml
│       ├── manual-build.yml
│       ├── nightly-virustotal-analyze.yml
│       ├── pipeline-build-docker.yml
│       ├── pipeline-build-linux.yml
│       ├── pipeline-build-macos.yml
│       ├── pipeline-build-windows.yml
│       ├── publish-stores.yml
│       ├── release-prod.yml
│       ├── release-stage.yml
│       ├── tests-backend.yml
│       ├── tests-e2e-appimage.yml
│       ├── tests-e2e-docker-critical-path.yml
│       ├── tests-e2e-docker-regression.yml
│       ├── tests-e2e-docker-smoke.yml
│       ├── tests-e2e-playwright-chromium.yml
│       ├── tests-e2e-playwright-docker.yml
│       ├── tests-e2e-playwright-electron.yml
│       ├── tests-e2e-playwright-lint.yml
│       ├── tests-e2e-playwright-v2.yml
│       ├── tests-e2e-playwright.yml
│       ├── tests-e2e.yml
│       ├── tests-frontend.yml
│       ├── tests-integration.yml
│       ├── tests.yml
│       ├── virustotal.yml
│       └── weekly.yml
├── .gitignore
├── .jit/
│   └── jit-config.yml
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .storybook/
│   ├── RootStoryLayout.tsx
│   ├── Story.context.ts
│   ├── ThemeContextBridge.tsx
│   ├── helpers/
│   │   └── styles.ts
│   ├── main.ts
│   ├── manager.ts
│   ├── preview-head.html
│   ├── preview.tsx
│   ├── redis-theme.ts
│   ├── tsconfig.json
│   └── vite.config.ts
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   └── settings.json
├── .yarnrc
├── AGENTS.md
├── CHANGELOG.md
├── CONDUCT
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── api-docker-entry.sh
├── babel.config.cjs
├── configs/
│   ├── .eslintrc
│   ├── webpack.config.base.ts
│   ├── webpack.config.eslint.js
│   ├── webpack.config.main.prod.ts
│   ├── webpack.config.main.stage.ts
│   ├── webpack.config.preload.dev.ts
│   └── webpack.paths.ts
├── dev.provisionprofile
├── docker-entry.sh
├── docs/
│   ├── azure-docker-setup.md
│   ├── azure-setup.md
│   ├── plugins/
│   │   ├── development.md
│   │   ├── installation.md
│   │   └── introduction.md
│   └── release-notes/
│       └── RELEASE_NOTES_TEMPLATE.md
├── electron-builder-mas.js
├── electron-builder.json
├── embedded.provisionprofile
├── env.mcp.example
├── jest-resolver.js
├── jest.config.cjs
├── mcp.json
├── package.json
├── patches/
│   ├── @elastic+eui+34.6.0.patch
│   ├── monaco-yaml+5.1.1.patch
│   └── react-vtree+3.0.0-beta.3.patch
├── pull_request_template.md
├── redisinsight/
│   ├── __mocks__/
│   │   ├── brotli-dec-wasm.js
│   │   ├── fileMock.js
│   │   ├── monacoMock.js
│   │   ├── monacoYamlMock.js
│   │   ├── rawproto.js
│   │   ├── react-children-utilities.js
│   │   ├── react-resizable-panels.js
│   │   ├── rehypeStringify.js
│   │   ├── remarkGfm.js
│   │   ├── remarkParse.js
│   │   ├── remarkRehype.js
│   │   ├── scssRaw.js
│   │   ├── svg.js
│   │   ├── unified.js
│   │   └── unistUtilsVisit.js
│   ├── api/
│   │   ├── .dockerignore
│   │   ├── .eslintignore
│   │   ├── .gitignore
│   │   ├── .jest.setup.ts
│   │   ├── .prettierignore
│   │   ├── .prettierrc
│   │   ├── .yarnclean.prod
│   │   ├── bruno/
│   │   │   └── RedisInsight/
│   │   │       ├── Query Library/
│   │   │       │   ├── Create/
│   │   │       │   │   ├── Create Query (invalid).bru
│   │   │       │   │   ├── Create Query.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Delete/
│   │   │       │   │   ├── Delete Query (invalid).bru
│   │   │       │   │   ├── Delete Query.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Get/
│   │   │       │   │   ├── Get Query (invalid).bru
│   │   │       │   │   ├── Get Query.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Get Queries/
│   │   │       │   │   ├── Get Queries.bru
│   │   │       │   │   ├── Search Queries.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Seed/
│   │   │       │   │   ├── Seed Queries.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Update/
│   │   │       │   │   ├── Update Query (invalid).bru
│   │   │       │   │   ├── Update Query.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   └── folder.bru
│   │   │       ├── bruno.json
│   │   │       └── environments/
│   │   │           └── Local.bru
│   │   ├── config/
│   │   │   ├── default.ts
│   │   │   ├── development.ts
│   │   │   ├── features-config.json
│   │   │   ├── logger.ts
│   │   │   ├── ormconfig.ts
│   │   │   ├── production.ts
│   │   │   ├── stack.ts
│   │   │   ├── staging.ts
│   │   │   ├── swagger.ts
│   │   │   └── test.ts
│   │   ├── data/
│   │   │   ├── common
│   │   │   ├── json
│   │   │   ├── manifest.json
│   │   │   ├── search
│   │   │   └── vector-collections/
│   │   │       ├── bikes
│   │   │       └── movies
│   │   ├── esbuild.js
│   │   ├── migration/
│   │   │   ├── 1614164490968-initial-migration.ts
│   │   │   ├── 1615480887019-connection-type.ts
│   │   │   ├── 1615990079125-database-name-from-provider.ts
│   │   │   ├── 1615992183565-remove-database-type.ts
│   │   │   ├── 1616520395940-oss-sentinel.ts
│   │   │   ├── 1625771635418-agreements.ts
│   │   │   ├── 1626086601057-server-info.ts
│   │   │   ├── 1626904405170-database-hosting-provider.ts
│   │   │   ├── 1627556171227-settings.ts
│   │   │   ├── 1629729923740-database-modules.ts
│   │   │   ├── 1634219846022-database-db-index.ts
│   │   │   ├── 1634557312500-encryption.ts
│   │   │   ├── 1641795882696-command-execution.ts
│   │   │   ├── 1641805606399-plugin-state.ts
│   │   │   ├── 1650278664000-sni.ts
│   │   │   ├── 1655821010349-notification.ts
│   │   │   ├── 1659687030433-notification-category.ts
│   │   │   ├── 1660664717573-workbench-mode.ts
│   │   │   ├── 1663093411715-workbench-group-mode.ts
│   │   │   ├── 1664785208236-database-analysis.ts
│   │   │   ├── 1664886479051-database-analysis-expiration-groups.ts
│   │   │   ├── 1667368983699-workbench-execution-time.ts
│   │   │   ├── 1667477693934-database.ts
│   │   │   ├── 1670252337342-database-new.ts
│   │   │   ├── 1673035852335-ssh-options.ts
│   │   │   ├── 1673934231410-workbench-and-analysis-db.ts
│   │   │   ├── 1674539211397-browser-history.ts
│   │   │   ├── 1674660306971-database-analysis-recommendations.ts
│   │   │   ├── 1675398140189-database-timeout.ts
│   │   │   ├── 1677135091633-custom-tutorials.ts
│   │   │   ├── 1678182722874-database-compressor.ts
│   │   │   ├── 1681900503586-database-recommendations.ts
│   │   │   ├── 1683006064293-database-recommendation-params.ts
│   │   │   ├── 1684931530343-feature.ts
│   │   │   ├── 1686719451753-database-redis-server.ts
│   │   │   ├── 1687166457712-cloud-database-details.ts
│   │   │   ├── 1687435940110-database-recommendation-unique.ts
│   │   │   ├── 1688989337247-freeCloudDatabase.ts
│   │   │   ├── 1691061058385-cloud-capi-keys.ts
│   │   │   ├── 1691476419592-feature-sso.ts
│   │   │   ├── 1713515657364-ai-history.ts
│   │   │   ├── 1714501203616-ai-history-steps.ts
│   │   │   ├── 1716370509836-rdi.ts
│   │   │   ├── 1718260230164-ai-history.ts
│   │   │   ├── 1726058563737-command-execution.ts
│   │   │   ├── 1729085495444-cloud-session.ts
│   │   │   ├── 1733740794737-database-createdAt.ts
│   │   │   ├── 1737362130798-db-settings.ts
│   │   │   ├── 1738829743482-database-forceStandalone.ts
│   │   │   ├── 1740579711635-rdi-optional-auth.ts
│   │   │   ├── 1741610039177-database-tags.ts
│   │   │   ├── 1741786803681-pre-setup-databases.ts
│   │   │   ├── 1742303245547-key-name-format.ts
│   │   │   ├── 1743432519891-cascade-tags.ts
│   │   │   ├── 1743606395647-encrypt-tags.ts
│   │   │   ├── 1755086732238-update-provider-names.ts
│   │   │   ├── 1769785218000-provider-details.ts
│   │   │   ├── 1771500000000-query-library.ts
│   │   │   └── index.ts
│   │   ├── nest-cli.json
│   │   ├── package.json
│   │   ├── package.tmp.json
│   │   ├── patches/
│   │   │   └── redis-parser+3.0.0.patch
│   │   ├── scripts/
│   │   │   ├── default-commands.ts
│   │   │   ├── default-content.ts
│   │   │   └── default-tutorials.ts
│   │   ├── src/
│   │   │   ├── __mocks__/
│   │   │   │   ├── ai.ts
│   │   │   │   ├── analytics.ts
│   │   │   │   ├── app-settings.ts
│   │   │   │   ├── autodiscovery.ts
│   │   │   │   ├── browser-history.ts
│   │   │   │   ├── bulk-actions.ts
│   │   │   │   ├── certificates.ts
│   │   │   │   ├── cloud-auth.ts
│   │   │   │   ├── cloud-autodiscovery.ts
│   │   │   │   ├── cloud-capi-key.ts
│   │   │   │   ├── cloud-common.ts
│   │   │   │   ├── cloud-database.ts
│   │   │   │   ├── cloud-job.ts
│   │   │   │   ├── cloud-session.ts
│   │   │   │   ├── cloud-subscription.ts
│   │   │   │   ├── cloud-task.ts
│   │   │   │   ├── cloud-user.ts
│   │   │   │   ├── commands.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── custom-tutorial.ts
│   │   │   │   ├── database-discovery.ts
│   │   │   │   ├── database-import.ts
│   │   │   │   ├── database-info.ts
│   │   │   │   ├── database-recommendation.ts
│   │   │   │   ├── database-settings.ts
│   │   │   │   ├── databases-client.ts
│   │   │   │   ├── databases.ts
│   │   │   │   ├── encryption.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── event-emitter.ts
│   │   │   │   ├── feature.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── notification.ts
│   │   │   │   ├── profiler.ts
│   │   │   │   ├── rdi.ts
│   │   │   │   ├── redis-client.ts
│   │   │   │   ├── redis-databases.ts
│   │   │   │   ├── redis-enterprise.ts
│   │   │   │   ├── redis-info.ts
│   │   │   │   ├── redis-rs.ts
│   │   │   │   ├── redis-sentinel.ts
│   │   │   │   ├── redis-utils.ts
│   │   │   │   ├── redis.ts
│   │   │   │   ├── redisearch.ts
│   │   │   │   ├── server.ts
│   │   │   │   ├── session.ts
│   │   │   │   ├── ssh.ts
│   │   │   │   ├── tags.ts
│   │   │   │   ├── triggered-functions.ts
│   │   │   │   ├── user.ts
│   │   │   │   ├── utm.ts
│   │   │   │   └── workbench.ts
│   │   │   ├── app.module.ts
│   │   │   ├── app.routes.ts
│   │   │   ├── common/
│   │   │   │   ├── constants/
│   │   │   │   │   ├── api.ts
│   │   │   │   │   ├── general.ts
│   │   │   │   │   ├── history.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── recommendations.ts
│   │   │   │   │   ├── redis-string.ts
│   │   │   │   │   └── user.ts
│   │   │   │   ├── decorators/
│   │   │   │   │   ├── client-metadata/
│   │   │   │   │   │   ├── client-metadata.decorator.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── data-as-json-string.decorator.ts
│   │   │   │   │   ├── database-management.decorator.ts
│   │   │   │   │   ├── default.ts
│   │   │   │   │   ├── hidden-field.decorator.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── is-bigger-than.decorator.ts
│   │   │   │   │   ├── is-github-link.decorator.ts
│   │   │   │   │   ├── is-multi-number.decorator.ts
│   │   │   │   │   ├── no-duplicates.decorator.ts
│   │   │   │   │   ├── object-as-map.decorator.ts
│   │   │   │   │   ├── redis-string/
│   │   │   │   │   │   ├── any-to-redis-string.decorator.ts
│   │   │   │   │   │   ├── api-query-redis-string-encoding.decorator.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── is-redis-string.decorator.ts
│   │   │   │   │   │   ├── redis-string-to-ascii.decorator.ts
│   │   │   │   │   │   ├── redis-string-to-buffer.decorator.ts
│   │   │   │   │   │   ├── redis-string-to-utf8.decorator.ts
│   │   │   │   │   │   └── redis-string-type.decorator.ts
│   │   │   │   │   ├── session/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── session-metadata.decorator.ts
│   │   │   │   │   ├── transform-to-map.decorator.spec.ts
│   │   │   │   │   ├── transform-to-map.decorator.ts
│   │   │   │   │   └── zset-score/
│   │   │   │   │       ├── index.ts
│   │   │   │   │       └── zset-score.decorator.ts
│   │   │   │   ├── exceptions/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── validation.exception.ts
│   │   │   │   ├── guards/
│   │   │   │   │   ├── database-management.guard.spec.ts
│   │   │   │   │   └── database-management.guard.ts
│   │   │   │   ├── interceptors/
│   │   │   │   │   ├── browser-serialize.interceptor.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── timeout.interceptor.ts
│   │   │   │   ├── logger/
│   │   │   │   │   ├── app-logger.spec.ts
│   │   │   │   │   └── app-logger.ts
│   │   │   │   ├── middlewares/
│   │   │   │   │   ├── body-parser.middleware.ts
│   │   │   │   │   └── single-user-auth.middleware.ts
│   │   │   │   ├── models/
│   │   │   │   │   ├── client-metadata.ts
│   │   │   │   │   ├── common.ts
│   │   │   │   │   ├── database-index.ts
│   │   │   │   │   ├── endpoint.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── session.ts
│   │   │   │   ├── pipes/
│   │   │   │   │   ├── database-index.validation.pipe.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── transformers/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── redis-reply/
│   │   │   │   │   │   ├── formatter-manager.spec.ts
│   │   │   │   │   │   ├── formatter-manager.ts
│   │   │   │   │   │   ├── formatter.interface.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── strategies/
│   │   │   │   │   │       ├── ascii-formatter.strategey.spec.ts
│   │   │   │   │   │       ├── ascii-formatter.strategy.ts
│   │   │   │   │   │       ├── utf8-formatter.strategy.spec.ts
│   │   │   │   │   │       └── utf8-formatter.strategy.ts
│   │   │   │   │   └── redis-string/
│   │   │   │   │       ├── any-to-redis-string.transformer.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── redis-string-to-ascii.transformer.ts
│   │   │   │   │       ├── redis-string-to-buffer.transformer.ts
│   │   │   │   │       └── redis-string-to-utf8.transformer.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── certificate-import.util.ts
│   │   │   │   │   ├── errors.util.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── merge.util.spec.ts
│   │   │   │   │   └── merge.util.ts
│   │   │   │   └── validators/
│   │   │   │       ├── bigger-than.validator.ts
│   │   │   │       ├── github-link.validator.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── multi-number.validator.ts
│   │   │   │       ├── no-duplicates.validator.ts
│   │   │   │       ├── redis-string.validator.ts
│   │   │   │       └── zset-score.validator.ts
│   │   │   ├── constants/
│   │   │   │   ├── agreements-spec.json
│   │   │   │   ├── app-events.ts
│   │   │   │   ├── custom-error-codes.ts
│   │   │   │   ├── error-messages.ts
│   │   │   │   ├── exceptions.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── recommendations.ts
│   │   │   │   ├── redis-commands.ts
│   │   │   │   ├── redis-connection.ts
│   │   │   │   ├── redis-error-codes.ts
│   │   │   │   ├── redis-keys.ts
│   │   │   │   ├── redis-modules.ts
│   │   │   │   ├── regex.ts
│   │   │   │   ├── sort.ts
│   │   │   │   ├── telemetry-events.ts
│   │   │   │   └── websocket-rooms.ts
│   │   │   ├── core.module.ts
│   │   │   ├── decorators/
│   │   │   │   ├── api-endpoint.decorator.ts
│   │   │   │   ├── api-redis-instance-operation.decorator.ts
│   │   │   │   └── api-redis-params.decorator.ts
│   │   │   ├── dto/
│   │   │   │   ├── dto-transformer.spec.ts
│   │   │   │   └── dto-transformer.ts
│   │   │   ├── exceptions/
│   │   │   │   └── global-exception.filter.ts
│   │   │   ├── init-helper.ts
│   │   │   ├── local-database.module.ts
│   │   │   ├── main.ts
│   │   │   ├── middleware/
│   │   │   │   ├── exclude-route.middleware.ts
│   │   │   │   ├── redis-connection/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── redis-connection.middleware.ts
│   │   │   │   │   └── route-controllers.ts
│   │   │   │   ├── subpath-proxy.middleware.ts
│   │   │   │   └── x-frame-options.middleware.ts
│   │   │   ├── models/
│   │   │   │   ├── index.ts
│   │   │   │   ├── redis-client.ts
│   │   │   │   └── redis-cluster.ts
│   │   │   ├── modules/
│   │   │   │   ├── ai/
│   │   │   │   │   ├── chat/
│   │   │   │   │   │   ├── ai-chat.controller.ts
│   │   │   │   │   │   ├── ai-chat.module.ts
│   │   │   │   │   │   ├── ai-chat.service.spec.ts
│   │   │   │   │   │   ├── ai-chat.service.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   └── send.ai-chat.message.dto.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── conv-ai.bad-request.exception.ts
│   │   │   │   │   │   │   ├── conv-ai.error.handler.spec.ts
│   │   │   │   │   │   │   ├── conv-ai.error.handler.ts
│   │   │   │   │   │   │   ├── conv-ai.forbidden.exception.ts
│   │   │   │   │   │   │   ├── conv-ai.internal-server-error.exception.ts
│   │   │   │   │   │   │   ├── conv-ai.not-found.exception.ts
│   │   │   │   │   │   │   ├── conv-ai.unauthorized.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── ai-chat.message.ts
│   │   │   │   │   │   │   ├── ai-chat.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── providers/
│   │   │   │   │   │       ├── conv-ai.provider.spec.ts
│   │   │   │   │   │       └── conv-ai.provider.ts
│   │   │   │   │   └── query/
│   │   │   │   │       ├── ai-query.controller.ts
│   │   │   │   │       ├── ai-query.module.ts
│   │   │   │   │       ├── ai-query.service.spec.ts
│   │   │   │   │       ├── ai-query.service.ts
│   │   │   │   │       ├── dto/
│   │   │   │   │       │   └── send.ai-query.message.dto.ts
│   │   │   │   │       ├── entities/
│   │   │   │   │       │   └── ai-query.message.entity.ts
│   │   │   │   │       ├── exceptions/
│   │   │   │   │       │   ├── a-queryi.error.handler.spec.ts
│   │   │   │   │       │   ├── ai-query.bad-request.exception.ts
│   │   │   │   │       │   ├── ai-query.error.handler.ts
│   │   │   │   │       │   ├── ai-query.forbidden.exception.ts
│   │   │   │   │       │   ├── ai-query.internal-server-error.exception.ts
│   │   │   │   │       │   ├── ai-query.not-found.exception.ts
│   │   │   │   │       │   ├── ai-query.rate-limit.max-tokens.exception.ts
│   │   │   │   │       │   ├── ai-query.rate-limit.request.exception.ts
│   │   │   │   │       │   ├── ai-query.rate-limit.token.exception.ts
│   │   │   │   │       │   ├── ai-query.unauthorized.exception.ts
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       ├── models/
│   │   │   │   │       │   ├── ai-query.auth-data.ts
│   │   │   │   │       │   ├── ai-query.common.ts
│   │   │   │   │       │   ├── ai-query.intermediate-step.ts
│   │   │   │   │       │   ├── ai-query.message.ts
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       ├── providers/
│   │   │   │   │       │   ├── ai-query.provider.spec.ts
│   │   │   │   │       │   ├── ai-query.provider.ts
│   │   │   │   │       │   └── auth/
│   │   │   │   │       │       ├── ai-query-auth.provider.ts
│   │   │   │   │       │       ├── local.ai-query-auth.provider.spec.ts
│   │   │   │   │       │       └── local.ai-query-auth.provider.ts
│   │   │   │   │       ├── repositories/
│   │   │   │   │       │   ├── ai-query.context.repository.ts
│   │   │   │   │       │   ├── ai-query.message.repository.ts
│   │   │   │   │       │   ├── in-memory.ai-query.context.repository.spec.ts
│   │   │   │   │       │   ├── in-memory.ai-query.context.repository.ts
│   │   │   │   │       │   ├── local.ai-query.message.repository.spec.ts
│   │   │   │   │       │   └── local.ai-query.message.repository.ts
│   │   │   │   │       └── utils/
│   │   │   │   │           ├── context.util.spec.ts
│   │   │   │   │           └── context.util.ts
│   │   │   │   ├── analytics/
│   │   │   │   │   ├── analytics.controller.ts
│   │   │   │   │   ├── analytics.module.ts
│   │   │   │   │   ├── analytics.service.spec.ts
│   │   │   │   │   ├── analytics.service.ts
│   │   │   │   │   ├── command.telemetry.base.service.spec.ts
│   │   │   │   │   ├── command.telemetry.base.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── analytics.dto.ts
│   │   │   │   │   ├── telemetry.base.service.spec.ts
│   │   │   │   │   └── telemetry.base.service.ts
│   │   │   │   ├── auth/
│   │   │   │   │   ├── auth.module.ts
│   │   │   │   │   ├── session-metadata/
│   │   │   │   │   │   ├── adapters/
│   │   │   │   │   │   │   ├── session-metadata.adapter.spec.ts
│   │   │   │   │   │   │   └── session-metadata.adapter.ts
│   │   │   │   │   │   └── decorators/
│   │   │   │   │   │       └── ws-session-metadata.decorator.ts
│   │   │   │   │   └── window-auth/
│   │   │   │   │       ├── adapters/
│   │   │   │   │       │   └── window-auth.adapter.ts
│   │   │   │   │       ├── constants/
│   │   │   │   │       │   └── exceptions.ts
│   │   │   │   │       ├── middleware/
│   │   │   │   │       │   └── window.auth.middleware.ts
│   │   │   │   │       ├── strategies/
│   │   │   │   │       │   └── abstract.window.auth.strategy.ts
│   │   │   │   │       ├── window-auth.module.ts
│   │   │   │   │       ├── window-auth.service.spec.ts
│   │   │   │   │       └── window-auth.service.ts
│   │   │   │   ├── azure/
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── azure-auth-callback.template.ts
│   │   │   │   │   │   ├── azure-auth.analytics.ts
│   │   │   │   │   │   ├── azure-auth.controller.ts
│   │   │   │   │   │   ├── azure-auth.service.spec.ts
│   │   │   │   │   │   ├── azure-auth.service.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── azure-auth-login.dto.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── models/
│   │   │   │   │   │       ├── azure-auth.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── autodiscovery/
│   │   │   │   │   │   ├── azure-autodiscovery.analytics.ts
│   │   │   │   │   │   ├── azure-autodiscovery.controller.ts
│   │   │   │   │   │   ├── azure-autodiscovery.service.spec.ts
│   │   │   │   │   │   ├── azure-autodiscovery.service.ts
│   │   │   │   │   │   └── dto/
│   │   │   │   │   │       ├── import-azure-database.dto.ts
│   │   │   │   │   │       ├── import-azure-database.response.ts
│   │   │   │   │   │       ├── import-azure-databases.dto.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── azure-token-refresh.manager.spec.ts
│   │   │   │   │   ├── azure-token-refresh.manager.ts
│   │   │   │   │   ├── azure.module.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── azure-entra-id-token-expired.exception.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── models/
│   │   │   │   │       ├── azure-resource.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── browser/
│   │   │   │   │   ├── __mocks__/
│   │   │   │   │   │   ├── hash.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── keys.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── set.ts
│   │   │   │   │   │   ├── streams.ts
│   │   │   │   │   │   └── z-set.ts
│   │   │   │   │   ├── browser-history/
│   │   │   │   │   │   ├── browser-history.controller.ts
│   │   │   │   │   │   ├── browser-history.module.ts
│   │   │   │   │   │   ├── browser-history.service.spec.ts
│   │   │   │   │   │   ├── browser-history.service.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create.browser-history.dto.ts
│   │   │   │   │   │   │   ├── delete.browser-history.dto.ts
│   │   │   │   │   │   │   ├── delete.browser-history.query.dto.ts
│   │   │   │   │   │   │   ├── delete.browser-history.response.dto.ts
│   │   │   │   │   │   │   ├── get.browser-history.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── list.browser-history.dto.ts
│   │   │   │   │   │   ├── entities/
│   │   │   │   │   │   │   └── browser-history.entity.ts
│   │   │   │   │   │   └── repositories/
│   │   │   │   │   │       ├── browser-history.repository.ts
│   │   │   │   │   │       ├── local.browser-history.repository.spec.ts
│   │   │   │   │   │       └── local.browser-history.repository.ts
│   │   │   │   │   ├── browser.base.controller.ts
│   │   │   │   │   ├── browser.module.ts
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── browser-tool-commands.ts
│   │   │   │   │   ├── decorators/
│   │   │   │   │   │   └── browser-client-metadata.decorator.ts
│   │   │   │   │   ├── hash/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── add.fields-to-hash.dto.ts
│   │   │   │   │   │   │   ├── create.hash-with-expire.dto.ts
│   │   │   │   │   │   │   ├── delete.fields-from-hash.dto.ts
│   │   │   │   │   │   │   ├── delete.fields-from-hash.response.ts
│   │   │   │   │   │   │   ├── get.hash-fields.dto.ts
│   │   │   │   │   │   │   ├── get.hash-fields.response.ts
│   │   │   │   │   │   │   ├── hash-field-ttl.dto.ts
│   │   │   │   │   │   │   ├── hash-field.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── update.hash-fields-ttl.dto.ts
│   │   │   │   │   │   ├── hash.controller.ts
│   │   │   │   │   │   ├── hash.module.ts
│   │   │   │   │   │   ├── hash.service.spec.ts
│   │   │   │   │   │   └── hash.service.ts
│   │   │   │   │   ├── keys/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── delete.keys.dto.ts
│   │   │   │   │   │   │   ├── delete.keys.response.ts
│   │   │   │   │   │   │   ├── get.keys-info.dto.ts
│   │   │   │   │   │   │   ├── get.keys-info.response.ts
│   │   │   │   │   │   │   ├── get.keys-with-details.response.ts
│   │   │   │   │   │   │   ├── get.keys.dto.ts
│   │   │   │   │   │   │   ├── get.namespace-searchable.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── key-with-expire.dto.ts
│   │   │   │   │   │   │   ├── key.dto.ts
│   │   │   │   │   │   │   ├── rename.key.dto.ts
│   │   │   │   │   │   │   ├── rename.key.response.ts
│   │   │   │   │   │   │   ├── scan-data-type.dto.ts
│   │   │   │   │   │   │   ├── update.key-ttl.dto.ts
│   │   │   │   │   │   │   └── update.key-ttl.response.ts
│   │   │   │   │   │   ├── key-info/
│   │   │   │   │   │   │   ├── key-info.provider.spec.ts
│   │   │   │   │   │   │   ├── key-info.provider.ts
│   │   │   │   │   │   │   └── strategies/
│   │   │   │   │   │   │       ├── graph.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── graph.key-info.strategy.ts
│   │   │   │   │   │   │       ├── hash.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── hash.key-info.strategy.ts
│   │   │   │   │   │   │       ├── key-info.strategy.ts
│   │   │   │   │   │   │       ├── list.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── list.key-info.strategy.ts
│   │   │   │   │   │   │       ├── rejson-rl.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── rejson-rl.key-info.strategy.ts
│   │   │   │   │   │   │       ├── set.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── set.key-info.strategy.ts
│   │   │   │   │   │   │       ├── stream.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── stream.key-info.strategy.ts
│   │   │   │   │   │   │       ├── string.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── string.key-info.strategy.ts
│   │   │   │   │   │   │       ├── ts.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── ts.key-info.strategy.ts
│   │   │   │   │   │   │       ├── unsupported.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── unsupported.key-info.strategy.ts
│   │   │   │   │   │   │       ├── z-set.key-info.strategy.spec.ts
│   │   │   │   │   │   │       └── z-set.key-info.strategy.ts
│   │   │   │   │   │   ├── keys.controller.ts
│   │   │   │   │   │   ├── keys.module.ts
│   │   │   │   │   │   ├── keys.service.spec.ts
│   │   │   │   │   │   ├── keys.service.ts
│   │   │   │   │   │   └── scanner/
│   │   │   │   │   │       ├── scanner.interface.ts
│   │   │   │   │   │       ├── scanner.spec.ts
│   │   │   │   │   │       ├── scanner.ts
│   │   │   │   │   │       └── strategies/
│   │   │   │   │   │           ├── cluster.scanner.strategy.spec.ts
│   │   │   │   │   │           ├── cluster.scanner.strategy.ts
│   │   │   │   │   │           ├── scanner.strategy.ts
│   │   │   │   │   │           ├── standalone.scanner.strategy.spec.ts
│   │   │   │   │   │           └── standalone.scanner.strategy.ts
│   │   │   │   │   ├── list/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create.list-with-expire.dto.ts
│   │   │   │   │   │   │   ├── delete.list-elements.dto.ts
│   │   │   │   │   │   │   ├── delete.list-elements.response.ts
│   │   │   │   │   │   │   ├── get.list-element.response.ts
│   │   │   │   │   │   │   ├── get.list-elements.dto.ts
│   │   │   │   │   │   │   ├── get.list-elements.response.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── push.element-to-list.dto.ts
│   │   │   │   │   │   │   ├── push.list-elements.response.ts
│   │   │   │   │   │   │   ├── set.list-element.dto.ts
│   │   │   │   │   │   │   └── set.list-element.response.ts
│   │   │   │   │   │   ├── list.controller.ts
│   │   │   │   │   │   ├── list.module.ts
│   │   │   │   │   │   ├── list.service.spec.ts
│   │   │   │   │   │   └── list.service.ts
│   │   │   │   │   ├── redisearch/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create.redisearch-index.dto.ts
│   │   │   │   │   │   │   ├── index.delete.dto.ts
│   │   │   │   │   │   │   ├── index.info.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── key-indexes.dto.ts
│   │   │   │   │   │   │   ├── list.redisearch-indexes.response.ts
│   │   │   │   │   │   │   └── search.redisearch.dto.ts
│   │   │   │   │   │   ├── key-indexes.service.spec.ts
│   │   │   │   │   │   ├── key-indexes.service.ts
│   │   │   │   │   │   ├── redisearch.controller.ts
│   │   │   │   │   │   ├── redisearch.module.ts
│   │   │   │   │   │   ├── redisearch.service.spec.ts
│   │   │   │   │   │   └── redisearch.service.ts
│   │   │   │   │   ├── rejson-rl/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create.rejson-rl-with-expire.dto.ts
│   │   │   │   │   │   │   ├── create.rejson-rl.dto.ts
│   │   │   │   │   │   │   ├── get.rejson-rl.dto.ts
│   │   │   │   │   │   │   ├── get.rejson-rl.response.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── modify.rejson-rl-arr-append.dto.ts
│   │   │   │   │   │   │   ├── modify.rejson-rl-set.dto.ts
│   │   │   │   │   │   │   ├── remove.rejson-rl.dto.ts
│   │   │   │   │   │   │   ├── remove.rejson-rl.response.ts
│   │   │   │   │   │   │   └── safe.rejson-rl-data.dto.ts
│   │   │   │   │   │   ├── rejson-rl.controller.ts
│   │   │   │   │   │   ├── rejson-rl.module.ts
│   │   │   │   │   │   ├── rejson-rl.service.spec.ts
│   │   │   │   │   │   └── rejson-rl.service.ts
│   │   │   │   │   ├── set/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── add.members-to-set.dto.ts
│   │   │   │   │   │   │   ├── create.set-with-expire.dto.ts
│   │   │   │   │   │   │   ├── delete.members-from-set.dto.ts
│   │   │   │   │   │   │   ├── delete.members-from-set.response.ts
│   │   │   │   │   │   │   ├── get.set-members.dto.ts
│   │   │   │   │   │   │   ├── get.set-members.response.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── set.controller.ts
│   │   │   │   │   │   ├── set.module.ts
│   │   │   │   │   │   ├── set.service.spec.ts
│   │   │   │   │   │   └── set.service.ts
│   │   │   │   │   ├── stream/
│   │   │   │   │   │   ├── controllers/
│   │   │   │   │   │   │   ├── consumer-group.controller.ts
│   │   │   │   │   │   │   ├── consumer.controller.ts
│   │   │   │   │   │   │   └── stream.controller.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── ack.pending-entries.dto.ts
│   │   │   │   │   │   │   ├── ack.pending-entries.response.ts
│   │   │   │   │   │   │   ├── add.stream-entries.dto.ts
│   │   │   │   │   │   │   ├── add.stream-entries.response.ts
│   │   │   │   │   │   │   ├── claim.pending-entries.response.ts
│   │   │   │   │   │   │   ├── claim.pending-entry.dto.ts
│   │   │   │   │   │   │   ├── create.consumer-groups.dto.ts
│   │   │   │   │   │   │   ├── create.stream.dto.ts
│   │   │   │   │   │   │   ├── delete.consumer-groups.dto.ts
│   │   │   │   │   │   │   ├── delete.consumer-groups.response.ts
│   │   │   │   │   │   │   ├── delete.consumers.dto.ts
│   │   │   │   │   │   │   ├── delete.stream-entries.dto.ts
│   │   │   │   │   │   │   ├── delete.stream-entries.response.ts
│   │   │   │   │   │   │   ├── get.consumers.dto.ts
│   │   │   │   │   │   │   ├── get.pending-entries.dto.ts
│   │   │   │   │   │   │   ├── get.stream-entries.dto.ts
│   │   │   │   │   │   │   ├── get.stream-entries.response.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── stream-entry.dto.ts
│   │   │   │   │   │   │   └── update.consumer-group.dto.ts
│   │   │   │   │   │   ├── services/
│   │   │   │   │   │   │   ├── consumer-group.service.spec.ts
│   │   │   │   │   │   │   ├── consumer-group.service.ts
│   │   │   │   │   │   │   ├── consumer.service.spec.ts
│   │   │   │   │   │   │   ├── consumer.service.ts
│   │   │   │   │   │   │   ├── stream.service.spec.ts
│   │   │   │   │   │   │   └── stream.service.ts
│   │   │   │   │   │   └── stream.module.ts
│   │   │   │   │   ├── string/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── get.string-info.dto.ts
│   │   │   │   │   │   │   ├── get.string-value.response.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── set.string-with-expire.dto.ts
│   │   │   │   │   │   │   └── set.string.dto.ts
│   │   │   │   │   │   ├── string.controller.ts
│   │   │   │   │   │   ├── string.module.ts
│   │   │   │   │   │   ├── string.service.spec.ts
│   │   │   │   │   │   └── string.service.ts
│   │   │   │   │   ├── utils/
│   │   │   │   │   │   ├── checkKeyExistsing.spec.ts
│   │   │   │   │   │   ├── checkKeyExistsing.ts
│   │   │   │   │   │   ├── clusterCursor.spec.ts
│   │   │   │   │   │   ├── clusterCursor.ts
│   │   │   │   │   │   ├── getShards.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── redisIndexInfo.ts
│   │   │   │   │   └── z-set/
│   │   │   │   │       ├── dto/
│   │   │   │   │       │   ├── add.members-to-z-set.dto.ts
│   │   │   │   │       │   ├── create.z-set-with-expire.dto.ts
│   │   │   │   │       │   ├── delete.members-from-z-set.dto.ts
│   │   │   │   │       │   ├── delete.members-from-z-set.response.ts
│   │   │   │   │       │   ├── get.z-set-members.dto.ts
│   │   │   │   │       │   ├── get.z-set.response.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── search.z-set-members.dto.ts
│   │   │   │   │       │   ├── search.z-set-members.response.ts
│   │   │   │   │       │   ├── search.z-set.response.ts
│   │   │   │   │       │   ├── update.member-in-z-set.dto.ts
│   │   │   │   │       │   └── z-set-member.dto.ts
│   │   │   │   │       ├── z-set.controller.ts
│   │   │   │   │       ├── z-set.module.ts
│   │   │   │   │       ├── z-set.service.spec.ts
│   │   │   │   │       └── z-set.service.ts
│   │   │   │   ├── bulk-actions/
│   │   │   │   │   ├── bulk-actions.analytics.spec.ts
│   │   │   │   │   ├── bulk-actions.analytics.ts
│   │   │   │   │   ├── bulk-actions.controller.ts
│   │   │   │   │   ├── bulk-actions.gateway.ts
│   │   │   │   │   ├── bulk-actions.module.ts
│   │   │   │   │   ├── bulk-actions.service.spec.ts
│   │   │   │   │   ├── bulk-actions.service.ts
│   │   │   │   │   ├── bulk-import.controller.ts
│   │   │   │   │   ├── bulk-import.service.spec.ts
│   │   │   │   │   ├── bulk-import.service.ts
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── bulk-action-id.dto.ts
│   │   │   │   │   │   ├── create-bulk-action.dto.ts
│   │   │   │   │   │   └── upload-import-file-by-path.dto.ts
│   │   │   │   │   ├── interfaces/
│   │   │   │   │   │   ├── bulk-action-filter-overview.interface.ts
│   │   │   │   │   │   ├── bulk-action-overview.interface.ts
│   │   │   │   │   │   ├── bulk-action-progress-overview.interface.ts
│   │   │   │   │   │   ├── bulk-action-summary-overview.interface.ts
│   │   │   │   │   │   ├── bulk-action.interface.ts
│   │   │   │   │   │   ├── bulk-action.runner.interface.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── bulk-action-filter.spec.ts
│   │   │   │   │   │   ├── bulk-action-filter.ts
│   │   │   │   │   │   ├── bulk-action-progress.spec.ts
│   │   │   │   │   │   ├── bulk-action-progress.ts
│   │   │   │   │   │   ├── bulk-action-summary.spec.ts
│   │   │   │   │   │   ├── bulk-action-summary.ts
│   │   │   │   │   │   ├── bulk-action.spec.ts
│   │   │   │   │   │   ├── bulk-action.ts
│   │   │   │   │   │   └── runners/
│   │   │   │   │   │       ├── abstract.bulk-action.runner.spec.ts
│   │   │   │   │   │       ├── abstract.bulk-action.runner.ts
│   │   │   │   │   │       └── simple/
│   │   │   │   │   │           ├── abstract.bulk-action.simple.runner.spec.ts
│   │   │   │   │   │           ├── abstract.bulk-action.simple.runner.ts
│   │   │   │   │   │           ├── delete.bulk-action.simple.runner.spec.ts
│   │   │   │   │   │           ├── delete.bulk-action.simple.runner.ts
│   │   │   │   │   │           ├── unlink.bulk-action.simple.runner.spec.ts
│   │   │   │   │   │           └── unlink.bulk-action.simple.runner.ts
│   │   │   │   │   └── providers/
│   │   │   │   │       ├── bulk-actions.provider.spec.ts
│   │   │   │   │       └── bulk-actions.provider.ts
│   │   │   │   ├── certificate/
│   │   │   │   │   ├── ca-certificate.controller.ts
│   │   │   │   │   ├── ca-certificate.service.spec.ts
│   │   │   │   │   ├── ca-certificate.service.ts
│   │   │   │   │   ├── certificate.module.ts
│   │   │   │   │   ├── client-certificate.controller.ts
│   │   │   │   │   ├── client-certificate.service.spec.ts
│   │   │   │   │   ├── client-certificate.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.ca-certificate.dto.ts
│   │   │   │   │   │   ├── create.client-certificate.dto.ts
│   │   │   │   │   │   ├── use.ca-certificate.dto.ts
│   │   │   │   │   │   └── use.client-certificate.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   ├── ca-certificate.entity.ts
│   │   │   │   │   │   └── client-certificate.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── ca-certificate.ts
│   │   │   │   │   │   └── client-certificate.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── ca-certificate.repository.ts
│   │   │   │   │   │   ├── client-certificate.repository.ts
│   │   │   │   │   │   ├── local.ca-certificate.repository.spec.ts
│   │   │   │   │   │   ├── local.ca-certificate.repository.ts
│   │   │   │   │   │   ├── local.client-certificate.repository.spec.ts
│   │   │   │   │   │   └── local.client-certificate.repository.ts
│   │   │   │   │   └── transformers/
│   │   │   │   │       ├── ca-cert.transformer.spec.ts
│   │   │   │   │       ├── ca-cert.transformer.ts
│   │   │   │   │       ├── client-cert.transformer.spec.ts
│   │   │   │   │       └── client-cert.transformer.ts
│   │   │   │   ├── cli/
│   │   │   │   │   ├── cli.module.ts
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── errors.ts
│   │   │   │   │   ├── controllers/
│   │   │   │   │   │   └── cli.controller.ts
│   │   │   │   │   ├── decorators/
│   │   │   │   │   │   ├── api-cli-params.decorator.ts
│   │   │   │   │   │   └── cli-client-metadata.decorator.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── cli.dto.ts
│   │   │   │   │   ├── services/
│   │   │   │   │   │   ├── cli-analytics/
│   │   │   │   │   │   │   ├── cli-analytics.service.spec.ts
│   │   │   │   │   │   │   └── cli-analytics.service.ts
│   │   │   │   │   │   └── cli-business/
│   │   │   │   │   │       ├── cli-business.service.spec.ts
│   │   │   │   │   │       ├── cli-business.service.ts
│   │   │   │   │   │       └── output-formatter/
│   │   │   │   │   │           ├── output-formatter-manager.spec.ts
│   │   │   │   │   │           ├── output-formatter-manager.ts
│   │   │   │   │   │           ├── output-formatter.interface.ts
│   │   │   │   │   │           └── strategies/
│   │   │   │   │   │               ├── raw-formatter.strategy.spec.ts
│   │   │   │   │   │               ├── raw-formatter.strategy.ts
│   │   │   │   │   │               ├── text-formatter.strategy.spec.ts
│   │   │   │   │   │               ├── text-formatter.strategy.ts
│   │   │   │   │   │               └── utf-8-formatter.strategy.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── getUnsupportedCommands.spec.ts
│   │   │   │   │       └── getUnsupportedCommands.ts
│   │   │   │   ├── cloud/
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── auth-strategy/
│   │   │   │   │   │   │   ├── cloud-auth.strategy.spec.ts
│   │   │   │   │   │   │   ├── cloud-auth.strategy.ts
│   │   │   │   │   │   │   ├── github-idp.cloud.auth-strategy.ts
│   │   │   │   │   │   │   ├── google-idp.cloud.auth-strategy.ts
│   │   │   │   │   │   │   ├── sso-idp.cloud.auth-strategy.spec.ts
│   │   │   │   │   │   │   ├── sso-idp.cloud.auth-strategy.ts
│   │   │   │   │   │   │   └── tcp-cloud.auth.strategy.ts
│   │   │   │   │   │   ├── cloud-auth.analytics.spec.ts
│   │   │   │   │   │   ├── cloud-auth.analytics.ts
│   │   │   │   │   │   ├── cloud-auth.controller.ts
│   │   │   │   │   │   ├── cloud-auth.module.ts
│   │   │   │   │   │   ├── cloud-auth.service.spec.ts
│   │   │   │   │   │   ├── cloud-auth.service.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── cloud-oauth.canceled.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.github-email-permission.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.misconfiguration.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.missed-required-data.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.sso-unsupported-email.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.unexpected-error.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.unknown-authorization-request.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── models/
│   │   │   │   │   │       ├── cloud-auth-request-info.ts
│   │   │   │   │   │       ├── cloud-auth-request.ts
│   │   │   │   │   │       ├── cloud-auth-response.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── autodiscovery/
│   │   │   │   │   │   ├── cloud-autodicovery.analytics.spec.ts
│   │   │   │   │   │   ├── cloud-autodiscovery.analytics.ts
│   │   │   │   │   │   ├── cloud-autodiscovery.service.spec.ts
│   │   │   │   │   │   ├── cloud-autodiscovery.service.ts
│   │   │   │   │   │   ├── cloud.autodiscovery.controller.ts
│   │   │   │   │   │   ├── cloud.autodiscovery.module.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── discover-cloud-databases.dto.ts
│   │   │   │   │   │   │   ├── import-cloud-database.dto.ts
│   │   │   │   │   │   │   ├── import-cloud-database.response.ts
│   │   │   │   │   │   │   ├── import-cloud-databases.dto.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── me.cloud-autodiscovery.service.spec.ts
│   │   │   │   │   │   ├── me.cloud-autodiscovery.service.ts
│   │   │   │   │   │   ├── me.cloud.autodiscovery.controller.ts
│   │   │   │   │   │   └── models/
│   │   │   │   │   │       ├── cloud-autodiscovery-auth-type.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── capi-key/
│   │   │   │   │   │   ├── cloud-capi-key.analytics.spec.ts
│   │   │   │   │   │   ├── cloud-capi-key.analytics.ts
│   │   │   │   │   │   ├── cloud-capi-key.api.provider.spec.ts
│   │   │   │   │   │   ├── cloud-capi-key.api.provider.ts
│   │   │   │   │   │   ├── cloud-capi-key.controller.ts
│   │   │   │   │   │   ├── cloud-capi-key.module.ts
│   │   │   │   │   │   ├── cloud-capi-key.service.spec.ts
│   │   │   │   │   │   ├── cloud-capi-key.service.ts
│   │   │   │   │   │   ├── entity/
│   │   │   │   │   │   │   └── cloud-capi-key.entity.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── cloud-capi-key.not-found.exception.ts
│   │   │   │   │   │   │   ├── cloud-capi-key.unauthorized.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── model/
│   │   │   │   │   │   │   ├── api.interface.ts
│   │   │   │   │   │   │   ├── cloud-capi-key.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── repository/
│   │   │   │   │   │       ├── cloud-capi-key.repository.ts
│   │   │   │   │   │       ├── local.cloud-capi-key.repository.spec.ts
│   │   │   │   │   │       └── local.cloud-capi-key.repository.ts
│   │   │   │   │   ├── cloud-sso.feature.flag.ts
│   │   │   │   │   ├── cloud.module.ts
│   │   │   │   │   ├── common/
│   │   │   │   │   │   ├── constants/
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── decorators/
│   │   │   │   │   │   │   └── cloud-auth.decorator.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── cloud.capi.auth.dto.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── cloud-api.bad-request.exception.ts
│   │   │   │   │   │   │   ├── cloud-api.error.handler.ts
│   │   │   │   │   │   │   ├── cloud-api.forbidden.exception.ts
│   │   │   │   │   │   │   ├── cloud-api.internal-server-error.exception.ts
│   │   │   │   │   │   │   ├── cloud-api.not-found.exception.ts
│   │   │   │   │   │   │   ├── cloud-api.unauthorized.exception.ts
│   │   │   │   │   │   │   ├── cloud-capi.error.handler.ts
│   │   │   │   │   │   │   ├── cloud-capi.unauthorized.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── api.interface.ts
│   │   │   │   │   │   │   ├── capi.interface.ts
│   │   │   │   │   │   │   ├── cloud-request-utm.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── providers/
│   │   │   │   │   │       ├── cloud.api.provider.spec.ts
│   │   │   │   │   │       ├── cloud.api.provider.ts
│   │   │   │   │   │       ├── cloud.capi.provider.spec.ts
│   │   │   │   │   │       └── cloud.capi.provider.ts
│   │   │   │   │   ├── database/
│   │   │   │   │   │   ├── cloud-database.analytics.spec.ts
│   │   │   │   │   │   ├── cloud-database.analytics.ts
│   │   │   │   │   │   ├── cloud-database.capi.provider.spec.ts
│   │   │   │   │   │   ├── cloud-database.capi.provider.ts
│   │   │   │   │   │   ├── cloud-database.capi.service.spec.ts
│   │   │   │   │   │   ├── cloud-database.capi.service.ts
│   │   │   │   │   │   ├── cloud-database.module.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create-free-cloud-database.dto.ts
│   │   │   │   │   │   │   ├── get-cloud-subscription-database.dto.ts
│   │   │   │   │   │   │   ├── get-cloud-subscription-databases.dto.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── entities/
│   │   │   │   │   │   │   └── cloud-database-details.entity.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── capi.interface.ts
│   │   │   │   │   │   │   ├── cloud-database-details.ts
│   │   │   │   │   │   │   ├── cloud-database.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── utils/
│   │   │   │   │   │       ├── cloud-data-converter.spec.ts
│   │   │   │   │   │       ├── cloud-data-converter.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── job/
│   │   │   │   │   │   ├── cloud-job.controller.ts
│   │   │   │   │   │   ├── cloud-job.factory.ts
│   │   │   │   │   │   ├── cloud-job.gateway.ts
│   │   │   │   │   │   ├── cloud-job.module.ts
│   │   │   │   │   │   ├── cloud-job.provider.ts
│   │   │   │   │   │   ├── cloud-job.service.spec.ts
│   │   │   │   │   │   ├── cloud-job.service.ts
│   │   │   │   │   │   ├── constants/
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create-database.cloud-job.data.dto.ts
│   │   │   │   │   │   │   ├── create-subscription-and-database.cloud-job.data.dto.ts
│   │   │   │   │   │   │   ├── create.cloud-job.dto.ts
│   │   │   │   │   │   │   ├── import-database.cloud-job.data.dto.ts
│   │   │   │   │   │   │   └── monitor.cloud-job.dto.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── cloud-database-already-exists-free.exception.ts
│   │   │   │   │   │   │   ├── cloud-database-endpoint-invalid.exception.ts
│   │   │   │   │   │   │   ├── cloud-database-import-forbidden.exception.ts
│   │   │   │   │   │   │   ├── cloud-database-in-failed-state.exception.ts
│   │   │   │   │   │   │   ├── cloud-database-in-unexpected-state.exception.ts
│   │   │   │   │   │   │   ├── cloud-job-aborted.exception.ts
│   │   │   │   │   │   │   ├── cloud-job-not-found.exception.ts
│   │   │   │   │   │   │   ├── cloud-job-unexpected-error.exception.ts
│   │   │   │   │   │   │   ├── cloud-job-unsupported.exception.ts
│   │   │   │   │   │   │   ├── cloud-job.error.handler.ts
│   │   │   │   │   │   │   ├── cloud-plan-not-found-free.exception.ts
│   │   │   │   │   │   │   ├── cloud-subscription-already-exists-free.exception.ts
│   │   │   │   │   │   │   ├── cloud-subscription-in-failed-state.exception.ts
│   │   │   │   │   │   │   ├── cloud-subscription-in-unexpected-state.exception.ts
│   │   │   │   │   │   │   ├── cloud-subscription-unable-to-determine.exception.ts
│   │   │   │   │   │   │   ├── cloud-task-no-resource-id.exception.ts
│   │   │   │   │   │   │   ├── cloud-task-not-found.exception.ts
│   │   │   │   │   │   │   ├── cloud-task-processing-error.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── jobs/
│   │   │   │   │   │   │   ├── cloud-job.spec.ts
│   │   │   │   │   │   │   ├── cloud-job.ts
│   │   │   │   │   │   │   ├── create-free-database.cloud-job.ts
│   │   │   │   │   │   │   ├── create-free-subscription-and-database.cloud-job.ts
│   │   │   │   │   │   │   ├── create-free-subscription.cloud-job.ts
│   │   │   │   │   │   │   ├── import-free-database.cloud-job.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── wait-for-active-database.cloud-job.ts
│   │   │   │   │   │   │   ├── wait-for-active-subscription.cloud-job.ts
│   │   │   │   │   │   │   └── wait-for-task.cloud-job.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── cloud-job-info.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── transformers/
│   │   │   │   │   │       ├── cloud-job-data.transformer.spec.ts
│   │   │   │   │   │       └── cloud-job-data.transformer.ts
│   │   │   │   │   ├── session/
│   │   │   │   │   │   ├── cloud-session.module.ts
│   │   │   │   │   │   ├── cloud-session.service.spec.ts
│   │   │   │   │   │   ├── cloud-session.service.ts
│   │   │   │   │   │   ├── entities/
│   │   │   │   │   │   │   └── cloud.session.entity.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   └── cloud-session.ts
│   │   │   │   │   │   └── repositories/
│   │   │   │   │   │       ├── cloud.session.repository.ts
│   │   │   │   │   │       ├── local.cloud.session.repository.spec.ts
│   │   │   │   │   │       └── local.cloud.session.repository.ts
│   │   │   │   │   ├── subscription/
│   │   │   │   │   │   ├── cloud-subscription.api.service.spec.ts
│   │   │   │   │   │   ├── cloud-subscription.api.service.ts
│   │   │   │   │   │   ├── cloud-subscription.capi.service.spec.ts
│   │   │   │   │   │   ├── cloud-subscription.capi.service.ts
│   │   │   │   │   │   ├── cloud-subscription.controller.ts
│   │   │   │   │   │   ├── cloud-subscription.module.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create-free-cloud-subscription.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── plans.cloud-subscription.dto.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── api.interface.ts
│   │   │   │   │   │   │   ├── capi.interface.ts
│   │   │   │   │   │   │   ├── cloud-subscription-plan.ts
│   │   │   │   │   │   │   ├── cloud-subscription-region.ts
│   │   │   │   │   │   │   ├── cloud-subscription.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── providers/
│   │   │   │   │   │   │   ├── cloud-subscription.api.provider.spec.ts
│   │   │   │   │   │   │   ├── cloud-subscription.api.provider.ts
│   │   │   │   │   │   │   ├── cloud-subscription.capi.provider.spec.ts
│   │   │   │   │   │   │   └── cloud-subscription.capi.provider.ts
│   │   │   │   │   │   └── utils/
│   │   │   │   │   │       ├── cloud-data-converter.spec.ts
│   │   │   │   │   │       ├── cloud-data-converter.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── task/
│   │   │   │   │   │   ├── cloud-task.capi.service.spec.ts
│   │   │   │   │   │   ├── cloud-task.capi.service.ts
│   │   │   │   │   │   ├── cloud-task.module.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── capi.interface.ts
│   │   │   │   │   │   │   ├── cloud-task.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── providers/
│   │   │   │   │   │   │   ├── cloud-task.capi.provider.spec.ts
│   │   │   │   │   │   │   └── cloud-task.capi.provider.ts
│   │   │   │   │   │   └── utils/
│   │   │   │   │   │       ├── cloud-data-converter.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   └── user/
│   │   │   │   │       ├── cloud-user.api.service.spec.ts
│   │   │   │   │       ├── cloud-user.api.service.ts
│   │   │   │   │       ├── cloud-user.capi.service.spec.ts
│   │   │   │   │       ├── cloud-user.capi.service.ts
│   │   │   │   │       ├── cloud-user.controller.ts
│   │   │   │   │       ├── cloud-user.module.ts
│   │   │   │   │       ├── models/
│   │   │   │   │       │   ├── api.interface.ts
│   │   │   │   │       │   ├── capi.interface.ts
│   │   │   │   │       │   ├── cloud-account-info.ts
│   │   │   │   │       │   ├── cloud-user-account.ts
│   │   │   │   │       │   ├── cloud-user.ts
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       ├── providers/
│   │   │   │   │       │   ├── cloud-user.api.provider.spec.ts
│   │   │   │   │       │   ├── cloud-user.api.provider.ts
│   │   │   │   │       │   ├── cloud-user.capi.provider.spec.ts
│   │   │   │   │       │   └── cloud-user.capi.provider.ts
│   │   │   │   │       ├── repositories/
│   │   │   │   │       │   ├── cloud-user.repository.ts
│   │   │   │   │       │   ├── in-session.cloud-user.repository.spec.ts
│   │   │   │   │       │   └── in-session.cloud-user.repository.ts
│   │   │   │   │       └── utils/
│   │   │   │   │           ├── cloud-data-converter.ts
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── token.spec.ts
│   │   │   │   │           └── token.ts
│   │   │   │   ├── cluster-monitor/
│   │   │   │   │   ├── cluster-monitor.controller.ts
│   │   │   │   │   ├── cluster-monitor.module.ts
│   │   │   │   │   ├── cluster-monitor.service.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── cluster-details.ts
│   │   │   │   │   │   ├── cluster-node-details.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── strategies/
│   │   │   │   │       ├── abstract.info.strategy.spec.ts
│   │   │   │   │       ├── abstract.info.strategy.ts
│   │   │   │   │       ├── cluster-nodes.info.strategy.spec.ts
│   │   │   │   │       ├── cluster-nodes.info.strategy.ts
│   │   │   │   │       ├── cluster-shards.info.strategy.spec.ts
│   │   │   │   │       ├── cluster-shards.info.strategy.ts
│   │   │   │   │       └── cluster.info.interface.ts
│   │   │   │   ├── commands/
│   │   │   │   │   ├── commands-json.provider.spec.ts
│   │   │   │   │   ├── commands-json.provider.ts
│   │   │   │   │   ├── commands.controller.ts
│   │   │   │   │   ├── commands.module.ts
│   │   │   │   │   ├── commands.service.spec.ts
│   │   │   │   │   └── commands.service.ts
│   │   │   │   ├── constants/
│   │   │   │   │   ├── constants.module.ts
│   │   │   │   │   └── providers/
│   │   │   │   │       ├── constants.provider.ts
│   │   │   │   │       └── local.constants.provider.ts
│   │   │   │   ├── custom-tutorial/
│   │   │   │   │   ├── custom-tutorial.analytics.spec.ts
│   │   │   │   │   ├── custom-tutorial.analytics.ts
│   │   │   │   │   ├── custom-tutorial.controller.ts
│   │   │   │   │   ├── custom-tutorial.module.ts
│   │   │   │   │   ├── custom-tutorial.service.spec.ts
│   │   │   │   │   ├── custom-tutorial.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── upload.custom-tutorial.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── custom-tutorial.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── custom-tutorial.manifest.ts
│   │   │   │   │   │   └── custom-tutorial.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── custom-tutorial.fs.provider.spec.ts
│   │   │   │   │   │   ├── custom-tutorial.fs.provider.ts
│   │   │   │   │   │   ├── custom-tutorial.manifest.provider.spec.ts
│   │   │   │   │   │   └── custom-tutorial.manifest.provider.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── custom-tutorial.repository.ts
│   │   │   │   │       ├── local.custom-tutorial.repository.spec.ts
│   │   │   │   │       └── local.custom-tutorial.repository.ts
│   │   │   │   ├── database/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   ├── events.ts
│   │   │   │   │   │   └── overview.ts
│   │   │   │   │   ├── credentials/
│   │   │   │   │   │   ├── credential-strategy.provider.ts
│   │   │   │   │   │   ├── credentials.module.ts
│   │   │   │   │   │   ├── local.credential-strategy.provider.spec.ts
│   │   │   │   │   │   ├── local.credential-strategy.provider.ts
│   │   │   │   │   │   └── strategies/
│   │   │   │   │   │       ├── azure-entra-id.credential-strategy.spec.ts
│   │   │   │   │   │       ├── azure-entra-id.credential-strategy.ts
│   │   │   │   │   │       ├── default.credential-strategy.spec.ts
│   │   │   │   │   │       └── default.credential-strategy.ts
│   │   │   │   │   ├── database-connection.service.spec.ts
│   │   │   │   │   ├── database-connection.service.ts
│   │   │   │   │   ├── database-info.controller.ts
│   │   │   │   │   ├── database-info.service.spec.ts
│   │   │   │   │   ├── database-info.service.ts
│   │   │   │   │   ├── database.analytics.spec.ts
│   │   │   │   │   ├── database.analytics.ts
│   │   │   │   │   ├── database.controller.spec.ts
│   │   │   │   │   ├── database.controller.ts
│   │   │   │   │   ├── database.module.ts
│   │   │   │   │   ├── database.service.spec.ts
│   │   │   │   │   ├── database.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.database.dto.ts
│   │   │   │   │   │   ├── database.response.ts
│   │   │   │   │   │   ├── delete.databases.dto.ts
│   │   │   │   │   │   ├── delete.databases.response.ts
│   │   │   │   │   │   ├── export.databases.dto.ts
│   │   │   │   │   │   ├── redis-info.dto.ts
│   │   │   │   │   │   └── update.database.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── database.entity.ts
│   │   │   │   │   ├── exeptions/
│   │   │   │   │   │   ├── database-already-exists.exception.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── middleware/
│   │   │   │   │   │   └── connection.middleware.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── additional.redis.module.ts
│   │   │   │   │   │   ├── database-overview.ts
│   │   │   │   │   │   ├── database.ts
│   │   │   │   │   │   ├── export-database.ts
│   │   │   │   │   │   └── provider-details.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── database-info.provider.spec.ts
│   │   │   │   │   │   ├── database-info.provider.ts
│   │   │   │   │   │   ├── database-overview.provider.spec.ts
│   │   │   │   │   │   ├── database-overview.provider.ts
│   │   │   │   │   │   ├── database.client.factory.spec.ts
│   │   │   │   │   │   ├── database.client.factory.ts
│   │   │   │   │   │   ├── database.factory.spec.ts
│   │   │   │   │   │   └── database.factory.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── database.repository.ts
│   │   │   │   │       ├── local.database.repository.spec.ts
│   │   │   │   │       ├── local.database.repository.ts
│   │   │   │   │       ├── stack.database.repository.spec.ts
│   │   │   │   │       └── stack.databases.repository.ts
│   │   │   │   ├── database-analysis/
│   │   │   │   │   ├── database-analysis.controller.ts
│   │   │   │   │   ├── database-analysis.module.ts
│   │   │   │   │   ├── database-analysis.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create-database-analysis.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── recommendation-vote.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── database-analysis.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── analysis-progress.ts
│   │   │   │   │   │   ├── database-analysis.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── key.ts
│   │   │   │   │   │   ├── nsp-summary.ts
│   │   │   │   │   │   ├── nsp-type-summary.ts
│   │   │   │   │   │   ├── recommendation.ts
│   │   │   │   │   │   ├── scan-filter.ts
│   │   │   │   │   │   ├── short-database-analysis.ts
│   │   │   │   │   │   ├── simple-summary.ts
│   │   │   │   │   │   ├── simple-type-summary.ts
│   │   │   │   │   │   └── sum-group.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── database-analysis.provider.spec.ts
│   │   │   │   │   │   ├── database-analysis.provider.ts
│   │   │   │   │   │   ├── database-analyzer.spec.ts
│   │   │   │   │   │   └── database-analyzer.ts
│   │   │   │   │   └── scanner/
│   │   │   │   │       ├── key-info/
│   │   │   │   │       │   ├── key-info.provider.spec.ts
│   │   │   │   │       │   ├── key-info.provider.ts
│   │   │   │   │       │   ├── key-info.strategy.interface.ts
│   │   │   │   │       │   └── strategies/
│   │   │   │   │       │       ├── abstract.info.strategy.spec.ts
│   │   │   │   │       │       ├── abstract.info.strategy.ts
│   │   │   │   │       │       ├── default-info.strategy.spec.ts
│   │   │   │   │       │       ├── default-info.strategy.ts
│   │   │   │   │       │       ├── graph-info.strategy.spec.ts
│   │   │   │   │       │       ├── graph-info.strategy.ts
│   │   │   │   │       │       ├── hash-info.strategy.spec.ts
│   │   │   │   │       │       ├── hash-info.strategy.ts
│   │   │   │   │       │       ├── index.ts
│   │   │   │   │       │       ├── json-info.strategy.spec.ts
│   │   │   │   │       │       ├── json-info.strategy.ts
│   │   │   │   │       │       ├── list-info.strategy.spec.ts
│   │   │   │   │       │       ├── list-info.strategy.ts
│   │   │   │   │       │       ├── set-info.strategy.spec.ts
│   │   │   │   │       │       ├── set-info.strategy.ts
│   │   │   │   │       │       ├── stream-info.strategy.spec.ts
│   │   │   │   │       │       ├── stream-info.strategy.ts
│   │   │   │   │       │       ├── string-info.strategy.spec.ts
│   │   │   │   │       │       ├── string-info.strategy.ts
│   │   │   │   │       │       ├── ts-info.strategy.spec.ts
│   │   │   │   │       │       ├── ts-info.strategy.ts
│   │   │   │   │       │       ├── z-set-info.strategy.spec.ts
│   │   │   │   │       │       └── z-set-info.strategy.ts
│   │   │   │   │       ├── keys-scanner.spec.ts
│   │   │   │   │       └── keys-scanner.ts
│   │   │   │   ├── database-discovery/
│   │   │   │   │   ├── auto.database-discovery.service.spec.ts
│   │   │   │   │   ├── auto.database-discovery.service.ts
│   │   │   │   │   ├── database-discovery.module.ts
│   │   │   │   │   ├── database-discovery.service.ts
│   │   │   │   │   ├── local.database-discovery.service.spec.ts
│   │   │   │   │   ├── local.database-discovery.service.ts
│   │   │   │   │   ├── pre-setup.database-discovery.service.spec.ts
│   │   │   │   │   ├── pre-setup.database-discovery.service.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── autodiscovery.util.spec.ts
│   │   │   │   │       ├── autodiscovery.util.ts
│   │   │   │   │       ├── pre-setup.discovery.util.spec.ts
│   │   │   │   │       └── pre-setup.discovery.util.ts
│   │   │   │   ├── database-import/
│   │   │   │   │   ├── certificate-import.service.spec.ts
│   │   │   │   │   ├── certificate-import.service.ts
│   │   │   │   │   ├── database-import.analytics.spec.ts
│   │   │   │   │   ├── database-import.analytics.ts
│   │   │   │   │   ├── database-import.controller.spec.ts
│   │   │   │   │   ├── database-import.controller.ts
│   │   │   │   │   ├── database-import.module.ts
│   │   │   │   │   ├── database-import.service.spec.ts
│   │   │   │   │   ├── database-import.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── database-import.response.ts
│   │   │   │   │   │   └── import.database.dto.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── invalid-ca-certificate-body.exception.ts
│   │   │   │   │   │   ├── invalid-certificate-name.exception.ts
│   │   │   │   │   │   ├── invalid-client-certificate-body.exception.ts
│   │   │   │   │   │   ├── invalid-client-private-key.exception.ts
│   │   │   │   │   │   ├── invalid-compressor.exception.ts
│   │   │   │   │   │   ├── invalid-ssh-body.exception.ts
│   │   │   │   │   │   ├── invalid-ssh-private-key-body.exception.ts
│   │   │   │   │   │   ├── no-database-import-file-provided.exception.ts
│   │   │   │   │   │   ├── size-limit-exceeded-database-import-file.exception.ts
│   │   │   │   │   │   ├── ssh-agents-are-not-supported.exception.ts
│   │   │   │   │   │   └── unable-to-parse-database-import-file.exception.ts
│   │   │   │   │   ├── ssh-import.service.spec.ts
│   │   │   │   │   └── ssh-import.service.ts
│   │   │   │   ├── database-recommendation/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── database-recommendation.analytics.spec.ts
│   │   │   │   │   ├── database-recommendation.analytics.ts
│   │   │   │   │   ├── database-recommendation.controller.ts
│   │   │   │   │   ├── database-recommendation.gateway.ts
│   │   │   │   │   ├── database-recommendation.module.ts
│   │   │   │   │   ├── database-recommendation.service.spec.ts
│   │   │   │   │   ├── database-recommendation.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.database-recommendation.dto.ts
│   │   │   │   │   │   ├── database-recommendations.response.ts
│   │   │   │   │   │   ├── delete.database-recommendation.dto.ts
│   │   │   │   │   │   ├── delete.database-recommendation.response.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── modify.database-recommendation.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── database-recommendation.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── database-recommendation-params.ts
│   │   │   │   │   │   ├── database-recommendation.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── integersInSet.ts
│   │   │   │   │   │   └── searchJSON.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── database-recommendation.emitter.spec.ts
│   │   │   │   │   │   └── database-recommendation.emitter.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── database-recommendation.repository.ts
│   │   │   │   │   │   ├── local.database.recommendation.repository.spec.ts
│   │   │   │   │   │   └── local.database.recommendation.repository.ts
│   │   │   │   │   └── scanner/
│   │   │   │   │       ├── recommendation.provider.spec.ts
│   │   │   │   │       ├── recommendation.provider.ts
│   │   │   │   │       ├── recommendation.strategy.interface.ts
│   │   │   │   │       ├── recommendations.scanner.spec.ts
│   │   │   │   │       ├── recommendations.scanner.ts
│   │   │   │   │       └── strategies/
│   │   │   │   │           ├── abstract.recommendation.strategy.spec.ts
│   │   │   │   │           ├── abstract.recommendation.strategy.ts
│   │   │   │   │           ├── avoid-logical-databases.strategy.spec.ts
│   │   │   │   │           ├── avoid-logical-databases.strategy.ts
│   │   │   │   │           ├── avoid-lua-scripts.strategy.spec.ts
│   │   │   │   │           ├── avoid-lua-scripts.strategy.ts
│   │   │   │   │           ├── big-amount-connected-clients.strategy.spec.ts
│   │   │   │   │           ├── big-amount-connected-clients.strategy.ts
│   │   │   │   │           ├── big-set.strategy.spec.ts
│   │   │   │   │           ├── big-set.strategy.ts
│   │   │   │   │           ├── big-string.strategy.spec.ts
│   │   │   │   │           ├── big-string.strategy.ts
│   │   │   │   │           ├── compression-for-list.strategy.spec.ts
│   │   │   │   │           ├── compression-for-list.strategy.ts
│   │   │   │   │           ├── default.recommendation.strategy.spec.ts
│   │   │   │   │           ├── default.recommendation.strategy.ts
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── redis-version.strategy.spec.ts
│   │   │   │   │           ├── redis-version.strategy.ts
│   │   │   │   │           ├── rts.strategy.spec.ts
│   │   │   │   │           ├── rts.strategy.ts
│   │   │   │   │           ├── search-JSON.strategy.spec.ts
│   │   │   │   │           ├── search-JSON.strategy.ts
│   │   │   │   │           ├── search-visualization.strategy.spec.ts
│   │   │   │   │           ├── search-visualization.strategy.ts
│   │   │   │   │           ├── shard-hash.strategy.spec.ts
│   │   │   │   │           ├── shard-hash.strategy.ts
│   │   │   │   │           ├── string-to-json.strategy.spec.ts
│   │   │   │   │           ├── string-to-json.strategy.ts
│   │   │   │   │           ├── try-rdi.strategy.spec.ts
│   │   │   │   │           ├── try-rdi.strategy.ts
│   │   │   │   │           ├── use-smaller-keys.strategy.spec.ts
│   │   │   │   │           └── use-smaller-keys.strategy.ts
│   │   │   │   ├── database-settings/
│   │   │   │   │   ├── database-settings.controller.ts
│   │   │   │   │   ├── database-settings.module.ts
│   │   │   │   │   ├── database-settings.service.spec.ts
│   │   │   │   │   ├── database-settings.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── database-setting.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── database-setting.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── database-settings.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── database-settings.repository.ts
│   │   │   │   │       ├── local-database-settings.repository.spec.ts
│   │   │   │   │       └── local-database-settings.repository.ts
│   │   │   │   ├── encryption/
│   │   │   │   │   ├── encryption.module.ts
│   │   │   │   │   ├── encryption.service.spec.ts
│   │   │   │   │   ├── encryption.service.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── encryption-service-error.exception.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── key-decryption-error.exception.ts
│   │   │   │   │   │   ├── key-encryption-error.exception.ts
│   │   │   │   │   │   ├── key-unavailable.exception.ts
│   │   │   │   │   │   ├── keytar-decryption-error.exception.ts
│   │   │   │   │   │   ├── keytar-encryption-error.exception.ts
│   │   │   │   │   │   ├── keytar-unavailable.exception.ts
│   │   │   │   │   │   └── unsupported-encryption-strategy.exception.ts
│   │   │   │   │   ├── model.encryptor.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── encryption-result.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── strategies/
│   │   │   │   │       ├── encryption-strategy.interface.ts
│   │   │   │   │       ├── key-encryption.strategy.spec.ts
│   │   │   │   │       ├── key-encryption.strategy.ts
│   │   │   │   │       ├── keytar-encryption.strategy.spec.ts
│   │   │   │   │       ├── keytar-encryption.strategy.ts
│   │   │   │   │       ├── plain-encryption.strategy.spec.ts
│   │   │   │   │       └── plain-encryption.strategy.ts
│   │   │   │   ├── feature/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── known-features.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   ├── feature.entity.ts
│   │   │   │   │   │   └── features-config.entity.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── unable-to-fetch-remote-config.exception.ts
│   │   │   │   │   ├── feature.analytics.spec.ts
│   │   │   │   │   ├── feature.analytics.ts
│   │   │   │   │   ├── feature.controller.ts
│   │   │   │   │   ├── feature.gateway.ts
│   │   │   │   │   ├── feature.module.ts
│   │   │   │   │   ├── feature.service.ts
│   │   │   │   │   ├── features-config.service.ts
│   │   │   │   │   ├── local.feature.service.spec.ts
│   │   │   │   │   ├── local.feature.service.ts
│   │   │   │   │   ├── local.features-config.service.spec.ts
│   │   │   │   │   ├── local.features-config.service.ts
│   │   │   │   │   ├── model/
│   │   │   │   │   │   ├── feature.ts
│   │   │   │   │   │   ├── features-config.spec.ts
│   │   │   │   │   │   └── features-config.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   └── feature-flag/
│   │   │   │   │   │       ├── feature-flag.provider.spec.ts
│   │   │   │   │   │       ├── feature-flag.provider.ts
│   │   │   │   │   │       └── strategies/
│   │   │   │   │   │           ├── cloud-sso.flag.strategy.ts
│   │   │   │   │   │           ├── common.flag.strategy.ts
│   │   │   │   │   │           ├── default.flag.strategy.ts
│   │   │   │   │   │           ├── feature.flag.strategy.spec.ts
│   │   │   │   │   │           ├── feature.flag.strategy.ts
│   │   │   │   │   │           ├── switchable.flag.strategy.spec.ts
│   │   │   │   │   │           ├── switchable.flag.strategy.ts
│   │   │   │   │   │           └── with-data.flag.strategy.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── feature.repository.ts
│   │   │   │   │   │   ├── features-config.repository.ts
│   │   │   │   │   │   ├── local.feature.repository.spec.ts
│   │   │   │   │   │   ├── local.feature.repository.ts
│   │   │   │   │   │   ├── local.features-config.repository.spec.ts
│   │   │   │   │   │   └── local.features-config.repository.ts
│   │   │   │   │   └── transformers/
│   │   │   │   │       ├── feature-config-filter.transformer.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── init/
│   │   │   │   │   ├── init.module.ts
│   │   │   │   │   ├── init.service.ts
│   │   │   │   │   └── local.init.service.ts
│   │   │   │   ├── notification/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create-notification.dto.ts
│   │   │   │   │   │   ├── create-notifications.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── notifications.dto.ts
│   │   │   │   │   │   └── read-notifications.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── notification.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── notification.ts
│   │   │   │   │   ├── notification.controller.ts
│   │   │   │   │   ├── notification.gateway.ts
│   │   │   │   │   ├── notification.module.ts
│   │   │   │   │   ├── notification.service.spec.ts
│   │   │   │   │   ├── notification.service.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── global-notification.provider.spec.ts
│   │   │   │   │   │   ├── global-notification.provider.ts
│   │   │   │   │   │   ├── notification.emitter.spec.ts
│   │   │   │   │   │   └── notification.emitter.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── local.notification.repository.spec.ts
│   │   │   │   │       ├── local.notification.repository.ts
│   │   │   │   │       └── notification.repository.ts
│   │   │   │   ├── plugin/
│   │   │   │   │   ├── plugin.controller.ts
│   │   │   │   │   ├── plugin.module.ts
│   │   │   │   │   ├── plugin.response.ts
│   │   │   │   │   └── plugin.service.ts
│   │   │   │   ├── profiler/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── emitters/
│   │   │   │   │   │   ├── client.logs-emiter.spec.ts
│   │   │   │   │   │   ├── client.logs-emitter.ts
│   │   │   │   │   │   ├── file.logs-emiter.spec.ts
│   │   │   │   │   │   └── file.logs-emitter.ts
│   │   │   │   │   ├── interfaces/
│   │   │   │   │   │   ├── logs-emitter.interface.ts
│   │   │   │   │   │   ├── monitor-data.interface.ts
│   │   │   │   │   │   └── shard-observer.interface.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── log-file.spec.ts
│   │   │   │   │   │   ├── log-file.ts
│   │   │   │   │   │   ├── monitor-settings.ts
│   │   │   │   │   │   ├── profiler.client.spec.ts
│   │   │   │   │   │   ├── profiler.client.ts
│   │   │   │   │   │   ├── redis.observer.spec.ts
│   │   │   │   │   │   └── redis.observer.ts
│   │   │   │   │   ├── monitor.service.spec.ts
│   │   │   │   │   ├── profiler-analytics.service.ts
│   │   │   │   │   ├── profiler.controller.ts
│   │   │   │   │   ├── profiler.gateway.ts
│   │   │   │   │   ├── profiler.module.ts
│   │   │   │   │   ├── profiler.service.ts
│   │   │   │   │   └── providers/
│   │   │   │   │       ├── log-file.provider.spec.ts
│   │   │   │   │       ├── log-file.provider.ts
│   │   │   │   │       ├── profiler-client.provider.spec.ts
│   │   │   │   │       ├── profiler-client.provider.ts
│   │   │   │   │       ├── redis-observer.provider.spec.ts
│   │   │   │   │       └── redis-observer.provider.ts
│   │   │   │   ├── pub-sub/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── decorators/
│   │   │   │   │   │   └── client.decorator.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── messages.response.ts
│   │   │   │   │   │   ├── publish.dto.ts
│   │   │   │   │   │   ├── publish.response.ts
│   │   │   │   │   │   ├── subscribe.dto.ts
│   │   │   │   │   │   └── subscription.dto.ts
│   │   │   │   │   ├── errors/
│   │   │   │   │   │   └── pub-sub-ws.exception.ts
│   │   │   │   │   ├── filters/
│   │   │   │   │   │   └── ack-ws-exception.filter.ts
│   │   │   │   │   ├── interfaces/
│   │   │   │   │   │   ├── message.interface.ts
│   │   │   │   │   │   └── subscription.interface.ts
│   │   │   │   │   ├── model/
│   │   │   │   │   │   ├── abstract.subscription.ts
│   │   │   │   │   │   ├── pattern.subscription.ts
│   │   │   │   │   │   ├── redis-client-subscriber.spec.ts
│   │   │   │   │   │   ├── redis-client-subscriber.ts
│   │   │   │   │   │   ├── simple.subscription.ts
│   │   │   │   │   │   ├── user-client.ts
│   │   │   │   │   │   ├── user-session.spec.ts
│   │   │   │   │   │   └── user-session.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── redis-client.provider.spec.ts
│   │   │   │   │   │   ├── redis-client.provider.ts
│   │   │   │   │   │   ├── subscription.provider.spec.ts
│   │   │   │   │   │   ├── subscription.provider.ts
│   │   │   │   │   │   ├── user-session.provider.spec.ts
│   │   │   │   │   │   └── user-session.provider.ts
│   │   │   │   │   ├── pub-sub.analytics.service.spec.ts
│   │   │   │   │   ├── pub-sub.analytics.service.ts
│   │   │   │   │   ├── pub-sub.controller.ts
│   │   │   │   │   ├── pub-sub.gateway.ts
│   │   │   │   │   ├── pub-sub.module.ts
│   │   │   │   │   ├── pub-sub.service.spec.ts
│   │   │   │   │   └── pub-sub.service.ts
│   │   │   │   ├── query-library/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── query-library.factory.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create-query-library-item.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── query-library-filter.dto.ts
│   │   │   │   │   │   ├── seed-query-library-item.dto.ts
│   │   │   │   │   │   ├── seed-query-library.dto.ts
│   │   │   │   │   │   └── update-query-library-item.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── query-library.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── query-library-type.enum.ts
│   │   │   │   │   │   └── query-library.ts
│   │   │   │   │   ├── query-library.controller.spec.ts
│   │   │   │   │   ├── query-library.controller.ts
│   │   │   │   │   ├── query-library.module.ts
│   │   │   │   │   ├── query-library.service.spec.ts
│   │   │   │   │   ├── query-library.service.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── local-query-library.repository.spec.ts
│   │   │   │   │       ├── local-query-library.repository.ts
│   │   │   │   │       └── query-library.repository.ts
│   │   │   │   ├── rdi/
│   │   │   │   │   ├── client/
│   │   │   │   │   │   ├── api/
│   │   │   │   │   │   │   ├── v1/
│   │   │   │   │   │   │   │   ├── api.rdi.client.spec.ts
│   │   │   │   │   │   │   │   ├── api.rdi.client.ts
│   │   │   │   │   │   │   │   ├── responses/
│   │   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   │   ├── statistics.responses.ts
│   │   │   │   │   │   │   │   │   └── status.responses.ts
│   │   │   │   │   │   │   │   └── transformers/
│   │   │   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │   │   │       ├── statistics.transformers.spec.ts
│   │   │   │   │   │   │   │       ├── statistics.transformers.ts
│   │   │   │   │   │   │   │       ├── status.transformers.spec.ts
│   │   │   │   │   │   │   │       └── status.transformers.ts
│   │   │   │   │   │   │   └── v2/
│   │   │   │   │   │   │       ├── api.v2.rdi.client.spec.ts
│   │   │   │   │   │   │       ├── api.v2.rdi.client.ts
│   │   │   │   │   │   │       ├── responses/
│   │   │   │   │   │   │       │   ├── index.ts
│   │   │   │   │   │   │       │   ├── info.responses.ts
│   │   │   │   │   │   │       │   ├── metrics-collections.response.ts
│   │   │   │   │   │   │       │   ├── pipeline.responses.ts
│   │   │   │   │   │   │       │   └── status.responses.ts
│   │   │   │   │   │   │       └── transformers/
│   │   │   │   │   │   │           ├── index.ts
│   │   │   │   │   │   │           ├── metrics-collections.transformer.spec.ts
│   │   │   │   │   │   │           └── metrics-collections.transformer.ts
│   │   │   │   │   │   └── rdi.client.ts
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── decorators/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── request.rdi.client.metadata.decorator.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.rdi.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── rdi-template.response.dto.ts
│   │   │   │   │   │   ├── rdi-test-connections.response.dto.ts
│   │   │   │   │   │   ├── rdi.dry-run.job.dto.ts
│   │   │   │   │   │   ├── rdi.dry-run.job.response.dto.ts
│   │   │   │   │   │   └── update.rdi.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── rdi.entity.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── rdi-deploy-failed.exception.spec.ts
│   │   │   │   │   │   ├── rdi-deploy-failed.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.bad-request.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.error.handler.spec.ts
│   │   │   │   │   │   ├── rdi-pipeline.error.handler.ts
│   │   │   │   │   │   ├── rdi-pipeline.forbidden.exception.spec.ts
│   │   │   │   │   │   ├── rdi-pipeline.forbidden.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.internal-server-error.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.not-found.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.timeout-error.exception.spec.ts
│   │   │   │   │   │   ├── rdi-pipeline.timeout-error.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.unauthorized.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.validation.exception.ts
│   │   │   │   │   │   ├── rdi-reset-pipeline-failed.exception.spec.ts
│   │   │   │   │   │   ├── rdi-reset-pipeline-failed.exception.ts
│   │   │   │   │   │   ├── rdi-start-pipeline-failed.exception.spec.ts
│   │   │   │   │   │   ├── rdi-start-pipeline-failed.exception.ts
│   │   │   │   │   │   ├── rdi-stop-pipeline-failed.exception.spec.ts
│   │   │   │   │   │   └── rdi-stop-pipeline-failed.exception.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── rdi-dry-run.ts
│   │   │   │   │   │   ├── rdi-info.ts
│   │   │   │   │   │   ├── rdi-pipeline.ts
│   │   │   │   │   │   ├── rdi-statistics.ts
│   │   │   │   │   │   ├── rdi.client.metadata.ts
│   │   │   │   │   │   ├── rdi.pipeline.status.ts
│   │   │   │   │   │   └── rdi.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── rdi.client.factory.spec.ts
│   │   │   │   │   │   ├── rdi.client.factory.ts
│   │   │   │   │   │   ├── rdi.client.provider.spec.ts
│   │   │   │   │   │   ├── rdi.client.provider.ts
│   │   │   │   │   │   ├── rdi.client.storage.spec.ts
│   │   │   │   │   │   └── rdi.client.storage.ts
│   │   │   │   │   ├── rdi-pipeline.analytics.spec.ts
│   │   │   │   │   ├── rdi-pipeline.analytics.ts
│   │   │   │   │   ├── rdi-pipeline.controller.ts
│   │   │   │   │   ├── rdi-pipeline.service.spec.ts
│   │   │   │   │   ├── rdi-pipeline.service.ts
│   │   │   │   │   ├── rdi-statistics.controller.ts
│   │   │   │   │   ├── rdi-statistics.service.spec.ts
│   │   │   │   │   ├── rdi-statistics.service.ts
│   │   │   │   │   ├── rdi.analytics.spec.ts
│   │   │   │   │   ├── rdi.analytics.ts
│   │   │   │   │   ├── rdi.controller.ts
│   │   │   │   │   ├── rdi.module.ts
│   │   │   │   │   ├── rdi.service.spec.ts
│   │   │   │   │   ├── rdi.service.ts
│   │   │   │   │   ├── repository/
│   │   │   │   │   │   ├── local.rdi.repository.spec.ts
│   │   │   │   │   │   ├── local.rdi.repository.ts
│   │   │   │   │   │   └── rdi.repository.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── pipeline.util.spec.ts
│   │   │   │   │       ├── pipeline.util.ts
│   │   │   │   │       ├── transformer.util.spec.ts
│   │   │   │   │       └── transformer.util.ts
│   │   │   │   ├── recommendation/
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── recommendation.provider.spec.ts
│   │   │   │   │   │   └── recommendation.provider.ts
│   │   │   │   │   ├── recommendation.module.ts
│   │   │   │   │   └── recommendation.service.ts
│   │   │   │   ├── redis/
│   │   │   │   │   ├── client/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── ioredis/
│   │   │   │   │   │   │   ├── cluster.ioredis.client.ts
│   │   │   │   │   │   │   ├── ioredis.client.ts
│   │   │   │   │   │   │   ├── sentinel.ioredis.client.ts
│   │   │   │   │   │   │   └── standalone.ioredis.client.ts
│   │   │   │   │   │   ├── node-redis/
│   │   │   │   │   │   │   ├── cluster.node-redis.client.ts
│   │   │   │   │   │   │   ├── node-redis.client.ts
│   │   │   │   │   │   │   └── standalone.node-redis.client.ts
│   │   │   │   │   │   └── redis.client.ts
│   │   │   │   │   ├── connection/
│   │   │   │   │   │   ├── ioredis.redis.connection.strategy.spec.ts
│   │   │   │   │   │   ├── ioredis.redis.connection.strategy.ts
│   │   │   │   │   │   ├── node.redis.connection.strategy.spec.ts
│   │   │   │   │   │   ├── node.redis.connection.strategy.ts
│   │   │   │   │   │   ├── redis.connection.strategy.spec.ts
│   │   │   │   │   │   └── redis.connection.strategy.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── client-not-found-error.exception.ts
│   │   │   │   │   │   └── connection/
│   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │       ├── redis-connection-auth-unsupported.exception.ts
│   │   │   │   │   │       ├── redis-connection-cluster-nodes-unavailable.exception.ts
│   │   │   │   │   │       ├── redis-connection-default-user-disabled.exception.ts
│   │   │   │   │   │       ├── redis-connection-failed.exception.ts
│   │   │   │   │   │       ├── redis-connection-incorrect-certificate.exception.ts
│   │   │   │   │   │       ├── redis-connection-sentinel-master-required.exception.ts
│   │   │   │   │   │       ├── redis-connection-timeout.exception.ts
│   │   │   │   │   │       ├── redis-connection-unauthorized.exception.ts
│   │   │   │   │   │       └── redis-connection-unavailable.exception.ts
│   │   │   │   │   ├── local.redis.client.factory.spec.ts
│   │   │   │   │   ├── local.redis.client.factory.ts
│   │   │   │   │   ├── redis.client.factory.ts
│   │   │   │   │   ├── redis.client.storage.spec.ts
│   │   │   │   │   ├── redis.client.storage.ts
│   │   │   │   │   ├── redis.module.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── cluster.util.spec.ts
│   │   │   │   │       ├── cluster.util.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── keys.util.spec.ts
│   │   │   │   │       ├── keys.util.ts
│   │   │   │   │       ├── reply.util.spec.ts
│   │   │   │   │       ├── reply.util.ts
│   │   │   │   │       ├── sentinel.util.spec.ts
│   │   │   │   │       └── sentinel.util.ts
│   │   │   │   ├── redis-enterprise/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── cluster.dto.ts
│   │   │   │   │   │   └── redis-enterprise-cluster.dto.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── redis-enterprise-database.ts
│   │   │   │   │   ├── redis-enterprise.analytics.spec.ts
│   │   │   │   │   ├── redis-enterprise.analytics.ts
│   │   │   │   │   ├── redis-enterprise.controller.spec.ts
│   │   │   │   │   ├── redis-enterprise.controller.ts
│   │   │   │   │   ├── redis-enterprise.module.ts
│   │   │   │   │   ├── redis-enterprise.service.spec.ts
│   │   │   │   │   ├── redis-enterprise.service.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── redis-enterprise-converter.spec.ts
│   │   │   │   │       └── redis-enterprise-converter.ts
│   │   │   │   ├── redis-sentinel/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.sentinel.database.dto.ts
│   │   │   │   │   │   ├── create.sentinel.database.response.ts
│   │   │   │   │   │   ├── create.sentinel.databases.dto.ts
│   │   │   │   │   │   ├── discover.sentinel-masters.dto.ts
│   │   │   │   │   │   ├── sentinel.master.response.dto.ts
│   │   │   │   │   │   └── update.sentinel.master.dto.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── sentinel-master.ts
│   │   │   │   │   │   └── sentinel.ts
│   │   │   │   │   ├── redis-sentinel.analytics.spec.ts
│   │   │   │   │   ├── redis-sentinel.analytics.ts
│   │   │   │   │   ├── redis-sentinel.controller.spec.ts
│   │   │   │   │   ├── redis-sentinel.controller.ts
│   │   │   │   │   ├── redis-sentinel.module.ts
│   │   │   │   │   ├── redis-sentinel.service.spec.ts
│   │   │   │   │   └── redis-sentinel.service.ts
│   │   │   │   ├── server/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── server.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── server.entity.ts
│   │   │   │   │   ├── health.controller.ts
│   │   │   │   │   ├── local.server.service.spec.ts
│   │   │   │   │   ├── local.server.service.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── server.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── local.server.repository.spec.ts
│   │   │   │   │   │   ├── local.server.repository.ts
│   │   │   │   │   │   └── server.repository.ts
│   │   │   │   │   ├── server.controller.ts
│   │   │   │   │   ├── server.module.ts
│   │   │   │   │   └── server.service.ts
│   │   │   │   ├── session/
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── session.provider.ts
│   │   │   │   │   │   ├── single-user.session.provider.spec.ts
│   │   │   │   │   │   ├── single-user.session.provider.ts
│   │   │   │   │   │   └── storage/
│   │   │   │   │   │       ├── in-memory.session.storage.spec.ts
│   │   │   │   │   │       ├── in-memory.session.storage.ts
│   │   │   │   │   │       └── session.storage.ts
│   │   │   │   │   ├── session.module.ts
│   │   │   │   │   ├── session.service.spec.ts
│   │   │   │   │   └── session.service.ts
│   │   │   │   ├── settings/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── settings.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── settings.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   ├── agreements.entity.ts
│   │   │   │   │   │   └── settings.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── agreements.interface.ts
│   │   │   │   │   │   ├── agreements.ts
│   │   │   │   │   │   └── settings.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── agreements.repository.ts
│   │   │   │   │   │   ├── local.agreements.repository.spec.ts
│   │   │   │   │   │   ├── local.agreements.repository.ts
│   │   │   │   │   │   ├── local.settings.repository.spec.ts
│   │   │   │   │   │   ├── local.settings.repository.ts
│   │   │   │   │   │   └── settings.repository.ts
│   │   │   │   │   ├── settings.analytics.spec.ts
│   │   │   │   │   ├── settings.analytics.ts
│   │   │   │   │   ├── settings.controller.ts
│   │   │   │   │   ├── settings.module.ts
│   │   │   │   │   ├── settings.service.spec.ts
│   │   │   │   │   └── settings.service.ts
│   │   │   │   ├── slow-log/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── commands.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── get-slow-logs.dto.ts
│   │   │   │   │   │   └── update-slow-log-config.dto.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── slow-log-config.ts
│   │   │   │   │   │   └── slow-log.ts
│   │   │   │   │   ├── slow-log.analytics.ts
│   │   │   │   │   ├── slow-log.controller.ts
│   │   │   │   │   ├── slow-log.module.ts
│   │   │   │   │   ├── slow-log.service.spec.ts
│   │   │   │   │   └── slow-log.service.ts
│   │   │   │   ├── ssh/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.basic-ssh-options.dto.ts
│   │   │   │   │   │   ├── create.cert-ssh-options.dto.ts
│   │   │   │   │   │   ├── ssh-options.response.ts
│   │   │   │   │   │   └── update.ssh-options.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── ssh-options.entity.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── tunnel-connection-lost.exception.ts
│   │   │   │   │   │   ├── unable-to-create-local-server.exception.ts
│   │   │   │   │   │   ├── unable-to-create-ssh-connection.exception.ts
│   │   │   │   │   │   └── unable-to-create-tunnel.exception.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── ssh-options.ts
│   │   │   │   │   │   └── ssh-tunnel.ts
│   │   │   │   │   ├── ssh-tunnel.provider.spec.ts
│   │   │   │   │   ├── ssh-tunnel.provider.ts
│   │   │   │   │   ├── ssh.module.ts
│   │   │   │   │   ├── transformers/
│   │   │   │   │   │   ├── ssh-options.transformer.spec.ts
│   │   │   │   │   │   └── ssh-options.transformer.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── error-message.spec.ts
│   │   │   │   │       ├── error-message.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── statics-management/
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── auto-updated-statics.interface.ts
│   │   │   │   │   │   ├── auto-updated-statics.provider.spec.ts
│   │   │   │   │   │   └── auto-updated-statics.provider.ts
│   │   │   │   │   └── statics-management.module.ts
│   │   │   │   ├── tag/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create-tag.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── update-tag.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── tag.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── tag.ts
│   │   │   │   │   ├── repository/
│   │   │   │   │   │   ├── local.tag.repository.spec.ts
│   │   │   │   │   │   ├── local.tag.repository.ts
│   │   │   │   │   │   └── tag.repository.ts
│   │   │   │   │   ├── tag.controller.ts
│   │   │   │   │   ├── tag.module.ts
│   │   │   │   │   ├── tag.service.spec.ts
│   │   │   │   │   └── tag.service.ts
│   │   │   │   └── workbench/
│   │   │   │       ├── decorators/
│   │   │   │       │   └── workbench-client-metadata.decorator.ts
│   │   │   │       ├── dto/
│   │   │   │       │   ├── create-command-execution.dto.ts
│   │   │   │       │   ├── create-command-executions.dto.ts
│   │   │   │       │   └── create-plugin-state.dto.ts
│   │   │   │       ├── entities/
│   │   │   │       │   ├── command-execution.entity.ts
│   │   │   │       │   └── plugin-state.entity.ts
│   │   │   │       ├── models/
│   │   │   │       │   ├── command-execution-result.ts
│   │   │   │       │   ├── command-execution.ts
│   │   │   │       │   ├── command-executions.filter.ts
│   │   │   │       │   ├── plugin-command-execution.ts
│   │   │   │       │   ├── plugin-state.ts
│   │   │   │       │   └── short-command-execution.ts
│   │   │   │       ├── plugins.controller.ts
│   │   │   │       ├── plugins.service.spec.ts
│   │   │   │       ├── plugins.service.ts
│   │   │   │       ├── providers/
│   │   │   │       │   ├── plugin-commands-whitelist.provider.spec.ts
│   │   │   │       │   ├── plugin-commands-whitelist.provider.ts
│   │   │   │       │   ├── workbench-commands.executor.spec.ts
│   │   │   │       │   └── workbench-commands.executor.ts
│   │   │   │       ├── repositories/
│   │   │   │       │   ├── command-execution.repository.ts
│   │   │   │       │   ├── local-command-execution.repository.spec.ts
│   │   │   │       │   ├── local-command-execution.repository.ts
│   │   │   │       │   ├── local-plugin-state.repository.spec.ts
│   │   │   │       │   ├── local-plugin-state.repository.ts
│   │   │   │       │   └── plugin-state.repository.ts
│   │   │   │       ├── utils/
│   │   │   │       │   ├── getUnsupportedCommands.spec.ts
│   │   │   │       │   └── getUnsupportedCommands.ts
│   │   │   │       ├── workbench.analytics.spec.ts
│   │   │   │       ├── workbench.analytics.ts
│   │   │   │       ├── workbench.controller.ts
│   │   │   │       ├── workbench.module.ts
│   │   │   │       ├── workbench.service.spec.ts
│   │   │   │       └── workbench.service.ts
│   │   │   ├── utils/
│   │   │   │   ├── analytics-helper.spec.ts
│   │   │   │   ├── analytics-helper.ts
│   │   │   │   ├── base.helper.spec.ts
│   │   │   │   ├── base.helper.ts
│   │   │   │   ├── big-string.spec.ts
│   │   │   │   ├── big-string.ts
│   │   │   │   ├── catch-redis-errors.spec.ts
│   │   │   │   ├── catch-redis-errors.ts
│   │   │   │   ├── class-transformer.ts
│   │   │   │   ├── cli-helper.spec.ts
│   │   │   │   ├── cli-helper.ts
│   │   │   │   ├── config.spec.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── converter.spec.ts
│   │   │   │   ├── converter.ts
│   │   │   │   ├── createHttpOptions.ts
│   │   │   │   ├── feature-version-filter.helper.spec.ts
│   │   │   │   ├── feature-version-filter.helper.ts
│   │   │   │   ├── file-helper.ts
│   │   │   │   ├── glob-pattern-helper.spec.ts
│   │   │   │   ├── glob-pattern-helper.ts
│   │   │   │   ├── hosting-provider-helper.spec.ts
│   │   │   │   ├── hosting-provider-helper.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── logsFormatter.spec.ts
│   │   │   │   ├── logsFormatter.ts
│   │   │   │   ├── path.spec.ts
│   │   │   │   ├── path.ts
│   │   │   │   ├── promise-with-timeout.spec.ts
│   │   │   │   ├── promise-with-timeout.ts
│   │   │   │   ├── recommendation-helper.spec.ts
│   │   │   │   ├── recommendation-helper.ts
│   │   │   │   ├── redis-modules-summary.spec.ts
│   │   │   │   ├── redis-modules-summary.ts
│   │   │   │   ├── redis-reply-converter.spec.ts
│   │   │   │   └── redis-reply-converter.ts
│   │   │   └── validators/
│   │   │       ├── index.ts
│   │   │       ├── isObjectWithValues.validator.ts
│   │   │       ├── serializedJson.validator.spec.ts
│   │   │       └── serializedJson.validator.ts
│   │   ├── stubs/
│   │   │   └── cpu-features/
│   │   │       ├── index.js
│   │   │       └── package.json
│   │   ├── test/
│   │   │   ├── README.md
│   │   │   ├── api/
│   │   │   │   ├── .mocharc.yml
│   │   │   │   ├── _init/
│   │   │   │   │   └── WS-notifications-global-sync.test.ts
│   │   │   │   ├── ai/
│   │   │   │   │   └── assistant/
│   │   │   │   │       ├── DELETE-ai-assistant-chats-id.test.ts
│   │   │   │   │       ├── GET-ai-assistant-chats-id.test.ts
│   │   │   │   │       ├── POST-ai-assistant-chats-id-messages.test.ts
│   │   │   │   │       └── POST-ai-assistant-chats.test.ts
│   │   │   │   ├── analytics/
│   │   │   │   │   ├── POST-analytics-send-event.test.ts
│   │   │   │   │   ├── POST-analytics-send-page.test.ts
│   │   │   │   │   └── analytics.test.ts
│   │   │   │   ├── api.deps.init.ts
│   │   │   │   ├── api.tsconfig.json
│   │   │   │   ├── browser-history/
│   │   │   │   │   ├── DELETE-browser-histories.test.ts
│   │   │   │   │   ├── DELETE-browser-history-id.test.ts
│   │   │   │   │   └── GET-browser-histories.test.ts
│   │   │   │   ├── bulk-actions/
│   │   │   │   │   ├── POST-databases-id-bulk_actions-import-default_data.test.ts
│   │   │   │   │   ├── POST-databases-id-bulk_actions-import-tutorial_data.test.ts
│   │   │   │   │   └── POST-databases-id-bulk_actions-import.test.ts
│   │   │   │   ├── certificate/
│   │   │   │   │   └── constants.ts
│   │   │   │   ├── cli/
│   │   │   │   │   ├── POST-databases-id-cli-uuid-send_cluster_command.test.ts
│   │   │   │   │   ├── POST-databases-id-cli-uuid-send_command.test.ts
│   │   │   │   │   └── POST-databases-id-cli.test.ts
│   │   │   │   ├── cloud/
│   │   │   │   │   ├── autodiscovery/
│   │   │   │   │   │   ├── GET-cloud-autodiscovery-account.test.ts
│   │   │   │   │   │   ├── GET-cloud-autodiscovery-subscriptions.test.ts
│   │   │   │   │   │   ├── GET-cloud-me-autodiscovery-account.test.ts
│   │   │   │   │   │   ├── POST-cloud-autodiscovery-databases.test.ts
│   │   │   │   │   │   └── POST-cloud-autodiscovery-get_databases.test.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   └── user/
│   │   │   │   │       ├── GET-cloud-me.test.ts
│   │   │   │   │       └── PUT-cloud-me-accounts-id-current.test.ts
│   │   │   │   ├── cluster-monitor/
│   │   │   │   │   └── GET-databases-id-cluster_details.test.ts
│   │   │   │   ├── commands/
│   │   │   │   │   └── GET-commands.test.ts
│   │   │   │   ├── custom-tutorials/
│   │   │   │   │   └── POST-custom-tutorials.test.ts
│   │   │   │   ├── database/
│   │   │   │   │   ├── DELETE-databases-id.test.ts
│   │   │   │   │   ├── DELETE-databases.test.ts
│   │   │   │   │   ├── GET-databases-id-connect.test.ts
│   │   │   │   │   ├── GET-databases-id-info.test.ts
│   │   │   │   │   ├── GET-databases-id-overview.test.ts
│   │   │   │   │   ├── GET-databases.test.ts
│   │   │   │   │   ├── PATCH-databases-id.test.ts
│   │   │   │   │   ├── POST-databases-clone-id.test.ts
│   │   │   │   │   ├── POST-databases-export.test.ts
│   │   │   │   │   ├── POST-databases-test-id.test.ts
│   │   │   │   │   ├── POST-databases-test.test.ts
│   │   │   │   │   ├── POST-databases.test.ts
│   │   │   │   │   └── constants.ts
│   │   │   │   ├── database-analysis/
│   │   │   │   │   ├── GET-databases-id-analysis-id.test.ts
│   │   │   │   │   ├── GET-databases-id-analysis.test.ts
│   │   │   │   │   ├── PATCH-databases-id-analysis.test.ts
│   │   │   │   │   ├── POST-databases-id-analysis.test.ts
│   │   │   │   │   └── constants.ts
│   │   │   │   ├── database-discovery/
│   │   │   │   │   └── pre-setup-databases.tests.ts
│   │   │   │   ├── database-import/
│   │   │   │   │   └── POST-databases-import.test.ts
│   │   │   │   ├── database-recommendations/
│   │   │   │   │   ├── DELETE-databases-id-recommendations.test.ts
│   │   │   │   │   ├── GET-databases-id-recommendations.test.ts
│   │   │   │   │   ├── PATCH-databases-id-recommendations-id.test.ts
│   │   │   │   │   ├── PATCH-databases-id-recommendations-read.test.ts
│   │   │   │   │   ├── WS-new-recommendations.test.ts
│   │   │   │   │   └── constants.ts
│   │   │   │   ├── deps.ts
│   │   │   │   ├── enterprise/
│   │   │   │   │   └── POST-redis-enterprise-cluster-get_dbs.test.ts
│   │   │   │   ├── feature/
│   │   │   │   │   ├── GET-features.test.ts
│   │   │   │   │   └── POST-features-sync.test.ts
│   │   │   │   ├── hash/
│   │   │   │   │   ├── DELETE-databases-id-hash-fields.test.ts
│   │   │   │   │   ├── POST-databases-id-hash-get_fields.test.ts
│   │   │   │   │   ├── POST-databases-id-hash.test.ts
│   │   │   │   │   └── PUT-databases-id-hash.test.ts
│   │   │   │   ├── info/
│   │   │   │   │   ├── GET-health.test.ts
│   │   │   │   │   ├── GET-info-cli-blocking-commands.test.ts
│   │   │   │   │   ├── GET-info-cli-unsupported-commands.test.ts
│   │   │   │   │   └── GET-info.test.ts
│   │   │   │   ├── keys/
│   │   │   │   │   ├── DELETE-databases-id-keys.test.ts
│   │   │   │   │   ├── PATCH-databases-id-keys-name.test.ts
│   │   │   │   │   ├── PATCH-databases-id-keys-ttl.test.ts
│   │   │   │   │   ├── POST-databases-id-keys-get_info.test.ts
│   │   │   │   │   ├── POST-databases-id-keys-get_infos.test.ts
│   │   │   │   │   └── POST-databases-id-keys.test.ts
│   │   │   │   ├── list/
│   │   │   │   │   ├── DELETE-databases-id-list-elements.test.ts
│   │   │   │   │   ├── PATCH-databases-id-list.test.ts
│   │   │   │   │   ├── POST-databases-id-list-get_elements-index.test.ts
│   │   │   │   │   ├── POST-databases-id-list-get_elements.test.ts
│   │   │   │   │   ├── POST-databases-id-list.test.ts
│   │   │   │   │   └── PUT-databases-id-list.test.ts
│   │   │   │   ├── notifications/
│   │   │   │   │   ├── GET-notifications.test.ts
│   │   │   │   │   ├── PATCH-notifications.test.ts
│   │   │   │   │   └── notifications.json
│   │   │   │   ├── plugins/
│   │   │   │   │   ├── GET-databases-id-plugins-commands.test.ts
│   │   │   │   │   ├── GET-databases-id-plugins-id-command_executions-id-state.test.ts
│   │   │   │   │   ├── GET-plugins.test.ts
│   │   │   │   │   ├── POST-databases-id-plugins-command_executions.test.ts
│   │   │   │   │   └── POST-databases-id-plugins-id-command_executions-id-state.test.ts
│   │   │   │   ├── pub-sub/
│   │   │   │   │   └── POST-databases-id-pub-sub-messages.test.ts
│   │   │   │   ├── query-library/
│   │   │   │   │   ├── DELETE-databases-id-query_library-id.test.ts
│   │   │   │   │   ├── GET-databases-id-query_library-id.test.ts
│   │   │   │   │   ├── GET-databases-id-query_library.test.ts
│   │   │   │   │   ├── PATCH-databases-id-query_library-id.test.ts
│   │   │   │   │   ├── POST-databases-id-query_library-seed.test.ts
│   │   │   │   │   └── POST-databases-id-query_library.test.ts
│   │   │   │   ├── rdi/
│   │   │   │   │   ├── DELETE-rdi.test.ts
│   │   │   │   │   ├── GET-rdi-id-connect.test.ts
│   │   │   │   │   ├── GET-rdi-id.test.ts
│   │   │   │   │   ├── GET-rdi.test.ts
│   │   │   │   │   ├── PATCH-rdi-id.test.ts
│   │   │   │   │   ├── POST-rdi.test.ts
│   │   │   │   │   ├── pipeline/
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-config-template-pipelineType-dbType.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-job-functions.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-job-template-pipelineType.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-schema.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-status.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-strategies.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-deploy.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-dry-run-job.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-reset.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-start.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-stop.test.ts
│   │   │   │   │   │   └── POST-rdi-id-pipeline-test-connections.test.ts
│   │   │   │   │   └── statistics/
│   │   │   │   │       └── GET-rdi-id-statistics.test.ts
│   │   │   │   ├── redisearch/
│   │   │   │   │   ├── DELETE-databases-id-redisearch.test.ts
│   │   │   │   │   ├── GET-databases-id-redisearch.test.ts
│   │   │   │   │   ├── POST-databases-id-redisearch-info.test.ts
│   │   │   │   │   ├── POST-databases-id-redisearch-key-indexes.test.ts
│   │   │   │   │   ├── POST-databases-id-redisearch-search.test.ts
│   │   │   │   │   └── POST-databases-id-redisearch.test.ts
│   │   │   │   ├── rejson-rl/
│   │   │   │   │   ├── DELETE-databases-id-rejson_rl.test.ts
│   │   │   │   │   ├── PATCH-databases-id-rejson_rl-arrappend.test.ts
│   │   │   │   │   ├── PATCH-databases-id-rejson_rl-set.test.ts
│   │   │   │   │   ├── POST-databases-id-rejson_rl-get.test.ts
│   │   │   │   │   └── POST-databases-id-rejson_rl.test.ts
│   │   │   │   ├── reporters.json
│   │   │   │   ├── sentinel/
│   │   │   │   │   ├── POST-redis_sentinel-databases.test.ts
│   │   │   │   │   └── POST-redis_sentinel-get_databases.test.ts
│   │   │   │   ├── set/
│   │   │   │   │   ├── DELETE-databases-id-set-members.test.ts
│   │   │   │   │   ├── POST-databases-id-set-get_members.test.ts
│   │   │   │   │   ├── POST-databases-id-set.test.ts
│   │   │   │   │   └── PUT-databases-id-set.test.ts
│   │   │   │   ├── settings/
│   │   │   │   │   ├── GET-settings-agreements-spec.test.ts
│   │   │   │   │   ├── GET-settings.test.ts
│   │   │   │   │   └── PATCH-settings.test.ts
│   │   │   │   ├── slowlog/
│   │   │   │   │   ├── DELETE-databases-id-slow_logs.test.ts
│   │   │   │   │   ├── GET-databases-id-slow_logs-config.test.ts
│   │   │   │   │   ├── GET-databases-id-slow_logs.test.ts
│   │   │   │   │   └── PATCH-databases-id-slow_logs-config.test.ts
│   │   │   │   ├── stream/
│   │   │   │   │   ├── DELETE-databases-id-streams-consumer_groups-consumers.test.ts
│   │   │   │   │   ├── DELETE-databases-id-streams-consumer_groups.test.ts
│   │   │   │   │   ├── PATCH-databases-id-streams-consumer_groups.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-consumers-get.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-consumers-pending_messages-ack.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-consumers-pending_messages-claim.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-consumers-pending_messages-get.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-get.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-entries-get.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-entries.test.ts
│   │   │   │   │   └── POST-databases-id-streams.test.ts
│   │   │   │   ├── string/
│   │   │   │   │   ├── POST-databases-id-string-download_value.test.ts
│   │   │   │   │   ├── POST-databases-id-string-get_value.test.ts
│   │   │   │   │   ├── POST-databases-id-string.test.ts
│   │   │   │   │   └── PUT-databases-id-string.test.ts
│   │   │   │   ├── triggered-functions/
│   │   │   │   │   ├── DELETE-databases-id-library.test.ts
│   │   │   │   │   ├── GET-databases-id-functions.test.ts
│   │   │   │   │   ├── GET-databases-id-libraries.test.ts
│   │   │   │   │   └── POST-databases-id-library.test.ts
│   │   │   │   ├── workbench/
│   │   │   │   │   ├── DELETE-databases-id-workbench-command_executions-id.test.ts
│   │   │   │   │   ├── DELETE-databases-id-workbench-command_executions.test.ts
│   │   │   │   │   ├── GET-databases-id-workbench-command_executions-id.test.ts
│   │   │   │   │   ├── GET-databases-id-workbench-command_executions.test.ts
│   │   │   │   │   └── POST-databases-id-workbench-command_executions.test.ts
│   │   │   │   ├── ws/
│   │   │   │   │   ├── bulk-actions/
│   │   │   │   │   │   └── bulk-actions-create.test.ts
│   │   │   │   │   ├── monitor/
│   │   │   │   │   │   └── monitor.test.ts
│   │   │   │   │   └── pub-sub/
│   │   │   │   │       └── pub-sub.test.ts
│   │   │   │   └── z-set/
│   │   │   │       ├── DELETE-databases-id-zSet-members.test.ts
│   │   │   │       ├── PATCH-databases-id-zSet.test.ts
│   │   │   │       ├── POST-databases-id-zSet-get_members.test.ts
│   │   │   │       ├── POST-databases-id-zSet-search.test.ts
│   │   │   │       ├── POST-databases-id-zSet.test.ts
│   │   │   │       └── PUT-databases-id-zSet.test.ts
│   │   │   ├── helpers/
│   │   │   │   ├── analytics.ts
│   │   │   │   ├── cloud.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── data/
│   │   │   │   │   └── redis.ts
│   │   │   │   ├── local-db.ts
│   │   │   │   ├── redis.ts
│   │   │   │   ├── remote-server.ts
│   │   │   │   ├── server.ts
│   │   │   │   ├── test/
│   │   │   │   │   ├── conditionalIgnore.ts
│   │   │   │   │   └── dataGenerator.ts
│   │   │   │   ├── test.ts
│   │   │   │   └── utils.ts
│   │   │   └── test-runs/
│   │   │       ├── cloud-st/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── docker.build.env
│   │   │       ├── docker.build.yml
│   │   │       ├── gears-clu/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── local.build.env
│   │   │       ├── local.build.yml
│   │   │       ├── mods-preview/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-clu/
│   │   │       │   ├── Dockerfile
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-clu-tls/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   ├── redis.key
│   │   │       │   │   └── redisCA.crt
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-sent/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── docker-compose.yml
│   │   │       │   ├── redis.conf
│   │   │       │   ├── sentinel.Dockerfile
│   │   │       │   ├── sentinel.conf
│   │   │       │   ├── sentinel.users.acl
│   │   │       │   └── users.acl
│   │   │       ├── oss-sent-tls-auth/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── ca.crt
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   └── redis.key
│   │   │       │   ├── docker-compose.yml
│   │   │       │   ├── redis.conf
│   │   │       │   ├── sentinel.Dockerfile
│   │   │       │   ├── sentinel.conf
│   │   │       │   └── users.acl
│   │   │       ├── oss-st-5/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── redis.conf
│   │   │       ├── oss-st-5-pass/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-st-6/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-st-6-tls/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   ├── redis.key
│   │   │       │   │   └── redisCA.crt
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-st-6-tls-auth/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   ├── redis.key
│   │   │       │   │   ├── redisCA.crt
│   │   │       │   │   ├── user.crt
│   │   │       │   │   └── user.key
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-st-6-tls-auth-ssh/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   ├── redis.key
│   │   │       │   │   ├── redisCA.crt
│   │   │       │   │   ├── user.crt
│   │   │       │   │   └── user.key
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── ssh/
│   │   │       │       └── keys/
│   │   │       │           ├── pub/
│   │   │       │           │   ├── test.pub
│   │   │       │           │   └── testp.pub
│   │   │       │           ├── test
│   │   │       │           └── testp
│   │   │       ├── oss-st-big/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── entrypoint.sh
│   │   │       ├── re-clu/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── db.json
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── entrypoint.sh
│   │   │       ├── re-crdt/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── entrypoint.sh
│   │   │       ├── re-st/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── db.json
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── entrypoint.sh
│   │   │       ├── run-all.sh
│   │   │       ├── start-test-run.sh
│   │   │       ├── test-docker-entry.sh
│   │   │       ├── test.Dockerfile
│   │   │       └── wait-for-it.sh
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.build.prod.json
│   │   └── tsconfig.json
│   ├── desktop/
│   │   ├── app.ts
│   │   ├── config.json
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── preload.ts
│   │   ├── splash.html
│   │   ├── src/
│   │   │   ├── config/
│   │   │   │   ├── configMain.ts
│   │   │   │   ├── configRenderer.ts
│   │   │   │   └── index.ts
│   │   │   ├── index.html
│   │   │   ├── lib/
│   │   │   │   ├── aboutPanel/
│   │   │   │   │   └── aboutPanel.ts
│   │   │   │   ├── app/
│   │   │   │   │   ├── app.handlers.ts
│   │   │   │   │   ├── deep-link.handlers.ts
│   │   │   │   │   ├── dialog.handlers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── ipc.handlers.ts
│   │   │   │   ├── auth/
│   │   │   │   │   ├── auth.factory.ts
│   │   │   │   │   ├── auth.interface.ts
│   │   │   │   │   ├── service.auth.strategy.ts
│   │   │   │   │   └── tcp.auth.strategy.ts
│   │   │   │   ├── azure/
│   │   │   │   │   ├── azure-auth.service.provider.ts
│   │   │   │   │   ├── azure-oauth-errors.spec.ts
│   │   │   │   │   ├── azure-oauth-errors.ts
│   │   │   │   │   ├── deep-link.handlers.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── cloud/
│   │   │   │   │   ├── cloud-oauth.handlers.ts
│   │   │   │   │   ├── deep-link.handlers.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── extensions/
│   │   │   │   │   └── extensions.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── logging/
│   │   │   │   │   └── logging.ts
│   │   │   │   ├── menu/
│   │   │   │   │   └── menu.ts
│   │   │   │   ├── server/
│   │   │   │   │   └── server.ts
│   │   │   │   ├── store/
│   │   │   │   │   └── store.ts
│   │   │   │   ├── tray/
│   │   │   │   │   ├── tray.ts
│   │   │   │   │   └── trayManager.ts
│   │   │   │   ├── updater/
│   │   │   │   │   ├── updater.handlers.ts
│   │   │   │   │   └── updater.ts
│   │   │   │   └── window/
│   │   │   │       ├── browserWindow.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── window.handlers.ts
│   │   │   └── utils/
│   │   │       ├── getAssetPath.ts
│   │   │       ├── index.ts
│   │   │       ├── resolveHtmlPath.ts
│   │   │       ├── showOrCreateWindow.ts
│   │   │       ├── window-size.ts
│   │   │       └── wrapErrorSensitiveData.ts
│   │   ├── views/
│   │   │   └── cloud_outh_callback/
│   │   │       ├── callback.html
│   │   │       ├── index.js
│   │   │       └── styles.css
│   │   ├── vite.main.config.ts
│   │   ├── vite.preload.config.ts
│   │   └── vite.renderer.config.ts
│   ├── package.json
│   ├── patches/
│   │   └── sqlite3+5.1.7.patch
│   └── ui/
│       ├── .eslintignore
│       ├── README.md
│       ├── index.html
│       ├── index.tsx
│       ├── indexElectron.tsx
│       ├── package.json
│       ├── src/
│       │   ├── App.scss
│       │   ├── App.spec.tsx
│       │   ├── App.tsx
│       │   ├── Router.spec.tsx
│       │   ├── Router.tsx
│       │   ├── RouterElectron.tsx
│       │   ├── assets/
│       │   │   └── assets.d.ts
│       │   ├── components/
│       │   │   ├── ContentEditable.tsx
│       │   │   ├── MonacoEnvironmentInitializer/
│       │   │   │   ├── MonacoEnvironmentInitializer.spec.tsx
│       │   │   │   ├── MonacoEnvironmentInitializer.tsx
│       │   │   │   └── yaml.worker.js
│       │   │   ├── analytics-tabs/
│       │   │   │   ├── AnalyticsTabs.spec.tsx
│       │   │   │   ├── AnalyticsTabs.stories.tsx
│       │   │   │   ├── AnalyticsTabs.tsx
│       │   │   │   └── index.ts
│       │   │   ├── auto-discover/
│       │   │   │   ├── EmptyState.tsx
│       │   │   │   ├── EmptyState.types.ts
│       │   │   │   ├── Header.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.ts
│       │   │   ├── auto-refresh/
│       │   │   │   ├── AutoRefresh.spec.tsx
│       │   │   │   ├── AutoRefresh.stories.tsx
│       │   │   │   ├── AutoRefresh.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   └── utils.ts
│       │   │   ├── base/
│       │   │   │   ├── code-editor/
│       │   │   │   │   ├── CodeEditor.styles.ts
│       │   │   │   │   ├── CodeEditor.tsx
│       │   │   │   │   ├── CodeEditor.types.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── display/
│       │   │   │   │   ├── accordion/
│       │   │   │   │   │   ├── RiAccordion.spec.tsx
│       │   │   │   │   │   ├── RiAccordion.tsx
│       │   │   │   │   │   └── RiAccordion.types.ts
│       │   │   │   │   ├── badge/
│       │   │   │   │   │   └── RiBadge.tsx
│       │   │   │   │   ├── banner/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── call-out/
│       │   │   │   │   │   └── CallOut.tsx
│       │   │   │   │   ├── collapsible-nav-group/
│       │   │   │   │   │   └── RICollapsibleNavGroup.tsx
│       │   │   │   │   ├── image/
│       │   │   │   │   │   ├── RiImage.tsx
│       │   │   │   │   │   └── image.styles.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── loader/
│       │   │   │   │   │   └── Loader.tsx
│       │   │   │   │   ├── loading-logo/
│       │   │   │   │   │   └── RiLoadingLogo.tsx
│       │   │   │   │   ├── modal/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── progress-bar/
│       │   │   │   │   │   ├── ProgressBarLoader.tsx
│       │   │   │   │   │   └── progress-bar-loader.styles.ts
│       │   │   │   │   ├── section/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── toast/
│       │   │   │   │   │   ├── RiToast.tsx
│       │   │   │   │   │   ├── RiToaster.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── tour/
│       │   │   │   │       ├── TourStep.tsx
│       │   │   │   │       └── types.ts
│       │   │   │   ├── forms/
│       │   │   │   │   ├── FormField.tsx
│       │   │   │   │   ├── button-group/
│       │   │   │   │   │   └── ButtonGroup.tsx
│       │   │   │   │   ├── buttons/
│       │   │   │   │   │   ├── ActionIconButton.stories.tsx
│       │   │   │   │   │   ├── ActionIconButton.tsx
│       │   │   │   │   │   ├── Button.stories.tsx
│       │   │   │   │   │   ├── Button.tsx
│       │   │   │   │   │   ├── DestructiveButton.stories.tsx
│       │   │   │   │   │   ├── DestructiveButton.tsx
│       │   │   │   │   │   ├── EmptyButton.stories.tsx
│       │   │   │   │   │   ├── EmptyButton.tsx
│       │   │   │   │   │   ├── EmptyButton.types.ts
│       │   │   │   │   │   ├── IconButton.stories.tsx
│       │   │   │   │   │   ├── IconButton.tsx
│       │   │   │   │   │   ├── PrimaryButton.stories.tsx
│       │   │   │   │   │   ├── PrimaryButton.tsx
│       │   │   │   │   │   ├── SecondaryButton.stories.tsx
│       │   │   │   │   │   ├── SecondaryButton.tsx
│       │   │   │   │   │   ├── ToggleButton.stories.tsx
│       │   │   │   │   │   ├── ToggleButton.tsx
│       │   │   │   │   │   ├── button.styles.ts
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── checkbox/
│       │   │   │   │   │   ├── Checkbox.test.tsx
│       │   │   │   │   │   └── Checkbox.tsx
│       │   │   │   │   ├── combo-box/
│       │   │   │   │   │   ├── AutoTag.spec.tsx
│       │   │   │   │   │   └── AutoTag.tsx
│       │   │   │   │   ├── fieldset/
│       │   │   │   │   │   ├── FormFieldset.spec.tsx
│       │   │   │   │   │   ├── FormFieldset.styles.ts
│       │   │   │   │   │   ├── FormFieldset.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── file-picker/
│       │   │   │   │   │   ├── RiFilePicker.tsx
│       │   │   │   │   │   └── styles.tsx
│       │   │   │   │   ├── radio-group/
│       │   │   │   │   │   └── RadioGroup.tsx
│       │   │   │   │   └── select/
│       │   │   │   │       ├── RISelectWithActions.spec.tsx
│       │   │   │   │       ├── RISelectWithActions.tsx
│       │   │   │   │       └── RiSelect.tsx
│       │   │   │   ├── icons/
│       │   │   │   │   ├── Icon.tsx
│       │   │   │   │   ├── RiIcon.tsx
│       │   │   │   │   ├── iconRegistry.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── inputs/
│       │   │   │   │   ├── ComposedInput.tsx
│       │   │   │   │   ├── NumericInput.tsx
│       │   │   │   │   ├── PasswordInput.tsx
│       │   │   │   │   ├── SearchInput.tsx
│       │   │   │   │   ├── SwitchInput.spec.tsx
│       │   │   │   │   ├── SwitchInput.tsx
│       │   │   │   │   ├── TextArea.ts
│       │   │   │   │   ├── TextInput.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── layout/
│       │   │   │   │   ├── card/
│       │   │   │   │   │   └── index.tsx
│       │   │   │   │   ├── drawer/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── empty-prompt/
│       │   │   │   │   │   └── RiEmptyPrompt.tsx
│       │   │   │   │   ├── flex/
│       │   │   │   │   │   ├── flex.spec.tsx
│       │   │   │   │   │   ├── flex.styles.ts
│       │   │   │   │   │   ├── flex.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── flex.module.scss
│       │   │   │   │   ├── horizontal-rule/
│       │   │   │   │   │   ├── HorizontalRule.spec.tsx
│       │   │   │   │   │   ├── HorizontalRule.tsx
│       │   │   │   │   │   └── horizontal-rule.styles.ts
│       │   │   │   │   ├── horizontal-spacer/
│       │   │   │   │   │   ├── HorizontalSpacer.spec.tsx
│       │   │   │   │   │   ├── horizontal-spacer.styles.ts
│       │   │   │   │   │   ├── horizontal-spacer.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── list/
│       │   │   │   │   │   ├── Group.tsx
│       │   │   │   │   │   ├── Item.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── list.styles.ts
│       │   │   │   │   ├── loading-content/
│       │   │   │   │   │   ├── LoadingContent.spec.tsx
│       │   │   │   │   │   ├── LoadingContent.tsx
│       │   │   │   │   │   └── loading-content.styles.ts
│       │   │   │   │   ├── menu/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── page/
│       │   │   │   │   │   ├── Page.tsx
│       │   │   │   │   │   ├── PageBody.tsx
│       │   │   │   │   │   ├── PageContentBody.tsx
│       │   │   │   │   │   ├── PageHeader.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   ├── page-body.spec.tsx
│       │   │   │   │   │   ├── page-body.styles.ts
│       │   │   │   │   │   ├── page-heading.styles.ts
│       │   │   │   │   │   ├── page.spec.tsx
│       │   │   │   │   │   └── page.styles.ts
│       │   │   │   │   ├── profile-icon/
│       │   │   │   │   │   └── ProfileIcon.tsx
│       │   │   │   │   ├── resize/
│       │   │   │   │   │   ├── container/
│       │   │   │   │   │   │   └── ResizableContainer.tsx
│       │   │   │   │   │   ├── handle/
│       │   │   │   │   │   │   ├── ResizablePanelHandle.tsx
│       │   │   │   │   │   │   └── resizable-panel-handle.styles.ts
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── panel/
│       │   │   │   │   │       └── ResizablePanel.tsx
│       │   │   │   │   ├── sidebar/
│       │   │   │   │   │   ├── SideBarItemIcon.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── sidebar-item-icon.styles.ts
│       │   │   │   │   ├── spacer/
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   ├── spacer.spec.tsx
│       │   │   │   │   │   ├── spacer.styles.ts
│       │   │   │   │   │   └── spacer.tsx
│       │   │   │   │   ├── stepper/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── table/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── tabs/
│       │   │   │   │       └── index.ts
│       │   │   │   ├── link/
│       │   │   │   │   ├── Link.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── link.styles.ts
│       │   │   │   │   └── link.types.ts
│       │   │   │   ├── navigation/
│       │   │   │   │   └── breadcrumbs/
│       │   │   │   │       ├── RiBreadcrumbs.tsx
│       │   │   │   │       └── index.ts
│       │   │   │   ├── popover/
│       │   │   │   │   ├── RiPopover.constants.ts
│       │   │   │   │   ├── RiPopover.spec.tsx
│       │   │   │   │   ├── RiPopover.tsx
│       │   │   │   │   ├── RiPopover.types.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── shared/
│       │   │   │   │   └── WindowControlGroup.tsx
│       │   │   │   ├── text/
│       │   │   │   │   ├── ColorText.tsx
│       │   │   │   │   ├── HealthText.tsx
│       │   │   │   │   ├── MultilineEllipsisText.tsx
│       │   │   │   │   ├── Text.tsx
│       │   │   │   │   ├── Title.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── text.styles.ts
│       │   │   │   ├── theme/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── types.ts
│       │   │   │   ├── tooltip/
│       │   │   │   │   ├── HoverContent.tsx
│       │   │   │   │   ├── RITooltip.tsx
│       │   │   │   │   ├── RiTooltip.spec.tsx
│       │   │   │   │   └── index.tsx
│       │   │   │   └── utils/
│       │   │   │       ├── FocusTrap.tsx
│       │   │   │       ├── OutsideClickDetector.tsx
│       │   │   │       ├── ShowHide.spec.tsx
│       │   │   │       ├── ShowHide.tsx
│       │   │   │       ├── WindowEvent.spec.tsx
│       │   │   │       ├── WindowEvent.tsx
│       │   │   │       ├── hooks/
│       │   │   │       │   ├── generate-id.ts
│       │   │   │       │   └── inner-text.ts
│       │   │   │       ├── index.ts
│       │   │   │       ├── outsideClickDetector.spec.tsx
│       │   │   │       ├── pluginsThemeContext.tsx
│       │   │   │       └── resize-observer/
│       │   │   │           └── ResizeObserver.tsx
│       │   │   ├── bottom-group-components/
│       │   │   │   ├── BottomGroupComponents.spec.tsx
│       │   │   │   ├── BottomGroupComponents.stories.tsx
│       │   │   │   ├── BottomGroupComponents.tsx
│       │   │   │   ├── components/
│       │   │   │   │   └── bottom-group-minimized/
│       │   │   │   │       ├── BottomGroupMinimized.spec.tsx
│       │   │   │   │       ├── BottomGroupMinimized.stories.tsx
│       │   │   │   │       ├── BottomGroupMinimized.tsx
│       │   │   │   │       ├── ButtonGroupMinimized.styles.ts
│       │   │   │   │       └── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── browser/
│       │   │   │   ├── KeysBrowser.spec.tsx
│       │   │   │   ├── KeysBrowser.styles.ts
│       │   │   │   ├── KeysBrowser.tsx
│       │   │   │   ├── KeysBrowser.types.ts
│       │   │   │   ├── columns-menu/
│       │   │   │   │   ├── ColumnsMenu.styles.ts
│       │   │   │   │   ├── ColumnsMenu.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── useResponsiveColumns.ts
│       │   │   │   ├── index.ts
│       │   │   │   └── view-switch/
│       │   │   │       ├── ViewSwitch.styles.ts
│       │   │   │       ├── ViewSwitch.tsx
│       │   │   │       ├── ViewSwitch.types.ts
│       │   │   │       └── index.ts
│       │   │   ├── bulk-actions-config/
│       │   │   │   ├── BulkActionsConfig.spec.tsx
│       │   │   │   ├── BulkActionsConfig.tsx
│       │   │   │   └── index.ts
│       │   │   ├── charts/
│       │   │   │   ├── bar-chart/
│       │   │   │   │   ├── BarChart.spec.tsx
│       │   │   │   │   ├── BarChart.stories.tsx
│       │   │   │   │   ├── BarChart.styles.ts
│       │   │   │   │   ├── BarChart.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── donut-chart/
│       │   │   │   │   ├── DonutChart.spec.tsx
│       │   │   │   │   ├── DonutChart.stories.tsx
│       │   │   │   │   ├── DonutChart.styles.ts
│       │   │   │   │   ├── DonutChart.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   └── index.ts
│       │   │   ├── cli/
│       │   │   │   ├── Cli/
│       │   │   │   │   ├── Cli.spec.tsx
│       │   │   │   │   ├── Cli.stories.tsx
│       │   │   │   │   ├── Cli.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── CliWrapper.spec.tsx
│       │   │   │   ├── CliWrapper.stories.tsx
│       │   │   │   ├── CliWrapper.tsx
│       │   │   │   └── components/
│       │   │   │       ├── cli-body/
│       │   │   │       │   ├── CliBody/
│       │   │   │       │   │   ├── CliBody.spec.tsx
│       │   │   │       │   │   ├── CliBody.stories.tsx
│       │   │   │       │   │   ├── CliBody.tsx
│       │   │   │       │   │   ├── index.ts
│       │   │   │       │   │   └── styles.module.scss
│       │   │   │       │   ├── CliBodyWrapper.spec.tsx
│       │   │   │       │   ├── CliBodyWrapper.stories.tsx
│       │   │   │       │   ├── CliBodyWrapper.tsx
│       │   │   │       │   └── index.ts
│       │   │   │       ├── cli-header/
│       │   │   │       │   ├── CliHeader.spec.tsx
│       │   │   │       │   ├── CliHeader.stories.tsx
│       │   │   │       │   ├── CliHeader.tsx
│       │   │   │       │   ├── index.ts
│       │   │   │       │   └── styles.module.scss
│       │   │   │       └── cli-input/
│       │   │   │           ├── CliAutocomplete/
│       │   │   │           │   ├── CliAutocomplete.spec.tsx
│       │   │   │           │   ├── CliAutocomplete.stories.tsx
│       │   │   │           │   ├── CliAutocomplete.tsx
│       │   │   │           │   ├── index.ts
│       │   │   │           │   └── styles.module.scss
│       │   │   │           ├── CliInput/
│       │   │   │           │   ├── CliInput.spec.tsx
│       │   │   │           │   ├── CliInput.stories.tsx
│       │   │   │           │   ├── CliInput.tsx
│       │   │   │           │   ├── index.ts
│       │   │   │           │   └── styles.module.scss
│       │   │   │           ├── CliInputWrapper.spec.tsx
│       │   │   │           ├── CliInputWrapper.stories.tsx
│       │   │   │           ├── CliInputWrapper.tsx
│       │   │   │           └── index.ts
│       │   │   ├── code-block/
│       │   │   │   ├── CodeBlock.spec.tsx
│       │   │   │   ├── CodeBlock.stories.tsx
│       │   │   │   ├── CodeBlock.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── column-header/
│       │   │   │   ├── ColumnHeader.spec.tsx
│       │   │   │   ├── ColumnHeader.tsx
│       │   │   │   └── index.ts
│       │   │   ├── columns-config/
│       │   │   │   ├── ColumnsConfigPopover.spec.tsx
│       │   │   │   └── ColumnsConfigPopover.tsx
│       │   │   ├── command-helper/
│       │   │   │   ├── CommandHelper/
│       │   │   │   │   ├── CommandHelper.spec.tsx
│       │   │   │   │   ├── CommandHelper.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── CommandHelperHeader/
│       │   │   │   │   ├── CommandHelperHeader.spec.tsx
│       │   │   │   │   ├── CommandHelperHeader.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── CommandHelperWrapper.spec.tsx
│       │   │   │   ├── CommandHelperWrapper.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── command-helper-info/
│       │   │   │   │   │   ├── CHCommandInfo.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── command-helper-search/
│       │   │   │   │   │   ├── CHSearchFilter/
│       │   │   │   │   │   │   ├── CHSearchFilter.spec.tsx
│       │   │   │   │   │   │   ├── CHSearchFilter.tsx
│       │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   ├── CHSearchInput/
│       │   │   │   │   │   │   ├── CHSearchInput.spec.tsx
│       │   │   │   │   │   │   ├── CHSearchInput.tsx
│       │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   ├── CHSearchWrapper.spec.tsx
│       │   │   │   │   │   ├── CHSearchWrapper.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── command-helper-search-output/
│       │   │   │   │       ├── CHSearchOutput.tsx
│       │   │   │   │       ├── CliSearchOutput.spec.tsx
│       │   │   │   │       ├── index.ts
│       │   │   │   │       └── styles.module.scss
│       │   │   │   └── index.ts
│       │   │   ├── config/
│       │   │   │   ├── Config.spec.tsx
│       │   │   │   ├── Config.tsx
│       │   │   │   └── index.ts
│       │   │   ├── confirmation-popover/
│       │   │   │   ├── ConfirmationPopover.spec.tsx
│       │   │   │   ├── ConfirmationPopover.tsx
│       │   │   │   └── index.ts
│       │   │   ├── connectivity-error/
│       │   │   │   ├── ConnectivityError.spec.tsx
│       │   │   │   └── ConnectivityError.tsx
│       │   │   ├── consents-settings/
│       │   │   │   ├── ConsentOption/
│       │   │   │   │   ├── ConsentOption.spec.tsx
│       │   │   │   │   ├── ConsentOption.tsx
│       │   │   │   │   ├── components/
│       │   │   │   │   │   ├── ItemDescription.tsx
│       │   │   │   │   │   └── index.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── ConsentsNotifications/
│       │   │   │   │   ├── ConsentsNotifications.spec.tsx
│       │   │   │   │   ├── ConsentsNotifications.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── ConsentsPrivacy/
│       │   │   │   │   ├── ConsentsPrivacy.spec.tsx
│       │   │   │   │   ├── ConsentsPrivacy.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── ConsentsSettings.spec.tsx
│       │   │   │   ├── ConsentsSettings.tsx
│       │   │   │   ├── ConsentsSettingsPopup/
│       │   │   │   │   ├── ConsentsSettingsPopup.spec.tsx
│       │   │   │   │   └── ConsentsSettingsPopup.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   └── styles.ts
│       │   │   ├── copy-button/
│       │   │   │   ├── CopyButton.spec.tsx
│       │   │   │   ├── CopyButton.styles.ts
│       │   │   │   ├── CopyButton.tsx
│       │   │   │   ├── CopyButton.types.ts
│       │   │   │   ├── components/
│       │   │   │   │   ├── ButtonWithTooltip/
│       │   │   │   │   │   ├── ButtonWithTooltip.tsx
│       │   │   │   │   │   ├── ButtonWithTooltip.types.ts
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── index.ts
│       │   │   │   └── index.ts
│       │   │   ├── css.d.ts
│       │   │   ├── database-list-modules/
│       │   │   │   ├── DatabaseListModules.spec.tsx
│       │   │   │   ├── DatabaseListModules.stories.tsx
│       │   │   │   ├── DatabaseListModules.styles.ts
│       │   │   │   ├── DatabaseListModules.tsx
│       │   │   │   ├── DatabaseListModules.types.ts
│       │   │   │   ├── components/
│       │   │   │   │   ├── DatabaseModuleContent/
│       │   │   │   │   │   ├── DatabaseModuleContent.tsx
│       │   │   │   │   │   └── DatabaseModuleContent.types.ts
│       │   │   │   │   ├── DatabaseModuleContentItem/
│       │   │   │   │   │   ├── DatabaseModuleContentItem.styles.ts
│       │   │   │   │   │   ├── DatabaseModuleContentItem.tsx
│       │   │   │   │   │   └── DatabaseModuleContentItem.types.ts
│       │   │   │   │   ├── DatabaseModuleItem/
│       │   │   │   │   │   ├── DatabaseModuleItem.styles.ts
│       │   │   │   │   │   ├── DatabaseModuleItem.tsx
│       │   │   │   │   │   └── DatabaseModuleItem.types.ts
│       │   │   │   │   ├── DatabaseModulesList/
│       │   │   │   │   │   ├── DatabaseModulesList.tsx
│       │   │   │   │   │   └── DatabaseModulesList.types.ts
│       │   │   │   │   └── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── database-list-options/
│       │   │   │   ├── DatabaseListOptions.spec.tsx
│       │   │   │   ├── DatabaseListOptions.stories.tsx
│       │   │   │   ├── DatabaseListOptions.styles.ts
│       │   │   │   ├── DatabaseListOptions.tsx
│       │   │   │   ├── components/
│       │   │   │   │   └── Tooltip.tsx
│       │   │   │   └── constants.ts
│       │   │   ├── database-overview/
│       │   │   │   ├── DatabaseOverview.spec.tsx
│       │   │   │   ├── DatabaseOverview.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── OverviewMetrics/
│       │   │   │   │   │   ├── MetricItem.tsx
│       │   │   │   │   │   ├── OverviewMetrics.spec.tsx
│       │   │   │   │   │   ├── OverviewMetrics.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── icons.ts
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── useDatabaseOverview.spec.ts
│       │   │   │   │   └── useDatabaseOverview.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── divider/
│       │   │   │   ├── Divider.spec.tsx
│       │   │   │   ├── Divider.styles.ts
│       │   │   │   ├── Divider.tsx
│       │   │   │   └── Divider.types.ts
│       │   │   ├── explore-guides/
│       │   │   │   ├── ExploreGuides.spec.tsx
│       │   │   │   ├── ExploreGuides.styles.ts
│       │   │   │   ├── ExploreGuides.tsx
│       │   │   │   ├── icons.ts
│       │   │   │   └── index.ts
│       │   │   ├── feature-flag-component/
│       │   │   │   ├── FeatureFlagComponent.spec.tsx
│       │   │   │   ├── FeatureFlagComponent.tsx
│       │   │   │   └── index.ts
│       │   │   ├── field-message/
│       │   │   │   ├── FieldMessage.spec.tsx
│       │   │   │   ├── FieldMessage.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── form-dialog/
│       │   │   │   ├── FooterDatabaseForm.ts
│       │   │   │   ├── FormDialog.spec.tsx
│       │   │   │   ├── FormDialog.styles.ts
│       │   │   │   ├── FormDialog.tsx
│       │   │   │   └── index.ts
│       │   │   ├── formated-date/
│       │   │   │   ├── FormatedDate.spec.tsx
│       │   │   │   ├── FormatedDate.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── full-screen/
│       │   │   │   ├── FullScreen.spec.tsx
│       │   │   │   ├── FullScreen.tsx
│       │   │   │   └── index.ts
│       │   │   ├── global-azure-auth/
│       │   │   │   ├── AzureAuthCallbackPage.spec.tsx
│       │   │   │   ├── AzureAuthCallbackPage.styles.ts
│       │   │   │   ├── AzureAuthCallbackPage.tsx
│       │   │   │   ├── GlobalAzureAuth.spec.tsx
│       │   │   │   ├── GlobalAzureAuth.tsx
│       │   │   │   └── index.ts
│       │   │   ├── global-dialogs/
│       │   │   │   ├── GlobalDialogs.tsx
│       │   │   │   └── index.ts
│       │   │   ├── global-subscriptions/
│       │   │   │   ├── CommonAppSubscription/
│       │   │   │   │   ├── CommonAppSubscription.spec.tsx
│       │   │   │   │   ├── CommonAppSubscription.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── GlobalSubscriptions.tsx
│       │   │   │   └── index.ts
│       │   │   ├── global-url-handler/
│       │   │   │   ├── GlobalUrlHandler.spec.tsx
│       │   │   │   ├── GlobalUrlHandler.tsx
│       │   │   │   └── index.ts
│       │   │   ├── group-badge/
│       │   │   │   ├── GroupBadge.stories.tsx
│       │   │   │   ├── GroupBadge.styles.ts
│       │   │   │   ├── GroupBadge.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── hightlighted-feature/
│       │   │   │   ├── HighlightedFeature.spec.tsx
│       │   │   │   ├── HighlightedFeature.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── home-tabs/
│       │   │   │   ├── HomeTabs.spec.tsx
│       │   │   │   ├── HomeTabs.tsx
│       │   │   │   ├── constants.ts
│       │   │   │   └── index.ts
│       │   │   ├── hooks/
│       │   │   │   ├── useAzureAuth.spec.ts
│       │   │   │   ├── useAzureAuth.ts
│       │   │   │   ├── useConnectionType.spec.ts
│       │   │   │   └── useConnectionType.ts
│       │   │   ├── import-file-modal/
│       │   │   │   ├── ImportFileModal.spec.tsx
│       │   │   │   ├── ImportFileModal.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── index.ts
│       │   │   ├── init/
│       │   │   │   ├── AppInit.spec.tsx
│       │   │   │   └── AppInit.tsx
│       │   │   ├── inline-item-editor/
│       │   │   │   ├── InlineItemEditor.spec.tsx
│       │   │   │   ├── InlineItemEditor.styles.tsx
│       │   │   │   ├── InlineItemEditor.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── input-field-sentinel/
│       │   │   │   ├── InputFieldSentinel.spec.tsx
│       │   │   │   ├── InputFieldSentinel.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── instance-header/
│       │   │   │   ├── InstanceHeader.spec.tsx
│       │   │   │   ├── InstanceHeader.stories.tsx
│       │   │   │   ├── InstanceHeader.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── ShortInstanceInfo.spec.tsx
│       │   │   │   │   ├── ShortInstanceInfo.styles.ts
│       │   │   │   │   ├── ShortInstanceInfo.tsx
│       │   │   │   │   ├── instances-navigation-popover/
│       │   │   │   │   │   ├── InstancesNavigationPopover.spec.tsx
│       │   │   │   │   │   ├── InstancesNavigationPopover.styles.ts
│       │   │   │   │   │   ├── InstancesNavigationPopover.tsx
│       │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   └── instances-list/
│       │   │   │   │   │   │       ├── InstancesList.spec.tsx
│       │   │   │   │   │   │       ├── InstancesList.tsx
│       │   │   │   │   │   │       └── index.tsx
│       │   │   │   │   │   ├── index.tsx
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── user-profile/
│       │   │   │   │       ├── CloudUserProfile.tsx
│       │   │   │   │       ├── UserProfile.spec.tsx
│       │   │   │   │       ├── UserProfile.tsx
│       │   │   │   │       ├── UserProfileBadge.spec.tsx
│       │   │   │   │       └── UserProfileBadge.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── item-list/
│       │   │   │   └── components/
│       │   │   │       ├── action-bar/
│       │   │   │       │   ├── ActionBar.spec.tsx
│       │   │   │       │   ├── ActionBar.styles.ts
│       │   │   │       │   └── ActionBar.tsx
│       │   │   │       ├── delete-action/
│       │   │   │       │   ├── DeleteAction.spec.tsx
│       │   │   │       │   └── DeleteAction.tsx
│       │   │   │       ├── export-action/
│       │   │   │       │   ├── ExportAction.spec.tsx
│       │   │   │       │   └── ExportAction.tsx
│       │   │   │       ├── index.ts
│       │   │   │       └── styles.module.scss
│       │   │   ├── json-viewer/
│       │   │   │   ├── JSONViewer.spec.tsx
│       │   │   │   ├── JSONViewer.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── json-array/
│       │   │   │   │   │   ├── JsonArray.spec.tsx
│       │   │   │   │   │   ├── JsonArray.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── json-object/
│       │   │   │   │   │   ├── JsonObject.spec.tsx
│       │   │   │   │   │   ├── JsonObject.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── json-pretty/
│       │   │   │   │   │   ├── JsonPretty.spec.tsx
│       │   │   │   │   │   ├── JsonPretty.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── json-primitive/
│       │   │   │   │       ├── JsonPrimitive.spec.tsx
│       │   │   │   │       ├── JsonPrimitive.tsx
│       │   │   │   │       └── index.ts
│       │   │   │   ├── interfaces.ts
│       │   │   │   ├── utils.spec.ts
│       │   │   │   └── utils.ts
│       │   │   ├── keyboard-shortcut/
│       │   │   │   ├── KeyboardShortcut.spec.tsx
│       │   │   │   ├── KeyboardShortcut.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── keys-summary/
│       │   │   │   ├── KeysSummary.spec.tsx
│       │   │   │   ├── KeysSummary.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── main/
│       │   │   │   └── MainComponent.tsx
│       │   │   ├── main-router/
│       │   │   │   ├── MainRouter.spec.tsx
│       │   │   │   ├── MainRouter.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── RedisStackRoutes.spec.tsx
│       │   │   │   │   ├── RedisStackRoutes.tsx
│       │   │   │   │   ├── SuspenseLoader.tsx
│       │   │   │   │   └── loader.module.scss
│       │   │   │   ├── config.ts
│       │   │   │   ├── constants/
│       │   │   │   │   ├── commonRoutes.ts
│       │   │   │   │   ├── defaultRoutes.ts
│       │   │   │   │   ├── redisStackRoutes.ts
│       │   │   │   │   └── sub-routes/
│       │   │   │   │       ├── analyticsRoutes.ts
│       │   │   │   │       ├── index.ts
│       │   │   │   │       ├── rdiPipelineManagementRoutes.ts
│       │   │   │   │       └── vectorSearchRoutes.ts
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── useActivityMonitor.spec.ts
│       │   │   │   │   └── useActivityMonitor.ts
│       │   │   │   └── interfaces.ts
│       │   │   ├── markdown/
│       │   │   │   ├── CloudLink/
│       │   │   │   │   ├── CloudLink.spec.tsx
│       │   │   │   │   ├── CloudLink.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── CodeButtonBlock/
│       │   │   │   │   ├── CodeButtonBlock.spec.tsx
│       │   │   │   │   ├── CodeButtonBlock.tsx
│       │   │   │   │   ├── components/
│       │   │   │   │   │   ├── RunConfirmationPopover.spec.tsx
│       │   │   │   │   │   ├── RunConfirmationPopover.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── Image/
│       │   │   │   │   ├── Image.spec.tsx
│       │   │   │   │   ├── Image.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── RedisInsightLink/
│       │   │   │   │   ├── RedisInsightLink.spec.tsx
│       │   │   │   │   ├── RedisInsightLink.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── RedisUploadButton/
│       │   │   │   │   ├── RedisUploadButton.spec.tsx
│       │   │   │   │   ├── RedisUploadButton.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── index.ts
│       │   │   ├── message-bar/
│       │   │   │   ├── MessageBar.spec.tsx
│       │   │   │   ├── MessageBar.styles.ts
│       │   │   │   ├── MessageBar.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── messages/
│       │   │   │   ├── cli-output/
│       │   │   │   │   ├── cliOutput.spec.tsx
│       │   │   │   │   └── cliOutput.tsx
│       │   │   │   ├── database-not-opened/
│       │   │   │   │   ├── DatabaseNotOpened.spec.tsx
│       │   │   │   │   ├── DatabaseNotOpened.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── feature-not-available/
│       │   │   │   │   ├── FeatureNotAvailable.spec.tsx
│       │   │   │   │   ├── FeatureNotAvailable.styles.ts
│       │   │   │   │   ├── FeatureNotAvailable.tsx
│       │   │   │   │   ├── FeatureNotAvailable.types.ts
│       │   │   │   │   ├── constants.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── module-not-loaded/
│       │   │   │   │   ├── ModuleNotLoaded.spec.tsx
│       │   │   │   │   ├── ModuleNotLoaded.tsx
│       │   │   │   │   ├── ModuleNotLoadedButton.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── module-not-loaded-minimalized/
│       │   │   │       ├── ModuleNotLoadedMinimalized.spec.tsx
│       │   │   │       ├── ModuleNotLoadedMinimalized.tsx
│       │   │   │       ├── constants.ts
│       │   │   │       ├── index.ts
│       │   │   │       └── styles.module.scss
│       │   │   ├── monaco-editor/
│       │   │   │   ├── MonacoEditor.spec.tsx
│       │   │   │   ├── MonacoEditor.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── dedicated-editor/
│       │   │   │   │   │   ├── DedicatedEditor.spec.tsx
│       │   │   │   │   │   ├── DedicatedEditor.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── monaco-json/
│       │   │   │   │   │   ├── MonacoJson.spec.tsx
│       │   │   │   │   │   ├── MonacoJson.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── monaco-yaml/
│       │   │   │   │       ├── MonacoYaml.spec.tsx
│       │   │   │   │       ├── MonacoYaml.tsx
│       │   │   │   │       ├── index.ts
│       │   │   │   │       └── monacoYamlModel.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   ├── useMonacoValidation.spec.tsx
│       │   │   │   └── useMonacoValidation.ts
│       │   │   ├── monaco-laguages/
│       │   │   │   ├── MonacoLanguages.spec.tsx
│       │   │   │   ├── MonacoLanguages.tsx
│       │   │   │   └── index.ts
│       │   │   ├── monitor/
│       │   │   │   ├── Monitor/
│       │   │   │   │   ├── Monitor.spec.tsx
│       │   │   │   │   ├── Monitor.styles.tsx
│       │   │   │   │   ├── Monitor.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── MonitorHeader/
│       │   │   │   │   ├── MonitorHeader.spec.tsx
│       │   │   │   │   ├── MonitorHeader.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── MonitorLog/
│       │   │   │   │   ├── MonitorLog.spec.tsx
│       │   │   │   │   ├── MonitorLog.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── MonitorOutputList/
│       │   │   │   │   ├── MonitorOutputList.spec.tsx
│       │   │   │   │   ├── MonitorOutputList.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── MonitorWrapper.spec.tsx
│       │   │   │   ├── MonitorWrapper.tsx
│       │   │   │   └── index.ts
│       │   │   ├── monitor-config/
│       │   │   │   ├── MonitorConfig.spec.tsx
│       │   │   │   ├── MonitorConfig.tsx
│       │   │   │   └── index.ts
│       │   │   ├── multi-search/
│       │   │   │   ├── MultiSearch.spec.tsx
│       │   │   │   ├── MultiSearch.styles.ts
│       │   │   │   └── MultiSearch.tsx
│       │   │   ├── navigation-menu/
│       │   │   │   ├── NavigationMenu.spec.tsx
│       │   │   │   ├── NavigationMenu.tsx
│       │   │   │   ├── app-navigation/
│       │   │   │   │   ├── AppNavigation.styles.ts
│       │   │   │   │   ├── AppNavigation.tsx
│       │   │   │   │   └── AppNavigationTabTrigger.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── create-cloud/
│       │   │   │   │   │   ├── CreateCloud.spec.tsx
│       │   │   │   │   │   ├── CreateCloud.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── help-menu/
│       │   │   │   │   │   ├── HelpMenu.spec.tsx
│       │   │   │   │   │   ├── HelpMenu.tsx
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── notifications-center/
│       │   │   │   │   │   ├── Notification/
│       │   │   │   │   │   │   ├── Notification.tsx
│       │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   ├── NotificationCenter.spec.tsx
│       │   │   │   │   │   ├── NotificationCenter.tsx
│       │   │   │   │   │   ├── NotificationMenu.spec.tsx
│       │   │   │   │   │   ├── NotificationMenu.tsx
│       │   │   │   │   │   ├── PopoverNotification/
│       │   │   │   │   │   │   ├── PopoverNotification.spec.tsx
│       │   │   │   │   │   │   ├── PopoverNotification.tsx
│       │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── redis-logo/
│       │   │   │   │       ├── RedisLogo.spec.tsx
│       │   │   │   │       └── RedisLogo.tsx
│       │   │   │   ├── hooks/
│       │   │   │   │   └── useNavigation.ts
│       │   │   │   ├── navigation.types.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── notifications/
│       │   │   │   ├── Notifications.spec.tsx
│       │   │   │   ├── Notifications.stories.tsx
│       │   │   │   ├── Notifications.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── azure-token-expired/
│       │   │   │   │   │   ├── AzureTokenExpiredErrorContent.spec.tsx
│       │   │   │   │   │   ├── AzureTokenExpiredErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── cloud-capi-unauthorized/
│       │   │   │   │   │   ├── CloudCapiUnAuthorizedErrorContent.spec.tsx
│       │   │   │   │   │   ├── CloudCapiUnAuthorizedErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── default-error-content/
│       │   │   │   │   │   ├── DefaultErrorContent.spec.tsx
│       │   │   │   │   │   ├── DefaultErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── encryption-error-content/
│       │   │   │   │   │   ├── EncryptionErrorContent.spec.tsx
│       │   │   │   │   │   ├── EncryptionErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── infinite-messages/
│       │   │   │   │   │   ├── InfiniteMessages.spec.tsx
│       │   │   │   │   │   ├── InfiniteMessages.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── persistent-error-content/
│       │   │   │   │   │   ├── PersistentErrorContent.spec.tsx
│       │   │   │   │   │   ├── PersistentErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── rdi-deploy-error-content/
│       │   │   │   │       ├── RdiDeployErrorContent.spec.tsx
│       │   │   │   │       ├── RdiDeployErrorContent.tsx
│       │   │   │   │       └── index.ts
│       │   │   │   ├── constants.ts
│       │   │   │   ├── error-messages.spec.tsx
│       │   │   │   ├── error-messages.tsx
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── useErrorNotifications.spec.tsx
│       │   │   │   │   ├── useErrorNotifications.ts
│       │   │   │   │   ├── useInfiniteNotifications.ts
│       │   │   │   │   └── useMessageNotifications.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── success-messages.tsx
│       │   │   ├── oauth/
│       │   │   │   ├── index.ts
│       │   │   │   ├── oauth-connect-free-db/
│       │   │   │   │   ├── OAuthConnectFreeDb.spec.tsx
│       │   │   │   │   ├── OAuthConnectFreeDb.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── oauth-jobs/
│       │   │   │   │   ├── OAuthJobs.spec.tsx
│       │   │   │   │   ├── OAuthJobs.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── oauth-select-account-dialog/
│       │   │   │   │   ├── OAuthSelectAccountDialog.spec.tsx
│       │   │   │   │   ├── OAuthSelectAccountDialog.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── oauth-select-plan/
│       │   │   │   │   ├── OAuthSelectPlan.spec.tsx
│       │   │   │   │   ├── OAuthSelectPlan.styles.ts
│       │   │   │   │   ├── OAuthSelectPlan.tsx
│       │   │   │   │   ├── constants.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── oauth-sign-in-button/
│       │   │   │   │   ├── OAuthSignInButton.spec.tsx
│       │   │   │   │   ├── OAuthSignInButton.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── oauth-sso/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── oauth-autodiscovery/
│       │   │   │   │   │   ├── OAuthAutodiscovery.spec.tsx
│       │   │   │   │   │   ├── OAuthAutodiscovery.styles.ts
│       │   │   │   │   │   ├── OAuthAutodiscovery.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── oauth-create-db/
│       │   │   │   │   │   ├── OAuthCreateDb.spec.tsx
│       │   │   │   │   │   ├── OAuthCreateDb.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── oauth-sign-in/
│       │   │   │   │       ├── OAuthSignIn.spec.tsx
│       │   │   │   │       ├── OAuthSignIn.tsx
│       │   │   │   │       ├── index.ts
│       │   │   │   │       └── styles.module.scss
│       │   │   │   ├── oauth-sso-dialog/
│       │   │   │   │   ├── OAuthSsoDialog.spec.tsx
│       │   │   │   │   ├── OAuthSsoDialog.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── oauth-sso-handler-dialog/
│       │   │   │   │   ├── OAuthSsoHandlerDialog.spec.tsx
│       │   │   │   │   ├── OAuthSsoHandlerDialog.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── oauth-user-profile/
│       │   │   │   │   ├── OAuthUserProfile.spec.tsx
│       │   │   │   │   ├── OAuthUserProfile.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── shared/
│       │   │   │       ├── index.ts
│       │   │   │       ├── oauth-advantages/
│       │   │   │       │   ├── OAuthAdvantages.spec.tsx
│       │   │   │       │   ├── OAuthAdvantages.tsx
│       │   │   │       │   ├── constants.ts
│       │   │   │       │   ├── index.ts
│       │   │   │       │   └── styles.module.scss
│       │   │   │       ├── oauth-agreement/
│       │   │   │       │   ├── OAuthAgreement.spec.tsx
│       │   │   │       │   ├── OAuthAgreement.tsx
│       │   │   │       │   ├── index.ts
│       │   │   │       │   └── styles.module.scss
│       │   │   │       ├── oauth-form/
│       │   │   │       │   ├── OAuthForm.spec.tsx
│       │   │   │       │   ├── OAuthForm.tsx
│       │   │   │       │   ├── components/
│       │   │   │       │   │   └── oauth-sso-form/
│       │   │   │       │   │       ├── OAuthSsoForm.styles.ts
│       │   │   │       │   │       ├── OAuthSsoForm.tsx
│       │   │   │       │   │       └── index.ts
│       │   │   │       │   └── index.ts
│       │   │   │       ├── oauth-recommended-settings/
│       │   │   │       │   ├── OAuthRecommendedSettings.spec.tsx
│       │   │   │       │   ├── OAuthRecommendedSettings.tsx
│       │   │   │       │   └── index.ts
│       │   │   │       ├── oauth-social-buttons/
│       │   │   │       │   ├── OAuthSocialButtons.spec.tsx
│       │   │   │       │   ├── OAuthSocialButtons.styles.ts
│       │   │   │       │   ├── OAuthSocialButtons.tsx
│       │   │   │       │   └── index.ts
│       │   │   │       └── styles.ts
│       │   │   ├── onboarding-features/
│       │   │   │   ├── OnboardingFeatures.spec.tsx
│       │   │   │   ├── OnboardingFeatures.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── onboarding-tour/
│       │   │   │   ├── OnboardingTour.spec.tsx
│       │   │   │   ├── OnboardingTour.tsx
│       │   │   │   ├── OnboardingTourWrapper.spec.tsx
│       │   │   │   ├── OnboardingTourWrapper.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── interfaces.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── page-header/
│       │   │   │   ├── PageHeader.module.scss
│       │   │   │   ├── PageHeader.spec.tsx
│       │   │   │   ├── PageHeader.tsx
│       │   │   │   └── components/
│       │   │   │       └── index.ts
│       │   │   ├── page-placeholder/
│       │   │   │   ├── PagePlaceholder.spec.tsx
│       │   │   │   ├── PagePlaceholder.tsx
│       │   │   │   └── index.ts
│       │   │   ├── panel/
│       │   │   │   └── index.ts
│       │   │   ├── promo-link/
│       │   │   │   ├── PromoLink.spec.tsx
│       │   │   │   ├── PromoLink.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── pub-sub-config/
│       │   │   │   ├── PubSubConfig.spec.tsx
│       │   │   │   ├── PubSubConfig.tsx
│       │   │   │   └── index.ts
│       │   │   ├── query/
│       │   │   │   ├── components/
│       │   │   │   │   └── RunButton.tsx
│       │   │   │   ├── context/
│       │   │   │   │   ├── query-editor-context.spec.tsx
│       │   │   │   │   ├── query-editor.context.tsx
│       │   │   │   │   ├── query-editor.context.types.ts
│       │   │   │   │   ├── query-results-context.spec.tsx
│       │   │   │   │   ├── query-results.context.tsx
│       │   │   │   │   ├── view-mode-context.spec.tsx
│       │   │   │   │   └── view-mode.context.tsx
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── useCommandHistory.ts
│       │   │   │   │   ├── useCommandHistory.types.ts
│       │   │   │   │   ├── useDslSyntax.ts
│       │   │   │   │   ├── useDslSyntax.types.ts
│       │   │   │   │   ├── useMonacoRedisEditor.ts
│       │   │   │   │   ├── useMonacoRedisEditor.types.ts
│       │   │   │   │   ├── useQueryDecorations.ts
│       │   │   │   │   ├── useQueryDecorations.types.ts
│       │   │   │   │   ├── useQueryEditor.ts
│       │   │   │   │   ├── useQueryEditor.types.ts
│       │   │   │   │   ├── useRedisCompletions.ts
│       │   │   │   │   └── useRedisCompletions.types.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── query-actions/
│       │   │   │   │   ├── QueryActions.spec.tsx
│       │   │   │   │   ├── QueryActions.styles.ts
│       │   │   │   │   ├── QueryActions.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── query-card/
│       │   │   │   │   ├── QueryCard.spec.tsx
│       │   │   │   │   ├── QueryCard.tsx
│       │   │   │   │   ├── QueryCardCliDefaultResult/
│       │   │   │   │   │   ├── QueryCardCliDefaultResult.spec.tsx
│       │   │   │   │   │   ├── QueryCardCliDefaultResult.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardCliGroupResult/
│       │   │   │   │   │   ├── QueryCardCliGroupResult.spec.tsx
│       │   │   │   │   │   ├── QueryCardCliGroupResult.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── QueryCardCliPlugin/
│       │   │   │   │   │   ├── QueryCardCliPlugin.spec.tsx
│       │   │   │   │   │   ├── QueryCardCliPlugin.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardCliResultWrapper/
│       │   │   │   │   │   ├── QueryCardCliResultWrapper.spec.tsx
│       │   │   │   │   │   ├── QueryCardCliResultWrapper.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardCommonResult/
│       │   │   │   │   │   ├── QueryCardCommonResult.spec.tsx
│       │   │   │   │   │   ├── QueryCardCommonResult.tsx
│       │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   └── CommonErrorResponse/
│       │   │   │   │   │   │       ├── CommonErrorResponse.tsx
│       │   │   │   │   │   │       └── index.ts
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardHeader/
│       │   │   │   │   │   ├── QueryCardHeader.spec.tsx
│       │   │   │   │   │   ├── QueryCardHeader.styles.ts
│       │   │   │   │   │   ├── QueryCardHeader.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardTooltip/
│       │   │   │   │   │   ├── QueryCardTooltip.spec.tsx
│       │   │   │   │   │   ├── QueryCardTooltip.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── query-lite-actions/
│       │   │   │   │   ├── QueryActions.spec.tsx
│       │   │   │   │   ├── QueryLiteActions.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── query-results/
│       │   │   │   │   ├── QueryResults.spec.tsx
│       │   │   │   │   ├── QueryResults.styles.ts
│       │   │   │   │   ├── QueryResults.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── query-tutorials/
│       │   │   │   │   ├── QueryTutorials.spec.tsx
│       │   │   │   │   ├── QueryTutorials.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── query.styles.ts
│       │   │   ├── range-filter/
│       │   │   │   ├── RangeFilter.spec.tsx
│       │   │   │   ├── RangeFilter.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── rdi-instance-header/
│       │   │   │   ├── RdiInstanceHeader.spec.tsx
│       │   │   │   ├── RdiInstanceHeader.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── recommendation/
│       │   │   │   ├── badge-icon/
│       │   │   │   │   ├── BadgeIcon.spec.tsx
│       │   │   │   │   ├── BadgeIcon.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── constants.tsx
│       │   │   │   ├── content-element/
│       │   │   │   │   ├── ContentElement.spec.tsx
│       │   │   │   │   ├── ContentElement.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── internal-link/
│       │   │   │   │   ├── InternalLink.spec.tsx
│       │   │   │   │   ├── InternalLink.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-badges/
│       │   │   │   │   ├── RecommendationBadges.spec.tsx
│       │   │   │   │   ├── RecommendationBadges.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-badges-legend/
│       │   │   │   │   ├── RecommendationBadgesLegend.spec.tsx
│       │   │   │   │   ├── RecommendationBadgesLegend.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-body/
│       │   │   │   │   ├── RecommendationBody.spec.tsx
│       │   │   │   │   ├── RecommendationBody.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-copy-component/
│       │   │   │   │   ├── RecommendationCopyComponent.spec.tsx
│       │   │   │   │   ├── RecommendationCopyComponent.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-voting/
│       │   │   │   │   ├── RecommendationVoting.spec.tsx
│       │   │   │   │   ├── RecommendationVoting.tsx
│       │   │   │   │   ├── components/
│       │   │   │   │   │   └── vote-option/
│       │   │   │   │   │       ├── VoteOption.spec.tsx
│       │   │   │   │   │       ├── VoteOption.tsx
│       │   │   │   │   │       ├── index.ts
│       │   │   │   │   │       ├── styles.module.scss
│       │   │   │   │   │       └── utils.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── styles.module.scss
│       │   │   ├── scan-more/
│       │   │   │   ├── ScanMore.spec.tsx
│       │   │   │   ├── ScanMore.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── settings-item/
│       │   │   │   ├── SettingItem.spec.tsx
│       │   │   │   ├── SettingItem.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── shortcuts-flyout/
│       │   │   │   ├── ShortcutsFlyout.spec.tsx
│       │   │   │   ├── ShortcutsFlyout.tsx
│       │   │   │   └── schema.tsx
│       │   │   ├── side-panels/
│       │   │   │   ├── SidePanels.styles.ts
│       │   │   │   ├── SidePanels.test.tsx
│       │   │   │   ├── SidePanels.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── copilot-panel/
│       │   │   │   │   │   ├── CopilotPanel.spec.tsx
│       │   │   │   │   │   ├── CopilotPanel.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── header/
│       │   │   │   │   │   ├── Header.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── insights-panel/
│       │   │   │   │       ├── InsightsPanel.spec.tsx
│       │   │   │   │       ├── InsightsPanel.tsx
│       │   │   │   │       └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── panels/
│       │   │   │   │   ├── ai-assistant/
│       │   │   │   │   │   ├── AiAssistant.spec.tsx
│       │   │   │   │   │   ├── AiAssistant.tsx
│       │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   ├── assistance-chat/
│       │   │   │   │   │   │   │   ├── AssistanceChat.spec.tsx
│       │   │   │   │   │   │   │   ├── AssistanceChat.tsx
│       │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   ├── chats-wrapper/
│       │   │   │   │   │   │   │   ├── ChatsWrapper.spec.tsx
│       │   │   │   │   │   │   │   ├── ChatsWrapper.tsx
│       │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   ├── expert-chat/
│       │   │   │   │   │   │   │   ├── ExpertChat.spec.tsx
│       │   │   │   │   │   │   │   ├── ExpertChat.tsx
│       │   │   │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   │   │   ├── expert-chat-header/
│       │   │   │   │   │   │   │   │   │   ├── ExpertChatHeader.spec.tsx
│       │   │   │   │   │   │   │   │   │   ├── ExpertChatHeader.tsx
│       │   │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   │   └── no-indexes-initial-message/
│       │   │   │   │   │   │   │   │       ├── NoIndexesInitialMessage.spec.tsx
│       │   │   │   │   │   │   │   │       ├── NoIndexesInitialMessage.tsx
│       │   │   │   │   │   │   │   │       ├── index.ts
│       │   │   │   │   │   │   │   │       └── styles.module.scss
│       │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   ├── shared/
│       │   │   │   │   │   │   │   ├── chat-form/
│       │   │   │   │   │   │   │   │   ├── ChatForm.spec.tsx
│       │   │   │   │   │   │   │   │   ├── ChatForm.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── chat-history/
│       │   │   │   │   │   │   │   │   ├── ChatHistory.spec.tsx
│       │   │   │   │   │   │   │   │   ├── ChatHistory.styles.ts
│       │   │   │   │   │   │   │   │   ├── ChatHistory.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── texts.tsx
│       │   │   │   │   │   │   │   ├── error-message/
│       │   │   │   │   │   │   │   │   ├── ErrorMessage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── ErrorMessage.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   ├── loading-message/
│       │   │   │   │   │   │   │   │   ├── LoadingMessage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── LoadingMessage.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── markdown-message/
│       │   │   │   │   │   │   │   │   ├── MarkdownMessage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── MarkdownMessage.tsx
│       │   │   │   │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   │   │   │   ├── chat-external-link/
│       │   │   │   │   │   │   │   │   │   │   ├── ChatExternalLink.spec.tsx
│       │   │   │   │   │   │   │   │   │   │   ├── ChatExternalLink.tsx
│       │   │   │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   │   │   ├── code-block/
│       │   │   │   │   │   │   │   │   │   │   ├── CodeBlock.spec.tsx
│       │   │   │   │   │   │   │   │   │   │   ├── CodeBlock.tsx
│       │   │   │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   └── restart-chat/
│       │   │   │   │   │   │   │       ├── RestartChat.spec.tsx
│       │   │   │   │   │   │   │       ├── RestartChat.tsx
│       │   │   │   │   │   │   │       ├── index.ts
│       │   │   │   │   │   │   │       └── styles.module.scss
│       │   │   │   │   │   │   ├── texts.tsx
│       │   │   │   │   │   │   └── welcome-ai-assistant/
│       │   │   │   │   │   │       ├── WelcomeAiAssistant.spec.tsx
│       │   │   │   │   │   │       ├── WelcomeAiAssistant.tsx
│       │   │   │   │   │   │       ├── index.ts
│       │   │   │   │   │   │       └── styles.module.scss
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── enablement-area/
│       │   │   │   │   │   ├── EnablementArea/
│       │   │   │   │   │   │   ├── EnablementArea.spec.tsx
│       │   │   │   │   │   │   ├── EnablementArea.tsx
│       │   │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   │   ├── Code/
│       │   │   │   │   │   │   │   │   ├── Code.spec.tsx
│       │   │   │   │   │   │   │   │   ├── Code.tsx
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   ├── CreateTutorialLink/
│       │   │   │   │   │   │   │   │   ├── CreateTutorialLink.spec.tsx
│       │   │   │   │   │   │   │   │   ├── CreateTutorialLink.tsx
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   ├── DeleteTutorialButton/
│       │   │   │   │   │   │   │   │   ├── DeleteTutorialButton.spec.tsx
│       │   │   │   │   │   │   │   │   ├── DeleteTutorialButton.styles.ts
│       │   │   │   │   │   │   │   │   ├── DeleteTutorialButton.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── EmptyPrompt/
│       │   │   │   │   │   │   │   │   ├── EmptyPrompt.spec.tsx
│       │   │   │   │   │   │   │   │   ├── EmptyPrompt.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── Group/
│       │   │   │   │   │   │   │   │   ├── Group.spec.tsx
│       │   │   │   │   │   │   │   │   ├── Group.styles.ts
│       │   │   │   │   │   │   │   │   ├── Group.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.scss
│       │   │   │   │   │   │   │   ├── InternalLink/
│       │   │   │   │   │   │   │   │   ├── InternalLink.spec.tsx
│       │   │   │   │   │   │   │   │   ├── InternalLink.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   ├── styles.module.scss
│       │   │   │   │   │   │   │   │   └── styles.scss
│       │   │   │   │   │   │   │   ├── InternalPage/
│       │   │   │   │   │   │   │   │   ├── InternalPage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── InternalPage.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── LazyInternalPage/
│       │   │   │   │   │   │   │   │   ├── LazyInternalPage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── LazyInternalPage.tsx
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   ├── Navigation/
│       │   │   │   │   │   │   │   │   ├── Navigation.spec.tsx
│       │   │   │   │   │   │   │   │   ├── Navigation.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── Pagination/
│       │   │   │   │   │   │   │   │   ├── Pagination.spec.tsx
│       │   │   │   │   │   │   │   │   ├── Pagination.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── PlainText/
│       │   │   │   │   │   │   │   │   ├── PlainText.spec.tsx
│       │   │   │   │   │   │   │   │   ├── PlainText.tsx
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   ├── UploadTutorialForm/
│       │   │   │   │   │   │   │   │   ├── UploadTutorialForm.spec.tsx
│       │   │   │   │   │   │   │   │   ├── UploadTutorialForm.styles.ts
│       │   │   │   │   │   │   │   │   ├── UploadTutorialForm.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   ├── styles.module.scss
│       │   │   │   │   │   │   └── utils/
│       │   │   │   │   │   │       ├── getFileInfo.ts
│       │   │   │   │   │   │       ├── index.ts
│       │   │   │   │   │   │       └── tests/
│       │   │   │   │   │   │           └── getFileInfo.spec.ts
│       │   │   │   │   │   ├── EnablementAreaWrapper.spec.tsx
│       │   │   │   │   │   ├── EnablementAreaWrapper.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── live-time-recommendations/
│       │   │   │   │       ├── LiveTimeRecommendations.spec.tsx
│       │   │   │   │       ├── LiveTimeRecommendations.tsx
│       │   │   │   │       ├── components/
│       │   │   │   │       │   ├── popover-run-analyze/
│       │   │   │   │       │   │   ├── PopoverRunAnalyze.spec.tsx
│       │   │   │   │       │   │   ├── PopoverRunAnalyze.tsx
│       │   │   │   │       │   │   ├── index.ts
│       │   │   │   │       │   │   └── styles.module.scss
│       │   │   │   │       │   ├── recommendation/
│       │   │   │   │       │   │   ├── Recommendation.spec.tsx
│       │   │   │   │       │   │   ├── Recommendation.styles.ts
│       │   │   │   │       │   │   ├── Recommendation.tsx
│       │   │   │   │       │   │   ├── index.ts
│       │   │   │   │       │   │   └── styles.module.scss
│       │   │   │   │       │   └── welcome-screen/
│       │   │   │   │       │       ├── WelcomeScreen.spec.tsx
│       │   │   │   │       │       ├── WelcomeScreen.tsx
│       │   │   │   │       │       ├── index.ts
│       │   │   │   │       │       └── styles.module.scss
│       │   │   │   │       ├── index.ts
│       │   │   │   │       └── styles.module.scss
│       │   │   │   └── styles.module.scss
│       │   │   ├── table-column-search/
│       │   │   │   ├── TableColumnSearch.spec.tsx
│       │   │   │   ├── TableColumnSearch.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── table-column-search-trigger/
│       │   │   │   ├── TableColumnSearchTrigger.spec.tsx
│       │   │   │   ├── TableColumnSearchTrigger.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── triggers/
│       │   │   │   ├── copilot-trigger/
│       │   │   │   │   ├── CopilotTrigger.styles.ts
│       │   │   │   │   ├── CopilotTrigger.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   └── insights-trigger/
│       │   │   │       ├── InsightsTrigger.spec.tsx
│       │   │   │       ├── InsightsTrigger.styles.ts
│       │   │   │       ├── InsightsTrigger.tsx
│       │   │   │       └── index.ts
│       │   │   ├── upload-file/
│       │   │   │   ├── UploadFile.spec.tsx
│       │   │   │   ├── UploadFile.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── upload-warning/
│       │   │   │   ├── UploadWarning.spec.tsx
│       │   │   │   ├── UploadWarning.tsx
│       │   │   │   ├── index.tsx
│       │   │   │   └── styles.ts
│       │   │   ├── virtual-grid/
│       │   │   │   ├── VirtualGrid.spec.tsx
│       │   │   │   ├── VirtualGrid.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── interfaces.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   ├── tests/
│       │   │   │   │   └── utils.spec.ts
│       │   │   │   └── utils.tsx
│       │   │   ├── virtual-list/
│       │   │   │   ├── VirtualList.spec.tsx
│       │   │   │   ├── VirtualList.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── virtual-table/
│       │   │   │   ├── VirtualTable.spec.tsx
│       │   │   │   ├── VirtualTable.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── interfaces.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   └── utils.tsx
│       │   │   └── yaml-validator/
│       │   │       ├── index.ts
│       │   │       ├── validatePipeline.test.ts
│       │   │       ├── validatePipeline.ts
│       │   │       ├── validateYamlSchema.test.ts
│       │   │       └── validateYamlSchema.ts
│       │   ├── config/
│       │   │   ├── default.ts
│       │   │   ├── domain.ts
│       │   │   └── index.ts
│       │   ├── constants/
│       │   │   ├── allRedisModules.json
│       │   │   ├── api.ts
│       │   │   ├── apiErrors.ts
│       │   │   ├── apiStatusCode.ts
│       │   │   ├── breadcrumbs.ts
│       │   │   ├── browser/
│       │   │   │   └── keyDetailsHeader.ts
│       │   │   ├── browser.ts
│       │   │   ├── bulkActions.ts
│       │   │   ├── cliOutput.ts
│       │   │   ├── commands.ts
│       │   │   ├── commandsVersions.ts
│       │   │   ├── customErrorCodes.ts
│       │   │   ├── databaseList.ts
│       │   │   ├── datetime.ts
│       │   │   ├── durationUnits.tsx
│       │   │   ├── env.ts
│       │   │   ├── featureFlags.ts
│       │   │   ├── featuresHighlighting.tsx
│       │   │   ├── help-texts.tsx
│       │   │   ├── importDatabasesTableResult.ts
│       │   │   ├── index.ts
│       │   │   ├── keyboardShortcuts.tsx
│       │   │   ├── keys.ts
│       │   │   ├── links.ts
│       │   │   ├── mocks/
│       │   │   │   ├── mock-custom-tutorials.ts
│       │   │   │   ├── mock-explore-guides.ts
│       │   │   │   ├── mock-recommendations.ts
│       │   │   │   ├── mock-redis-commands.ts
│       │   │   │   ├── mock-sso.ts
│       │   │   │   └── mock-tutorials.ts
│       │   │   ├── modules.ts
│       │   │   ├── monaco/
│       │   │   │   ├── cypher/
│       │   │   │   │   ├── functions.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── monacoCypher.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── jmespath/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── monacoJmespath.ts
│       │   │   │   ├── monaco.ts
│       │   │   │   ├── monacoRedis.ts
│       │   │   │   ├── monitorEvents.ts
│       │   │   │   ├── sqliteFunctions/
│       │   │   │   │   ├── functions.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── monacoSQLiteFunctions.ts
│       │   │   │   └── theme.ts
│       │   │   ├── notifications.ts
│       │   │   ├── onboarding.ts
│       │   │   ├── pages.ts
│       │   │   ├── prop-types/
│       │   │   │   ├── keys.ts
│       │   │   │   └── zset.ts
│       │   │   ├── pubSub.ts
│       │   │   ├── rdiList.ts
│       │   │   ├── recommendations.ts
│       │   │   ├── redisearch.ts
│       │   │   ├── redisinsight.ts
│       │   │   ├── regex.ts
│       │   │   ├── securityField.ts
│       │   │   ├── serverVersions.ts
│       │   │   ├── socketErrors.ts
│       │   │   ├── socketEvents.ts
│       │   │   ├── sorting.ts
│       │   │   ├── storage.ts
│       │   │   ├── streamViews.ts
│       │   │   ├── string.ts
│       │   │   ├── table.ts
│       │   │   ├── telemetry.ts
│       │   │   ├── texts.tsx
│       │   │   ├── themes.tsx
│       │   │   ├── tutorials.ts
│       │   │   ├── validationErrors.ts
│       │   │   ├── workbench.ts
│       │   │   └── workbenchResults.ts
│       │   ├── contexts/
│       │   │   ├── AppNavigationActionsProvider.tsx
│       │   │   ├── ModalTitleProvider.tsx
│       │   │   └── themeContext.tsx
│       │   ├── electron/
│       │   │   ├── AppElectron.spec.tsx
│       │   │   ├── AppElectron.tsx
│       │   │   ├── components/
│       │   │   │   ├── ConfigAzureAuth/
│       │   │   │   │   ├── ConfigAzureAuth.spec.tsx
│       │   │   │   │   ├── ConfigAzureAuth.tsx
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── ConfigElectron/
│       │   │   │   │   ├── ConfigElectron.spec.tsx
│       │   │   │   │   ├── ConfigElectron.tsx
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── ConfigOAuth/
│       │   │   │   │   ├── ConfigOAuth.spec.tsx
│       │   │   │   │   ├── ConfigOAuth.tsx
│       │   │   │   │   └── index.tsx
│       │   │   │   └── index.ts
│       │   │   ├── constants/
│       │   │   │   ├── cloudAuth.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── ipcEvent.ts
│       │   │   │   └── storageElectron.ts
│       │   │   └── utils/
│       │   │       ├── index.ts
│       │   │       ├── ipcAppRestart.ts
│       │   │       ├── ipcAuth.ts
│       │   │       ├── ipcCheckUpdates.ts
│       │   │       ├── ipcDeleteStoreValues.ts
│       │   │       ├── ipcThemeChange.ts
│       │   │       └── tests/
│       │   │           └── ipcCheckUpdates.spec.ts
│       │   ├── helpers/
│       │   │   ├── constructKeysToTree.ts
│       │   │   ├── index.ts
│       │   │   └── tests/
│       │   │       ├── constructKeysToTree.spec.ts
│       │   │       └── constructKeysToTreeMockResult.ts
│       │   ├── hoc/
│       │   │   └── extractRouter.hoc.tsx
│       │   ├── mocks/
│       │   │   ├── content/
│       │   │   │   └── content.ts
│       │   │   ├── data/
│       │   │   │   ├── analysis.ts
│       │   │   │   ├── bigString.ts
│       │   │   │   ├── dateNow.ts
│       │   │   │   ├── instances.ts
│       │   │   │   ├── mocked_redis_commands.ts
│       │   │   │   ├── oauth.ts
│       │   │   │   └── rdi.ts
│       │   │   ├── factories/
│       │   │   │   ├── browser/
│       │   │   │   │   └── bulkActions/
│       │   │   │   │       └── bulkActionOverview.factory.ts
│       │   │   │   ├── cloud/
│       │   │   │   │   ├── AzureAccount.factory.ts
│       │   │   │   │   ├── RedisCloudAccount.factory.ts
│       │   │   │   │   ├── RedisCloudInstance.factory.ts
│       │   │   │   │   └── RedisCloudSubscription.factory.ts
│       │   │   │   ├── cluster/
│       │   │   │   │   ├── ClusterNodeDetails.factory.ts
│       │   │   │   │   └── RedisClusterInstance.factory.ts
│       │   │   │   ├── database/
│       │   │   │   │   ├── DBInstance.factory.ts
│       │   │   │   │   └── DbConnectionInfo.factory.ts
│       │   │   │   ├── database-analysis/
│       │   │   │   │   └── DatabaseAnalysis.factory.ts
│       │   │   │   ├── pubsub/
│       │   │   │   │   └── PubSubMessage.factory.ts
│       │   │   │   ├── query-library/
│       │   │   │   │   └── queryLibraryItem.factory.ts
│       │   │   │   ├── rdi/
│       │   │   │   │   └── RdiStatistics.factory.ts
│       │   │   │   ├── redisearch/
│       │   │   │   │   ├── IndexField.factory.ts
│       │   │   │   │   └── IndexInfo.factory.ts
│       │   │   │   ├── sentinel/
│       │   │   │   │   └── SentinelMaster.factory.ts
│       │   │   │   ├── vector-search/
│       │   │   │   │   ├── indexInfo.factory.ts
│       │   │   │   │   └── indexList.factory.ts
│       │   │   │   └── workbench/
│       │   │   │       └── commandExectution.factory.ts
│       │   │   ├── handlers/
│       │   │   │   ├── ai/
│       │   │   │   │   ├── assistantHandlers.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── analytics/
│       │   │   │   │   ├── clusterDetailsHandlers.ts
│       │   │   │   │   ├── dbAnalysisHistoryHandlers.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── app/
│       │   │   │   │   ├── featureHandlers.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── infoHandlers.ts
│       │   │   │   │   └── telemetryHandlers.ts
│       │   │   │   ├── browser/
│       │   │   │   │   ├── bulkActionsHandlers.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── queryLibraryHandlers.ts
│       │   │   │   │   └── redisearchHandlers.ts
│       │   │   │   ├── content/
│       │   │   │   │   ├── createRedisButtonsHandlers.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── instances/
│       │   │   │   │   ├── caCertsHandlers.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── instancesHandlers.ts
│       │   │   │   ├── misc/
│       │   │   │   │   └── index.ts
│       │   │   │   ├── oauth/
│       │   │   │   │   ├── cloud.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── rdi/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── rdiHandler.ts
│       │   │   │   │   └── rdiPipelineStrategiesHandlers.ts
│       │   │   │   ├── recommendations/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── recommendationsHandler.ts
│       │   │   │   │   └── recommendationsReadHandler.ts
│       │   │   │   ├── tutorials/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── tutorialsHandlers.ts
│       │   │   │   ├── user/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── userSettingsHandlers.ts
│       │   │   │   └── workbench/
│       │   │   │       ├── commands.ts
│       │   │   │       └── index.ts
│       │   │   ├── rdi/
│       │   │   │   └── RdiInstance.factory.ts
│       │   │   ├── res/
│       │   │   │   └── responseComposition.ts
│       │   │   └── server.ts
│       │   ├── packages/
│       │   │   ├── clients-list/
│       │   │   │   ├── README.md
│       │   │   │   ├── index.html
│       │   │   │   ├── package.json
│       │   │   │   └── src/
│       │   │   │       ├── App.tsx
│       │   │   │       ├── components/
│       │   │   │       │   ├── index.ts
│       │   │   │       │   ├── json-view/
│       │   │   │       │   │   ├── JSONView.spec.tsx
│       │   │   │       │   │   ├── JSONView.tsx
│       │   │   │       │   │   ├── components/
│       │   │   │       │   │   │   ├── json-array/
│       │   │   │       │   │   │   │   ├── JsonArray.tsx
│       │   │   │       │   │   │   │   └── index.ts
│       │   │   │       │   │   │   ├── json-object/
│       │   │   │       │   │   │   │   ├── JsonObject.tsx
│       │   │   │       │   │   │   │   └── index.ts
│       │   │   │       │   │   │   ├── json-pretty/
│       │   │   │       │   │   │   │   ├── JsonPretty.tsx
│       │   │   │       │   │   │   │   └── index.ts
│       │   │   │       │   │   │   └── json-primitive/
│       │   │   │       │   │   │       ├── JsonPrimitive.tsx
│       │   │   │       │   │   │       └── index.ts
│       │   │   │       │   │   ├── index.ts
│       │   │   │       │   │   ├── interfaces.ts
│       │   │   │       │   │   └── utils.ts
│       │   │   │       │   └── table-view/
│       │   │   │       │       ├── TableView.spec.tsx
│       │   │   │       │       ├── TableView.tsx
│       │   │   │       │       └── index.ts
│       │   │   │       ├── global.d.ts
│       │   │   │       ├── icons/
│       │   │   │       │   ├── arrow_down.jsx
│       │   │   │       │   ├── arrow_left.jsx
│       │   │   │       │   ├── arrow_right.jsx
│       │   │   │       │   ├── check.js
│       │   │   │       │   ├── copy.js
│       │   │   │       │   ├── cross.js
│       │   │   │       │   └── empty.js
│       │   │   │       ├── main.tsx
│       │   │   │       ├── result.json
│       │   │   │       ├── styles/
│       │   │   │       │   └── styles.scss
│       │   │   │       └── utils/
│       │   │   │           ├── cachedIcons.ts
│       │   │   │           ├── index.ts
│       │   │   │           └── parseResponse.ts
│       │   │   ├── common/
│       │   │   │   └── package.json
│       │   │   ├── package.json
│       │   │   ├── redisearch/
│       │   │   │   ├── index.html
│       │   │   │   ├── p

================================================
FILE CONTENTS
================================================

================================================
FILE: .ai/README.md
================================================
# RedisInsight AI Development Rules

This directory contains the **single source of truth** for AI-assisted development rules and workflows in RedisInsight.

## Overview

This repository uses a centralized approach to AI development rules:

- **`AGENTS.md`** (at repository root) - Entry point for AI agents with essential commands, testing instructions, and quick reference
- **`.ai/rules/`** - Detailed development standards organized by topic
- **`.ai/commands/`** - AI workflow commands and templates

These rules are used by multiple AI coding assistants:

- **Cursor** (via symlinks: `.cursor/rules/` and `.cursor/commands/`)
- **Augment** (via symlink: `.augment/`)
- **Windsurf** (via symlink: `.windsurfrules`)
- **GitHub Copilot** (via file: `.github/copilot-instructions.md`)

## Structure

```
AGENTS.md                              # 🎯 AI agent entry point
.ai/                                   # Single source of truth
├── README.md                          # This file (human-readable overview)
├── rules/                             # Development standards (modular)
│   ├── code-quality.md                # Linting, TypeScript standards
│   ├── frontend.md                    # React, Redux, UI patterns
│   ├── backend.md                     # NestJS, API patterns
│   ├── testing.md                     # Testing standards
│   ├── branches.md                    # Branch naming conventions
│   ├── commits.md                     # Commit message guidelines
│   └── pull-requests.md               # Pull request process
└── commands/                          # AI workflow commands
    ├── pr-plan.md                     # JIRA ticket implementation planning
    ├── commit-message.md              # Commit message generation
    └── pull-request-review.md         # PR review workflow

# Symlinks (all AI tools read from .ai/)
.cursor/
  ├── rules/ -> ../.ai/rules/          # Cursor AI (rules)
  └── commands/ -> ../.ai/commands/  # Cursor AI (commands)
.augment/ -> .ai/                      # Augment AI
.windsurfrules -> .ai/                 # Windsurf AI
.github/copilot-instructions.md        # GitHub Copilot
```

## For AI Agents

**Start here**: Read `AGENTS.md` at the repository root for:

- Setup and build commands
- Code quality standards
- Testing instructions
- Git workflow guidelines
- Boundaries and best practices

**Then refer to**: `.ai/rules/` for detailed guidelines on specific topics.

## For Human Developers

This directory contains comprehensive development standards that are automatically used by AI coding assistants. The rules are organized into modular files for easy maintenance:

- **Code Quality Standards**: `.ai/rules/code-quality.md` - TypeScript standards, import organization, best practices
- **Frontend Patterns**: `.ai/rules/frontend.md` - React, Redux, styled-components, UI component usage
- **Backend Patterns**: `.ai/rules/backend.md` - NestJS, dependency injection, API patterns
- **Testing Standards**: `.ai/rules/testing.md` - Testing patterns, faker usage, test helpers
- **Branch Naming**: `.ai/rules/branches.md` - Branch naming conventions
- **Commit Messages**: `.ai/rules/commits.md` - Commit message guidelines (Conventional Commits)
- **Pull Request Process**: `.ai/rules/pull-requests.md` - PR creation and review guidelines

## MCP (Model Context Protocol) Setup

AI tools can access external services (JIRA, Confluence, GitHub, Figma) via MCP configuration.

### Initial Setup

1. **Copy the example configuration:**

   ```bash
   cp env.mcp.example .env.mcp
   ```

2. **Get your Atlassian API token:**

   - Go to: https://id.atlassian.com/manage-profile/security/api-tokens
   - Create a classic token by pressing the first "Create Token" button
   - Copy the token

3. **Edit `.env.mcp` with your credentials:**

   - Add your JIRA and Confluence API tokens
   - Note: Figma MCP server uses OAuth authentication and doesn't require API keys

4. **Verify your setup:**

   **For Cursor users:**

   - Restart Cursor to load the new MCP configuration
   - Ask the AI: "Can you list all available MCP tools and test them?"
   - The AI should be able to access JIRA, Confluence, GitHub, Figma, and other configured services
   - **For Figma**: On first use, you'll be prompted to authenticate via OAuth flow in your browser

   **For Augment users:**

   ```bash
   npx @augmentcode/auggie --mcp-config mcp.json "go over all my mcp tools and make sure they work as expected"
   ```

   **For GitHub Copilot users:**

   - Note: GitHub Copilot does not currently support MCP integration
   - MCP services (JIRA, Confluence, etc.) will not be available in Copilot

### Available MCP Services

The `mcp.json` file configures these services:

- **github** - GitHub integration (issues, PRs, repository operations)
- **memory** - Persistent context storage across sessions
- **sequential-thinking** - Enhanced reasoning for complex tasks
- **context-7** - Advanced context management
- **atlassian** - JIRA (RI-XXX tickets) and Confluence integration (requires API tokens in `.env.mcp`)
- **figma** - Figma design files, frames, and layers (uses OAuth authentication - no API key needed)

## Updating These Rules

To update AI rules:

1. **Edit files in `.ai/` only** (never edit symlinked files directly)
2. **Update `AGENTS.md`** if you change commands, testing instructions, or boundaries
3. Changes automatically propagate to all AI tools via symlinks
4. Commit changes to version control

**Remember**: These rules exist to maintain code quality and consistency. Follow them, but also use good judgment.


================================================
FILE: .ai/commands/commit-message.md
================================================
# Commit Message Generation

Generate concise, meaningful commit messages following RedisInsight conventions.

## Format

```
<type>(<scope>): <description>

[optional body]

References: #RI-XXX
```

## Types & Scopes

**Types**: `feat`, `fix`, `refactor`, `test`, `docs`, `chore`, `perf`, `ci`

**Scopes**: `api`, `ui`, `e2e`, `deps`

## Rules

**DO:**
- ✅ Always include scope: `feat(api):`, `fix(ui):`
- ✅ Use imperative mood: "add feature" not "added feature"
- ✅ Start with lowercase after scope
- ✅ Keep subject under 250 characters
- ✅ Inspect all uncommitted files before generating

**DON'T:**
- ❌ Omit scope
- ❌ Use past tense
- ❌ Add period at end
- ❌ Use multiple scopes (split into separate commits)

## Examples

```bash
feat(ui): add user profile editing
fix(api): resolve memory leak in connection pool
refactor(api): extract validation logic
test(e2e): add authentication tests
chore(deps): upgrade React to 18.2
```

## Issue References

**JIRA**: `References: #RI-123` or `Fixes #RI-123`
**GitHub**: `Fixes #123` or `Closes #123`

## Process

1. Run `git status && git diff`
2. Identify scope: API → `api`, UI → `ui`, Both → separate commits
3. Identify type: New → `feat`, Bug → `fix`, Improvement → `refactor`
4. Write description (what changed and why)
5. Add issue reference in body

## Multiple Scopes

Split into separate commits:

```bash
# ✅ Good
git commit -m "feat(api): add user endpoint

References: #RI-123"

git commit -m "feat(ui): add user interface

References: #RI-123"

# ❌ Bad
git commit -m "feat(api,ui): add user feature"
```

## Output Format

Present in copyable format:

```markdown
Based on the changes, here's your commit message:

\`\`\`
feat(api): add OAuth 2.0 authentication

Implements OAuth flow with token management
and refresh token support.

References: #RI-123
\`\`\`
```

If multiple scopes:

```markdown
Changes span multiple scopes. I recommend two commits:

**Commit 1:**
\`\`\`
feat(api): add OAuth endpoints

References: #RI-123
\`\`\`

**Commit 2:**
\`\`\`
feat(ui): add OAuth login interface

References: #RI-123
\`\`\`
```


================================================
FILE: .ai/commands/e2e-fix.md
================================================
---
description: Run E2E tests and fix any failures
argument-hint: <test-pattern>
---

# Fix E2E Tests

Run E2E tests matching a pattern, analyze failures, and fix them.

**Follow all standards in `.ai/rules/e2e-testing.md`**

## Input

**Test pattern** (required) - Test name or describe block pattern
- Examples: `"Analytics > Slow Log"`, `"should add string key"`, `"@smoke"`

## Process

### Step 1: Run the Tests

```bash
cd tests/e2e-playwright
npx playwright test --grep "<pattern>" --reporter=list 2>&1 | tail -50
```

### Step 2: Analyze Failures

If tests fail, check the error context file:

```bash
cat test-results/<test-folder>/error-context.md | head -150
```

The error context contains:
- **Page snapshot** - Current UI state (element tree with refs)
- **Error message** - What assertion failed
- **Call log** - Playwright's action log

### Step 3: Diagnose the Issue

Common failure patterns:

| Error | Likely Cause | Solution |
|-------|--------------|----------|
| `element(s) not found` | Wrong selector or element not rendered | Check snapshot for correct testid/role |
| `Timeout waiting for` | Element takes too long to appear | Add proper wait or check if element exists |
| `expected visible` | Element hidden or removed | Verify UI flow, check if dialog closed |
| `not.toBeVisible failed` | Element still visible | Wait for element to be removed |

### Step 4: Explore UI if Needed

If the error context doesn't reveal the issue, use Playwright MCP to explore:

```
browser_navigate_Playwright → http://localhost:8080
browser_snapshot_Playwright
browser_click_Playwright → element, ref
```

### Step 5: Fix the Test

Apply fixes following these priorities:

1. **Fix selectors** - Use correct `data-testid` or role from snapshot
2. **Fix waits** - Replace `waitForTimeout` with proper element waits
3. **Fix test data** - Ensure unique prefixes to avoid conflicts with other tests
4. **Fix assertions** - Match actual UI behavior

### Step 6: Verify the Fix

```bash
cd tests/e2e-playwright
npx playwright test --grep "<pattern>" --reporter=list 2>&1 | tail -30
```

### Step 7: Run Linter and Type Check

**REQUIRED before completing:**

```bash
cd tests/e2e-playwright
npm run lint && npx tsc --noEmit
```

Both must pass.

## Debugging Tips

### Check Page Snapshot for Correct Selectors

```yaml
# Look for data-testid in the snapshot
- button "Add" [ref=e123] [cursor=pointer]    # Use getByRole('button', { name: 'Add' })
- generic "my-testid" [ref=e456]              # Use getByTestId('my-testid')
- treeitem "String keyname..." [ref=e789]     # Use getByRole('treeitem', { name: /keyname/ })
```

### Handle View Mode Differences

Browser page has List view and Tree view with different element structures:

```typescript
// List view uses gridcell
page.getByRole('gridcell', { name: keyName })

// Tree view uses treeitem  
page.getByRole('treeitem', { name: new RegExp(keyName) })

// KeyList.getKeyRow() handles both
```

### Test Isolation Issues

If test fails inconsistently, check for:
- Missing unique suffix in test data (conflicts with parallel runs)
- Missing cleanup in `afterEach`
- Shared state between tests (use `test.describe.serial` if needed)

### Dropdown/Dialog Issues

If clicking fails after interacting with dropdown:
```typescript
// Close dropdown before next action
await page.keyboard.press('Escape');
```

## Example Usage

```
@e2e-fix "Analytics > Slow Log"
@e2e-fix "should add string key"
@e2e-fix "Browser > Key Details > String"
@e2e-fix "@smoke"
```

## Quick Reference

| Command | Purpose |
|---------|---------|
| `npx playwright test --grep "pattern"` | Run matching tests |
| `npx playwright test --grep "pattern" --debug` | Run with inspector |
| `npx playwright show-trace <trace.zip>` | View test trace |
| `npm run lint` | Check for lint errors |
| `npx tsc --noEmit` | Check for type errors |



================================================
FILE: .ai/commands/e2e-generate.md
================================================
---
description: Explore a page using Playwright MCP and generate E2E tests for a Jira ticket
argument-hint: <ticket-id or ticket-url>
---

# Generate E2E Tests

Use Playwright MCP to explore a page, discover testable functionality, and generate E2E tests based on a Jira ticket.

**Follow all standards in `.ai/rules/e2e-testing.md`**

**Reference:** @tests/e2e-playwright/TEST_PLAN.md

## Prerequisites

- App must be running at `http://localhost:8080` for Playwright exploration

## Input

1. **Ticket ID or URL** (required)

## Process

### Step 1: Fetch Jira Ticket Details

Use the Jira API to get ticket information:
- Summary and description
- Acceptance criteria
- Related components/features

### Step 2: Check Test Plan

Review `tests/e2e-playwright/TEST_PLAN.md` to find related tests:
- ✅ = Already implemented (skip or verify)
- 🔲 = Not implemented (create new)

### Step 3: Explore the Page with Playwright MCP

Navigate to the relevant page based on the ticket's feature area:

```
browser_navigate_Playwright → url (e.g., http://localhost:8080)
browser_snapshot_Playwright
browser_click_Playwright → element, ref
browser_snapshot_Playwright (after each action)
```

Look for:
- `data-testid` attributes → use with `page.getByTestId()`
- Element roles (button, combobox, grid) → use with `page.getByRole()`
- Form field placeholders → use with `page.getByPlaceholder()`

### Step 4: Check Existing Infrastructure

```bash
ls tests/e2e-playwright/tests/
ls tests/e2e-playwright/pages/
ls tests/e2e-playwright/test-data/
```

### Step 5: Generate Test Artifacts

Based on exploration and ticket requirements, create/update:

1. **Page Object** - `tests/e2e-playwright/pages/{feature}/{Feature}Page.ts`
2. **Test Data Factory** - `tests/e2e-playwright/test-data/{feature}/index.ts`
3. **Fixture** (if new page) - Update `tests/e2e-playwright/fixtures/base.ts`
4. **Test File** - `tests/e2e-playwright/tests/{feature}/{action}/*.spec.ts`

### Step 6: Verify

Run only the new tests using list reporter (no HTML report):

```bash
cd tests/e2e-playwright
npx playwright test tests/main/{feature}/{action}/ --project=chromium --reporter=list
npm run lint && npx tsc --noEmit
```

**Note:** Use `--reporter=list` to avoid Playwright generating and hosting an HTML report. Use `--project=chromium` to run only browser tests (faster feedback).

### Step 7: Update Test Plan

Update `tests/e2e-playwright/TEST_PLAN.md` to match actual tests:

- **Rename** test case names to match the actual test titles in spec files
- **Add** new test cases that were created
- **Delete** test cases that were removed or consolidated
- Mark implemented tests as ✅

Test case names in TEST_PLAN.md should exactly match the test titles in spec files (e.g., `should open Help Center and display all menu options`).

## Exploration Checklist

- [ ] Main page purpose and entry points
- [ ] Forms and their fields
- [ ] Buttons and their actions
- [ ] Lists/tables and CRUD operations
- [ ] Dialogs/modals triggered by actions
- [ ] Loading states and spinners
- [ ] Success/error toasts
- [ ] Empty states
- [ ] Validation messages
- [ ] `data-testid` attributes

## Feature-to-URL Mapping

| Feature | URL Pattern |
|---------|-------------|
| Database Management | `http://localhost:8080` |
| Browser | `http://localhost:8080/{dbId}/browser` |
| Workbench | `http://localhost:8080/{dbId}/workbench` |
| CLI | (Panel on any database page) |
| Pub/Sub | `http://localhost:8080/{dbId}/pub-sub` |
| Slow Log | `http://localhost:8080/{dbId}/analytics/slowlog` |
| Database Analysis | `http://localhost:8080/{dbId}/analytics/database-analysis` |
| Settings | `http://localhost:8080/settings` |

**Note:** Replace `{dbId}` with an actual database UUID.

## Example Usage

```
@e2e-generate RI-7992
@e2e-generate https://redislabs.atlassian.net/browse/RI-7992
```

The command will:
1. Fetch ticket details from Jira
2. Determine the relevant page/feature to test
3. Explore the UI at http://localhost:8080
4. Generate appropriate E2E tests based on ticket requirements


================================================
FILE: .ai/commands/generate-release-notes.md
================================================
***

description: Generate release notes from JIRA tickets for a specific version
argument-hint: <version> \[jira-filter-link-or-jql-or-csv-file]
---------------------------------------------------------------

Generate release notes for RedisInsight releases based on JIRA tickets.

## Examples

```bash
# Generate from JIRA filter link (PREFERRED)
generate-release-notes 3.0.3 "https://<jira-domain>/jira/software/c/projects/<project_name>/issues?jql=project%20%3D%20<project_name>..."

# Generate from JIRA query (JQL)
generate-release-notes 3.0.2 "project = <project_key> AND parent = <ticket-key>"

# Generate from CSV export
generate-release-notes 3.0.2 /path/to/jira-export.csv

# Generate from ticket keys
generate-release-notes 3.0.2 <ticket-key-1>,<ticket-key-2>,<ticket-key-3>
```

**Always reference the GitHub releases page as the source of truth for format and style:**
https://github.com/redis/RedisInsight/releases

Use existing releases (especially recent ones like 3.0.2, 3.0.0) as examples for:

* Format and structure
* Tone and language
* Section organization
* Ticket reference format

## 1. Get Version and Ticket Data

**If version is not provided as an argument, prompt the user for it.**

The version should be in semantic versioning format (e.g., `3.0.2`).

**Ticket data can be provided in one of these ways:**

1. **JIRA Filter Link** (PREFERRED): If a JIRA filter link is provided:
   * **Detection**: Check if the input starts with `http://` or `https://` and contains `atlassian.net` and `jql=`
   * **Example**: `https://<jira-domain>/jira/software/c/projects/<project_name>/issues?jql=project%20%3D%20<project_name>...`
   * Extract the JQL query from the URL (decode URL-encoded parameters)
   * **Use the JavaScript script `scripts/fetch-jira-tickets.js` to fetch all tickets matching the filter** (or JIRA MCP tools if available)
   * For each ticket, fetch complete details including:
     * Issue key, summary, type, status, priority
     * Labels (check for "Github-Issue" label)
     * Description
     * All custom fields and metadata needed for categorization
   * Process the tickets the same way as CSV data

2. **JIRA Query (JQL)**: If a raw JQL query is provided (e.g., `project = <project_key> AND parent = <ticket-key>`), use the JIRA MCP tools to fetch tickets with full details

3. **CSV File**: If a CSV file path is provided, parse it to extract ticket information
   * To export from JIRA: Go to JIRA → Search for issues → Run your JQL query → Export → CSV
   * The CSV will contain all ticket information needed for generation

4. **Ticket Keys**: If specific ticket keys are provided (e.g., `<ticket-key-1>,<ticket-key-2>`), fetch each ticket individually with full details

## 2. Fetch and Categorize Tickets

For each ticket, analyze its essence to categorize it:

### Exclusion Rules

**Exclude entirely (do not include in any section):**

* **Spike tickets**: If issue type is "Spike", exclude from release notes
* **POC tickets**: If "POC" appears in the title or description (indicating proof-of-concept that is not implemented), exclude from release notes
* These tickets are not ready for release and should not be mentioned

### Categorization Logic

**Bug indicators:**

* Issue type contains "bug" or "defect"
* Summary contains: "fix", "bug", "error", "issue", "broken", "crash", "fail"
* Labels contain "bug" or "defect"

**IMPORTANT: Bugs/Bug fixes section filter:**

* **Only tickets with the "Github-Issue" label should be included in the Bugs/Bug fixes section**
* When processing tickets from JIRA query or CSV, filter bugs to only include those with the "Github-Issue" label
* **Include all bugs that have the "Github-Issue" label**—every such ticket must appear in the Bugs section with no limit or additional filtering
* Other bug tickets (without this label) should be excluded from the Bugs/Bug fixes section
* **Bugs with Github-Issue label should ONLY appear in the Bugs section, NOT in Headlines or Details sections**
* **Always list each of these bugs with the GitHub issue link**: For every ticket in the Bugs section (tickets with "Github-Issue" label), output the line in the form `[#ISSUE-NUMBER](https://github.com/redis/RedisInsight/issues/ISSUE-NUMBER) [Short description]`. Resolve the GitHub issue number from: (1) JIRA labels such as `Github-4658` (use the number part), (2) JIRA description or linked PR body (e.g. "References #5381", "Closes #5382"), or (3) search on GitHub (repo: redis/RedisInsight) for the issue or PR that matches the bug (e.g. by JIRA key like RI-7894 or by summary). If the number cannot be determined, still include the short description but add a note to look up the link.

**Feature indicators:**

* Issue type contains: "story", "feature", "epic", "enhancement"
* Summary contains: "add", "implement", "new", "introduce", "support", "enable"
* Labels contain "feature" or "enhancement"

**Improvement indicators:**

* Issue type contains: "task", "improvement"
* Summary contains: "improve", "enhance", "update", "optimize", "refactor"
* Labels contain "improvement"

## 3. Generate Release Notes

Use the template from `docs/release-notes/RELEASE_NOTES_TEMPLATE.md` as a reference.

### Format Selection

* **If only bugs (with "Github-Issue" label)**: Use simple "Bug fixes" section only; include every ticket that has the "Github-Issue" label
* **If features/improvements exist**: Use full format with "Headlines", "Details", and "Bugs" sections
  * Note: The "Bugs" section must include all tickets with the "Github-Issue" label (include every one)

### Section Organization Rules

**IMPORTANT: Avoid duplication between sections:**

* **Tickets with "Github-Issue" label**: These should **ONLY** appear in the "Bugs" section, never in "Headlines" or "Details" sections
* **No duplication**: Items in the Bugs section must not appear in Headlines or Details sections
* **Headlines and Details relationship**:
  * Headlines should contain short summaries of the most important user-facing features and improvements
  * Details can expand on Headlines items with more information, or include additional features/improvements not mentioned in Headlines
  * The same item can appear in both Headlines (short summary) and Details (full description), but items from Bugs section must not appear in either

### Release Notes Structure

**Reference format from GitHub releases:** https://github.com/redis/RedisInsight/releases

```markdown
# [VERSION] ([MONTH] [YEAR])

[Release description based on content]

### Headlines (if features exist - see 3.0.0 example)
* [Top 3-5 most important items - user-facing features or critical improvements]

### Details (if features/improvements exist - see 3.0.0 example)
* [Short description of what was added/improved] (for JIRA tickets, don't include ticket ID)
* [#ISSUE-NUMBER](https://github.com/redis/RedisInsight/issues/ISSUE-NUMBER) [Summary] (for GitHub issues, use link format)

### Bugs (if features exist) OR Bug fixes (if only bugs - see 3.0.2 example)
* **IMPORTANT: Include all tickets with the "Github-Issue" label in this section (every one, no limit). Always list each bug with its GitHub issue link.**
* Each line must be: `[#ISSUE-NUMBER](https://github.com/redis/RedisInsight/issues/ISSUE-NUMBER) [Short description of problem and fix]`
* Resolve ISSUE-NUMBER from JIRA labels (e.g. Github-4658 → 4658), ticket/PR references, or GitHub search if needed.

**SHA-512 Checksums**

https://redis.io/docs/latest/develop/tools/insight/release-notes/v.[VERSION]/

**Full Changelog**: https://github.com/redis/RedisInsight/compare/[LAST_RELEASED]...[VERSION]
```

**Important formatting notes from GitHub releases:**

* **For the Bugs section (tickets with "Github-Issue" label)**: Always list each bug with its GitHub issue link: `[#<issue-number>](https://github.com/redis/RedisInsight/issues/<issue-number>) [Short description]`. Resolve the issue number from JIRA labels (e.g. `Github-4658`), from "References #NNNN" / "Closes #NNNN" in linked PRs or descriptions, or by searching GitHub (repo: redis/RedisInsight) for the matching issue.
* **For other JIRA tickets** (Headlines/Details): Do NOT include ticket IDs. Provide a very short description of what was added or fixed.
* **For GitHub issues** (when referenced elsewhere): Use actual links in format `[#<issue-number>](https://github.com/redis/RedisInsight/issues/<issue-number>)` (not just `#<issue-number>` or `#<ticket-key>`).
* Use "SHA-512 Checksums" for all releases
* Keep descriptions concise and user-focused
* Headlines should highlight the most impactful user-facing changes

### Release Description

**Examples from GitHub releases:**

* **Major releases** (x.0.0): "This is the General Availability (GA) release of Redis Insight \[version], a major version upgrade that introduces \[key themes]."
  * See 3.0.0 example: mentions "new UI experience, new navigation architecture, and foundational improvements"
* **Patch releases with only bugs**:
  * Check ticket priorities to determine description:
    * If only high/critical priority bugs: "This maintenance patch release includes critical bug fixes for Redis Insight \[major.minor].0."
    * If only medium/low priority bugs: "This maintenance patch release includes non-critical bug fixes for Redis Insight \[major.minor].0."
    * If both critical and non-critical: "This maintenance patch release includes critical and non-critical bug fixes for Redis Insight \[major.minor].0."
  * See 3.0.2 example
* **Patch releases with features**: "This release includes new features, improvements, and bug fixes for Redis Insight."
  * See 2.64, 2.62, 2.60 examples for format with "Highlights" and "Details" sections

## 4. Generate All Release Note Formats

After generating the main release notes, create **two different formats** for different platforms:

### 4.1 GitHub/Redis Docs Format

Save the generated release notes to `RELEASE_NOTES_[VERSION].md` in the repository root.

**Important: Links**

* **Checksums link**: Use format `https://redis.io/docs/latest/develop/tools/insight/release-notes/v.[VERSION]/`
  * Example for 3.0.3: `https://redis.io/docs/latest/develop/tools/insight/release-notes/v.3.0.3/`
* **Full Changelog link**: Use format `https://github.com/redis/RedisInsight/compare/[LAST_RELEASED]...[VERSION]`
  * Example for 3.0.3 (if last release was 3.0.2): `https://github.com/redis/RedisInsight/compare/3.0.2...3.0.3`
  * Determine the last released version by checking GitHub releases or repository tags

### 4.2 Store Format (App Store & Microsoft Store)

Save to `RELEASE_NOTES_STORE_[VERSION].md` in the repository root.

**IMPORTANT:** Reuse the same content from the GitHub/Redis Docs format (`RELEASE_NOTES_[VERSION].md`), but apply different formatting. Only the formatting changes - the content (sections, descriptions, items) should remain the same.

**Note:** This single file is used for both App Store and Microsoft Store as they have identical format requirements.

**Format requirements (formatting changes only):**

* Plain text only (no markdown formatting)
* Section header: "Bug fixes" (if only bugs) or appropriate section name (if features exist) - keep the same section names from GitHub format
* Use bullet points with `•` character (not `*`)
* No version number or date header
* No links (remove SHA-512 Checksums and Full Changelog sections)
* No markdown headers (`#`, `###`)
* No bold formatting (`**`)
* Just the section headers and bullet points - same content, different formatting

**Example format:**

```
Bug fixes

• Fixed default database sorting order to display most recently used databases at the top
• Restored missing Pub/Sub functionality including message clear option, full message display with line wrapping, and descending chronological order (most recent messages first)
```

**If features/improvements exist, use appropriate section headers:**

```
Features

• [Feature description]

Improvements

• [Improvement description]

Bug fixes

• [Bug fix description]
```

## 5. Display Summary

Show a summary of:

* Total tickets processed
* Number of bugs, features, and improvements
* Which format was used (simple vs. full)
* File locations for all formats:
  * GitHub/Redis Docs: `RELEASE_NOTES_[VERSION].md`
  * App Store & Microsoft Store: `RELEASE_NOTES_STORE_[VERSION].md`

## JIRA Filter Link Processing

When a JIRA filter link is provided:

1. **Parse the URL and fetch tickets**: Extract the JQL query from the `jql` parameter in the URL and use the JavaScript script `scripts/fetch-jira-tickets.js` to fetch all tickets matching the query
   * Example URL: `https://<jira-domain>/jira/software/c/projects/<project_name>/issues?jql=project%20%3D%20<project_name>%20AND%20status%20%3D%20Closed`
   * Extract and decode: `project = <project_name> AND status = Closed`
   * **Use `node scripts/fetch-jira-tickets.js <jira-filter-url>` to fetch tickets** (the script uses JIRA REST API with credentials from `.env.mcp`)
   * Alternatively, if JIRA MCP tools are available, use them (check with `list_mcp_resources`) such as `jira_search` or `jira_get_project_issues`

2. **Fetch full details**: For each ticket returned, fetch complete information:
   * **Basic fields**: key, summary, type, status, priority, description
   * **Labels**: Extract all labels and check for "Github-Issue" label (critical for filtering)
   * **Custom fields**: Any additional fields needed for categorization
   * **Links**: Check for linked GitHub pull requests or issues
   * **Metadata**: Created date, updated date, resolved date, assignee, reporter

3. **Transform to CSV-like structure**: Convert the fetched ticket data into a structure similar to CSV format:
   ```javascript
   {
       'Issue key': '<ticket-key>',
       'Summary': 'Fix default database sorting...',
       'Issue Type': 'Bug',
       'Status': 'Closed',
       'Priority': 'Medium',
       'Labels': ['Github-Issue', 'Github-Issue-Notification'],
       'Description': 'Full description text...',
       // ... other fields
   }
   ```

4. **Process**: Use the same categorization and filtering logic as CSV processing

## Notes

* Keep summaries concise, user-focused, and descriptive
* For Headlines section, prioritize the most impactful user-facing changes (see 3.0.0 example)
* Ensure all closed tickets are included if they match the criteria
* **Always check GitHub releases page** before generating to ensure consistency with published format:
  https://github.com/redis/RedisInsight/releases
* Match the tone and style of existing releases (professional, clear, user-focused)


================================================
FILE: .ai/commands/pr-plan.md
================================================
---
description: Analyze a JIRA ticket and create a detailed implementation plan
argument-hint: <ticket-id or ticket-url>
---

Create a comprehensive implementation plan for a JIRA ticket.

## 1. Fetch JIRA Ticket

**If ticket ID is not provided as an argument, prompt the user for it.**

Fetch all the information from the ticket, its comments, linked documents, and parent ticket.

Use the `jira` tool to fetch the ticket details.

## 4. Create Implementation Plan

Use `sequential-thinking` tool for complex analysis. Break down into thoughts:

### Thought 1-5: Requirements Analysis

- Parse acceptance criteria into specific tasks
- Identify functional requirements
- Identify non-functional requirements (performance, security, cost)
- Map requirements to system components
- Identify dependencies and blockers

### Thought 6-10: Architecture Planning

- Determine which services are affected
- Identify new components needed
- Identify existing components to modify
- Plan data flow and interactions
- Consider error handling and edge cases

### Thought 16-20: Implementation Breakdown

- Break work into logical phases
- Identify dependencies between phases
- Consider testing strategy for each phase
- Plan for incremental delivery

### Thought 21-25: Testing Strategy

- Identify test scenarios from acceptance criteria
- Plan unit tests (behavior-based, not implementation)
- Plan integration tests
- Consider edge cases and error scenarios
- Plan test data needs

### Thought 26-30: Risk Assessment

- Identify technical risks
- Identify integration risks
- Identify timeline risks
- Identify knowledge gaps
- Plan mitigation strategies

## 5. Generate Implementation Plan Document

**CRITICAL: You MUST create and save a plan document. This is NOT optional.**

Create a comprehensive Markdown document and save it to `docs/pr-plan-{ticket-id}-{brief-description}.md` using the `write` tool.

**IMPORTANT: Planner Detection**
- Detect which AI tool is being used (Cursor, Augment, or other)
- Set the **Planner** field to:
  - "Cursor Agent" if running in Cursor
  - "Augment Agent" if running in Augment
  - "[Tool Name] Agent" for other tools
- You can infer the tool from context, user messages, or environment

**The document structure MUST include all sections below:**

```markdown
# Implementation Plan: [Ticket Title]

**JIRA Ticket:** [MOD-XXXXX](https://redislabs.atlassian.net/browse/MOD-XXXXX)
**Epic:** [EPIC-XXX](link) (if applicable)
**Parent:** [PARENT-XXX](link) (if applicable)
**Plan Date:** [Date]
**Planner:** [Detect and set: Cursor Agent / Augment Agent / [Tool Name] Agent]

---

## Executive Summary

**Components Affected:**

- [component name]

**Key Risks:**

1. [Risk with mitigation]
2. [Risk with mitigation]
3. [Risk with mitigation]

---

## 1. Requirements Summary

**Story (Why):**
[Quote or summarize the story from the ticket]

**Acceptance Criteria (What):**

1. [AC1]
2. [AC2]
3. [AC3]

**Functional Requirements:**

- [Requirement 1]
- [Requirement 2]

**Non-Functional Requirements:**

- [NFR 1 - e.g., Performance: <100ms response time]
- [NFR 2 - e.g., Security: Requires authentication]

**Resources Provided:**

- [Link 1: Description]
- [Link 2: Description]

## 2. Current State Analysis

### Frontend Changes

**Components to Modify:**

- [Component 1]: [What changes are needed]
- [Component 2]: [What changes are needed]

**Components to Create:**

- [Component 1]: [Why it's needed]
- [Component 2]: [Why it's needed]

**Components to Reuse:**

- [Component 1]: [How it will be used]
- [Component 2]: [How it will be used]

### Backend Changes

**Services to Modify:**

- [Service 1]: [What changes are needed]
- [Service 2]: [What changes are needed]

**Services to Create:**

- [Service 1]: [Why it's needed]
- [Service 2]: [Why it's needed]

**APIs to Modify:**

- [API 1]: [What's changing]
- [API 2]: [What's changing]

**APIs to Create:**

- [API 1]: [Why it's needed]
- [API 2]: [Why it's needed]

**Data Models:**

- [Model 1]: [Description and whether it needs extension]
- [Model 2]: [Description and whether it needs extension]

**Repositories:**

- [Repo 1]: [Description and whether it can be reused]

---

## 3. Implementation Plan

### Phase 1: [Phase Name]

**Goal:** [What this phase achieves]

**Tasks:**

1. [ ] [Task 1 - specific, actionable]
   - Files: [List of files to create/modify]
   - Acceptance: [How to verify this task is done]
2. [ ] [Task 2]
   - Files: [List of files]
   - Acceptance: [Verification criteria]

**Deliverables:**

- [Deliverable 1]
- [Deliverable 2]

**Testing:**

- [Test scenario 1]
- [Test scenario 2]

### Phase 2: [Phase Name]

[Same structure as Phase 1]

### Phase 3: [Phase Name]

[Same structure as Phase 1]

---

## 5. Testing Strategy

### Test Scenarios (from Acceptance Criteria)

**AC1: [Acceptance Criterion]**

- Test Scenario: [Given-When-Then]
- Test Type: Unit/Integration
- Test Location: [File path]

**AC2: [Acceptance Criterion]**

- Test Scenario: [Given-When-Then]
- Test Type: Unit/Integration
- Test Location: [File path]

### Edge Cases and Error Scenarios

1. **[Edge Case 1]**

   - Scenario: [Description]
   - Expected Behavior: [What should happen]
   - Test: [How to test]

2. **[Error Scenario 1]**
   - Scenario: [Description]
   - Expected Error: [Error type/code]
   - Test: [How to test]

### Test Data Needs

- [Test data 1]: [Description]
- [Test data 2]: [Description]

---

## 6. Risk Assessment and Mitigation

### Technical Risks

| Risk     | Likelihood      | Impact          | Mitigation            |
| -------- | --------------- | --------------- | --------------------- |
| [Risk 1] | High/Medium/Low | High/Medium/Low | [Mitigation strategy] |
| [Risk 2] | High/Medium/Low | High/Medium/Low | [Mitigation strategy] |

### Integration Risks

| Risk     | Likelihood      | Impact          | Mitigation            |
| -------- | --------------- | --------------- | --------------------- |
| [Risk 1] | High/Medium/Low | High/Medium/Low | [Mitigation strategy] |

### Timeline Risks

| Risk     | Likelihood      | Impact          | Mitigation            |
| -------- | --------------- | --------------- | --------------------- |
| [Risk 1] | High/Medium/Low | High/Medium/Low | [Mitigation strategy] |

### Knowledge Gaps

- [Gap 1]: [What we don't know and how to find out]
- [Gap 2]: [What we don't know and how to find out]
```

---

## 6. Save the Plan Document

**CRITICAL: You MUST save the plan document using the `write` tool.**

1. **Generate the complete plan document** following the structure in section 5
2. **Save it** to `docs/pr-plan-{ticket-id}-{brief-description}.md` using `write` tool
3. **Verify the file was created** by confirming the write tool succeeded

**Example filename:** `docs/pr-plan-MOD-11280-dp-services-clean-architecture.md`

---

## 7. Follow-up Actions

After saving the plan document:

1. **Confirm document was saved** - Show the file path to the user
2. **Summarize key findings** for the user:
   - Key risks
   - Recommended approach
   - **Confirm plan document was saved** (file path)
3. **Ask if user wants to:**
   - Review the plan document
   - Proceed with implementation

---

## Important Notes

- **ALWAYS save the plan document** - use `write` tool to save to `docs/pr-plan-{ticket-id}-{brief-description}.md`
- **Use main branch as baseline** - all analysis should be against current main
- **Be specific and actionable** - every task should be clear and verifiable
- **Consider PR stacking** - plan for small, reviewable PRs (see `.ai/rules/pull-requests.md`). plan breaking the implementation in a stack of PRs.
- **Follow all project standards** - reference rules in `.ai/rules/`
- **Document assumptions** - if anything is unclear, document the assumption made
- **Identify blockers early** - surface dependencies and knowledge gaps upfront

## Execution Order Summary

**The correct order of operations is:**

1. ✅ Fetch JIRA ticket
2. ✅ Analyze current codebase state
3. ✅ Create implementation plan using sequential-thinking
4. ✅ Generate implementation plan document content
5. ✅ **Save plan document to `docs/pr-plan-{ticket-id}-{brief-description}.md`** (CRITICAL - use write tool)
6. ✅ Present results to user and confirm document location

**Do NOT skip step 5 - it is mandatory and must be done during command execution.**

**Step 5 is MANDATORY:** You MUST use the `write` tool to save the plan document. Do NOT just present the plan to the user without saving it.


================================================
FILE: .ai/commands/pull-request-review.md
================================================
# PR Review Command

## Purpose

Reviews code changes in the current branch against requirements, best practices, and project standards.

## Usage

```bash
/pr:review <ticket-id>
```

**Examples**:

- JIRA ticket: `/pr:review RI-1234`
- GitHub issue: `/pr:review 456`

## Prerequisites

1. Checkout the branch to review locally
2. Ensure the ticket ID is valid and accessible
3. Have JIRA MCP tool configured (if using JIRA integration)

## Process

### 1. Gather Context

- Fetch JIRA ticket details (if available)
- Read requirements and acceptance criteria
- Identify affected files in the PR
- Review recent commits

### 2. Code Analysis

Analyze the changes against:

- **Code Quality**: Linting rules, TypeScript types, complexity
- **Testing**: Test coverage, test quality, edge cases
- **Performance**: Rendering optimizations
- **Security**: Input validation, XSS prevention, credential handling
- **Accessibility**: ARIA labels, keyboard navigation, semantic HTML
- **Best Practices**: React patterns, Redux usage, NestJS conventions

### 3. Requirements Check

- Verify all acceptance criteria are met
- Check for missing functionality
- Validate edge case handling
- Ensure proper error messages

### 4. Testing Validation

- Unit test coverage (80% minimum)
- Integration tests for API endpoints
- Component tests for React components
- E2E tests for critical flows
- No fixed timeouts or magic numbers
- Use of faker for test data

### 5. Generate Report

Create a markdown report in `docs/reviews/pr-<ticket-id>-<date>.md` with:

**Note**: Use appropriate ticket reference format:

- JIRA tickets: `pr-RI-1234-2024-11-20.md`
- GitHub issues: `pr-456-2024-11-20.md`

Report should include:

- **Summary**: Overview of changes
- **Strengths**: What was done well
- **Issues**: Categorized by severity (Critical, High, Medium, Low)
- **Suggestions**: Improvements and optimizations
- **Requirements Coverage**: Acceptance criteria checklist
- **Testing Assessment**: Coverage and quality analysis
- **Risk Assessment**: Potential issues or impacts

## Review Checklist

### Code Quality

- [ ] No linting errors
- [ ] TypeScript types are proper (no `any` without justification)
- [ ] Code follows project conventions
- [ ] No console.log statements
- [ ] Import order is correct
- [ ] Cognitive complexity within limits
- [ ] No duplicate code

### Testing

- [ ] Unit tests added/updated
- [ ] Test coverage meets thresholds
- [ ] Tests use faker for data generation
- [ ] No fixed timeouts in tests
- [ ] Edge cases are tested
- [ ] Mocks are properly configured

### React/Frontend (if applicable)

- [ ] Functional components with hooks
- [ ] Proper state management (Redux vs local)
- [ ] Effects cleanup properly
- [ ] No unnecessary re-renders
- [ ] Accessibility considerations
- [ ] Styled-components for styling (no new SCSS modules)
- [ ] Proper error boundaries
- [ ] Component folder structure follows guidelines

### NestJS/Backend (if applicable)

- [ ] Dependency injection used properly
- [ ] DTOs for validation
- [ ] Proper error handling
- [ ] Swagger documentation
- [ ] Service layer separation
- [ ] Database transactions where needed

### Performance

- [ ] No performance regressions
- [ ] Large lists virtualized
- [ ] Routes lazy loaded
- [ ] Expensive operations memoized
- [ ] Bundle size impact acceptable

### Security

- [ ] Input validation
- [ ] Output sanitization
- [ ] No sensitive data in logs
- [ ] Proper authentication/authorization
- [ ] SQL injection prevention (if applicable)

### Documentation

- [ ] README updated if needed
- [ ] Complex logic documented
- [ ] API documentation updated
- [ ] Breaking changes noted

## Example Output

**Note**: Use appropriate ticket format (RI-1234 for JIRA or #456 for GitHub issues)

```markdown
# PR Review: RI-1234 - Add User Profile Editing

**Date**: 2024-11-20
**Reviewer**: AI Assistant
**Branch**: feature/RI-1234/user-profile-editing

## Summary

This PR implements user profile editing functionality including UI components,
API endpoints, and data persistence. The implementation follows project
standards with good test coverage.

## High Priority Issues

1. **Missing Input Validation** (Security)
   - File: `redisinsight/api/src/user/user.service.ts:45`
   - Issue: Email validation missing on backend
   - Recommendation: Add class-validator decorator to DTO

## Medium Priority Issues

1. **Performance Concern** (Performance)

   - File: `redisinsight/ui/src/components/UserProfile.tsx:78`
   - Issue: Inline function in render
   - Recommendation: Extract to useCallback

2. **Test Flakiness Risk** (Testing)
   - File: `redisinsight/ui/src/components/UserProfile.spec.tsx:45`
   - Issue: Direct state check without waitFor
   - Recommendation: Wrap assertion in waitFor

## Low Priority Issues

1. **Code Style** (Style)
   - File: Multiple files
   - Issue: Inconsistent import ordering
   - Recommendation: Run `yarn prettier:fix`

## Risk Assessment

**Low Risk** - Well-tested implementation with minor issues that can be
addressed before merge. No breaking changes or security vulnerabilities.

## Recommendation

**Approve with comments** - Address high priority issues before merging.
Consider suggestions for future improvements.
```

## Notes

- Focus on constructive feedback
- Prioritize issues by severity
- Be specific with file locations and line numbers
- Provide actionable recommendations
- Balance criticism with recognition of good practices
- Consider the broader impact of changes


================================================
FILE: .ai/rules/backend.md
================================================
---
description: NestJS backend development patterns, module structure, services, controllers, DTOs, and error handling
globs: redisinsight/api/**/*.ts
alwaysApply: false
---

# Backend Development (NestJS/API)

## Module Structure

### NestJS Architecture

- Follow **modular architecture** (feature-based modules)
- Use **dependency injection** throughout
- **Separate concerns**: Controllers, Services, Repositories
- Use **DTOs** for validation and data transfer
- Apply **proper error handling** with NestJS exceptions

### Module Folder Structure

Each feature module in its own directory under `api/src/`:

```
feature/
├── feature.module.ts           # Module definition
├── feature.controller.ts       # REST endpoints
├── feature.service.ts          # Business logic
├── feature.service.spec.ts     # Service tests
├── feature.controller.spec.ts  # Controller tests
├── feature.types.ts            # Interfaces and types related to the feature
├── dto/                        # Data transfer objects
│   ├── create-feature.dto.ts
│   ├── update-feature.dto.ts
│   └── feature.dto.ts
├── entities/                   # TypeORM entities
├── repositories/               # Custom repositories
├── exceptions/                 # Custom exceptions
├── guards/                     # Feature-specific guards
├── decorators/                 # Custom decorators
└── constants/                  # Feature constants
```

### File Naming

- **Modules**: `feature.module.ts`
- **Controllers**: `feature.controller.ts`
- **Services**: `feature.service.ts`
- **DTOs**: `create-feature.dto.ts`, `update-feature.dto.ts`
- **Entities**: `feature.entity.ts`
- **Interfaces and types**: `feature.types.ts`
- **Tests**: `feature.service.spec.ts`
- **Constants**: `feature.constants.ts`
- **Exceptions**: `feature-not-found.exception.ts`

### Constants Organization

Store feature-specific constants in dedicated constants file:

```typescript
export const FEATURE_CONSTANTS = {
  MAX_NAME_LENGTH: 100,
  DEFAULT_PAGE_SIZE: 20,
} as const;

export const FEATURE_ERROR_MESSAGES = {
  NOT_FOUND: 'Feature not found',
  INVALID_INPUT: 'Invalid feature data',
} as const;
```

### Imports Order

1. Node.js built-in modules
2. External dependencies (`@nestjs/*`, etc.)
3. Internal modules (using `apiSrc/*` alias)
4. Local relative imports

## Service Layer

### Service Pattern

- Inject dependencies via constructor
- Use TypeORM repositories
- Handle errors with NestJS exceptions
- Use Logger for important operations
- Keep business logic in services (not controllers)

### Dependency Injection

Always inject dependencies via constructor with proper decorators:

```typescript
@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private readonly userRepository: Repository<User>,
    private readonly emailService: EmailService,
  ) {}
}
```

## Controller Layer

### Controller Pattern

- Keep controllers thin (delegate to services)
- Use proper HTTP decorators (`@Get`, `@Post`, etc.)
- Use `@Body`, `@Param`, `@Query` for inputs
- Apply guards with `@UseGuards()`
- Document with Swagger decorators

### HTTP Status Codes

- Use `@HttpCode()` decorator for non-standard codes
- Return appropriate status codes (200, 201, 204, 400, 404, etc.)

## Data Transfer Objects (DTOs)

### Validation

Use `class-validator` decorators for validation:

- `@IsString()`, `@IsNumber()`, `@IsEmail()`
- `@IsNotEmpty()`, `@IsOptional()`
- `@MinLength()`, `@MaxLength()`
- `@Min()`, `@Max()`

### Swagger Documentation

Use `@ApiProperty()` and `@ApiPropertyOptional()` for Swagger docs.

## Error Handling

### NestJS Exceptions

Use appropriate exception types:

- `NotFoundException` - 404
- `BadRequestException` - 400
- `UnauthorizedException` - 401
- `ForbiddenException` - 403
- `ConflictException` - 409
- `InternalServerErrorException` - 500

### Custom Exceptions

**Prefer custom exceptions over generic ones** when you need:

- Consistent error codes for frontend handling
- Specific error messages from constants
- Consistent error structure across the codebase

Create custom exceptions following existing patterns:

```typescript
// src/modules/feature/exceptions/feature-invalid.exception.ts
import {
  HttpException,
  HttpExceptionOptions,
  HttpStatus,
} from '@nestjs/common';
import ERROR_MESSAGES from 'src/constants/error-messages';
import { CustomErrorCodes } from 'src/constants';

export class FeatureInvalidException extends HttpException {
  constructor(
    message = ERROR_MESSAGES.FEATURE_INVALID,
    options?: HttpExceptionOptions,
  ) {
    const response = {
      message,
      statusCode: HttpStatus.BAD_REQUEST,
      error: 'FeatureInvalid',
      errorCode: CustomErrorCodes.FeatureInvalid,
    };

    super(response, response.statusCode, options);
  }
}
```

### Error Logging

```typescript
private readonly logger = new Logger(ServiceName.name)

this.logger.error('Error message', error.stack, { context })
```

## Redis Integration

### Redis Service Pattern

- Use RedisClient from `apiSrc/modules/redis`
- Handle errors gracefully
- Log Redis operations
- Use try-catch for error handling

## Code Quality

### Cognitive Complexity (≤ 15)

- Use early returns to reduce nesting
- Extract complex logic to separate functions
- Avoid deeply nested conditions

### No Duplicate Strings

Extract repeated strings to constants in constants file.

## API Documentation (Swagger)

### Required Decorators

- `@ApiTags()` - Group endpoints
- `@ApiOperation()` - Describe operation
- `@ApiResponse()` - Document responses
- `@ApiParam()` - Document params
- `@ApiQuery()` - Document query params
- `@ApiBearerAuth()` - Auth requirement

## Checklist

- [ ] Services use dependency injection
- [ ] DTOs have validation decorators
- [ ] Controllers have Swagger documentation
- [ ] Proper HTTP status codes used
- [ ] Error handling with appropriate exceptions
- [ ] Logging for important operations
- [ ] Transactions for related DB operations
- [ ] Configuration via ConfigService
- [ ] Guards for authentication/authorization
- [ ] Cognitive complexity ≤ 15


================================================
FILE: .ai/rules/code-quality.md
================================================
---
alwaysApply: true
---

# Code Quality Standards

## Critical Rules

- **ALWAYS run linter** after code changes: `yarn lint`
- Linter must pass before committing
- No console.log in production code (use console.warn/error only)

## TypeScript Standards

### Essential Rules

- Use TypeScript for all new code
- **Avoid `any`** - use proper types or `unknown`
- **Prefer interfaces** for object shapes
- Use **type** for unions, intersections, primitives
- Add explicit return types for non-obvious functions
- Leverage type inference where clear

## Import Organization

### Required Order (enforced by ESLint)

1. External libraries (`react`, `lodash`, etc.)
2. Built-in Node modules (`path`, `fs` - backend only)
3. Internal modules with aliases (`uiSrc/*`, `apiSrc/*`)
4. Sibling/parent relative imports
5. Style imports (ALWAYS LAST)

### Module Aliases

- `uiSrc/*` → `redisinsight/ui/src/*`
- `apiSrc/*` → `redisinsight/api/src/*`
- `desktopSrc/*` → `redisinsight/desktop/src/*`

✅ **Use aliases**: `import { Button } from 'uiSrc/components/Button'`  
❌ **Avoid relative**: `import { Button } from '../../../ui/src/components/Button'`

## Naming Conventions

- **Components**: `PascalCase` - `UserProfile`
- **Functions/Variables**: `camelCase` - `fetchUserProfile`
- **Constants**: `UPPER_SNAKE_CASE` - `MAX_RETRY_ATTEMPTS`
- **Booleans**: Use `is/has/should` prefix - `isLoading`, `hasError`

## SonarJS Rules

- Keep cognitive complexity low (refactor complex functions)
- Extract duplicate strings to constants
- Follow DRY principle - no duplicate code
- Use immediate return (avoid unnecessary intermediate variables)

## Best Practices

- Use destructuring for objects and arrays
- Use template literals over string concatenation
- Use `const` by default, `let` only when reassignment needed
- Use descriptive variable names
- Handle errors properly
- Clean up subscriptions and timers
- Use constants instead of magic numbers

## Vite Cache Management

When updating npm packages (especially `@redis-ui/*` packages):

1. **Clear Vite cache** after `yarn install`:

   ```bash
   rm -rf node_modules/.vite
   rm -rf redisinsight/ui/node_modules/.vite
   ```

2. **Restart dev server** to rebuild dependencies

3. This ensures new package versions are properly loaded

## Pre-Commit Checklist

- [ ] `yarn lint` passes
- [ ] No TypeScript errors
- [ ] Import order is correct
- [ ] No `any` types without reason
- [ ] No console.log statements
- [ ] No magic numbers
- [ ] Descriptive variable names
- [ ] Low cognitive complexity
- [ ] No duplicate code
- [ ] Vite cache cleared (if updated dependencies)


================================================
FILE: .ai/rules/e2e-testing.md
================================================
---
description: Playwright E2E testing standards, page object models, test structure, fixtures, and navigation patterns
globs: tests/e2e-playwright/**/*.ts
alwaysApply: false
---

# E2E Testing Standards (Playwright)

## Location

All E2E tests are in `tests/e2e-playwright/`. This is a **standalone package** - no imports from `redisinsight/ui/` or `redisinsight/api/`.

## Test Plan

**Always refer to `tests/e2e-playwright/TEST_PLAN.md`** for:
- Test coverage status (✅ implemented, 🔲 not implemented)
- Feature implementation order
- Test data requirements

**After implementing tests, update TEST_PLAN.md** to mark tests as ✅.

## Project Structure

```
tests/e2e-playwright/
├── TEST_PLAN.md         # Master test plan with coverage status
├── config/              # Configuration (env, databases)
│   └── databases/       # Database configs by type
├── fixtures/            # Playwright fixtures
├── helpers/             # API helpers for setup/teardown
├── pages/               # Page Object Models
│   ├── BasePage.ts      # Base class for all pages
│   ├── InstancePage.ts  # Base class for database instance pages
│   ├── components/      # Shared components (InstanceHeader, NavigationTabs, BottomPanel)
│   └── {feature}/       # Feature-specific pages (browser/, cli/, etc.)
├── test-data/           # Test data factories
├── tests/               # Test specs organized by project
│   ├── main/            # Default parallel tests
│   │   └── {feature}/
│   │       └── {action}/
│   ├── auto-update/     # Serial tests with special setup
│   └── electron/        # Electron-specific tests
└── types/               # TypeScript types
```

## Playwright Projects

Tests are organized into **projects** based on execution requirements. Each project can have different parallelism, timeouts, and setup.

| Project | Folder | Parallelism | Use Case |
|---------|--------|-------------|----------|
| `main` | `tests/main/` | Parallel | Standard tests that can run concurrently |
| `auto-update` | `tests/auto-update/` | Serial | Tests requiring special setup or causing flakiness |
| `electron` | `tests/electron/` | Serial | Electron-specific features (deep links, etc.) |

### Running Projects

```bash
npx playwright test --project=main           # Only main parallel tests
npx playwright test --project=auto-update    # Only auto-update tests
npx playwright test                           # All projects
```

### When to Create a New Project

Create a new project folder when tests:
- Require different parallelism settings (serial vs parallel)
- Need different global setup/teardown
- Would cause flakiness when run with other tests
- Require special environment configuration

### Adding a New Project

1. Create folder under `tests/` (e.g., `tests/my-feature/`)
2. Add project configuration in `playwright.config.ts`:

```typescript
{
  name: 'my-feature',
  testDir: './tests/my-feature',
  fullyParallel: false, // or true
  workers: 1,
  timeout: 120000,
  // Optional: different setup
  // globalSetup: './my-feature-setup.ts',
}
```

## Page Objects

### Page Object Hierarchy

```
BasePage (abstract)
  ├── DatabasesPage           # Databases list page
  ├── SettingsPage            # Settings page
  └── InstancePage (abstract) # Base for all database instance pages
        ├── instanceHeader    # Database name, stats, breadcrumb
        ├── navigationTabs    # Browse, Workbench, Analyze, Pub/Sub
        ├── bottomPanel       # CLI, Command Helper, Profiler
        └── BrowserPage       # Browser-specific (extends InstancePage)
              └── WorkbenchPage (future)
              └── AnalyzePage (future)
              └── PubSubPage (future)
```

### Extend the Appropriate Base Class

- **BasePage** - For standalone pages (DatabasesPage, SettingsPage)
- **InstancePage** - For pages within a connected database (BrowserPage, WorkbenchPage, etc.)

Page objects are **stateless** - they don't store database objects. Pass `databaseId` to navigation methods.

```typescript
// For database instance pages - extend InstancePage
import { Page, Locator } from '@playwright/test';
import { InstancePage } from '../InstancePage';

export class WorkbenchPage extends InstancePage {
  readonly editor: Locator;

  constructor(page: Page) {
    super(page);
    this.editor = page.getByTestId('workbench-editor');
  }

  // InstancePage provides: instanceHeader, navigationTabs, bottomPanel
  // Plus navigation methods: navigateToBrowser(), openCli(), etc.

  async goto(databaseId: string): Promise<void> {
    await this.gotoDatabase(databaseId);
    await this.navigationTabs.gotoWorkbench();
    await this.waitForLoad();
  }
}
```

### Component-Based Structure

Break large pages into components:

```typescript
// pages/feature/FeaturePage.ts
export class FeaturePage extends InstancePage {
  readonly dialog: FeatureDialog;
  readonly list: FeatureList;

  constructor(page: Page) {
    super(page);
    this.dialog = new FeatureDialog(page);
    this.list = new FeatureList(page);
  }
}
```

## Test Structure

### File Organization

```
tests/
├── main/                # Default parallel tests (most tests go here)
│   └── {feature}/       # e.g., databases, browser, workbench
│       └── {action}/    # e.g., add, edit, delete
│           ├── standalone.spec.ts
│           └── cluster.spec.ts
├── auto-update/         # Serial tests with special setup
└── electron/            # Electron-specific tests
```

### Test Setup Pattern

Use simple, explicit setup with clear separation of concerns. **Page objects are fixtures** - they don't store database state. Pass `databaseId` to `goto()` methods.

```typescript
import { test, expect } from '../../../fixtures/base';
import { standaloneConfig } from '../../../config/databases/standalone';
import { DatabaseInstance } from '../../../types';

test.describe('Feature > Action', () => {
  let database: DatabaseInstance;

  // Setup: Create database once for all tests
  test.beforeAll(async ({ apiHelper }) => {
    database = await apiHelper.createDatabase({
      name: 'test-feature-db',
      host: standaloneConfig.host,
      port: standaloneConfig.port,
    });
  });

  // Teardown: Clean up database after all tests
  test.afterAll(async ({ apiHelper }) => {
    await apiHelper.deleteDatabase(database.id);
  });

  test.describe('Sub-feature', () => {
    // Navigation: Pass databaseId to goto() - page is a fixture
    test.beforeEach(async ({ featurePage }) => {
      await featurePage.goto(database.id);
    });

    // Tests receive page fixtures they need
    test('should do something', async ({ featurePage }) => {
      await featurePage.doAction();
      await expect(featurePage.result).toBeVisible();
    });

    // Tests that need both page and apiHelper
    test('should create and verify', async ({ featurePage, apiHelper }) => {
      await apiHelper.createKey(database.id, 'test-key', 'value');
      await featurePage.refresh();
      await expect(featurePage.keyList).toContainText('test-key');
    });
  });
});
```

### Key Principles

1. **`beforeAll`** - Create database/test data via API (runs once)
2. **`afterAll`** - Clean up database/test data via API (runs once)
3. **`beforeEach`** - Navigate to page via UI using `goto(databaseId)` (runs before each test)
4. **Individual tests** - Receive page fixtures they need in the signature
5. **Page objects are stateless** - Don't store database objects in pages, pass IDs to methods

### Avoid These Anti-Patterns

```typescript
// ❌ BAD: Storing database in page object
const browserPage = createBrowserPage(database);  // OLD pattern - don't use

// ✅ GOOD: Pass databaseId to goto()
await browserPage.goto(database.id);

// ❌ BAD: Using page fixture without declaring it in test signature
test('should work', async () => {
  await browserPage.doSomething();  // browserPage is undefined!
});

// ✅ GOOD: Declare fixtures in test signature
test('should work', async ({ browserPage }) => {
  await browserPage.doSomething();
});

// ❌ BAD: Navigation inside each test
test('should work', async ({ browserPage }) => {
  await browserPage.goto(database.id);  // Should be in beforeEach
  // ...
});

// ❌ BAD: Using test.describe.serial when not needed
test.describe.serial('Feature', () => { // Use regular describe unless tests truly depend on each other
  // ...
});
```

## Test Data

### Use Fishery Factories with Faker

Use the [fishery](https://github.com/thoughtbot/fishery) library for test data factories:

```typescript
import { Factory } from 'fishery';
import { faker } from '@faker-js/faker';

export const TEST_PREFIX = 'test-';

export const ConfigFactory = Factory.define<Config>(() => ({
  name: `${TEST_PREFIX}${faker.string.alphanumeric(8)}`,
  host: '127.0.0.1',
  port: 6379,
}));

// Usage in tests
const config = ConfigFactory.build();
const config = ConfigFactory.build({ name: 'custom-name' });
```

### Cleanup Pattern

Always prefix test data with `test-` for easy cleanup:

```typescript
// In apiHelper
async deleteTestData(): Promise<number> {
  return this.deleteByPattern(new RegExp(`^${TEST_PREFIX}`));
}
```

## Fixtures

### Add New Fixtures to base.ts

```typescript
// fixtures/base.ts
type Fixtures = {
  myPage: MyPage;
  apiHelper: ApiHelper;
};

export const test = base.extend<Fixtures>({
  myPage: async ({ page }, use) => {
    await use(new MyPage(page));
  },
  apiHelper: async ({}, use) => {
    const helper = new ApiHelper();
    await use(helper);
    await helper.dispose();
  },
});
```

## UI Exploration with Playwright MCP

**Before writing tests, ALWAYS use Playwright MCP to explore the UI:**

### Why Explore First?
- Discover actual `data-testid` attributes used in the application
- Understand element roles and accessible names for `getByRole()`
- See page structure and component hierarchy
- Avoid trial-and-error test writing

### Exploration Workflow

1. **Navigate to the page**: `browser_navigate_Playwright` to target URL
2. **Take snapshot**: `browser_snapshot_Playwright` to see element tree
3. **Interact with elements**: `browser_click_Playwright` to trigger dialogs, dropdowns, etc.
4. **Wait for async content**: `browser_wait_for_Playwright` for dynamic content
5. **Document findings**: Add discovered UI patterns to `TEST_PLAN.md` under the feature section

### What to Look For

- `data-testid` attributes → use with `page.getByTestId()`
- Element roles (button, combobox, grid, treeitem) → use with `page.getByRole()`
- Accessible names → use with `{ name: 'text' }` option
- Form field placeholders → use with `page.getByPlaceholder()`
- Text content patterns → use with `page.getByText()`

### Use Discovered Patterns in Page Objects

After exploring, use discovered patterns directly in Page Object locators:

```typescript
// Use data-testid when available
this.addButton = page.getByTestId('btn-add-key');

// Use role + name for accessible elements
this.submitButton = page.getByRole('button', { name: 'Submit' });

// Use placeholder for form fields
this.searchInput = page.getByPlaceholder('Search...');
```

**Note**: Keep TEST_PLAN.md as a simple visual list of test cases. Document UI patterns in Page Object comments if needed.

## Best Practices

### ✅ DO

- **Explore UI with Playwright MCP before writing tests**
- **Use Page Object navigation methods** (e.g., `browserPage.goto()`, `workbenchPage.goto()`)
- Use `data-testid` attributes for stable selectors
- Use `getByRole`, `getByLabel` for accessible elements
- Wait for elements with `waitFor({ state: 'visible' })`
- Clean up test data in `afterEach`
- Use API for setup, UI for assertions
- Handle both List view and Tree view in key assertions

### ❌ DON'T

- **NEVER use `page.goto()` directly** - tests must work in both browser and Electron
- Write tests without exploring the actual UI first
- Use fixed timeouts (`waitForTimeout`)
- Use CSS selectors for dynamic content
- Leave test data after tests
- Import from `redisinsight/ui/` or `redisinsight/api/`
- Hardcode test data (use faker)
- Assume element structure without verification

## Navigation (IMPORTANT)

**All navigation must use UI-based methods, NOT URL navigation.**

Tests must work in both browser mode (http://localhost:8080) and Electron mode (no baseURL). Direct `page.goto()` calls fail in Electron because there's no baseURL.

### Navigation Architecture

**BasePage** provides only fundamental navigation:
```typescript
await this.gotoHome();              // Click Redis logo → databases list
await this.gotoDatabase(dbId);      // Click database → Browser page (default)
```

**Each page owns its navigation** via its `goto()` method:
```typescript
await settingsPage.goto();           // Settings page
await browserPage.goto(dbId);        // Browser page for database
await workbenchPage.goto(dbId);      // Workbench page for database
await analyticsPage.goto(dbId);      // Analytics page for database
await pubSubPage.goto(dbId);         // Pub/Sub page for database
```

**NavigationTabs component** handles tab switching within a connected database:
```typescript
await browserPage.navigationTabs.gotoBrowser();
await browserPage.navigationTabs.gotoWorkbench();
await browserPage.navigationTabs.gotoAnalyze();
await browserPage.navigationTabs.gotoPubSub();
```

### ✅ Correct Navigation Pattern

```typescript
// Use Page Object's goto() method in beforeEach
test.beforeEach(async ({ browserPage }) => {
  await browserPage.goto(database.id);  // Navigates and waits for page load
});

// Switch tabs when already connected
await browserPage.navigationTabs.gotoWorkbench();
```

### ❌ Incorrect Navigation Pattern

```typescript
// NEVER do this - fails in Electron
await page.goto(`/${database.id}/browser`);
await page.goto('/settings');
await page.goto('/');
```

## Running Tests

```bash
npm test                    # Main project tests (default)
npm run test:main           # Main project tests only
npm run test:electron       # Electron tests (auto-detects platform)
npm run test:all            # All projects
ENV=ci npm test             # CI environment
ENV=staging npm test        # Staging environment
```

## Code Quality (IMPORTANT)

**Always run linter and type checker after making changes:**

```bash
npm run lint                # ESLint check
npx tsc --noEmit            # TypeScript type check
```

Both must pass before committing. Common issues:
- Unused variables/imports
- Missing return types
- `any` types (avoid when possible)
- Null/undefined handling (use proper types like `Promise<string | null>`)

## Test Isolation (IMPORTANT)

Tests should be isolated and not depend on execution order:

### 1. Shared Database with beforeAll/afterAll

```typescript
test.describe('Feature Name', () => {
  let database: DatabaseInstance;

  test.beforeAll(async ({ apiHelper }) => {
    database = await apiHelper.createDatabase({ name: 'test-feature-db', ... });
  });

  test.afterAll(async ({ apiHelper }) => {
    await apiHelper.deleteDatabase(database.id);
  });

  // Tests can run in parallel - they share the database but don't modify shared state
});
```

### 2. Use Serial Only When Tests Truly Depend on Each Other

```typescript
// Only use .serial when tests modify state that subsequent tests depend on
test.describe.serial('Workflow that modifies state', () => {
  test('step 1: create item', ...);
  test('step 2: modify item created in step 1', ...);
  test('step 3: delete item', ...);
});
```

### 3. Unique Test Data Per Test (when needed)

```typescript
test('should create unique item', async ({ apiHelper }) => {
  const uniqueName = `test-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
  // Use uniqueName for this test's data
});
```

## Feature-to-Path Mapping

Follow this naming convention for test and page object paths:

| Feature | Test Path | Page Object Path |
|---------|-----------|------------------|
| Database List | `tests/main/databases/list/` | `pages/databases/` |
| Add Database | `tests/main/databases/add/` | `pages/databases/` |
| Import Database | `tests/main/databases/import/` | `pages/databases/` |
| Browser - Key List | `tests/main/browser/key-list/` | `pages/browser/` |
| Browser - Add Key | `tests/main/browser/add-key/` | `pages/browser/` |
| Browser - Key Details | `tests/main/browser/key-details/` | `pages/browser/` |
| Workbench | `tests/main/workbench/` | `pages/workbench/` |
| CLI | `tests/main/cli/` | `pages/cli/` |
| Pub/Sub | `tests/main/pubsub/` | `pages/pubsub/` |
| Slow Log | `tests/main/analytics/slow-log/` | `pages/analytics/` |
| DB Analysis | `tests/main/analytics/analysis/` | `pages/analytics/` |
| Settings | `tests/main/settings/` | `pages/settings/` |
| Navigation | `tests/main/navigation/` | `pages/navigation/` |
| Auto-Update | `tests/auto-update/` | `pages/` (shared) |
| Deep Links | `tests/electron/deep-links/` | `pages/` (shared) |

**Note**: Most tests go in `tests/main/`. Only use other project folders for tests with special requirements (serial execution, different setup, etc.).


================================================
FILE: .ai/rules/frontend.md
================================================
---
description: React frontend development patterns, Redux, styled-components, UI components, and hooks
globs: redisinsight/ui/**/*.{ts,tsx}
alwaysApply: false
---

# Frontend Development (React/Redux)

## Component Structure

### Functional Components

- Use **functional components with hooks** (no class components)
- **Prefer named exports** over default exports
- Keep components focused and single-responsibility
- Extract complex logic into custom hooks

### Component Folder Structure

Each component in its own directory under `**/ComponentName`:

```
ComponentName/
  ComponentName.tsx          # Main component
  ComponentName.styles.ts    # Styled-components styles (PascalCase)
  ComponentName.types.ts     # TypeScript interfaces
  ComponentName.spec.tsx     # Tests
  ComponentName.constants.ts # Constants
  ComponentName.story.tsx    # Storybook examples
  hooks/                     # Custom hooks
  components/                # Sub-components
  utils/                     # Utility functions
```

### Props Interface

- Name as `ComponentNameProps`
- Use separate interfaces for complex prop objects
- Always use proper TypeScript types, never `any`

### Imports Order in Components

1. External dependencies (`react`, `redux`, etc.)
2. Internal modules (aliases)
3. Local imports (types, constants, hooks)
4. Styles (always last: `import { Container } from './Component.styles'`)

### Barrel Files

Use barrel files (`index.ts`) only when exporting **3 or more** items. Make sure exports appear in only one barrel file, not propagated up the chain.

## Styled Components

**We are migrating to styled-components** (deprecating SCSS modules).

### Encapsulate Styles in .styles.ts

Keep all component styles in dedicated `.styles.ts` files using styled-components. Use PascalCase for the filename to match the component name:

```
ComponentName/
  ComponentName.tsx
  ComponentName.styles.ts  # ✅ PascalCase
  # Not component-name.styles.ts ❌
```

### Import Pattern

Keep all component styles in dedicated .style.ts files and import them with a namespace.

**CRITICAL: `import * as S` is reserved for local styles only** (e.g., from `ComponentName.styles.ts`). When you need to use styled components from external components, create a local styles file that re-exports them.

#### ✅ Good

```typescript
// ComponentName.tsx
import * as S from './ComponentName.styles'

return (
  <S.Container>
    <S.Title>Title</S.Title>
    <S.Content>Content</S.Content>
  </S.Container>
)

// ComponentName.styles.ts (when re-exporting from external component)
export { ExternalStyledComponent } from '../ExternalComponent/ExternalComponent.styles'
```

#### ❌ Bad

```typescript
// ❌ BAD: Importing styled components directly from external component
import * as S from '../ExternalComponent/ExternalComponent.styles'

// ❌ BAD: Named imports instead of namespace
import { Container, Title, Content } from './Component.styles'
```

### Use Layout Components Instead of div

**Prefer `FlexGroup` over `div`** when creating flex containers:

```typescript
// ✅ GOOD: Use FlexGroup
import { FlexGroup } from 'uiSrc/components/base/layout/flex'

export const Wrapper = styled(FlexGroup)`
  user-select: none;
`

// Usage: Pass layout props as component props
<Wrapper align="center" justify="end">
  {children}
</Wrapper>

// ❌ BAD: Using div with hardcoded flex properties
export const Wrapper = styled.div`
  display: flex;
  align-items: center;
  justify-content: flex-end;
`
```

### Pass Layout Props as Component Props

**Don't hardcode layout properties** in styled components when using layout components like `FlexGroup`. Pass them as props instead:

```typescript
// ✅ GOOD: Pass props in JSX
export const Wrapper = styled(FlexGroup)`
  user-select: none;
`

<Wrapper align="center" justify="end">
  {children}
</Wrapper>

// ❌ BAD: Hardcoding in styled component
export const Wrapper = styled(FlexGroup)`
  align-items: center;
  justify-content: flex-end;
  user-select: none;
`
```

### Use Gap Prop Instead of Custom Margins

**Prefer `gap` prop on layout components** instead of custom margins for spacing between elements:

```typescript
// ✅ GOOD: Use gap prop
<Row align="center" justify="between" gap="l">
  <FlexItem>Item 1</FlexItem>
  <FlexItem>Item 2</FlexItem>
</Row>
```

### Use Theme Spacing Instead of Magic Numbers

**Always use theme spacing values** instead of hardcoded pixel values:

```typescript
// ✅ GOOD: Use theme spacing
export const Container = styled(Row)`
  height: ${({ theme }) => theme.core.space.space500};
  padding: 0 ${({ theme }) => theme.core.space.space200};
  margin-bottom: ${({ theme }) => theme.core.space.space200};
`;

// ❌ BAD: Using magic numbers
export const Container = styled(Row)`
  height: 64px;
  padding: 0 16px;
  margin-bottom: 16px;
`;
```

### Use Semantic Colors from Theme

**Always use semantic colors** from the theme instead of CSS variables or hardcoded colors:

```typescript
// ✅ GOOD: Use semantic colors
export const Header = styled(Row)`
  background-color: ${({ theme }) =>
    theme.semantic.color.background.neutral100};
  border-bottom: 1px solid
    ${({ theme }) => theme.semantic.color.border.neutral500};
`;

// ❌ BAD: Using deprecated EUI CSS variables
export const Header = styled(Row)`
  background-color: var(--euiColorEmptyShade);
  border-bottom: 1px solid var(--separatorColor);
`;
```

### Use Layout Components (Row/Col/FlexGroup) Instead of div

**Prefer layout components** from the layout system instead of regular `div` elements:

```typescript
// ✅ GOOD: Use Row component
import { Row } from 'uiSrc/components/base/layout/flex'

export const PageHeader = styled(Row)`
  height: ${({ theme }) => theme.core.space.space500};
  background-color: ${({ theme }) =>
    theme.semantic.color.background.neutral100};
`

<PageHeader align="center" justify="between" gap="l">
  {children}
</PageHeader>

// ❌ BAD: Using div with flex properties
export const PageHeader = styled.div`
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 64px;
`
```

### Conditional Styling

Use `$` prefix for transient props that shouldn't pass to DOM:

```typescript
export const Button = styled.button<{ $isActive?: boolean }>`
  background-color: ${({ $isActive }) => ($isActive ? '#007bff' : '#6c757d')};
`;
```

### Avoid !important

**Never use `!important` in styled-components**. Styled-components handles CSS specificity through component hierarchy. If you need to override styles, use more specific selectors or adjust the component structure:

```typescript
// ✅ GOOD: Rely on CSS specificity
export const IconButton = styled(IconButton)<{ isOpen: boolean }>`
  ${({ isOpen }) =>
    isOpen &&
    css`
      background-color: ${({ theme }) =>
        theme.semantic.color.background.primary200};
    `}
`;

// ❌ BAD: Using !important
export const IconButton = styled(IconButton)`
  background-color: ${({ theme }) =>
    theme.semantic.color.background.primary200} !important;
`;
```

### Verify Type System Compatibility

When using layout components or other typed components, verify your prop values match the type system:

```typescript
// Check the component's type definitions
// FlexGroup accepts: align?: 'center' | 'stretch' | 'baseline' | 'start' | 'end'
// Use valid values from the type system
```

## State Management (Redux)

### When to Use What

- **Global State (Redux)**:

  - Data shared across multiple components
  - Data persisting across routes
  - Server state (API data)
  - User preferences/settings

- **Local State (useState)**:

  - UI state (modals, dropdowns, tabs)
  - Form inputs before submission
  - Component-specific temporary data

- **Derived State (Selectors)**:
  - Computed values from Redux state
  - Filtered/sorted lists
  - Aggregated data

### Redux Toolkit Patterns

#### Slice Structure

- Use `createSlice` from Redux Toolkit
- Define proper TypeScript types for state
- Use `PayloadAction<T>` for action typing
- Handle async with `extraReducers` and thunks

#### Thunks

- Use `createAsyncThunk` for async operations
- Handle pending, fulfilled, and rejected states
- Use `rejectWithValue` for error handling

#### Selectors

- Create basic selectors for direct state access
- Use `createSelector` from `reselect` for memoized/computed values
- Keep selectors in separate `selectors.ts` file

## React Best Practices

### Performance

- Use `useCallback` for functions passed as props
- Use `useMemo` for expensive computations
- Use `React.memo` for expensive components
- Avoid inline arrow functions in JSX props

### Effect Cleanup

Always clean up subscriptions, timers, and event listeners in `useEffect` return function.

### Keys in Lists

- Use unique, stable IDs (not array indices)
- Only use indices if list never reorders and items have no IDs

### Conditional Rendering

- Use early returns for loading/error states
- Avoid deeply nested ternaries - extract to functions

## Custom Hooks

### Extract Reusable Logic

Create custom hooks for reusable stateful logic. Store component-specific hooks in the component's `/hooks` directory.

## Form Handling

Use Formik with Yup for validation. Keep form logic in custom hooks when complex.

## UI Components

**⚠️ IMPORTANT**:

- We are **deprecating Elastic UI** components
- Migrating to **Redis UI** (`@redis-ui/*`)
- **Use internal wrappers** from `uiSrc/components/ui`
- **DO NOT import directly** from `@redis-ui/*`

### Component Usage

```typescript
// ✅ GOOD: Import from internal wrappers
import { Button, Input, FlexGroup } from 'uiSrc/components/ui';

// ❌ BAD: Don't import directly from @redis-ui
import { Button } from '@redis-ui/components';

// ❌ DEPRECATED: Don't use Elastic UI for new code
import { EuiButton } from '@elastic/eui';
```

### Migration Guidelines

- ✅ Use internal wrappers from `uiSrc/components/ui` for all new features
- ✅ Create internal wrappers for Redis UI components as needed
- ✅ Replace Elastic UI when touching existing code
- ❌ Do not import directly from `@redis-ui/*`
- ❌ Do not add new Elastic UI imports

## Icons

**⚠️ IMPORTANT**: Always use icons from Redis UI library instead of custom SVGs.

### Icon Usage

- **Use Redis UI icons** from `@redis-ui/icons` via `iconRegistry.tsx`
- Icons are automatically exported via `export * from '@redis-ui/icons'` in `iconRegistry.tsx`
- Use `RiIcon` component with icon type: `<RiIcon type="FolderOpenIcon" />`
- **DO NOT create custom SVG icons** - check if the icon exists in Redis UI library first

### Custom Icons (Exception)

Only create custom SVG icons if:

- The icon doesn't exist in Redis UI library
- It's a project-specific icon that won't be added to the library

## Testing Components

### Always Use Shared `renderComponent` Helper

**CRITICAL**: Create a `renderComponent` helper function for each component test file:

```typescript
describe('MyComponent', () => {
  const defaultProps: MyComponentProps = {
    id: faker.string.uuid(),
    name: faker.person.fullName(),
    onComplete: jest.fn(),
  }

  const renderComponent = (propsOverride?: Partial<MyComponentProps>) => {
    const props = { ...defaultProps, ...propsOverride }

    return render(
      <Provider store={store}>
        <MyComponent {...props} />
      </Provider>
    )
  }

  it('should render', () => {
    renderComponent()
    // assertions
  })
})
```

Benefits:

- Centralized setup and providers
- Default props in one place
- Easy prop overrides per test
- No duplicate render logic

### Testing Redux

Create a test store with `configureStore` for components connected to Redux.

## Key Principles

1. **Separation of Concerns**: Keep styles, types, constants, logic separate
2. **Colocate Related Code**: Keep sub-components and hooks close to usage
3. **Consistent Naming**: Follow conventions across all components
4. **Type Safety**: Always define proper types, never `any`
5. **Testability**: Structure for easy testing with `renderComponent` helper
6. **Styled Components**: Prefer styled-components over SCSS modules
7. **Layout Components**: Use FlexGroup instead of div for flex containers, pass layout props as component props
8. **Type Safety**: Verify prop values match component type definitions (e.g., FlexGroup's align/justify values)


================================================
FILE: .ai/rules/git-safety.md
================================================
---
description: Critical safety guardrails for protected branches - prevents direct commits, pushes, and force pushes to main, latest, and release branches
alwaysApply: true
---

# Git Safety Rules for AI Agents

## 🚫 CRITICAL: Protected Branch Rules

**AI agents must NEVER commit to or push to protected branches under any circumstances.**

### Protected Branches

- `main` - Primary production branch
- `latest` - Latest stable release
- `release/*` - Release branches (e.g., `release/v2.0.0`)

This is a non-negotiable rule that applies to all scenarios:

### Prohibited Actions

- ❌ **Direct commits** - Never run `git commit` while on a protected branch
- ❌ **Direct pushes** - Never run `git push origin <protected-branch>` or `git push` while on a protected branch
- ❌ **Force pushes** - Never run `git push --force` or `git push -f` targeting protected branches
- ❌ **Merging into protected branches locally** - Never run `git merge <branch>` while on a protected branch
- ❌ **Rebasing protected branches** - Never run `git rebase` while on a protected branch
- ❌ **Resetting protected branches** - Never run `git reset` while on a protected branch

### Required Workflow

1. **Always create a feature branch** before making any changes
2. **Verify current branch** before any git operation using `git branch --show-current`
3. **Create Pull Requests** for all changes - let the review process handle merging

### Pre-Push Checklist

Before executing any push command, AI agents must:

1. ✅ Confirm current branch is NOT a protected branch (`main`, `latest`, `release/*`)
2. ✅ Verify the remote and branch target

### Error Recovery

If accidentally on a protected branch with uncommitted changes:

1. Stash changes: `git stash`
2. Create new branch: `git checkout -b <appropriate-branch-name>`
3. Apply changes: `git stash pop`
4. Continue work on the new branch

## Rationale

- Protected branches represent production-ready or release code
- All changes must go through code review via Pull Requests
- Direct pushes bypass CI/CD checks and team review
- Mistakes on protected branches can affect the entire team and deployment pipeline



================================================
FILE: .ai/rules/testing.md
================================================
---
description: Jest and Testing Library standards, test patterns, faker usage, renderComponent helper, and mocking
globs: "redisinsight/**/*.spec.{ts,tsx}"
alwaysApply: false
---

# Testing Standards and Practices

## Core Principles

- **Write tests for all new features**
- Follow **AAA pattern**: Arrange, Act, Assert
- Use **descriptive test names**: "should do X when Y"
- **CRITICAL**: Never use fixed time waits - tests must be deterministic
- **CRITICAL**: Use faker library (@faker-js/faker) for test data

## Test Organization

```typescript
describe('FeatureService', () => {
  describe('findById', () => {
    it('should return entity when found', () => {});
    it('should throw NotFoundException when not found', () => {});
  });

  describe('create', () => {
    it('should create entity with valid data', () => {});
    it('should throw error with invalid data', () => {});
  });
});
```

## Frontend Testing (Jest + Testing Library)

### Running Specific Tests

```bash
# Run a specific test file
node 'node_modules/.bin/jest' 'redisinsight/ui/src/path/to/Component.spec.tsx' -c 'jest.config.cjs'

# Run a specific test by name (use -t flag)
node 'node_modules/.bin/jest' 'redisinsight/ui/src/path/to/Component.spec.tsx' -c 'jest.config.cjs' -t 'test name pattern'

# Example:
node 'node_modules/.bin/jest' 'redisinsight/ui/src/slices/tests/browser/keys.spec.ts' -c 'jest.config.cjs' -t 'refreshKeyInfoAction'
```

### CRITICAL: Always Use Shared `renderComponent` Helper

**Create a `renderComponent` helper for each component test file**:

```typescript
import { faker } from '@faker-js/faker';

describe('MyComponent', () => {
  // Define default props with faker
  const defaultProps: MyComponentProps = {
    id: faker.string.uuid(),
    name: faker.person.fullName(),
    email: faker.internet.email(),
    onComplete: jest.fn(),
  };

  // Shared render helper
  const renderComponent = (propsOverride?: Partial<MyComponentProps>) => {
    const props = { ...defaultProps, ...propsOverride };

    return render(
      <Provider store={store}>
        <MyComponent {...props} />
      </Provider>
    );
  };

  beforeEach(() => {
    jest.clearAllMocks();
  });

  it('should render component', () => {
    renderComponent();
    expect(screen.getByText(defaultProps.name)).toBeInTheDocument();
  });

  it('should handle click', async () => {
    const mockOnComplete = jest.fn();
    renderComponent({ onComplete: mockOnComplete });

    fireEvent.click(screen.getByRole('button'));

    await waitFor(() => {
      expect(mockOnComplete).toHaveBeenCalledTimes(1);
    });
  });
});
```

**Benefits**:

- Centralized setup (providers, router, theme)
- Default props defined once
- Easy prop overrides per test
- No duplicate setup code

### Complex Component Setup

For components requiring Router, ThemeProvider, etc., include them in `renderComponent`:

```typescript
const renderComponent = (propsOverride?: Partial<Props>) => {
  const props = { ...defaultProps, ...propsOverride }

  return render(
    <Provider store={store}>
      <BrowserRouter>
        <ThemeProvider theme={theme}>
          <Component {...props} />
        </ThemeProvider>
      </BrowserRouter>
    </Provider>
  )
}
```

### Testing with Redux

Create a test store with `configureStore` for Redux-connected components:

```typescript
const createTestStore = (initialState = {}) => {
  return configureStore({
    reducer: { user: userSlice.reducer },
    preloadedState: initialState,
  });
};

const renderComponent = (propsOverride?: Partial<Props>, storeState = {}) => {
  const testStore = createTestStore(storeState);
  // render with testStore
};
```

### Query Priorities (Testing Library)

**Prefer accessible queries** (as users would interact):

```typescript
// ✅ PREFERRED
screen.getByRole('button', { name: /submit/i });
screen.getByLabelText('Email');
screen.getByPlaceholderText('Enter name');

// ⚠️ LAST RESORT
screen.getByTestId('user-profile');

// ❌ AVOID
wrapper.find('.button-class');
```

### Testing Async Behavior

```typescript
// ✅ GOOD: waitFor with proper queries
await waitFor(() => {
  expect(screen.getByText('Data loaded')).toBeInTheDocument();
});

// ✅ GOOD: waitForElementToBeRemoved
await waitForElementToBeRemoved(() => screen.queryByText('Loading...'));

// ✅ GOOD: findBy queries (built-in waiting)
const element = await screen.findByText('Async content');

// ❌ BAD: Fixed timeouts (flaky tests)
await new Promise((resolve) => setTimeout(resolve, 1000));
```

### Mocking API Calls (MSW)

Use Mock Service Worker for API mocking:

```typescript
import { rest } from 'msw';
import { setupServer } from 'msw/node';

const server = setupServer(
  rest.get('/api/users/:id', (req, res, ctx) => {
    return res(
      ctx.json({
        id: req.params.id,
        name: faker.person.fullName(),
      }),
    );
  }),
);

beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
```

## Backend Testing (NestJS/Jest)

### Service Test Pattern

```typescript
import { Factory } from 'fishery';
import { faker } from '@faker-js/faker';

// Define factory for User entity
const userFactory = Factory.define<User>(() => ({
  id: faker.string.uuid(),
  name: faker.person.fullName(),
  email: faker.internet.email(),
}));

describe('UserService', () => {
  let service: UserService;
  let repository: Repository<User>;

  const mockRepository = {
    find: jest.fn(),
    findOne: jest.fn(),
    save: jest.fn(),
    update: jest.fn(),
    delete: jest.fn(),
  };

  beforeEach(async () => {
    const module = await Test.createTestingModule({
      providers: [
        UserService,
        {
          provide: getRepositoryToken(User),
          useValue: mockRepository,
        },
      ],
    }).compile();

    service = module.get<UserService>(UserService);
    repository = module.get<Repository<User>>(getRepositoryToken(User));
  });

  afterEach(() => {
    jest.clearAllMocks();
  });

  it('should return user when found', async () => {
    const mockUser = userFactory.build();
    mockRepository.findOne.mockResolvedValue(mockUser);

    const result = await service.findById(mockUser.id);

    expect(result).toEqual(mockUser);
  });
});
```

### Controller Test Pattern

```typescript
import { Factory } from 'fishery';
import { faker } from '@faker-js/faker';

const userFactory = Factory.define<User>(() => ({
  id: faker.string.uuid(),
  name: faker.person.fullName(),
  email: faker.internet.email(),
}));

describe('UserController', () => {
  let controller: UserController;
  let service: UserService;

  const mockService = {
    findAll: jest.fn(),
    findById: jest.fn(),
    create: jest.fn(),
  };

  beforeEach(async () => {
    const module = await Test.createTestingModule({
      controllers: [UserController],
      providers: [{ provide: UserService, useValue: mockService }],
    }).compile();

    controller = module.get<UserController>(UserController);
  });

  it('should return user from service', async () => {
    const mockUser = userFactory.build();
    mockService.findById.mockResolvedValue(mockUser);

    const result = await controller.findById(mockUser.id);

    expect(result).toEqual(mockUser);
  });
});
```

### Integration Tests (E2E)

```typescript
describe('UserController (e2e)', () => {
  let app: INestApplication;

  beforeAll(async () => {
    const module = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = module.createNestApplication();
    await app.init();
  });

  afterAll(async () => {
    await app.close();
  });

  it('/users (GET)', () => {
    return request(app.getHttpServer())
      .get('/users')
      .expect(200)
      .expect((res) => {
        expect(Array.isArray(res.body)).toBe(true);
      });
  });
});
```

## E2E Testing (Playwright)

```typescript
import { Factory } from 'fishery';
import { faker } from '@faker-js/faker';

const userDataFactory = Factory.define(() => ({
  name: faker.person.fullName(),
  email: faker.internet.email(),
}));

test.describe('User Management', () => {
  test('should create new user', async ({ page }) => {
    const userData = userDataFactory.build();

    await page.goto('/users');
    await page.click('text=Add User');
    await page.fill('[name="name"]', userData.name);
    await page.fill('[name="email"]', userData.email);
    await page.click('text=Submit');

    // ✅ Use proper waits
    await expect(page.locator(`text=${userData.name}`)).toBeVisible();
  });
});
```

## Best Practices

### Always Use Faker for Test Data

```typescript
// ✅ GOOD: Use faker
const user = {
  id: faker.string.uuid(),
  name: faker.person.fullName(),
  email: faker.internet.email(),
  age: faker.number.int({ min: 18, max: 100 }),
};

// ❌ BAD: Hardcoded data
const user = { id: '123', name: 'Test User' };
```

### Use Factories Instead of Static Mocks

**Use Fishery** for creating test data factories with sensible defaults and overrides:

```typescript
// ✅ GOOD: Fishery factory
import { Factory } from 'fishery';
import { faker } from '@faker-js/faker';

const userFactory = Factory.define<User>(({ sequence }) => ({
  id: faker.string.uuid(),
  name: faker.person.fullName(),
  email: faker.internet.email(),
  age: faker.number.int({ min: 18, max: 100 }),
}));

// Usage - flexible and reusable
const user1 = userFactory.build();
const user2 = userFactory.build({ age: 25 });
const user3 = userFactory.build({ name: 'Specific Name' });
const users = userFactory.buildList(5); // Create multiple

// ❌ BAD: Static mock objects
const mockUser1 = {
  id: '123',
  name: 'User 1',
  email: 'user1@test.com',
  age: 30,
};
```

Benefits of Fishery factories:

- Easy to override specific properties per test
- Consistent default values across tests
- Single source of truth for mock structure
- Better maintainability when types change
- Built-in support for sequences and traits

### Never Use Fixed Timeouts

```typescript
// ❌ BAD: Fixed timeout
await new Promise((resolve) => setTimeout(resolve, 1000));
await page.waitForTimeout(2000);

// ✅ GOOD: Wait for condition
await waitFor(() => {
  expect(element).toBeInTheDocument();
});

await page.waitForSelector('[data-test="result"]');
```

### Mock External Dependencies

```typescript
// ✅ GOOD: Mock services
jest.mock('uiSrc/services/api', () => ({
  apiService: {
    get: jest.fn(),
    post: jest.fn(),
  },
}));
```

### Parameterized Tests with `it.each`

**Use `it.each` for multiple tests with the same body but different inputs:**

```typescript
// ✅ GOOD: Parameterized tests
it.each([
  { description: 'null', value: null },
  { description: 'undefined', value: undefined },
  { description: 'empty string', value: '' },
  { description: 'whitespace only', value: '   ' },
])('should return error when input is $description', async ({ value }) => {
  const result = await service.processInput(value);
  expect(result.status).toBe('error');
});
```

**Benefits:**

- DRY: Single test body shared across all cases
- Maintainability: Changes to test logic only need to be made once
- Readability: Test cases are clearly defined in a table
- Easier to extend: Adding new test cases is just adding a new row

### Test Edge Cases

Always test:

- Empty arrays/objects
- Null/undefined values
- Error scenarios
- Boundary conditions
- Loading states

## Testing Checklist

- [ ] All new features have tests
- [ ] Tests use faker for data generation
- [ ] No fixed timeouts (use waitFor)
- [ ] Tests follow AAA pattern
- [ ] Descriptive test names
- [ ] Shared `renderComponent` helper used
- [ ] Default props defined
- [ ] Edge cases covered
- [ ] Error scenarios tested
- [ ] Mocks cleaned up between tests
- [ ] Integration tests for API endpoints
- [ ] E2E tests for critical flows
- [ ] Coverage meets thresholds (80%+)


================================================
FILE: .ai/skills/branches/SKILL.md
================================================
---
name: branches
description: >-
  Create and name git branches following project conventions and GitHub Actions
  enforcement rules. Use when creating branches, checking out new branches, or
  the user mentions branch naming.
---

# Branch Naming Conventions

Use lowercase kebab-case with type prefix and issue/ticket identifier. **Branch names must match GitHub Actions workflow rules** (see `.github/workflows/enforce-branch-name-rules.yml`).

```bash
# Pattern: <type>/<issue-ref>/<short-title>

# INTERNAL (JIRA - RI-XXX)
feature/RI-123/add-user-profile
bugfix/RI-789/memory-leak
fe/feature/RI-567/add-dark-mode
be/bugfix/RI-345/fix-redis-connection
docs/RI-333/update-docs
test/RI-444/add-unit-tests
e2e/RI-555/add-integration-tests

# OPEN SOURCE (GitHub - XXX)
feature/123/add-export-feature
bugfix/789/fix-connection-timeout

# Special branches
release/v2.0.0
ric/RI-666/custom-prefix
```

## Allowed Branch Types (GitHub Actions Enforced)

- `feature/` - New features and refactoring (affects multiple areas)
- `bugfix/` - Bug fixes (affects multiple areas)
- `fe/feature/` - Frontend-only features (only `redisinsight/ui/` folder)
- `fe/bugfix/` - Frontend-only bug fixes (only `redisinsight/ui/` folder)
- `be/feature/` - Backend-only features (only `redisinsight/api/` folder)
- `be/bugfix/` - Backend-only bug fixes (only `redisinsight/api/` folder)
- `docs/` - Documentation changes
- `test/` - Test-related changes
- `e2e/` - End-to-end test changes
- `release/` - Release branches
- `ric/` - Custom prefix for special cases

**Note:** When a bug fix affects only the `redisinsight/ui/` folder, use `fe/bugfix/` prefix instead of `bugfix/`.

## Issue References

- **Internal**: `RI-XXX` (JIRA ticket)
- **Open Source**: `XXX` (GitHub issue number)
- Use `#` only in commit messages, not branch names


================================================
FILE: .ai/skills/commits/SKILL.md
================================================
---
name: commits
description: >-
  Generate commit messages following Conventional Commits format. Use when
  creating commits, writing commit messages, or the user asks to commit changes.
---

# Commit Message Guidelines

Follow **Conventional Commits** format:

```
<type>(<scope>): <subject>

<body>

<footer>
```

## Commit Types

- `feat` - New feature
- `fix` - Bug fix
- `refactor` - Code refactoring
- `test` - Adding or updating tests
- `docs` - Documentation changes
- `chore` - Maintenance tasks
- `style` - Code style changes (formatting)
- `perf` - Performance improvements
- `ci` - CI/CD changes

## Examples

```bash
feat(ui): add user search functionality

Implements real-time search with debouncing.

References: #RI-123

---

fix(api): resolve memory leak in connection pool

Properly cleanup subscriptions on unmount.

Fixes #456

---

test(ui): add tests for data serialization

refactor(api): extract common validation logic

docs: update API endpoint documentation

chore: upgrade React to version 18.2
```

## Best Practices

### ✅ Good Commits

- Clear, descriptive subject line
- Atomic changes (one logical change per commit)
- Reference issue/ticket in body
- Explain **why**, not just **what**
- **Keep it concise** - Don't list every file change in the body

```bash
feat(ui): add user profile editing

Allows users to update their profile information including
name, email, and avatar. Includes validation and error handling.

References: #RI-123
```

### ❌ Bad Commits

```bash
# Too vague
fix stuff
WIP
update

# Too broad
add feature, fix bugs, refactor code, update tests
```

## Issue References

- **JIRA (internal)**: `References: #RI-123` or `Fixes #RI-123`
- **GitHub (open source)**: `Fixes #456` or `Closes #456`
- Use `#` for auto-linking in commit messages


================================================
FILE: .ai/skills/pull-requests/SKILL.md
================================================
---
name: pull-requests
description: >-
  Create and review pull requests following project standards including title
  format, description template, and review checklist. Use when creating PRs,
  writing PR descriptions, or reviewing pull requests.
---

# Pull Request Guidelines

## Creating a PR

### Labels

When creating PRs with AI assistance, always add the **"AI-Made"** label.

### PR Title

Include issue number at the start:

```
RI-123 Add user profile editing
#456 Fix memory leak in connection pool
```

### PR Description Template

```markdown
# What

Describe what was changed.

# Testing

Describe how to test the changes.

---

Closes #RI-123
```

**PR Description Guidelines:**

- **Keep it concise** - Avoid verbose descriptions
- **Focus on high-level changes** - Don't list every code change in the #What section
- **Brief and to the point** - The diff shows the details; describe the "why" and "what" at a high level
- **Technical decisions** - Only mention significant architectural or design decisions if relevant

## Review Process

### As PR Author

- **Respond to all comments** - Address every piece of feedback
- **Don't take feedback personally** - Reviews improve code quality
- **Update code based on feedback** - Make requested changes
- **Mark conversations as resolved** - After addressing feedback
- **Keep PR up to date** - Rebase on main regularly

### As PR Reviewer

- **Be constructive and respectful** - Focus on improvement
- **Focus on logic, not style** - Linter handles formatting
- **Check for**:
  - Logic errors and edge cases
  - Performance issues
  - Security concerns
  - Test coverage
  - Missing documentation
  - Architectural concerns

### Review Checklist

- [ ] Code follows project patterns
- [ ] Tests are comprehensive
- [ ] No console.log or debug code
- [ ] TypeScript types are proper
- [ ] Error handling is adequate
- [ ] Documentation is updated
- [ ] No security vulnerabilities
- [ ] Performance is acceptable


================================================
FILE: .cursor/agents/test-runner.md
================================================
---
name: test-runner
model: composer-1.5
description: Test automation expert. Use proactively to run tests and fix failures.
---

You are a test automation expert.

When you see code changes, proactively run appropriate tests.

When completing a major task, run all tests to ensure the task is complete.

If tests fail:

1. Analyze the failure output
2. Identify the root cause
3. Fix the issue while preserving test intent
4. Re-run to verify

Report test results with:

- Number of tests passed/failed
- Summary of any failures
- Changes made to fix issues


================================================
FILE: .cursorignore
================================================
!/node_modules

================================================
FILE: .dockerignore
================================================
.git
.idea
.vscode
.docker

**/node_modules

**/dist
**/coverage
**/dll
**/.issues
**/.parcel-cache
**/.temp_cache
**/.nyc_output

redisinsight/main.prod.js


================================================
FILE: .editorconfig
================================================
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
quote_type = single

[*.md]
trim_trailing_whitespace = false

[/tests/**.ts]
indent_size = 4


================================================
FILE: .eslintignore
================================================
tests/e2e
tests/e2e-playwright

# Logs
logs
*.log

# Tests coverage results
redisinsight/api/test/test-runs/coverage

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
.eslintcache

# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules

# OSX
.DS_Store

# App packaged
release
*.main.prod.js
*.renderer.prod.js
scripts
configs
dist
dll
*.main.js

.idea
npm-debug.log.*
__snapshots__

# Package.json
package.json
.travis.yml
*.css.d.ts
*.sass.d.ts
*.scss.d.ts

# temp folders - remove in future after fix all issues
redisinsight/ui/src/packages/redisgraph
redisinsight/ui/src/packages/redistimeseries-app

/report
__mocks__


================================================
FILE: .eslintrc.js
================================================
const path = require('path');

const noUnusedVarsConfig = [
  'error',
  {
    argsIgnorePattern: '^_',
    varsIgnorePattern: '^_',
    destructuredArrayIgnorePattern: '^_',
  },
];

module.exports = {
  root: true,
  env: {
    node: true,
    browser: true,
  },
  extends: ['airbnb-typescript', 'plugin:prettier/recommended'],
  plugins: ['@typescript-eslint', 'import'],
  parser: '@typescript-eslint/parser',
  rules: {
    quotes: [2, 'single', { avoidEscape: true }],
    'max-len': [
      'error',
      {
        ignoreComments: true,
        ignoreStrings: true,
        ignoreRegExpLiterals: true,
        code: 120,
      },
    ],
    'class-methods-use-this': 'off',
    'import/no-extraneous-dependencies': 'off', // temporary disabled
    'object-curly-newline': 'off',
    'import/prefer-default-export': 'off',
    '@typescript-eslint/comma-dangle': 'off',
    'implicit-arrow-linebreak': 'off',
    'import/order': [
      1,
      {
        groups: [
          'external',
          'builtin',
          'internal',
          'sibling',
          'parent',
          'index',
        ],
        pathGroups: [
          {
            pattern: 'desktopSrc/**',
            group: 'internal',
            position: 'after',
          },
          {
            pattern: 'uiSrc/**',
            group: 'internal',
            position: 'after',
          },
          {
            pattern: 'apiSrc/**',
            group: 'internal',
            position: 'after',
          },
        ],
        warnOnUnassignedImports: true,
        pathGroupsExcludedImportTypes: ['builtin'],
      },
    ],
  },
  overrides: [
    // Backend/API specific rules
    {
      files: ['redisinsight/api/**/*.ts', 'redisinsight/api/**/*.js'],
      env: {
        node: true,
        browser: false,
      },
      extends: ['airbnb-typescript/base', 'plugin:prettier/recommended'],
      plugins: ['@typescript-eslint', 'sonarjs', 'import'],
      rules: {
        'max-len': ['warn', 120],
        '@typescript-eslint/return-await': 'off',
        '@typescript-eslint/dot-notation': 'off',
        'import/no-extraneous-dependencies': 'off',
        '@typescript-eslint/no-unused-vars': noUnusedVarsConfig,
        // SonarJS rules (manually enabled since v2.x doesn't have recommended config)
        'sonarjs/cognitive-complexity': ['error', 15],
        'sonarjs/no-duplicate-string': 'error',
        'sonarjs/no-identical-functions': 'error',
        'sonarjs/prefer-immediate-return': 'error',
        'sonarjs/no-small-switch': 'error',
        'sonarjs/no-nested-template-literals': 'off',
        'no-console': 'error',
        'import/no-duplicates': 'error',
        'prefer-destructuring': 'error',
        'no-unneeded-ternary': 'error',
        'prefer-template': 'error',
        'prefer-const': 'error',
      },
      parserOptions: {
        project: path.join(__dirname, 'redisinsight/api/tsconfig.json'),
      },
    },
    // Backend test files
    {
      files: [
        'redisinsight/api/**/*.spec.ts',
        'redisinsight/api/**/__mocks__/**/*',
      ],
      rules: {
        'sonarjs/no-duplicate-string': 0,
        'sonarjs/no-identical-functions': 0,
        'import/first': 0,
      },
    },
    // Frontend/UI specific rules
    {
      files: [
        'redisinsight/ui/**/*.ts',
        'redisinsight/ui/**/*.tsx',
        'redisinsight/ui/**/*.js',
        'redisinsight/ui/**/*.jsx',
      ],
      env: {
        browser: true,
        node: false,
      },
      extends: [
        'airbnb-typescript',
        'airbnb/hooks',
        'plugin:prettier/recommended',
      ],
      plugins: [
        '@typescript-eslint',
        'sonarjs',
        'import',
        'react',
        'react-hooks',
        'jsx-a11y',
      ],
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
        project: path.join(__dirname, 'tsconfig.json'),
      },
      rules: {
        radix: 'off',
        'no-bitwise': ['error', { allow: ['|'] }],
        'max-len': [
          'error',
          {
            ignoreComments: true,
            ignoreStrings: true,
            ignoreRegExpLiterals: true,
            code: 120,
          },
        ],
        'class-methods-use-this': 'off',
        'import/no-extraneous-dependencies': 'off',
        'import/prefer-default-export': 'off',
        'import/no-cycle': 'off',
        'import/no-named-as-default-member': 'off',
        'no-plusplus': 'off',
        'no-return-await': 'off',
        'no-underscore-dangle': 'off',
        'no-useless-catch': 'off',
        'no-console': ['error', { allow: ['warn', 'error'] }],
        'jsx-a11y/anchor-is-valid': 'off',
        'jsx-a11y/no-access-key': 'off',
        'max-classes-per-file': 'off',
        'no-case-declarations': 'off',
        'react-hooks/exhaustive-deps': 'off',
        'react/jsx-props-no-spreading': 'off',
        'react/require-default-props': 'off',
        'react/prop-types': 1,
        'react/jsx-one-expression-per-line': 'off',
        '@typescript-eslint/comma-dangle': 'off',
        '@typescript-eslint/no-shadow': 'off',
        '@typescript-eslint/no-unused-expressions': 'off',
        '@typescript-eslint/no-use-before-define': 'off',
        'implicit-arrow-linebreak': 'off',
        'object-curly-newline': 'off',
        'no-nested-ternary': 'off',
        'no-param-reassign': ['error', { props: false }],
        'sonarjs/no-duplicate-string': 'off',
        'sonarjs/cognitive-complexity': [1, 20],
        'sonarjs/no-identical-functions': [0, 5],
        'sonarjs/prefer-immediate-return': 'error',
        'sonarjs/no-small-switch': 'error',
        'import/no-duplicates': 'error',
        'prefer-destructuring': 'error',
        'no-unneeded-ternary': 'error',
        'prefer-template': 'error',
        'prefer-const': 'error',
        '@typescript-eslint/no-unused-vars': noUnusedVarsConfig,
        'import/order': [
          1,
          {
            groups: [
              'external',
              'builtin',
              'internal',
              'sibling',
              'parent',
              'index',
            ],
            pathGroups: [
              {
                pattern: 'uiSrc/**',
                group: 'internal',
                position: 'after',
              },
              {
                pattern: 'apiSrc/**',
                group: 'internal',
                position: 'after',
              },
              {
                pattern: '{.,..}/*.scss',
                group: 'object',
                position: 'after',
              },
            ],
            warnOnUnassignedImports: true,
            pathGroupsExcludedImportTypes: ['builtin'],
          },
        ],
      },
    },
    // UI test files
    {
      files: ['redisinsight/ui/**/*.spec.ts', 'redisinsight/ui/**/*.spec.tsx'],
      env: {
        jest: true,
      },
    },
    // Storybook files only
    {
      files: [
        '.storybook/**/*.@(ts|tsx|js|jsx)',
        'stories/**/*.@(ts|tsx|js|jsx)',
        '**/*.stories.@(ts|tsx|js|jsx)',
        '**/*.story.@(ts|tsx|js|jsx)',
      ],
      extends: ['plugin:storybook/recommended'],
    },
    // TypeScript files (general) - MUST BE LAST to override other rules
    {
      files: ['*.ts', '*.tsx'],
      rules: {
        '@typescript-eslint/semi': ['error', 'never'],
        semi: 'off',
        '@typescript-eslint/default-param-last': 'off',
      },
    },
    // JavaScript files (general) - MUST BE LAST to override other rules
    {
      files: ['*.js', '*.jsx', '*.cjs'],
      rules: {
        semi: ['error', 'always'],
        '@typescript-eslint/semi': 'off',
      },
    },
    // Temporary disable some rules for API
    {
      files: ['redisinsight/api/**/*.ts', 'redisinsight/api/esbuild.js'],
      rules: {
        semi: 'off',
        '@typescript-eslint/semi': 'off',
        'sonarjs/no-identical-functions': 'off',
        'sonarjs/prefer-immediate-return': 'off',
        'sonarjs/no-duplicate-string': 'off',
        'sonarjs/cognitive-complexity': 'off',
        'sonarjs/no-small-switch': 'off',
        'max-len': 'off',
        'import/order': 'off',
        'no-underscore-dangle': 'off',
        'import/no-duplicates': 'off',
        'no-console': 'off',
        'prefer-destructuring': 'off',
        'no-unneeded-ternary': 'off',
        'prefer-template': 'off',
        'prefer-const': 'off',
        // REDUNDANT: These are OFF by default in newer Airbnb config
        // 'prefer-arrow-callback': 'off',
        // 'no-restricted-syntax': 'off',
        // 'no-control-regex': 'off',
        // 'func-names': 'off',
        // 'no-case-declarations': 'off',
        // radix: 'off',
        // 'arrow-body-style': 'off',
        // 'no-constant-condition': 'off',
        // 'consistent-return': 'off',
        // 'no-useless-concat': 'off',
        // 'import/export': 'off',
      },
    },
    // Temporary (maybe) disable some rules for API tests
    {
      files: ['redisinsight/api/test/**/*.ts'],
      // In order to lint just the test files
      // make sure there's no override on 'redisinsight/api'
      // a.k.a. comment the above section
      rules: {
        '@typescript-eslint/no-loop-func': 'off',
        '@typescript-eslint/semi': 'off',
        'no-console': 'off',
        'prefer-template': 'off',
        'import/order': 'off',
        '@typescript-eslint/no-use-before-define': 'off',
        '@typescript-eslint/no-shadow': 'off',
        '@typescript-eslint/no-unused-expressions': 'off',
        '@typescript-eslint/naming-convention': 'off',
        'sonarjs/no-duplicate-string': 'off',
        'sonarjs/prefer-immediate-return': 'off',
        'sonarjs/cognitive-complexity': 'off',
        'max-len': 'off',
        'prefer-destructuring': 'off',
        'prefer-const': 'off',
        // REDUNDANT: These are OFF by default in newer Airbnb config
        // semi: 'off',
        // 'sonarjs/no-ignored-return': 'off',
        // 'sonarjs/no-identical-expressions': 'off',
        // 'sonarjs/no-nested-switch': 'off',
        // 'sonarjs/no-identical-functions': 'off',
        // 'no-plusplus': 'off',
        // 'array-callback-return': 'off',
        // 'no-underscore-dangle': 'off',
        // 'import/newline-after-import': 'off',
        // 'global-require': 'off',
        // 'object-shorthand': 'off',
        // 'import/no-useless-path-segments': 'off',
        // 'import/first': 'off',
        // 'one-var': 'off',
        // 'no-multi-assign': 'off',
        // 'spaced-comment': 'off',
        // 'no-lonely-if': 'off',
        // 'no-useless-computed-key': 'off',
        // 'no-return-assign': 'off',
        // 'prefer-promise-reject-errors': 'off',
        // 'no-fallthrough': 'off',
        // 'no-else-return': 'off',
        // 'no-empty': 'off',
        // 'import/no-mutable-exports': 'off',
        // 'import/no-cycle': 'off',
        // 'no-useless-escape': 'off',
        // 'default-case': 'off',
        // eqeqeq: 'off',
        // yoda: 'off',
        // 'prefer-arrow-callback': 'off',
        // 'arrow-body-style': 'off',
        // 'no-constant-condition': 'off',
        // 'no-restricted-syntax': 'off',
        // 'no-case-declarations': 'off',
        // 'func-names': 'off',
        // 'consistent-return': 'off',
        // radix: 'off',
      },
    },
    // Temporary disable some rules for UI
    {
      files: ['redisinsight/ui/**/*.ts*'],
      rules: {
        'sonarjs/cognitive-complexity': 'off',
        'import/extensions': 'off',
        'react/prop-types': 'off',
        'import/order': 'off',
        'prefer-const': 'off',
        'prefer-destructuring': 'off',
        // REDUNDANT: These are OFF by default in newer Airbnb config
        // 'react/jsx-boolean-value': 'off',
        // 'sonarjs/no-nested-template-literals': 'off',
        // 'sonarjs/no-extra-arguments': 'off',
        // 'consistent-return': 'off',
        // 'react/no-array-index-key': 'off',
        // 'react/no-unused-prop-types': 'off',
        // 'react/destructuring-assignment': 'off',
        // 'jsx-a11y/control-has-associated-label': 'off',
        // 'react/button-has-type': 'off',
        // 'react/no-unescaped-entities': 'off',
        // 'no-useless-escape': 'off',
        // 'no-template-curly-in-string': 'off',
      },
    },
  ],
  parserOptions: {
    project: './tsconfig.json',
    ecmaVersion: 2020,
    sourceType: 'module',
  },
  settings: {
    react: {
      version: 'detect', // Automatically detect React version
    },
  },
  ignorePatterns: [
    'dist',
    'node_modules',
    'release',
    'redisinsight/ui/src/packages/**/icons/*.js*',
    'redisinsight/ui/src/packages/**',
    'redisinsight/api/report/**',
    'redisinsight/api/static/**',
    'redisinsight/api/migration/**',
    // Config files that don't need linting
    '.eslintrc.js',
    'electron-builder-mas.js',
    'jest-resolver.js',
    'resources/resources.d.ts',
  ],
};


================================================
FILE: .gitattributes
================================================
*       text    eol=lf
*.exe   binary
*.png   binary
*.jpg   binary
*.jpeg  binary
*.ico   binary
*.icns  binary
*.otf   binary
*.eot   binary
*.ttf   binary
*.woff  binary
*.woff2 binary


================================================
FILE: .github/CODEOWNERS
================================================
* krum.tyukenov@redis.com pavel.angelov@redis.com dijana.antovska@redis.com artem.horuzhenko@redis.com petar.dzhambazov@redis.com dimo.georgiev@redis.com valentin.kirilov@redis.com


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: '[Bug]:'
labels: bug
assignees: ''
---

**Preconditions** (Any important steps we need to know)

**Steps to reproduce** (How to reproduce what you found step by step)

**Actual behavior** (A short description of what you found)

**Expected behavior** (A short description of what you expected to find)

**Screenshots** (Paste or drag-and-drop a screenshot or a link to a recording)

**Additional context** (Operating system, version of Redis Insight, Redis database version, Redis module version, database type, connection type, logs, or any other information)


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Request a feature or submit an idea
title: '[Feature Request]:'
labels: feature
assignees: ''
---

**Problem description** (Describe the problem you would like to solve with this feature request or suggested idea).

**How often do you encounter this problem** (Describe how frequently this problem occurs).

**Alternatives considered** (Describe any alternative features or products you've considered).

**Additional information** (Add any other context or details here).


================================================
FILE: .github/actions/deploy-test-reports/action.yml
================================================
name: Deploy Pages
description: 'Download the artifact and deploy to GitHub Pages'

inputs:
  group:
    description: Group matching the artifacts
    required: false
    default: '*'
  path:
    description: Path for link to the report
    required: false
    default: ''

  AWS_BUCKET_NAME_TEST:
    required: true
  AWS_DEFAULT_REGION:
    required: true
  AWS_DISTRIBUTION_ID:
    required: true
  AWS_ACCESS_KEY_ID:
    required: true
  AWS_SECRET_ACCESS_KEY:
    required: true

runs:
  using: 'composite'
  steps:
    - name: Get current date
      id: date
      uses: ./.github/actions/get-current-date

    - name: Download artifacts
      uses: actions/download-artifact@v4
      with:
        pattern: ${{ format('{0}*', inputs.group) }}
        path: public/${{ github.run_id }}

    - name: Deploy 🚀
      shell: bash
      env:
        AWS_BUCKET_NAME_TEST: ${{ inputs.AWS_BUCKET_NAME_TEST }}
        AWS_DEFAULT_REGION: ${{ inputs.AWS_DEFAULT_REGION }}
        AWS_DISTRIBUTION_ID: ${{ inputs.AWS_DISTRIBUTION_ID }}
        AWS_ACCESS_KEY_ID: ${{ inputs.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ inputs.AWS_SECRET_ACCESS_KEY }}
      run: |

        SUB_PATH=test-reports/${{ steps.date.outputs.date }}

        aws s3 cp public/ s3://${AWS_BUCKET_NAME_TEST}/public/${SUB_PATH} --recursive

    - name: Add link to report in the workflow summary
      shell: bash
      run: |
        link="${{ inputs.path }}/index.html"

        echo "- [${link}](${link})" >> $GITHUB_STEP_SUMMARY


================================================
FILE: .github/actions/get-current-date/action.yml
================================================
name: Get current date

outputs:
  date:
    description: Current date
    value: ${{ steps.date.outputs.date }}

runs:
  using: 'composite'
  steps:
    - name: Get current date
      id: date
      shell: bash
      run: |
        DATE=$(date +'%Y-%m-%d')
        echo "date=$DATE" >> $GITHUB_OUTPUT


================================================
FILE: .github/actions/install-all-build-libs/action.yml
================================================
name: Install all libraries action
description: Install all libraries and dependencies
inputs:
  skip-system-deps:
    description: Skip install system dependencies (libsecret, rpm, etc.)
    default: '0'
    required: false

  keytar-host-mirror:
    description: Keytar binary host mirror
    required: false

  sqlite3-host-mirror:
    description: SQLite3 binary host mirror
    required: false

runs:
  using: 'composite'
  steps:
    - name: Setup Node
      uses: actions/setup-node@v4.0.4
      with:
        node-version: '22.12.0'
        # disable cache for windows
        # https://github.com/actions/setup-node/issues/975
        cache: ${{ runner.os != 'Windows' && 'yarn' || '' }}
        cache-dependency-path: ${{ runner.os != 'Windows' && '**/yarn.lock' || '' }}

    - name: Cache node_modules
      id: cache-node-modules
      uses: actions/cache@v4
      with:
        path: |
          node_modules
          redisinsight/node_modules
          redisinsight/api/node_modules
        key: node-modules-${{ runner.os }}-${{ hashFiles('yarn.lock', 'redisinsight/yarn.lock', 'redisinsight/api/yarn.lock') }}
        restore-keys: |
          node-modules-${{ runner.os }}-

    - name: Setup Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'

    - name: Install linux libraries
      if: ${{ runner.os == 'Linux' && inputs.skip-system-deps != '1' }}
      shell: bash
      run: |
        sudo apt-get update -qy
        sudo apt-get install -qy libsecret-1-dev rpm

    - name: Install macos libraries
      if: ${{ runner.os == 'macOS' && inputs.skip-system-deps != '1' }}
      shell: bash
      run: |
        brew install libsecret

    # Javascript dependencies (skip if cache was restored)
    - name: Install dependencies for redisinsight package.js
      if: steps.cache-node-modules.outputs.cache-hit != 'true'
      uses: ./.github/actions/install-deps
      with:
        dir-path: './redisinsight'
        keytar-host-mirror: ${{ inputs.keytar-host-mirror }}
        sqlite3-host-mirror: ${{ inputs.sqlite3-host-mirror }}

    - name: Install dependencies for BE package.js
      if: steps.cache-node-modules.outputs.cache-hit != 'true'
      uses: ./.github/actions/install-deps
      with:
        dir-path: './redisinsight/api'

    - name: Install dependencies for root package.js
      if: steps.cache-node-modules.outputs.cache-hit != 'true'
      uses: ./.github/actions/install-deps
      with:
        dir-path: './'
        keytar-host-mirror: ${{ inputs.keytar-host-mirror }}
        sqlite3-host-mirror: ${{ inputs.sqlite3-host-mirror }}


================================================
FILE: .github/actions/install-apple-certs/action.yml
================================================
name: Add certs to the keychain (macos)

inputs:
  CSC_P12_BASE64:
    required: true
  CSC_MAC_INSTALLER_P12_BASE64:
    required: true
  CSC_MAS_P12_BASE64:
    required: true
  CSC_KEY_PASSWORD:
    required: true
  CSC_MAS_PASSWORD:
    required: true
  CSC_MAC_INSTALLER_PASSWORD:
    required: true

runs:
  using: 'composite'
  steps:
    - name: Setup sign certificates
      shell: bash
      env:
        CSC_P12_BASE64: ${{ inputs.CSC_P12_BASE64 }}
        CSC_MAC_INSTALLER_P12_BASE64: ${{ inputs.CSC_MAC_INSTALLER_P12_BASE64 }}
        CSC_MAS_P12_BASE64: ${{ inputs.CSC_MAS_P12_BASE64 }}
      run: |
        mkdir -p certs
        echo "$CSC_P12_BASE64" | base64 -d > certs/mac-developer.p12
        echo "$CSC_MAC_INSTALLER_P12_BASE64" | base64 -d > certs/mac-installer.p12
        echo "$CSC_MAS_P12_BASE64" | base64 -d > certs/mas-distribution.p12

    - name: Add certs to the keychain
      shell: bash
      env:
        KEYCHAIN: redisinsight.keychain
        CSC_KEY_PASSWORD: ${{ inputs.CSC_KEY_PASSWORD }}
        CSC_MAS_PASSWORD: ${{ inputs.CSC_MAS_PASSWORD }}
        CSC_MAC_INSTALLER_PASSWORD: ${{ inputs.CSC_MAC_INSTALLER_PASSWORD }}
      run: |
        security create-keychain -p mysecretpassword $KEYCHAIN
        security default-keychain -s $KEYCHAIN
        security unlock-keychain -p mysecretpassword $KEYCHAIN
        security set-keychain-settings -u -t 10000000 $KEYCHAIN
        security import certs/mac-developer.p12 -k $KEYCHAIN -P "$CSC_KEY_PASSWORD" -T /usr/bin/codesign -T /usr/bin/productbuild
        security import certs/mas-distribution.p12 -k $KEYCHAIN -P "$CSC_MAS_PASSWORD" -T /usr/bin/codesign -T /usr/bin/productbuild
        security import certs/mac-installer.p12 -k $KEYCHAIN -P "$CSC_MAC_INSTALLER_PASSWORD" -T /usr/bin/codesign -T /usr/bin/productbuild
        security set-key-partition-list -S apple-tool:,apple: -s -k mysecretpassword $KEYCHAIN
        security list-keychain -d user -s $KEYCHAIN


================================================
FILE: .github/actions/install-deps/action.yml
================================================
name: Install Dependencies action
description: Caches and installs dependencies for a given path
inputs:
  dir-path:
    description: Path to the directory
    required: true
  keytar-host-mirror:
    description: Keytar binary host mirror
    required: false
  sqlite3-host-mirror:
    description: SQLite3 binary host mirror
    required: false
  skip-postinstall:
    description: Skip postinstall
    required: false
    default: '0'

runs:
  using: 'composite'
  steps:
    - name: Install dependencies
      working-directory: ${{ inputs.dir-path }}
      shell: bash

      # env:
      #   SKIP_POSTINSTALL: ${{ inputs.skip-postinstall }}
      # run: yarn install
      run: |
        # todo: uncomment after build our binaries
        # export npm_config_keytar_binary_host_mirror=${{ inputs.keytar-host-mirror }}
        # export npm_config_node_sqlite3_binary_host_mirror=${{ inputs.sqlite3-host-mirror }}

        yarn install --frozen-lockfile --network-timeout 1000000


================================================
FILE: .github/actions/install-windows-certs/action.yml
================================================
name: Install Windows certs

inputs:
  WIN_CSC_PFX_BASE64:
    required: true

runs:
  using: 'composite'
  steps:
    - name: Setup sign certificates
      shell: bash
      env:
        WIN_CSC_PFX_BASE64: ${{ inputs.WIN_CSC_PFX_BASE64 }}
      run: |
        mkdir -p certs
        echo "$WIN_CSC_PFX_BASE64" | base64 -d > certs/redislabs_win.pfx


================================================
FILE: .github/actions/remove-artifacts/action.yml
================================================
name: Remove all artifacts

runs:
  using: 'composite'
  steps:
    - name: Merge artifacts by pattern
      id: merge-artifacts
      uses: actions/upload-artifact/merge@v4
      with:
        name: remove-artifacts
        pattern: '*'
        delete-merged: true

    - name: Delete merged artifact
      uses: actions/github-script@v7
      with:
        script: |
          github.rest.actions.deleteArtifact({
            owner: context.repo.owner,
            repo: context.repo.repo,
            artifact_id: ${{ steps.merge-artifacts.outputs.artifact-id }}
          });


================================================
FILE: .github/actions/setup-e2e-playwright/action.yml
================================================
name: 'Setup E2E Playwright'
description: 'Setup Node.js, E2E dependencies, and Playwright browsers with caching'

inputs:
  browsers:
    description: 'Playwright browsers to install (chromium, firefox, webkit, all, none)'
    required: false
    default: 'chromium'
  working-directory:
    description: 'E2E tests directory'
    required: false
    default: './tests/e2e-playwright'

runs:
  using: 'composite'
  steps:
    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version-file: '.nvmrc'
        # Note: We don't use setup-node's npm cache here because:
        # 1. We cache node_modules directly (more effective)
        # 2. Direct node_modules caching is faster than npm cache

    - name: Cache E2E node_modules
      id: cache-e2e-deps
      uses: actions/cache@v4
      with:
        path: ${{ inputs.working-directory }}/node_modules
        key: e2e-node-modules-${{ runner.os }}-${{ hashFiles(format('{0}/package-lock.json', inputs.working-directory)) }}

    - name: Install E2E dependencies
      if: steps.cache-e2e-deps.outputs.cache-hit != 'true'
      shell: bash
      working-directory: ${{ inputs.working-directory }}
      run: npm ci

    - name: Cache Playwright browsers
      if: inputs.browsers != 'none'
      id: cache-playwright
      uses: actions/cache@v4
      with:
        path: ~/.cache/ms-playwright
        # Use package-lock.json hash as cache key - it changes when Playwright version changes
        key: playwright-${{ runner.os }}-${{ hashFiles(format('{0}/package-lock.json', inputs.working-directory)) }}-${{ inputs.browsers }}

    - name: Install Playwright browsers
      if: inputs.browsers != 'none' && steps.cache-playwright.outputs.cache-hit != 'true'
      shell: bash
      working-directory: ${{ inputs.working-directory }}
      env:
        BROWSERS: ${{ inputs.browsers }}
      run: |
        if [ "$BROWSERS" == "all" ]; then
          npx playwright install --with-deps
        else
          npx playwright install "$BROWSERS" --with-deps
        fi

    - name: Install Playwright system dependencies (cache hit)
      if: inputs.browsers != 'none' && steps.cache-playwright.outputs.cache-hit == 'true'
      shell: bash
      working-directory: ${{ inputs.working-directory }}
      env:
        BROWSERS: ${{ inputs.browsers }}
      run: |
        # When cache hits, browsers are restored but system deps may be missing
        if [ "$BROWSERS" == "all" ]; then
          npx playwright install-deps
        else
          npx playwright install-deps "$BROWSERS"
        fi



================================================
FILE: .github/build/build.Dockerfile
================================================
FROM node:22.12.0-alpine

# runtime args and environment variables
ARG DIST=Redis-Insight.tar.gz
ARG NODE_ENV=production
ARG RI_SEGMENT_WRITE_KEY
ENV RI_SEGMENT_WRITE_KEY=${RI_SEGMENT_WRITE_KEY}
ENV NODE_ENV=${NODE_ENV}
ENV RI_SERVE_STATICS=true
ENV RI_BUILD_TYPE='DOCKER_ON_PREMISE'
ENV RI_APP_FOLDER_ABSOLUTE_PATH='/data'

# this resolves CVE-2023-5363
# TODO: remove this line once we update to base image that doesn't have this vulnerability
RUN apk update && apk upgrade --no-cache libcrypto3 libssl3

# set workdir
WORKDIR /usr/src/app

# copy artifacts built in previous stage to this one
ADD $DIST /usr/src/app/redisinsight
RUN ls -la /usr/src/app/redisinsight

# folder to store local database, plugins, logs and all other files
RUN mkdir -p /data && chown -R node:node /data

# copy the docker entry point script and make it executable
COPY --chown=node:node ./docker-entry.sh ./
RUN chmod +x docker-entry.sh

# since RI is hard-code to port 5540, expose it from the container
EXPOSE 5540

# don't run the node process as root
USER node

# serve the application 🚀
ENTRYPOINT ["./docker-entry.sh", "node", "redisinsight/api/dist/src/main"]


================================================
FILE: .github/build/build.sh
================================================
#!/bin/bash
set -e

# install deps
yarn
yarn --cwd redisinsight/api

# build

yarn build:statics
yarn build:ui
yarn --cwd ./redisinsight/api build:prod


================================================
FILE: .github/build/build_modules.sh
================================================
#!/bin/bash
set -e

PLATFORM=${PLATFORM:-'linux'}
ARCH=${ARCH:-'x64'}
LIBC=${LIBC:-''}
#FILENAME="Redis-Insight-$PLATFORM.$VERSION.$ARCH.zip"
FILENAME="Redis-Insight-web-$PLATFORM"
if [ ! -z $LIBC ]
then
  FILENAME="$FILENAME-$LIBC.$ARCH.tar.gz"
  export npm_config_target_libc="$LIBC"
else
  FILENAME="$FILENAME.$ARCH.tar.gz"
fi

echo "Building node modules..."
echo "Platform: $PLATFORM"
echo "Arch: $ARCH"
echo "Libc: $LIBC"
echo "npm target libc: $npm_config_target_libc"
echo "Filname: $FILENAME"

rm -rf redisinsight/api/node_modules

npm_config_arch="$ARCH" \
npm_config_target_arch="$ARCH" \
npm_config_platform="$PLATFORM" \
npm_config_target_platform="$PLATFORM" \
yarn --cwd ./redisinsight/api install --production

cp redisinsight/api/.yarnclean.prod redisinsight/api/.yarnclean
yarn --cwd ./redisinsight/api autoclean --force

rm -rf redisinsight/build.zip

cp LICENSE ./redisinsight

cd redisinsight && tar -czf build.tar.gz \
--exclude="api/node_modules/**/build/node_gyp_bins/python3" \
api/node_modules \
api/dist \
ui/dist \
LICENSE \
&& cd ..

mkdir -p release/web
cp redisinsight/build.tar.gz release/web/"$FILENAME"

# Minify build via esbuild
echo "Start minifing workflow"
npm_config_arch="$ARCH" \
npm_config_target_arch="$ARCH" \
npm_config_platform="$PLATFORM" \
npm_config_target_platform="$PLATFORM" \
yarn --cwd ./redisinsight/api install
yarn --cwd ./redisinsight/api minify:prod


PACKAGE_JSON_PATH="./redisinsight/api/package.json"
APP_PACKAGE_JSON_PATH="./redisinsight/package.json"

# Extract dependencies from the app package.json
BINARY_PACKAGES=$(jq -r '.dependencies | keys[]' "$APP_PACKAGE_JSON_PATH" | jq -R -s -c 'split("\n")[:-1]')

# Keep class transformer external for minified builds since it is not bundled
BINARY_PACKAGES=$(echo "$BINARY_PACKAGES" | jq '. + ["class-transformer"]')

echo "Binary packages to exclude during minify: $BINARY_PACKAGES"

# Modify the package.json to keep only binary prod dependencies
# Additionally remove custom "postinstall" script to avoid patch-package error(s)
jq --argjson keep "$BINARY_PACKAGES" \
  'del(.devDependencies) | .dependencies |= with_entries(select(.key as $k | $keep | index($k))) | del(.scripts.postinstall)' \
  "$PACKAGE_JSON_PATH" > temp.json && mv temp.json "$PACKAGE_JSON_PATH"

npm_config_arch="$ARCH" \
npm_config_target_arch="$ARCH" \
npm_config_platform="$PLATFORM" \
npm_config_target_platform="$PLATFORM" \
yarn --cwd ./redisinsight/api install --production
yarn --cwd ./redisinsight/api autoclean --force

# Compress minified build
cd redisinsight && tar -czf build-mini.tar.gz \
--exclude="api/node_modules/**/build/node_gyp_bins/python3" \
api/node_modules \
api/dist-minified \
ui/dist \
LICENSE \
&& cd ..

mkdir -p release/web-mini
cp redisinsight/build-mini.tar.gz release/web-mini/"$FILENAME"

# Restore the original package.json and yarn.lock
git restore redisinsight/api/yarn.lock redisinsight/api/package.json



================================================
FILE: .github/build/release-docker.sh
================================================
#!/bin/bash
set -e

HELP="Args:
-v - Semver (3.2.0)
-d - Build image repository (Ex: -d redisinsight)
-r - Target repository (Ex: -r redis/redisinsight)
"

while getopts "v:d:r:h:" opt; do
  case $opt in
    v) VERSION="$OPTARG";;
    d) DEV_REPO="$OPTARG";;
    r) RELEASE_REPO="$OPTARG";;
    h) echo "$HELP"; exit 0;;
    ?) echo "$HELP" >&2; exit 1 ;;
  esac
done

V_ARR=( ${VERSION//./ } )
TAGS[0]=$VERSION
TAGS[1]="${V_ARR[0]}.${V_ARR[1]}"
TAGS[2]="latest"

DEV_IMAGE_AMD64=$DEV_REPO:amd64
DEV_IMAGE_ARM64=$DEV_REPO:arm64
RELEASE_IMAGE_AMD64=$RELEASE_REPO:$VERSION-amd64
RELEASE_IMAGE_ARM64=$RELEASE_REPO:$VERSION-arm64

echo "
  TAGS: [${TAGS[0]}, ${TAGS[1]}, ${TAGS[2]}]
  DEV_REPO: $DEV_REPO
  RELEASE_REPO: $RELEASE_REPO

  DEV_IMAGE_AMD64: $DEV_IMAGE_AMD64
  DEV_IMAGE_ARM64: $DEV_IMAGE_ARM64

  RELEASE_IMAGE_AMD64: $RELEASE_IMAGE_AMD64
  RELEASE_IMAGE_ARM64: $RELEASE_IMAGE_ARM64
"

# Load images from tar archives
docker rmi $DEV_IMAGE_AMD64 || true
docker rmi $DEV_IMAGE_ARM64 || true
docker load -i release/docker-linux-alpine.amd64.tar
docker load -i release/docker-linux-alpine.arm64.tar

echo "Push AMD64 image"
docker tag $DEV_IMAGE_AMD64 $RELEASE_IMAGE_AMD64
docker push $RELEASE_IMAGE_AMD64

echo "Push ARM64 image"
docker tag $DEV_IMAGE_ARM64 $RELEASE_IMAGE_ARM64
docker push $RELEASE_IMAGE_ARM64

for TAG in "${TAGS[@]}"; do
    echo "Releasing: $RELEASE_REPO:$TAG"
    docker manifest rm $RELEASE_REPO:$TAG || true
    docker manifest create --amend "$RELEASE_REPO:$TAG" $RELEASE_IMAGE_AMD64 $RELEASE_IMAGE_ARM64
    docker manifest push "$RELEASE_REPO:$TAG"
done

echo "Success"


================================================
FILE: .github/build/sum_sha256.sh
================================================
#!/bin/bash
set -e

find ./release -type f -name '*.tar.gz' -execdir sh -c 'sha256sum "$1" > "$1.sha256"' _ {} \;


================================================
FILE: .github/codeql/config.yml
================================================
paths-ignore:
  - 'tests/**'
  - '**/*.test.ts'
  - '**/*.spec.ts'
  - '**/*.spec.tsx'
  - '**/__mocks__/**'
  - './redisinsight/api/test'


================================================
FILE: .github/copilot-instructions.md
================================================
# GitHub Copilot Instructions for RedisInsight

> **🎯 Start here: Read `AGENTS.md` at the repository root for essential commands, testing instructions, and quick reference**

This project uses a centralized AI rules structure:

- **`AGENTS.md`** (repository root) - Entry point with commands, testing, and boundaries
- **`.ai/rules/`** - Detailed development standards organized by topic
- **`.ai/commands/`** - AI workflow commands and templates

## 📂 Rules Structure

### Core Development Rules

- **Code Quality**: `.ai/rules/code-quality.md`

  - TypeScript best practices
  - Import organization
  - SonarJS complexity rules

- **Frontend Development**: `.ai/rules/frontend.md`

  - React 18 patterns and best practices
  - Redux Toolkit state management
  - Styled-components (SCSS deprecated)
  - Component folder structure
  - Internal UI component wrappers (never import from @redis-ui directly)
  - Elastic UI deprecation (use Redis UI wrappers)

- **Backend Development**: `.ai/rules/backend.md`

  - NestJS module architecture
  - Service and controller patterns
  - DTOs and validation
  - Error handling
  - Redis integration patterns

- **Testing Standards**: `.ai/rules/testing.md`

  - Jest and Testing Library patterns
  - Component testing with renderComponent helper
  - Faker for test data generation
  - No fixed timeouts (use waitFor)
  - Backend testing with NestJS
  - E2E testing with Playwright

- **Branch Naming**: `.ai/rules/branches.md`

  - Branch naming conventions (type/RI-XXX/title or type/XXX/title)

- **Commit Messages**: `.ai/rules/commits.md`

  - Commit message format (Conventional Commits)

- **Pull Requests**: `.ai/rules/pull-requests.md`
  - PR process and review guidelines
  - Pre-commit checklist

### Commands and Workflows

- **PR Plan**: `.ai/commands/pr-plan.md` - Analyze JIRA tickets (RI-XXX) and create detailed implementation plans
- **Commit Message Generation**: `.ai/commands/commit-message.md` - Generate commit messages following Conventional Commits
- **PR Review**: `.ai/commands/pull-request-review.md` - Review pull requests and provide feedback

## 🎯 Project Overview

**Tech Stack:**

- Frontend: React 18, TypeScript, Redux Toolkit, styled-components, Vite
- Backend: NestJS, TypeScript, Node.js
- Desktop: Electron
- Testing: Jest, Testing Library, Playwright

**Module Aliases:**

- `uiSrc/*` → `redisinsight/ui/src/*`
- `apiSrc/*` → `redisinsight/api/src/*`
- `desktopSrc/*` → `redisinsight/desktop/src/*`

## 📖 Additional Documentation

- **For AI agents**: Start with `AGENTS.md` at repository root
- **For human developers**: See `.ai/README.md` for setup and overview

---

**Note**: This is a minimal reference file. GitHub Copilot cannot read the referenced files directly, but developers can access the full guidelines. Other AI tools (Cursor, Augment, Windsurf) access these rules via symlinks and can read `AGENTS.md` directly.


================================================
FILE: .github/deps-audit-report.js
================================================
const fs = require('fs');
const { exec } = require('child_process');

const FILENAME = process.env.FILENAME;
const DEPS = process.env.DEPS || '';
const file = `${FILENAME}`;
const outputFile = `slack.${FILENAME}`;

function generateSlackMessage(summary) {
  const message = {
    text:
      `DEPS AUDIT: *${DEPS}* result (Branch: *${process.env.GITHUB_REF_NAME}*)` +
      `\nScanned ${summary.totalDependencies} dependencies` +
      `\n<https://github.com/RedisInsight/RedisInsight/actions/runs/${process.env.GITHUB_RUN_ID}|View on Github Actions>`,
    attachments: [],
  };

  if (summary.totalVulnerabilities) {
    if (summary.vulnerabilities.critical) {
      message.attachments.push({
        title: 'Critical',
        color: '#641E16',
        text: `${summary.vulnerabilities.critical}`,
      });
    }
    if (summary.vulnerabilities.high) {
      message.attachments.push({
        title: 'High',
        color: '#C0392B',
        text: `${summary.vulnerabilities.high}`,
      });
    }
    if (summary.vulnerabilities.moderate) {
      message.attachments.push({
        title: 'Moderate',
        color: '#F5B041',
        text: `${summary.vulnerabilities.moderate}`,
      });
    }
    if (summary.vulnerabilities.low) {
      message.attachments.push({
        title: 'Low',
        color: '#F9E79F',
        text: `${summary.vulnerabilities.low}`,
      });
    }
    if (summary.vulnerabilities.info) {
      message.attachments.push({
        title: 'Info',
        text: `${summary.vulnerabilities.info}`,
      });
    }
  } else {
    message.attachments.push({
      title: 'No vulnerabilities found',
      color: 'good',
    });
  }

  return message;
}

async function main() {
  const lastAuditLine = await new Promise((resolve, reject) => {
    exec(`tail -n 1 ${file}`, (error, stdout, stderr) => {
      if (error) {
        return reject(error);
      }
      resolve(stdout);
    });
  });

  const { data: summary } = JSON.parse(`${lastAuditLine}`);
  const vulnerabilities = summary?.vulnerabilities || {};
  summary.totalVulnerabilities = Object.values(vulnerabilities).reduce(
    (totalVulnerabilities, val) => totalVulnerabilities + val,
  );
  fs.writeFileSync(
    outputFile,
    JSON.stringify({
      channel: process.env.SLACK_AUDIT_REPORT_CHANNEL,
      ...generateSlackMessage(summary),
    }),
  );
}

main();


================================================
FILE: .github/deps-licenses-report.js
================================================
const fs = require('fs');
const { join } = require('path');
const { last, set } = require('lodash');
const { google } = require('googleapis');
const { execFile } = require('child_process');
const csvParser = require('csv-parser');
const { stringify } = require('csv-stringify');

const licenseFolderName = 'licenses';
const spreadsheetId = process.env.SPREADSHEET_ID;
const outputFilePath = `./${licenseFolderName}/licenses.csv`;
const summaryFilePath = `./${licenseFolderName}/summary.csv`;
const allData = [];
let csvFiles = [];

// Main function
async function main() {
  const folderPath = './';
  const packageJsons = findPackageJsonFiles(folderPath); // Find all package.json files in the given folder

  console.log('All package.jsons was found:', packageJsons);

  // Create the folder if it doesn't exist
  if (!fs.existsSync(licenseFolderName)) {
    fs.mkdirSync(licenseFolderName);
  }

  try {
    await Promise.all(packageJsons.map(runLicenseCheck));
    console.log('All csv files was generated');
    await generateSummary();
    await sendLicensesToGoogleSheet();
  } catch (error) {
    console.error('An error occurred:', error);
    process.exit(1);
  }
}

main();

// Function to find all package.json files in a given folder
function findPackageJsonFiles(folderPath) {
  const packageJsonPaths = [];
  const packageJsonName = 'package.json';
  const excludeFolders = [
    'dist',
    'node_modules',
    'static',
    'electron',
    'redisgraph',
  ];

  // Recursive function to search for package.json files
  function searchForPackageJson(currentPath) {
    const files = fs.readdirSync(currentPath);

    for (const file of files) {
      const filePath = join(currentPath, file);
      const stats = fs.statSync(filePath);

      if (stats.isDirectory() && !excludeFolders.includes(file)) {
        searchForPackageJson(filePath);
      } else if (file === packageJsonName) {
        packageJsonPaths.push(
          `./${filePath.slice(0, -packageJsonName.length - 1)}`,
        );
      }
    }
  }

  searchForPackageJson(folderPath);
  return packageJsonPaths;
}

// Function to run license check for a given package.json file
async function runLicenseCheck(path) {
  const name = last(path.split('/')) || 'electron';

  const COMMANDS = [
    `license-checker --start ${path} --csv --out ./${licenseFolderName}/${name}_prod.csv --production`,
    `license-checker --start ${path} --csv --out ./${licenseFolderName}/${name}_dev.csv --development`,
  ];

  return await Promise.all(
    COMMANDS.map((command) => {
      const [cmd, ...args] = command.split(' ');
      return new Promise((resolve, reject) => {
        execFile(cmd, args, (error, stdout, stderr) => {
          if (error) {
            console.error(`Failed command: ${command}, error:`, stderr);
            reject(error);
          }
          resolve();
        });
      });
    }),
  );
}

async function sendLicensesToGoogleSheet() {
  try {
    const serviceAccountKey = JSON.parse(
      fs.readFileSync('./gasKey.json', 'utf-8'),
    );

    // Set up JWT client
    const jwtClient = new google.auth.JWT(
      serviceAccountKey.client_email,
      null,
      serviceAccountKey.private_key,
      ['https://www.googleapis.com/auth/spreadsheets'],
    );

    const sheets = google.sheets('v4');

    // Read all .csv files in the 'licenses' folder
    csvFiles.forEach((csvFile) => {
      // Extract sheet name from file name
      const sheetName = csvFile.replace('.csv', '').replaceAll('_', ' ');

      const data = [];
      fs.createReadStream(`./${licenseFolderName}/${csvFile}`)
        .pipe(csvParser({ headers: false }))
        .on('data', (row) => {
          data.push(Object.values(row));
        })
        .on('end', async () => {
          const resource = { values: data };

          try {
            const response = await sheets.spreadsheets.get({
              auth: jwtClient,
              spreadsheetId,
            });

            const sheet = response.data.sheets.find(
              (sheet) => sheet.properties.title === sheetName,
            );
            if (sheet) {
              // Clear contents of the sheet starting from cell A2
              await sheets.spreadsheets.values.clear({
                auth: jwtClient,
                spreadsheetId,
                range: `${sheetName}!A1:Z`, // Assuming Z is the last column
              });
            } else {
              // Create the sheet if it doesn't exist
              await sheets.spreadsheets.batchUpdate({
                auth: jwtClient,
                spreadsheetId,
                resource: set(
                  {},
                  'requests[0].addSheet.properties.title',
                  sheetName,
                ),
              });
            }
          } catch (error) {
            console.error(
              `Error checking/creating sheet for ${sheetName}:`,
              error,
            );
          }

          try {
            await sheets.spreadsheets.values.batchUpdate({
              auth: jwtClient,
              spreadsheetId,
              resource: {
                valueInputOption: 'RAW',
                data: [
                  {
                    range: `${sheetName}!A1`, // Use the sheet name as the range and start from A2
                    majorDimension: 'ROWS',
                    values: data,
                  },
                ],
              },
            });

            console.log(`CSV data has been inserted into ${sheetName} sheet.`);
          } catch (err) {
            console.error(`Error inserting data for ${sheetName}:`, err);
          }
        });
    });
  } catch (error) {
    console.error('Error loading service account key:', error);
  }
}

// Function to read and process each CSV file
const processCSVFile = (file) => {
  return new Promise((resolve, reject) => {
    const parser = csvParser({ columns: true, trim: true });
    const input = fs.createReadStream(`./${licenseFolderName}/${file}`);

    parser.on('data', (record) => {
      allData.push(record);
    });

    parser.on('end', () => {
      resolve();
    });

    parser.on('error', (err) => {
      reject(err);
    });

    input.pipe(parser);
  });
};

// Process and aggregate license data
const processLicenseData = () => {
  const licenseCountMap = {};
  for (const record of allData) {
    const license = record.license;
    licenseCountMap[license] = (licenseCountMap[license] || 0) + 1;
  }
  return licenseCountMap;
};

// Create summary CSV data
const createSummaryData = (licenseCountMap) => {
  const summaryData = [['License', 'Count']];
  for (const license in licenseCountMap) {
    summaryData.push([license, licenseCountMap[license]]);
  }
  return summaryData;
};

// Write summary CSV file
const writeSummaryCSV = async (summaryData) => {
  try {
    const summaryCsvString = await stringifyPromise(summaryData);
    fs.writeFileSync(summaryFilePath, summaryCsvString);
    csvFiles.push(last(summaryFilePath.split('/')));
    console.log(`Summary CSV saved as ${summaryFilePath}`);
  } catch (err) {
    console.error(`Error: ${err}`);
  }
};

// Stringify as a promise
const stringifyPromise = (data) => {
  return new Promise((resolve, reject) => {
    stringify(data, (err, csvString) => {
      if (err) {
        reject(err);
      } else {
        resolve(csvString);
      }
    });
  });
};

async function generateSummary() {
  csvFiles = fs
    .readdirSync(licenseFolderName)
    .filter((file) => file.endsWith('.csv'))
    .sort();

  for (const file of csvFiles) {
    try {
      await processCSVFile(file);
    } catch (err) {
      console.error(`Error processing ${file}: ${err}`);
    }
  }

  const licenseCountMap = processLicenseData();
  const summaryData = createSummaryData(licenseCountMap);

  await writeSummaryCSV(summaryData);
}


================================================
FILE: .github/e2e/test.app-image.sh
================================================
#!/bin/bash
set -e

pkill -f Redis*  || true
rm -f apppath

yarn --cwd tests/e2e install

# mount app resources
chmod +x ./release/*.AppImage
./release/*.AppImage --appimage-mount >> apppath &

# wait briefly to allow the appimage mount command to output to the file
sleep 2

# log the content of apppath
echo "Content of apppath file:"
cat apppath

# create folder before tests run to prevent permissions issue
mkdir -p tests/e2e/remote
mkdir -p tests/e2e/rdi

# run rte
docker compose -f tests/e2e/rte.docker-compose.yml build
docker compose -f tests/e2e/rte.docker-compose.yml up --force-recreate -d -V
./tests/e2e/wait-for-redis.sh localhost 12000 && \

# run tests add TEST_DEBUG=1 to debug framework execution
TEST_DEBUG=0
[ "$TEST_DEBUG" = "1" ] && export DEBUG=testcafe:*
export COMMON_URL=$(tail -n 1 apppath)/resources/app.asar/dist/renderer/index.html
export ELECTRON_PATH=$(tail -n 1 apppath)/redisinsight
export RI_SOCKETS_CORS=true
yarn --cwd tests/e2e dotenv -e .desktop.env yarn --cwd tests/e2e test:desktop:ci


================================================
FILE: .github/e2e/test.app-image.sso.sh
================================================
#!/bin/bash
set -e

yarn --cwd tests/e2e install

# Create the ri-test directory if it doesn't exist
mkdir -p ri-test

# Extract the AppImage
chmod +x ./release/*.AppImage
./release/*.AppImage --appimage-extract

# Move contents of squashfs-root to ri-test and remove squashfs-root folder
mv squashfs-root/* ri-test/
rm -rf squashfs-root

# Export custom XDG_DATA_DIRS with ri-test
export XDG_DATA_DIRS="$(pwd)/ri-test:$XDG_DATA_DIRS"

# create folder before tests run to prevent permissions issue
mkdir -p tests/e2e/remote
mkdir -p tests/e2e/rdi

# Create a custom .desktop file for RedisInsight
cat > ri-test/redisinsight.desktop <<EOL
[Desktop Entry]
Version=1.0
Name=RedisInsight
Exec=$(pwd)/ri-test/redisinsight %u
Icon=$(pwd)/ri-test/resources/app.asar/img/icon.png
Type=Application
Terminal=false
MimeType=x-scheme-handler/redisinsight;
EOL

# Copy the .desktop file to the local applications directory
cp ri-test/redisinsight.desktop "$HOME/.local/share/applications"

# Update the desktop database with custom directory
update-desktop-database "$(pwd)/ri-test/"

# Register the RedisInsight deeplink protocol
xdg-mime default redisinsight.desktop x-scheme-handler/redisinsight

# Run rte
docker compose -f tests/e2e/rte.docker-compose.yml build
docker compose -f tests/e2e/rte.docker-compose.yml up --force-recreate -d -V
./tests/e2e/wait-for-redis.sh localhost 12000 && \

# Run tests
COMMON_URL=$(pwd)/ri-test/resources/app.asar/dist/renderer/index.html \
ELECTRON_PATH=$(pwd)/ri-test/redisinsight \
RI_SOCKETS_CORS=true \
yarn --cwd tests/e2e dotenv -e .desktop.env yarn --cwd tests/e2e test:desktop:ci


================================================
FILE: .github/e2e-results.js
================================================
const fs = require('fs');

let parallelNodeInfo = '';
// const totalNodes = parseInt(process.env.NODE_TOTAL, 10);
const totalNodes = 4;
if (totalNodes > 1) {
  parallelNodeInfo = ` (node: ${parseInt(process.env.NODE_INDEX, 10) + 1}/${totalNodes})`;
}

const file = 'tests/e2e/results/e2e.results.json';
const appBuildType = process.env.APP_BUILD_TYPE || 'Web';
const results = {
  message: {
    text:
      `*E2ETest - ${appBuildType}${parallelNodeInfo}* (Branch: *${process.env.GITHUB_REF_NAME}*)` +
      `\n<https://github.com/RedisInsight/RedisInsight/actions/runs/${process.env.GITHUB_RUN_ID}|View on Github Actions>`,
    attachments: [],
  },
};

const result = JSON.parse(fs.readFileSync(file, 'utf-8'));
const testRunResult = {
  color: '#36a64f',
  title: `Started at: *${result.startTime}`,
  text: `Executed ${result.total} in ${(new Date(result.endTime) - new Date(result.startTime)) / 1000}s`,
  fields: [
    {
      title: 'Passed',
      value: result.passed,
      short: true,
    },
    {
      title: 'Skipped',
      value: result.skipped,
      short: true,
    },
  ],
};
const failed = result.total - result.passed;
if (failed) {
  results.passed = false;
  testRunResult.color = '#cc0000';
  testRunResult.fields.push({
    title: 'Failed',
    value: failed,
    short: true,
  });
}

results.message.attachments.push(testRunResult);

if (results.passed === false) {
  results.message.text = '<!here> ' + results.message.text;
}

fs.writeFileSync(
  'e2e.report.json',
  JSON.stringify({
    channel: process.env.SLACK_TEST_REPORT_CHANNEL,
    ...results.message,
  }),
);


================================================
FILE: .github/generate-build-summary.js
================================================
const fs = require('fs');
const path = require('path');

const { appendFile } = fs.promises;

const {
  AWS_DEFAULT_REGION,
  AWS_BUCKET_NAME_TEST,
  SUB_PATH,
  GITHUB_STEP_SUMMARY,
} = process.env;

const Categories = {
  Linux: 'Linux Builds',
  MacOS: 'MacOS Builds',
  Windows: 'Windows Builds',
  Docker: 'Docker Builds',
};

const directoryPath = path.join(process.cwd(), 'release');
const dockerDirectoryPath = path.join(directoryPath, 'docker');

async function generateBuildSummary() {
  try {
    // Read the contents of the release directory and Docker subdirectory
    const files = fs.readdirSync(directoryPath);
    const dockerFiles = fs.existsSync(dockerDirectoryPath)
      ? fs.readdirSync(dockerDirectoryPath).map((file) => `docker/${file}`)
      : [];

    // Combine all files into a single array
    const allFiles = [...files, ...dockerFiles];

    // Mapping file names to Markdown links and categories
    const fileMappings = {
      'Redis-Insight-mac-arm64.dmg': {
        name: 'Redis Insight for Mac (arm64 DMG)',
        category: Categories.MacOS,
      },
      'Redis-Insight-mac-x64.dmg': {
        name: 'Redis Insight for Mac (x64 DMG)',
        category: Categories.MacOS,
      },
      'Redis-Insight-win-installer.exe': {
        name: 'Redis Insight Windows Installer (exe)',
        category: Categories.Windows,
      },
      'Redis-Insight-linux-x86_64.AppImage': {
        name: 'Redis Insight for Linux (AppImage)',
        category: Categories.Linux,
      },
      'Redis-Insight-linux-amd64.deb': {
        name: 'Redis Insight for Linux (deb)',
        category: Categories.Linux,
      },
      'Redis-Insight-linux-amd64.snap': {
        name: 'Redis Insight for Linux (snap)',
        category: Categories.Linux,
      },
      'Redis-Insight-linux-x86_64.rpm': {
        name: 'Redis Insight for Linux (rpm)',
        category: Categories.Linux,
      },
      'docker/docker-linux-alpine.amd64.tar': {
        name: 'Redis Insight Docker Image (amd64)',
        category: Categories.Docker,
      },
      'docker/docker-linux-alpine.arm64.tar': {
        name: 'Redis Insight Docker Image (arm64)',
        category: Categories.Docker,
      },
    };

    const categories = {};

    // Populate categories with existing files
    allFiles.forEach((file) => {
      const mapping = fileMappings[file];
      if (mapping) {
        if (!categories[mapping.category]) {
          categories[mapping.category] = [];
        }
        const s3path = `https://s3.${AWS_DEFAULT_REGION}.amazonaws.com/${AWS_BUCKET_NAME_TEST}`;
        const href = `${s3path}/public/${SUB_PATH}/${file}`;

        categories[mapping.category].push(`- [${mapping.name}](${href})`);
      }
    });

    // Prepare the summary markdown document
    const markdownLines = ['## Builds:', ''];

    // Append categories to markdown if they have entries
    Object.keys(categories).forEach((category) => {
      if (categories[category].length) {
        markdownLines.push(`### ${category}`, '', ...categories[category], '');
      }
    });

    const data = markdownLines.join('\n');
    const summaryFilePath = GITHUB_STEP_SUMMARY;

    await appendFile(summaryFilePath, data, { encoding: 'utf8' });

    console.log('Build summary generated successfully.');
  } catch (error) {
    console.error(error);
  }
}

generateBuildSummary();


================================================
FILE: .github/generate-checksums-summary.js
================================================
const fs = require('fs');
const path = require('path');

const { appendFile } = fs.promises;

const { GITHUB_STEP_SUMMARY } = process.env;

const directoryPath = path.join(process.cwd(), 'release');

// Mapping of file names to friendly package names (matching release notes format)
const fileMappings = {
  'Redis-Insight-win-installer.exe': 'Windows',
  'Redis-Insight-linux-x86_64.AppImage': 'Linux AppImage',
  'Redis-Insight-linux-amd64.deb': 'Linux Debian',
  'Redis-Insight-linux-x86_64.rpm': 'Linux RPM',
  'Redis-Insight-mac-x64.dmg': 'MacOS Intel',
  'Redis-Insight-mac-arm64.dmg': 'MacOS Apple silicon',
};

// YAML files generated by electron-builder
const yamlFiles = ['latest.yml', 'latest-linux.yml', 'latest-mac.yml'];

/**
 * Simple YAML parser for electron-builder format
 * Extracts file entries with their sha512 values
 */
function parseYamlFile(content) {
  const files = [];
  const lines = content.split('\n');

  let currentFile = null;

  for (const line of lines) {
    // Match file URL entries like "  - url: Redis-Insight-win-installer.exe"
    const urlMatch = line.match(/^\s+-?\s*url:\s*(.+)$/);
    if (urlMatch) {
      currentFile = { url: urlMatch[1].trim() };
      continue;
    }

    // Match sha512 entries like "    sha512: base64hash=="
    const sha512Match = line.match(/^\s+sha512:\s*(.+)$/);
    if (sha512Match && currentFile) {
      currentFile.sha512 = sha512Match[1].trim();
      files.push(currentFile);
      currentFile = null;
    }
  }

  return files;
}

async function generateChecksumsSummary() {
  try {
    const checksums = [];

    // Parse each YAML file
    for (const yamlFile of yamlFiles) {
      const filePath = path.join(directoryPath, yamlFile);

      if (!fs.existsSync(filePath)) {
        console.log(`File not found: ${yamlFile}, skipping...`);
        continue;
      }

      const content = fs.readFileSync(filePath, 'utf8');
      const files = parseYamlFile(content);

      for (const file of files) {
        const packageName = fileMappings[file.url];
        if (packageName && file.sha512) {
          checksums.push({
            package: packageName,
            sha512: file.sha512,
          });
        }
      }
    }

    if (checksums.length === 0) {
      console.log('No checksums found in YAML files.');
      return;
    }

    // Sort checksums in a consistent order
    const order = Object.values(fileMappings);
    checksums.sort(
      (a, b) => order.indexOf(a.package) - order.indexOf(b.package),
    );

    // Generate Markdown table
    const markdownLines = [
      '',
      '## SHA-512 Checksums',
      '',
      '| Package | SHA-512 |',
      '|---------|---------|',
      ...checksums.map((c) => `| ${c.package} | ${c.sha512} |`),
      '',
    ];

    const data = markdownLines.join('\n');

    if (GITHUB_STEP_SUMMARY) {
      await appendFile(GITHUB_STEP_SUMMARY, data, { encoding: 'utf8' });
      console.log('Checksums summary generated successfully.');
    } else {
      // For local testing, print to console
      console.log(data);
    }
  } catch (error) {
    console.error('Error generating checksums summary:', error.message);
  }
}

generateChecksumsSummary();


================================================
FILE: .github/itest-results.js
================================================
const fs = require('fs');

const file = 'redisinsight/api/test/test-runs/coverage/test-run-result.json';

const results = {
  message: {
    text:
      `*ITest - ${process.env.ITEST_NAME}* (Branch: *${process.env.GITHUB_REF_NAME}*)` +
      `\n<https://github.com/RedisInsight/RedisInsight/actions/runs/${process.env.GITHUB_RUN_ID}|View on Github Actions>`,
    attachments: [],
  },
};

const result = JSON.parse(fs.readFileSync(file, 'utf-8'));
const testRunResult = {
  color: '#36a64f',
  title: `Started at: ${result.stats.start}`,
  text: `Executed ${result.stats.tests} in ${result.stats.duration / 1000}s`,
  fields: [
    {
      title: 'Passed',
      value: result.stats.passes,
      short: true,
    },
    {
      title: 'Skipped',
      value: result.stats.pending,
      short: true,
    },
  ],
};

if (result.stats.failures) {
  results.passed = false;
  testRunResult.color = '#cc0000';
  testRunResult.fields.push({
    title: 'Failed',
    value: result.stats.failures,
    short: true,
  });
}

results.message.attachments.push(testRunResult);

if (results.passed === false) {
  results.message.text = '<!here> ' + results.message.text;
}

fs.writeFileSync(
  'itests.report.json',
  JSON.stringify({
    channel: process.env.SLACK_TEST_REPORT_CHANNEL,
    ...results.message,
  }),
);


================================================
FILE: .github/lint-report.js
================================================
const fs = require('fs');

const FILENAME = process.env.FILENAME || 'lint.audit.json';
const WORKDIR = process.env.WORKDIR || '.';
const TARGET = process.env.TARGET || '';
const file = `${WORKDIR}/${FILENAME}`;
const outputFile = `${WORKDIR}/slack.${FILENAME}`;

function generateSlackMessage(summary) {
  const message = {
    text:
      `CODE SCAN: *${TARGET}* result (Branch: *${process.env.GITHUB_REF_NAME}*)` +
      `\n<https://github.com/RedisInsight/RedisInsight/actions/runs/${process.env.GITHUB_RUN_ID}|View on Github Actions>`,
    attachments: [],
  };

  if (summary.total) {
    if (summary.errors) {
      message.attachments.push({
        title: 'Errors',
        color: '#C0392B',
        text: `${summary.errors}`,
      });
    }
    if (summary.warnings) {
      message.attachments.push({
        title: 'Warnings',
        color: '#F5B041',
        text: `${summary.warnings}`,
      });
    }
  } else {
    message.attachments.push({
      title: 'No issues found',
      color: 'good',
    });
  }

  return message;
}

async function main() {
  const summary = {
    errors: 0,
    warnings: 0,
  };
  const scanResult = JSON.parse(fs.readFileSync(file));
  scanResult.forEach((fileResult) => {
    summary.errors += fileResult.errorCount;
    summary.warnings += fileResult.warningCount;
  });

  summary.total = summary.errors + summary.warnings;

  fs.writeFileSync(
    outputFile,
    JSON.stringify({
      channel: process.env.SLACK_AUDIT_REPORT_CHANNEL,
      ...generateSlackMessage(summary),
    }),
  );
}

main();


================================================
FILE: .github/redisstack/app-image.repack.sh
================================================
#!/bin/bash
set -e

ARCH=${ARCH:-x86_64}
WORKING_DIRECTORY=$(pwd)
SOURCE_APP=${SOURCE_APP:-"Redis-Insight-linux-$ARCH.AppImage"}
RI_APP_FOLDER_NAME="Redis-Insight-linux"
TAR_NAME="Redis-Insight-app-linux.$ARCH.tar.gz"
TMP_FOLDER="/tmp/Redis-Insight-app-$ARCH"

rm -rf "$TMP_FOLDER"

mkdir -p "$WORKING_DIRECTORY/release/redisstack"
mkdir -p "$TMP_FOLDER"

cp "./release/$SOURCE_APP" "$TMP_FOLDER"
cd "$TMP_FOLDER" || exit 1

./"$SOURCE_APP" --appimage-extract
mv squashfs-root "$RI_APP_FOLDER_NAME"

tar -czvf "$TAR_NAME" "$RI_APP_FOLDER_NAME"

cp "$TAR_NAME" "$WORKING_DIRECTORY/release/redisstack/"
cd "$WORKING_DIRECTORY" || exit 1


================================================
FILE: .github/redisstack/dmg.repack.sh
================================================
#!/bin/bash
set -e

ARCH=${ARCH:-x64}
WORKING_DIRECTORY=$(pwd)
TAR_NAME="Redis-Insight-app-darwin.$ARCH.tar.gz"
RI_APP_FOLDER_NAME="Redis Insight.app"
TMP_FOLDER="/tmp/$RI_APP_FOLDER_NAME"

rm -rf "$TMP_FOLDER"

mkdir -p "$WORKING_DIRECTORY/release/redisstack"
mkdir -p "$TMP_FOLDER"

hdiutil attach "./release/Redis-Insight-mac-$ARCH.dmg"
rsync -av /Volumes/Redis*/Redis\ Insight.app "/tmp"
cd "/tmp" || exit 1
tar -czvf "$TAR_NAME" "$RI_APP_FOLDER_NAME"
cp "$TAR_NAME" "$WORKING_DIRECTORY/release/redisstack/"
cd "$WORKING_DIRECTORY" || exit 1
hdiutil unmount /Volumes/Redis*/


================================================
FILE: .github/virustotal-report.js
================================================
const fs = require('fs');

const fileName = process.env.FILE_NAME;
const buildName = process.env.BUILD_NAME;
const failed = process.env.FAILED === 'true';

const results = {
  message: {
    text:
      `*Virustotal checks* (Branch: *${process.env.GITHUB_REF_NAME}*)` +
      `\n<https://github.com/RedisInsight/RedisInsight/actions/runs/${process.env.GITHUB_RUN_ID}|View on Github Actions>`,
    attachments: [],
  },
};

const result = {
  color: '#36a64f',
  title: `Finished at: ${new Date().toISOString()}`,
  text: `All builds were passed via virustotal checks`,
  fields: [],
};

if (failed) {
  results.passed = false;
  result.color = '#cc0000';
  result.text = 'Build had failed virustotal checks';
  result.fields.push({
    title: 'Failed build',
    value: buildName,
    short: true,
  });
}

results.message.attachments.push(result);

if (failed === true) {
  results.message.text = '<!here> ' + results.message.text;
}

fs.writeFileSync(
  fileName,
  JSON.stringify({
    channel: process.env.SLACK_VIRUSTOTAL_REPORT_CHANNEL,
    ...results.message,
  }),
);


================================================
FILE: .github/workflows/approval-dedupe.yml
================================================
# Reusable workflow: Approval-based deduplication by PR head SHA
#
# Purpose
# - Gate heavy CI jobs to run only on Approved PR reviews (or manual dispatch in the caller),
# - De-duplicate runs for the same PR head SHA:
#   - mode=run: no prior run found → caller should run heavy jobs
#   - mode=wait: a prior run is queued/in_progress → this workflow waits and mirrors its result
#   - mode=mirror_completed: a prior run already completed → mirror its conclusion immediately
#   - mode=noop: not an approved review (and not allowed workflow_dispatch) → do nothing
#
# How to use (in a caller workflow):
# - Ensure the caller triggers on: pull_request_review: [submitted] and/or workflow_dispatch
# - Add a job that calls this workflow:
#     jobs:
#       approval-dedupe:
#         uses: ./.github/workflows/approval-dedupe.yml
#         secrets: inherit
#         with:
#           workflow_filename: tests-e2e.yml   # set to the caller's filename
#           require_approval: true             # only run on Approved reviews
#           allow_workflow_dispatch: true      # allow manual runs to go to mode=run
# - Gate heavy jobs in the caller with:
#     needs: approval-dedupe
#     if: needs.approval-dedupe.outputs.mode == 'run'
# - Recommended in caller: set concurrency to key by head SHA and cancel-in-progress: false
#

name: Approval Deduplicate

on:
  workflow_call:
    inputs:
      workflow_filename:
        description: The workflow filename to inspect for prior runs (e.g., tests-e2e.yml)
        required: true
        type: string
      require_approval:
        description: Require an Approved review to proceed (ignored for workflow_dispatch when allowed)
        required: false
        type: boolean
        default: true
      allow_workflow_dispatch:
        description: Allow workflow_dispatch to always run heavy jobs
        required: false
        type: boolean
        default: true
      head_sha:
        description: Optional explicit head SHA to use for de-duplication. Defaults to PR head SHA
        required: false
        type: string
    outputs:
      mode:
        description: One of run | wait | mirror_completed | noop
        value: ${{ jobs.gate.outputs.mode }}
      target_run_id:
        description: If mode == wait, the prior run id to wait on
        value: ${{ jobs.gate.outputs.target_run_id }}
      prev_conclusion:
        description: If mode == mirror_completed, the conclusion to mirror
        value: ${{ jobs.gate.outputs.prev_conclusion }}
      prev_run_id:
        description: If mode == mirror_completed, the prior run id being mirrored
        value: ${{ jobs.gate.outputs.prev_run_id }}

permissions:
  actions: read
  contents: read

jobs:
  gate:
    name: Gate and determine mode
    runs-on: ubuntu-latest
    outputs:
      mode: ${{ steps.check.outputs.mode }}
      target_run_id: ${{ steps.check.outputs.target_run_id }}
      prev_conclusion: ${{ steps.check.outputs.prev_conclusion }}
      prev_run_id: ${{ steps.check.outputs.prev_run_id }}
    steps:
      - name: Determine mode
        id: check
        uses: actions/github-script@v7
        env:
          WORKFLOW_FILENAME: ${{ inputs.workflow_filename }}
          REQUIRE_APPROVAL: ${{ inputs.require_approval }}
          ALLOW_WORKFLOW_DISPATCH: ${{ inputs.allow_workflow_dispatch }}
          HEAD_SHA: ${{ inputs.head_sha }}
        with:
          script: |
            const workflowFilename = process.env.WORKFLOW_FILENAME
            const requireApproval = process.env.REQUIRE_APPROVAL === 'true'
            const allowDispatch = process.env.ALLOW_WORKFLOW_DISPATCH === 'true'
            const explicitSha = (process.env.HEAD_SHA || '').trim()

            if (context.eventName === 'workflow_dispatch' && allowDispatch) {
              core.setOutput('mode', 'run')
              return
            }

            if (requireApproval) {
              const approved = (context.eventName === 'pull_request_review') &&
                               (context.payload.review?.state?.toLowerCase() === 'approved')
              if (!approved) {
                core.setOutput('mode', 'noop')
                return
              }
            }

            const sha = explicitSha || context.payload.pull_request?.head?.sha
            if (!sha) {
              core.setOutput('mode', 'run')
              return
            }

            const resp = await github.rest.actions.listWorkflowRuns({
              owner: context.repo.owner,
              repo: context.repo.repo,
              workflow_id: workflowFilename,
              head_sha: sha,
              per_page: 50,
            })

            const currentRunId = context.runId
            const runs = (resp.data.workflow_runs || []).filter(r => r.id !== currentRunId)
            const active = runs.find(r => ['queued', 'in_progress'].includes(r.status))
            if (active) {
              core.setOutput('mode', 'wait')
              core.setOutput('target_run_id', String(active.id))
              core.setOutput('prev_run_id', String(active.id))
              return
            }

            const completed = runs
              .filter(r => r.status === 'completed')
              .sort((a, b) => new Date(b.created_at) - new Date(a.created_at))[0]
            if (completed) {
              core.setOutput('mode', 'mirror_completed')
              core.setOutput('prev_conclusion', completed.conclusion || '')
              core.setOutput('prev_run_id', String(completed.id))
              return
            }

            core.setOutput('mode', 'run')

  wait-previous:
    name: Wait for previous run
    needs: gate
    if: needs.gate.outputs.mode == 'wait'
    runs-on: ubuntu-latest
    steps:
      - name: Wait and mirror
        uses: actions/github-script@v7
        with:
          script: |
            const MAX_WAIT_MS = 60 * 60 * 1000 // 1 hour
            const POLL_INTERVAL_MS = 15 * 1000 // 15 seconds
            const runId = Number('${{ needs.gate.outputs.target_run_id }}')
            const poll = async () => {
              const { data } = await github.rest.actions.getWorkflowRun({
                owner: context.repo.owner,
                repo: context.repo.repo,
                run_id: runId,
              })
              return data
            }
            let data = await poll()
            const started = Date.now()
            while (data.status !== 'completed') {
              if (Date.now() - started > MAX_WAIT_MS) {
                core.setFailed('Timeout waiting for prior run')
                return
              }
              await new Promise(r => setTimeout(r, POLL_INTERVAL_MS))
              data = await poll()
            }
            const conclusion = data.conclusion || 'failure'
            if (conclusion !== 'success') {
              core.setFailed(`Mirroring prior run conclusion: ${conclusion}`)
            }

  mirror-completed:
    name: Mirror completed run
    needs: gate
    if: needs.gate.outputs.mode == 'mirror_completed'
    runs-on: ubuntu-latest
    steps:
      - name: Mirror result
        run: |
          echo "Previous conclusion: ${{ needs.gate.outputs.prev_conclusion }}"
          echo "Mirroring workflow run: https://github.com/${{ github.repository }}/actions/runs/${{ needs.gate.outputs.prev_run_id }}"
          if [ "${{ needs.gate.outputs.prev_conclusion }}" != "success" ]; then
            echo "Mirroring failure"
            exit 1
          fi
          echo "Mirroring success"


================================================
FILE: .github/workflows/aws-upload-dev.yml
================================================
name: AWS Development

on:
  workflow_call:
    inputs:
      pre-release:
        type: boolean
        default: false

env:
  AWS_BUCKET_NAME_TEST: ${{ vars.AWS_BUCKET_NAME_TEST }}
  AWS_DEFAULT_REGION: ${{ vars.AWS_DEFAULT_REGION }}
  AWS_DISTRIBUTION_ID: ${{ secrets.AWS_DISTRIBUTION_ID }}
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

jobs:
  s3:
    name: Upload to s3
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Get current date
        id: date
        uses: ./.github/actions/get-current-date

      - name: Download builds
        uses: actions/download-artifact@v4
        with:
          pattern: '*-builds'
          path: release
          merge-multiple: true

      - run: ls -R ./release

      - name: Upload builds to s3 bucket dev sub folder
        if: ${{ !inputs.pre-release }}
        run: |
          SUB_PATH="dev-builds/${{ steps.date.outputs.date }}/${{ github.run_id }}"
          echo "SUB_PATH=${SUB_PATH}" >> $GITHUB_ENV

          aws s3 cp release/ s3://${AWS_BUCKET_NAME_TEST}/public/${SUB_PATH} --recursive

      - name: Upload builds to s3 bucket pre-releasea sub folder
        if: inputs.pre-release
        run: |
          APP_VERSION=$(jq -r '.version' redisinsight/package.json)
          SUB_PATH="pre-release/${APP_VERSION}"

          echo "SUB_PATH=${SUB_PATH}" >> $GITHUB_ENV

          aws s3 cp release/ s3://${AWS_BUCKET_NAME_TEST}/public/upgrades --recursive
          aws s3 cp release/ s3://${AWS_BUCKET_NAME_TEST}/public/pre-release/${APP_VERSION} --recursive

      - name: Download vendor plugins
        uses: actions/download-artifact@v4
        id: download-vendor
        continue-on-error: true
        with:
          name: 'vendor-plugins'
          path: vendor

      - name: Upload vendor plugins to s3 bucket
        if: steps.download-vendor.outcome == 'success'
        run: |
          aws s3 cp vendor/ s3://${AWS_BUCKET_NAME_TEST}/public/plugins/static/ --recursive

      - name: Generate job summary
        run: |
          node ./.github/generate-build-summary.js

      - name: Generate checksums summary
        continue-on-error: true
        run: node ./.github/generate-checksums-summary.js


================================================
FILE: .github/workflows/aws-upload-enterprise.yml
================================================
name: AWS Upload Enterprise

on:
  workflow_call:
    inputs:
      environment:
        description: Environment for build
        required: false
        default: 'development'
        type: string

env:
  AWS_BUCKET_NAME_PROD: ${{ vars.AWS_BUCKET_NAME_ENTERPRISE }}
  AWS_BUCKET_NAME_TEST: ${{ vars.AWS_BUCKET_NAME_ENTERPRISE_TEST }}
  AWS_DEFAULT_REGION: ${{ vars.AWS_DEFAULT_REGION }}
  AWS_DISTRIBUTION_ID: ${{ secrets.AWS_DISTRIBUTION_ID }}
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

jobs:
  s3:
    name: Upload to s3
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Get current date
        id: date
        uses: ./.github/actions/get-current-date

      - name: Download builds
        uses: actions/download-artifact@v4
        with:
          pattern: '*-builds'
          path: release
          merge-multiple: true

      - run: ls -R ./release

      - name: Renaming builds
        run: |
          APP_VERSION=$(jq -r '.version' redisinsight/package.json)
          VERSION="${APP_VERSION//./-}"
          TARGET_DIR=./release
          PREFIX="Redis-Insight"
          NEW_PREFIX="Redis-Insight-Enterprise-$VERSION"

          echo "Renaming artifacts. New prefix: $NEW_PREFIX"

          if [[ "$OSTYPE" == "darwin"* ]]; then
            SED_INPLACE="sed -i.bak"
          else
            SED_INPLACE="sed -i"
          fi

          # Step 1: Rename files in target dir
          for FILE in "$TARGET_DIR"/"$PREFIX"*; do
            if [ -f "$FILE" ]; then
              BASENAME="$(basename "$FILE")"
              SUFFIX="${BASENAME#"$PREFIX"-}"
              NEW_NAME="${NEW_PREFIX}-${SUFFIX}"
              mv "$FILE" "$TARGET_DIR/$NEW_NAME"
              echo "Renamed: $BASENAME -> $NEW_NAME"
            fi
          done

          # Step 2: Replace old filenames in all .yml files
          for YML_FILE in "$TARGET_DIR"/*.yml; do
            echo "Scanning: $YML_FILE"

            grep -oE 'Redis-Insight[^[:space:]]+' "$YML_FILE" | sort -u | while read -r OLD_NAME; do
              if [[ "$OLD_NAME" == "$PREFIX"-* ]]; then
                SUFFIX="${OLD_NAME#"$PREFIX"-}"
                NEW_NAME="${NEW_PREFIX}-${SUFFIX}"

                # Escape for sed
                ESCAPED_OLD=$(printf '%s\n' "$OLD_NAME" | sed -e 's/[\/&]/\\&/g')
                ESCAPED_NEW=$(printf '%s\n' "$NEW_NAME" | sed -e 's/[\/&]/\\&/g')

                if $SED_INPLACE "s/$ESCAPED_OLD/$ESCAPED_NEW/g" "$YML_FILE"; then
                  echo "  ✔ Updated: $OLD_NAME -> $NEW_NAME"
                else
                  echo "  ✘ ERROR updating: $OLD_NAME -> $NEW_NAME"
                fi
              fi
            done
          done

      - name: Upload builds to s3 bucket dev sub folder
        if: ${{ inputs.environment != 'production' }}
        run: |
          SUB_PATH="dev-builds/${{ steps.date.outputs.date }}/${{ github.run_id }}"
          echo "SUB_PATH=${SUB_PATH}" >> $GITHUB_ENV

          aws s3 cp release/ s3://${AWS_BUCKET_NAME_TEST}/public/${SUB_PATH} --recursive

      - name: Upload builds to s3 bucket pre-release sub folder
        if: ${{ inputs.environment == 'production' }}
        run: |
          APP_VERSION=$(jq -r '.version' redisinsight/package.json)

          aws s3 cp release/ s3://${AWS_BUCKET_NAME_PROD}/releases/${APP_VERSION} --recursive
          aws s3 cp release/ s3://${AWS_BUCKET_NAME_PROD}/latest --recursive

      - name: Generate job summary
        run: |
          node ./.github/generate-build-summary.js


================================================
FILE: .github/workflows/aws-upload-prod.yml
================================================
name: AWS production

on:
  workflow_call:

env:
  AWS_BUCKET_NAME: ${{ secrets.AWS_BUCKET_NAME }}
  AWS_DISTRIBUTION_ID: ${{ secrets.AWS_DISTRIBUTION_ID }}
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  AWS_DEFAULT_REGION: ${{ vars.AWS_DEFAULT_REGION }}

jobs:
  release-private:
    name: Release s3 private
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Merge builds by pattern
        id: merge-builds
        uses: actions/upload-artifact/merge@v4
        with:
          name: 'all-builds'
          pattern: '*-builds'
          delete-merged: true

      - name: Download builds
        uses: actions/download-artifact@v4
        with:
          name: 'all-builds'
          path: release

      - run: ls -R ./release

      - name: Publish private
        run: |
          chmod +x .github/build/sum_sha256.sh
          .github/build/sum_sha256.sh
          applicationVersion=$(jq -r '.version' redisinsight/package.json)

          aws s3 cp release/ s3://${AWS_BUCKET_NAME}/private/${applicationVersion} --recursive

      - name: Generate checksums summary
        continue-on-error: true
        run: node ./.github/generate-checksums-summary.js

  release-public:
    name: Release s3 public
    runs-on: ubuntu-latest
    needs: 'release-private'
    environment: 'production-approve'
    steps:
      - uses: actions/checkout@v4

      - name: Init variables
        run: |
          latestYmlFileName="latest.yml"
          downloadLatestFolderPath="public/latest-v3"
          upgradeLatestFolderPath="public/upgrades-v3"
          releasesFolderPath="public/releases"
          appName=$(jq -r '.productName' electron-builder.json)
          appVersion=$(jq -r '.version' redisinsight/package.json)

          echo "downloadLatestFolderPath=${downloadLatestFolderPath}" >> $GITHUB_ENV
          echo "upgradeLatestFolderPath=${upgradeLatestFolderPath}" >> $GITHUB_ENV
          echo "releasesFolderPath=${releasesFolderPath}" >> $GITHUB_ENV
          echo "applicationName=${appName}" >> $GITHUB_ENV
          echo "applicationVersion=${appVersion}" >> $GITHUB_ENV
          echo "appFileName=Redis-Insight" >> $GITHUB_ENV

          # download latest.yml file to get last public version
          aws s3 cp s3://${AWS_BUCKET_NAME}/${downloadLatestFolderPath}/${latestYmlFileName} .

          versionLine=$(head -1 ${latestYmlFileName})
          versionLineArr=(${versionLine/:// })
          previousAppVersion=${versionLineArr[1]}

          echo "previousApplicationVersion=${previousAppVersion}" >> $GITHUB_ENV

      - name: Publish AWS S3
        run: |

          # check if sub directories exists
          if [[ -z "$downloadLatestFolderPath" || -z "$upgradeLatestFolderPath" ]]; then
            exit 1;
          fi
          # remove previous build from the latest directory /public/latest
          aws s3 rm s3://${AWS_BUCKET_NAME}/${downloadLatestFolderPath} --recursive

          # remove previous build from the upgrade directory /public/upgrades
          aws s3 rm s3://${AWS_BUCKET_NAME}/${upgradeLatestFolderPath} --recursive

          # copy current version apps for download to /public/latest
          aws s3 cp s3://${AWS_BUCKET_NAME}/private/${applicationVersion}/ \
            s3://${AWS_BUCKET_NAME}/${downloadLatestFolderPath} --recursive  --exclude "*.zip"

          # copy current version apps for upgrades to /public/upgrades
          aws s3 cp s3://${AWS_BUCKET_NAME}/private/${applicationVersion}/ \
            s3://${AWS_BUCKET_NAME}/${upgradeLatestFolderPath} --recursive

          # !MOVE current version apps to releases folder /public/releases
          aws s3 mv s3://${AWS_BUCKET_NAME}/private/${applicationVersion}/ \
            s3://${AWS_BUCKET_NAME}/${releasesFolderPath}/${applicationVersion} --recursive

          # invalidate cloudfront cash
          aws cloudfront create-invalidation --distribution-id ${AWS_DISTRIBUTION_ID} --paths "/*"

      - name: Add tags for all objects and create S3 metrics
        run: |

          # declare all tags
          declare -A tag0=(
            [arch]='x64'
            [platform]='macos'
            [objectDownload]=${appFileName}'-mac-x64.dmg'
            [objectUpgrade]=${appFileName}'-mac-x64.zip'
          )

          declare -A tag1=(
            [arch]='arm64'
            [platform]='macos'
            [objectDownload]=${appFileName}'-mac-arm64.dmg'
            [objectUpgrade]=${appFileName}'-mac-arm64.zip'
          )

          declare -A tag2=(
            [arch]='x64'
            [platform]='windows'
            [objectDownload]=${appFileName}'-win-installer.exe'
          )

          declare -A tag3=(
            [arch]='x64'
            [platform]='linux_AppImage'
            [objectDownload]=${appFileName}'-linux-x86_64.AppImage'
          )

          declare -A tag4=(
            [arch]='x64'
            [platform]='linux_deb'
            [objectDownload]=${appFileName}'-linux-amd64.deb'
          )

          declare -A tag5=(
            [arch]='x64'
            [platform]='linux_rpm'
            [objectDownload]=${appFileName}'-linux-x86_64.rpm'
          )

          # loop for add all tags to each app and create metrics
          declare -n tag
          for tag in ${!tag@}; do

            designation0="downloads"
            designation1="upgrades"

            id0="${tag[platform]}_${tag[arch]}_${designation0}_${applicationVersion}"
            id1="${tag[platform]}_${tag[arch]}_${designation1}_${applicationVersion}"

            # add tags to each app for download
            aws s3api put-object-tagging \
              --bucket ${AWS_BUCKET_NAME} \
              --key ${downloadLatestFolderPath}/${tag[objectDownload]} \
              --tagging '{"TagSet": [{ "Key": "version", "Value": "'"${applicationVersion}"'" }, {"Key": "platform", "Value": "'"${tag[platform]}"'"}, {"Key": "arch", "Value": "'"${tag[arch]}"'"}, { "Key": "designation", "Value": "'"${designation0}"'" }]}'

            # add tags to each app for upgrades
            aws s3api put-object-tagging \
              --bucket ${AWS_BUCKET_NAME} \
              --key ${upgradeLatestFolderPath}/${tag[objectUpgrade]:=${tag[objectDownload]}} \
              --tagging '{"TagSet": [{ "Key": "version", "Value": "'"${applicationVersion}"'" }, {"Key": "platform", "Value": "'"${tag[platform]}"'"}, {"Key": "arch", "Value": "'"${tag[arch]}"'"}, { "Key": "designation", "Value": "'"${designation1}"'" }]}'

            # Create metrics for all tags for downloads to S3
            aws s3api put-bucket-metrics-configuration \
              --bucket ${AWS_BUCKET_NAME} \
              --id ${id0} \
              --metrics-configuration '{"Id": "'"${id0}"'", "Filter": {"And": {"Tags": [{"Key": "platform", "Value": "'"${tag[platform]}"'"}, {"Key": "arch", "Value": "'"${tag[arch]}"'"}, {"Key": "designation", "Value": "'"${designation0}"'"}, {"Key": "version", "Value": "'"${applicationVersion}"'"} ]}}}'

            # Create metrics for all tags for upgrades to S3
            aws s3api put-bucket-metrics-configuration \
              --bucket ${AWS_BUCKET_NAME} \
              --id ${id1} \
              --metrics-configuration '{"Id": "'"${id1}"'", "Filter": {"And": {"Tags": [{"Key": "platform", "Value": "'"${tag[platform]}"'"}, {"Key": "arch", "Value": "'"${tag[arch]}"'"}, {"Key": "designation", "Value": "'"${designation1}"'"}, {"Key": "version", "Value": "'"${applicationVersion}"'"}]}}}'

          done


================================================
FILE: .github/workflows/build.yml
================================================
name: Build

on:
  # Called for Release workflows
  workflow_call:
    inputs:
      environment:
        description: Environment to run build
        type: string
        default: 'staging'

      target:
        description: Build target
        type: string
        default: 'all'

      debug:
        description: Enable SSH Debug
        type: boolean

      enterprise:
        description: Enterprise build
        type: boolean

jobs:
  build-linux:
    if: contains(inputs.target, 'linux') || inputs.target == 'all'
    uses: ./.github/workflows/pipeline-build-linux.yml
    secrets: inherit
    with:
      environment: ${{ inputs.environment }}
      target: ${{ inputs.target }}
      debug: ${{ inputs.debug }}
      enterprise: ${{ inputs.enterprise }}

  build-macos:
    if: contains(inputs.target, 'macos') || inputs.target == 'all'
    uses: ./.github/workflows/pipeline-build-macos.yml
    secrets: inherit
    with:
      environment: ${{ inputs.environment }}
      target: ${{ inputs.target }}
      debug: ${{ inputs.debug }}
      enterprise: ${{ inputs.enterprise }}

  build-windows:
    if: contains(inputs.target, 'windows') || inputs.target == 'all'
    uses: ./.github/workflows/pipeline-build-windows.yml
    secrets: inherit
    with:
      environment: ${{ inputs.environment }}
      debug: ${{ inputs.debug }}
      enterprise: ${{ inputs.enterprise }}

  build-docker:
    if: contains(inputs.target, 'docker') || inputs.target == 'all'
    uses: ./.github/workflows/pipeline-build-docker.yml
    secrets: inherit
    with:
      environment: ${{ inputs.environment }}
      debug: ${{ inputs.debug }}
      enterprise: ${{ inputs.enterprise }}


================================================
FILE: .github/workflows/clean-deployments.yml
================================================
name: Delete deployments
on:
  workflow_call:

jobs:
  clean:
    name: Clean deployments
    runs-on: ubuntu-latest
    steps:
      - name: 🗑 Delete deployment (staging)
        uses: strumwolf/delete-deployment-environment@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          environment: staging
          onlyRemoveDeployments: true

      - name: 🗑 Delete deployment (production)
        uses: strumwolf/delete-deployment-environment@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          environment: production
          onlyRemoveDeployments: true

      - name: 🗑 Delete deployment (gh-actions)
        uses: strumwolf/delete-deployment-environment@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          environment: gh-pages
          onlyRemoveDeployments: true


================================================
FILE: .github/workflows/clean-s3-dev-builds.yml
================================================
name: Clean AWS S3 development builds
on:
  workflow_call:

env:
  AWS_BUCKET_NAME_TEST: ${{ secrets.AWS_BUCKET_NAME_TEST }}
  AWS_DISTRIBUTION_ID: ${{ secrets.AWS_DISTRIBUTION_ID }}
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  AWS_DEFAULT_REGION: ${{ vars.AWS_DEFAULT_REGION }}

jobs:
  deleting:
    runs-on: ubuntu-latest
    steps:
      - name: Deleting builds and test reports older than 7 days
        continue-on-error: true
        run: |
          DATE=$(date +'%Y-%m-%d')
          DATE_EPIRED=$(date -d "$DATE - 7 days" +'%Y-%m-%d')

          aws s3 rm s3://${AWS_BUCKET_NAME_TEST}/public/dev-builds/${DATE_EPIRED} --recursive
          aws s3 rm s3://${AWS_BUCKET_NAME_TEST}/public/test-reports/${DATE_EPIRED} --recursive


================================================
FILE: .github/workflows/code-coverage.yml
================================================
name: 'Code Coverage'
on:
  workflow_call:
    inputs:
      type:
        description: Type of report (unit or integration)
        type: string
      resource_name:
        description: Resource name of coverage report
        type: string

jobs:
  coverage-unit:
    runs-on: ubuntu-latest
    name: Unit tests coverage
    if: ${{ inputs.type == 'unit' }}
    steps:
      - uses: actions/checkout@v4

      - name: Download Coverage Report
        uses: actions/download-artifact@v4
        with:
          name: ${{ inputs.resource_name }}
          path: report

      - uses: jwalton/gh-find-current-pr@v1
        id: findPr

      - uses: ArtiomTr/jest-coverage-report-action@v2
        with:
          prnumber: ${{ steps.findPr.outputs.number }}
          coverage-file: report/coverage/report.json
          base-coverage-file: report/coverage/report.json
          github-token: ${{ secrets.GITHUB_TOKEN }}
          skip-step: all
          custom-title: Code Coverage - ${{ inputs.resource_name == 'report-be' && 'Backend' || 'Frontend' }} unit tests

  coverage-integration:
    runs-on: ubuntu-latest
    name: Integration tests coverage
    if: ${{ inputs.type == 'integration' }}
    steps:
      - uses: actions/checkout@v4

      - name: Download Coverage Report
        uses: actions/download-artifact@v4
        with:
          name: ${{ inputs.resource_name }}

      - name: Parse Coverage Summary
        id: parse-coverage
        run: |
          # Extract coverage data from file.
          # Example of processed row:
          #   Statements   : 81.75% ( 16130/19730 )
          # field '$3' = 81.75%, field '$5' = 16130
          extract_coverage_data() {
              local keyword=$1
              local field=$2
              awk "/$keyword/ {print $field}" integration-coverage.txt | tr -d '\n|%'
          }

          # Determine status based on percentage
          get_status() {
              if [ "$(echo "$1 < 50" | bc)" -eq 1 ]; then
                  echo "🔴"
              elif [ "$(echo "$1 < 80" | bc)" -eq 1 ]; then
                  echo "🟡"
              else
                  echo "🟢"
              fi
          }

          # Extract coverage data from the summary
          STATEMENTS_PERCENT=$(extract_coverage_data "Statements" '$3')
          STATEMENTS_COVERED=$(extract_coverage_data "Statements" '$5')
          STATEMENTS_STATUS=$(get_status $STATEMENTS_PERCENT)

          BRANCHES_PERCENT=$(extract_coverage_data "Branches" '$3')
          BRANCHES_COVERED=$(extract_coverage_data "Branches" '$5')
          BRANCHES_STATUS=$(get_status $BRANCHES_PERCENT)

          FUNCTIONS_PERCENT=$(extract_coverage_data "Functions" '$3')
          FUNCTIONS_COVERED=$(extract_coverage_data "Functions" '$5')
          FUNCTIONS_STATUS=$(get_status $FUNCTIONS_PERCENT)

          LINES_PERCENT=$(extract_coverage_data "Lines" '$3')
          LINES_COVERED
Download .txt
Showing preview only (373K chars total). Download the full file or copy to clipboard to get everything.
gitextract_fr3fg8ca/

├── .ai/
│   ├── README.md
│   ├── commands/
│   │   ├── commit-message.md
│   │   ├── e2e-fix.md
│   │   ├── e2e-generate.md
│   │   ├── generate-release-notes.md
│   │   ├── pr-plan.md
│   │   └── pull-request-review.md
│   ├── rules/
│   │   ├── backend.md
│   │   ├── code-quality.md
│   │   ├── e2e-testing.md
│   │   ├── frontend.md
│   │   ├── git-safety.md
│   │   └── testing.md
│   └── skills/
│       ├── branches/
│       │   └── SKILL.md
│       ├── commits/
│       │   └── SKILL.md
│       └── pull-requests/
│           └── SKILL.md
├── .cursor/
│   └── agents/
│       └── test-runner.md
├── .cursorignore
├── .dockerignore
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── actions/
│   │   ├── deploy-test-reports/
│   │   │   └── action.yml
│   │   ├── get-current-date/
│   │   │   └── action.yml
│   │   ├── install-all-build-libs/
│   │   │   └── action.yml
│   │   ├── install-apple-certs/
│   │   │   └── action.yml
│   │   ├── install-deps/
│   │   │   └── action.yml
│   │   ├── install-windows-certs/
│   │   │   └── action.yml
│   │   ├── remove-artifacts/
│   │   │   └── action.yml
│   │   └── setup-e2e-playwright/
│   │       └── action.yml
│   ├── build/
│   │   ├── build.Dockerfile
│   │   ├── build.sh
│   │   ├── build_modules.sh
│   │   ├── release-docker.sh
│   │   └── sum_sha256.sh
│   ├── codeql/
│   │   └── config.yml
│   ├── copilot-instructions.md
│   ├── deps-audit-report.js
│   ├── deps-licenses-report.js
│   ├── e2e/
│   │   ├── test.app-image.sh
│   │   └── test.app-image.sso.sh
│   ├── e2e-results.js
│   ├── generate-build-summary.js
│   ├── generate-checksums-summary.js
│   ├── itest-results.js
│   ├── lint-report.js
│   ├── redisstack/
│   │   ├── app-image.repack.sh
│   │   └── dmg.repack.sh
│   ├── virustotal-report.js
│   └── workflows/
│       ├── approval-dedupe.yml
│       ├── aws-upload-dev.yml
│       ├── aws-upload-enterprise.yml
│       ├── aws-upload-prod.yml
│       ├── build.yml
│       ├── clean-deployments.yml
│       ├── clean-s3-dev-builds.yml
│       ├── code-coverage.yml
│       ├── codeql-analysis.yml
│       ├── compress-images.yml
│       ├── enforce-branch-name-rules.yml
│       ├── licenses-check.yml
│       ├── lint.yml
│       ├── manual-build-enterprise.yml
│       ├── manual-build.yml
│       ├── nightly-virustotal-analyze.yml
│       ├── pipeline-build-docker.yml
│       ├── pipeline-build-linux.yml
│       ├── pipeline-build-macos.yml
│       ├── pipeline-build-windows.yml
│       ├── publish-stores.yml
│       ├── release-prod.yml
│       ├── release-stage.yml
│       ├── tests-backend.yml
│       ├── tests-e2e-appimage.yml
│       ├── tests-e2e-docker-critical-path.yml
│       ├── tests-e2e-docker-regression.yml
│       ├── tests-e2e-docker-smoke.yml
│       ├── tests-e2e-playwright-chromium.yml
│       ├── tests-e2e-playwright-docker.yml
│       ├── tests-e2e-playwright-electron.yml
│       ├── tests-e2e-playwright-lint.yml
│       ├── tests-e2e-playwright-v2.yml
│       ├── tests-e2e-playwright.yml
│       ├── tests-e2e.yml
│       ├── tests-frontend.yml
│       ├── tests-integration.yml
│       ├── tests.yml
│       ├── virustotal.yml
│       └── weekly.yml
├── .gitignore
├── .jit/
│   └── jit-config.yml
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .storybook/
│   ├── RootStoryLayout.tsx
│   ├── Story.context.ts
│   ├── ThemeContextBridge.tsx
│   ├── helpers/
│   │   └── styles.ts
│   ├── main.ts
│   ├── manager.ts
│   ├── preview-head.html
│   ├── preview.tsx
│   ├── redis-theme.ts
│   ├── tsconfig.json
│   └── vite.config.ts
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   └── settings.json
├── .yarnrc
├── AGENTS.md
├── CHANGELOG.md
├── CONDUCT
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── api-docker-entry.sh
├── babel.config.cjs
├── configs/
│   ├── .eslintrc
│   ├── webpack.config.base.ts
│   ├── webpack.config.eslint.js
│   ├── webpack.config.main.prod.ts
│   ├── webpack.config.main.stage.ts
│   ├── webpack.config.preload.dev.ts
│   └── webpack.paths.ts
├── dev.provisionprofile
├── docker-entry.sh
├── docs/
│   ├── azure-docker-setup.md
│   ├── azure-setup.md
│   ├── plugins/
│   │   ├── development.md
│   │   ├── installation.md
│   │   └── introduction.md
│   └── release-notes/
│       └── RELEASE_NOTES_TEMPLATE.md
├── electron-builder-mas.js
├── electron-builder.json
├── embedded.provisionprofile
├── env.mcp.example
├── jest-resolver.js
├── jest.config.cjs
├── mcp.json
├── package.json
├── patches/
│   ├── @elastic+eui+34.6.0.patch
│   ├── monaco-yaml+5.1.1.patch
│   └── react-vtree+3.0.0-beta.3.patch
├── pull_request_template.md
├── redisinsight/
│   ├── __mocks__/
│   │   ├── brotli-dec-wasm.js
│   │   ├── fileMock.js
│   │   ├── monacoMock.js
│   │   ├── monacoYamlMock.js
│   │   ├── rawproto.js
│   │   ├── react-children-utilities.js
│   │   ├── react-resizable-panels.js
│   │   ├── rehypeStringify.js
│   │   ├── remarkGfm.js
│   │   ├── remarkParse.js
│   │   ├── remarkRehype.js
│   │   ├── scssRaw.js
│   │   ├── svg.js
│   │   ├── unified.js
│   │   └── unistUtilsVisit.js
│   ├── api/
│   │   ├── .dockerignore
│   │   ├── .eslintignore
│   │   ├── .gitignore
│   │   ├── .jest.setup.ts
│   │   ├── .prettierignore
│   │   ├── .prettierrc
│   │   ├── .yarnclean.prod
│   │   ├── bruno/
│   │   │   └── RedisInsight/
│   │   │       ├── Query Library/
│   │   │       │   ├── Create/
│   │   │       │   │   ├── Create Query (invalid).bru
│   │   │       │   │   ├── Create Query.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Delete/
│   │   │       │   │   ├── Delete Query (invalid).bru
│   │   │       │   │   ├── Delete Query.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Get/
│   │   │       │   │   ├── Get Query (invalid).bru
│   │   │       │   │   ├── Get Query.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Get Queries/
│   │   │       │   │   ├── Get Queries.bru
│   │   │       │   │   ├── Search Queries.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Seed/
│   │   │       │   │   ├── Seed Queries.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   ├── Update/
│   │   │       │   │   ├── Update Query (invalid).bru
│   │   │       │   │   ├── Update Query.bru
│   │   │       │   │   └── folder.bru
│   │   │       │   └── folder.bru
│   │   │       ├── bruno.json
│   │   │       └── environments/
│   │   │           └── Local.bru
│   │   ├── config/
│   │   │   ├── default.ts
│   │   │   ├── development.ts
│   │   │   ├── features-config.json
│   │   │   ├── logger.ts
│   │   │   ├── ormconfig.ts
│   │   │   ├── production.ts
│   │   │   ├── stack.ts
│   │   │   ├── staging.ts
│   │   │   ├── swagger.ts
│   │   │   └── test.ts
│   │   ├── data/
│   │   │   ├── common
│   │   │   ├── json
│   │   │   ├── manifest.json
│   │   │   ├── search
│   │   │   └── vector-collections/
│   │   │       ├── bikes
│   │   │       └── movies
│   │   ├── esbuild.js
│   │   ├── migration/
│   │   │   ├── 1614164490968-initial-migration.ts
│   │   │   ├── 1615480887019-connection-type.ts
│   │   │   ├── 1615990079125-database-name-from-provider.ts
│   │   │   ├── 1615992183565-remove-database-type.ts
│   │   │   ├── 1616520395940-oss-sentinel.ts
│   │   │   ├── 1625771635418-agreements.ts
│   │   │   ├── 1626086601057-server-info.ts
│   │   │   ├── 1626904405170-database-hosting-provider.ts
│   │   │   ├── 1627556171227-settings.ts
│   │   │   ├── 1629729923740-database-modules.ts
│   │   │   ├── 1634219846022-database-db-index.ts
│   │   │   ├── 1634557312500-encryption.ts
│   │   │   ├── 1641795882696-command-execution.ts
│   │   │   ├── 1641805606399-plugin-state.ts
│   │   │   ├── 1650278664000-sni.ts
│   │   │   ├── 1655821010349-notification.ts
│   │   │   ├── 1659687030433-notification-category.ts
│   │   │   ├── 1660664717573-workbench-mode.ts
│   │   │   ├── 1663093411715-workbench-group-mode.ts
│   │   │   ├── 1664785208236-database-analysis.ts
│   │   │   ├── 1664886479051-database-analysis-expiration-groups.ts
│   │   │   ├── 1667368983699-workbench-execution-time.ts
│   │   │   ├── 1667477693934-database.ts
│   │   │   ├── 1670252337342-database-new.ts
│   │   │   ├── 1673035852335-ssh-options.ts
│   │   │   ├── 1673934231410-workbench-and-analysis-db.ts
│   │   │   ├── 1674539211397-browser-history.ts
│   │   │   ├── 1674660306971-database-analysis-recommendations.ts
│   │   │   ├── 1675398140189-database-timeout.ts
│   │   │   ├── 1677135091633-custom-tutorials.ts
│   │   │   ├── 1678182722874-database-compressor.ts
│   │   │   ├── 1681900503586-database-recommendations.ts
│   │   │   ├── 1683006064293-database-recommendation-params.ts
│   │   │   ├── 1684931530343-feature.ts
│   │   │   ├── 1686719451753-database-redis-server.ts
│   │   │   ├── 1687166457712-cloud-database-details.ts
│   │   │   ├── 1687435940110-database-recommendation-unique.ts
│   │   │   ├── 1688989337247-freeCloudDatabase.ts
│   │   │   ├── 1691061058385-cloud-capi-keys.ts
│   │   │   ├── 1691476419592-feature-sso.ts
│   │   │   ├── 1713515657364-ai-history.ts
│   │   │   ├── 1714501203616-ai-history-steps.ts
│   │   │   ├── 1716370509836-rdi.ts
│   │   │   ├── 1718260230164-ai-history.ts
│   │   │   ├── 1726058563737-command-execution.ts
│   │   │   ├── 1729085495444-cloud-session.ts
│   │   │   ├── 1733740794737-database-createdAt.ts
│   │   │   ├── 1737362130798-db-settings.ts
│   │   │   ├── 1738829743482-database-forceStandalone.ts
│   │   │   ├── 1740579711635-rdi-optional-auth.ts
│   │   │   ├── 1741610039177-database-tags.ts
│   │   │   ├── 1741786803681-pre-setup-databases.ts
│   │   │   ├── 1742303245547-key-name-format.ts
│   │   │   ├── 1743432519891-cascade-tags.ts
│   │   │   ├── 1743606395647-encrypt-tags.ts
│   │   │   ├── 1755086732238-update-provider-names.ts
│   │   │   ├── 1769785218000-provider-details.ts
│   │   │   ├── 1771500000000-query-library.ts
│   │   │   └── index.ts
│   │   ├── nest-cli.json
│   │   ├── package.json
│   │   ├── package.tmp.json
│   │   ├── patches/
│   │   │   └── redis-parser+3.0.0.patch
│   │   ├── scripts/
│   │   │   ├── default-commands.ts
│   │   │   ├── default-content.ts
│   │   │   └── default-tutorials.ts
│   │   ├── src/
│   │   │   ├── __mocks__/
│   │   │   │   ├── ai.ts
│   │   │   │   ├── analytics.ts
│   │   │   │   ├── app-settings.ts
│   │   │   │   ├── autodiscovery.ts
│   │   │   │   ├── browser-history.ts
│   │   │   │   ├── bulk-actions.ts
│   │   │   │   ├── certificates.ts
│   │   │   │   ├── cloud-auth.ts
│   │   │   │   ├── cloud-autodiscovery.ts
│   │   │   │   ├── cloud-capi-key.ts
│   │   │   │   ├── cloud-common.ts
│   │   │   │   ├── cloud-database.ts
│   │   │   │   ├── cloud-job.ts
│   │   │   │   ├── cloud-session.ts
│   │   │   │   ├── cloud-subscription.ts
│   │   │   │   ├── cloud-task.ts
│   │   │   │   ├── cloud-user.ts
│   │   │   │   ├── commands.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── custom-tutorial.ts
│   │   │   │   ├── database-discovery.ts
│   │   │   │   ├── database-import.ts
│   │   │   │   ├── database-info.ts
│   │   │   │   ├── database-recommendation.ts
│   │   │   │   ├── database-settings.ts
│   │   │   │   ├── databases-client.ts
│   │   │   │   ├── databases.ts
│   │   │   │   ├── encryption.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── event-emitter.ts
│   │   │   │   ├── feature.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── notification.ts
│   │   │   │   ├── profiler.ts
│   │   │   │   ├── rdi.ts
│   │   │   │   ├── redis-client.ts
│   │   │   │   ├── redis-databases.ts
│   │   │   │   ├── redis-enterprise.ts
│   │   │   │   ├── redis-info.ts
│   │   │   │   ├── redis-rs.ts
│   │   │   │   ├── redis-sentinel.ts
│   │   │   │   ├── redis-utils.ts
│   │   │   │   ├── redis.ts
│   │   │   │   ├── redisearch.ts
│   │   │   │   ├── server.ts
│   │   │   │   ├── session.ts
│   │   │   │   ├── ssh.ts
│   │   │   │   ├── tags.ts
│   │   │   │   ├── triggered-functions.ts
│   │   │   │   ├── user.ts
│   │   │   │   ├── utm.ts
│   │   │   │   └── workbench.ts
│   │   │   ├── app.module.ts
│   │   │   ├── app.routes.ts
│   │   │   ├── common/
│   │   │   │   ├── constants/
│   │   │   │   │   ├── api.ts
│   │   │   │   │   ├── general.ts
│   │   │   │   │   ├── history.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── recommendations.ts
│   │   │   │   │   ├── redis-string.ts
│   │   │   │   │   └── user.ts
│   │   │   │   ├── decorators/
│   │   │   │   │   ├── client-metadata/
│   │   │   │   │   │   ├── client-metadata.decorator.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── data-as-json-string.decorator.ts
│   │   │   │   │   ├── database-management.decorator.ts
│   │   │   │   │   ├── default.ts
│   │   │   │   │   ├── hidden-field.decorator.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── is-bigger-than.decorator.ts
│   │   │   │   │   ├── is-github-link.decorator.ts
│   │   │   │   │   ├── is-multi-number.decorator.ts
│   │   │   │   │   ├── no-duplicates.decorator.ts
│   │   │   │   │   ├── object-as-map.decorator.ts
│   │   │   │   │   ├── redis-string/
│   │   │   │   │   │   ├── any-to-redis-string.decorator.ts
│   │   │   │   │   │   ├── api-query-redis-string-encoding.decorator.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── is-redis-string.decorator.ts
│   │   │   │   │   │   ├── redis-string-to-ascii.decorator.ts
│   │   │   │   │   │   ├── redis-string-to-buffer.decorator.ts
│   │   │   │   │   │   ├── redis-string-to-utf8.decorator.ts
│   │   │   │   │   │   └── redis-string-type.decorator.ts
│   │   │   │   │   ├── session/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── session-metadata.decorator.ts
│   │   │   │   │   ├── transform-to-map.decorator.spec.ts
│   │   │   │   │   ├── transform-to-map.decorator.ts
│   │   │   │   │   └── zset-score/
│   │   │   │   │       ├── index.ts
│   │   │   │   │       └── zset-score.decorator.ts
│   │   │   │   ├── exceptions/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── validation.exception.ts
│   │   │   │   ├── guards/
│   │   │   │   │   ├── database-management.guard.spec.ts
│   │   │   │   │   └── database-management.guard.ts
│   │   │   │   ├── interceptors/
│   │   │   │   │   ├── browser-serialize.interceptor.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── timeout.interceptor.ts
│   │   │   │   ├── logger/
│   │   │   │   │   ├── app-logger.spec.ts
│   │   │   │   │   └── app-logger.ts
│   │   │   │   ├── middlewares/
│   │   │   │   │   ├── body-parser.middleware.ts
│   │   │   │   │   └── single-user-auth.middleware.ts
│   │   │   │   ├── models/
│   │   │   │   │   ├── client-metadata.ts
│   │   │   │   │   ├── common.ts
│   │   │   │   │   ├── database-index.ts
│   │   │   │   │   ├── endpoint.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── session.ts
│   │   │   │   ├── pipes/
│   │   │   │   │   ├── database-index.validation.pipe.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── transformers/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── redis-reply/
│   │   │   │   │   │   ├── formatter-manager.spec.ts
│   │   │   │   │   │   ├── formatter-manager.ts
│   │   │   │   │   │   ├── formatter.interface.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── strategies/
│   │   │   │   │   │       ├── ascii-formatter.strategey.spec.ts
│   │   │   │   │   │       ├── ascii-formatter.strategy.ts
│   │   │   │   │   │       ├── utf8-formatter.strategy.spec.ts
│   │   │   │   │   │       └── utf8-formatter.strategy.ts
│   │   │   │   │   └── redis-string/
│   │   │   │   │       ├── any-to-redis-string.transformer.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── redis-string-to-ascii.transformer.ts
│   │   │   │   │       ├── redis-string-to-buffer.transformer.ts
│   │   │   │   │       └── redis-string-to-utf8.transformer.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── certificate-import.util.ts
│   │   │   │   │   ├── errors.util.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── merge.util.spec.ts
│   │   │   │   │   └── merge.util.ts
│   │   │   │   └── validators/
│   │   │   │       ├── bigger-than.validator.ts
│   │   │   │       ├── github-link.validator.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── multi-number.validator.ts
│   │   │   │       ├── no-duplicates.validator.ts
│   │   │   │       ├── redis-string.validator.ts
│   │   │   │       └── zset-score.validator.ts
│   │   │   ├── constants/
│   │   │   │   ├── agreements-spec.json
│   │   │   │   ├── app-events.ts
│   │   │   │   ├── custom-error-codes.ts
│   │   │   │   ├── error-messages.ts
│   │   │   │   ├── exceptions.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── recommendations.ts
│   │   │   │   ├── redis-commands.ts
│   │   │   │   ├── redis-connection.ts
│   │   │   │   ├── redis-error-codes.ts
│   │   │   │   ├── redis-keys.ts
│   │   │   │   ├── redis-modules.ts
│   │   │   │   ├── regex.ts
│   │   │   │   ├── sort.ts
│   │   │   │   ├── telemetry-events.ts
│   │   │   │   └── websocket-rooms.ts
│   │   │   ├── core.module.ts
│   │   │   ├── decorators/
│   │   │   │   ├── api-endpoint.decorator.ts
│   │   │   │   ├── api-redis-instance-operation.decorator.ts
│   │   │   │   └── api-redis-params.decorator.ts
│   │   │   ├── dto/
│   │   │   │   ├── dto-transformer.spec.ts
│   │   │   │   └── dto-transformer.ts
│   │   │   ├── exceptions/
│   │   │   │   └── global-exception.filter.ts
│   │   │   ├── init-helper.ts
│   │   │   ├── local-database.module.ts
│   │   │   ├── main.ts
│   │   │   ├── middleware/
│   │   │   │   ├── exclude-route.middleware.ts
│   │   │   │   ├── redis-connection/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── redis-connection.middleware.ts
│   │   │   │   │   └── route-controllers.ts
│   │   │   │   ├── subpath-proxy.middleware.ts
│   │   │   │   └── x-frame-options.middleware.ts
│   │   │   ├── models/
│   │   │   │   ├── index.ts
│   │   │   │   ├── redis-client.ts
│   │   │   │   └── redis-cluster.ts
│   │   │   ├── modules/
│   │   │   │   ├── ai/
│   │   │   │   │   ├── chat/
│   │   │   │   │   │   ├── ai-chat.controller.ts
│   │   │   │   │   │   ├── ai-chat.module.ts
│   │   │   │   │   │   ├── ai-chat.service.spec.ts
│   │   │   │   │   │   ├── ai-chat.service.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   └── send.ai-chat.message.dto.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── conv-ai.bad-request.exception.ts
│   │   │   │   │   │   │   ├── conv-ai.error.handler.spec.ts
│   │   │   │   │   │   │   ├── conv-ai.error.handler.ts
│   │   │   │   │   │   │   ├── conv-ai.forbidden.exception.ts
│   │   │   │   │   │   │   ├── conv-ai.internal-server-error.exception.ts
│   │   │   │   │   │   │   ├── conv-ai.not-found.exception.ts
│   │   │   │   │   │   │   ├── conv-ai.unauthorized.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── ai-chat.message.ts
│   │   │   │   │   │   │   ├── ai-chat.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── providers/
│   │   │   │   │   │       ├── conv-ai.provider.spec.ts
│   │   │   │   │   │       └── conv-ai.provider.ts
│   │   │   │   │   └── query/
│   │   │   │   │       ├── ai-query.controller.ts
│   │   │   │   │       ├── ai-query.module.ts
│   │   │   │   │       ├── ai-query.service.spec.ts
│   │   │   │   │       ├── ai-query.service.ts
│   │   │   │   │       ├── dto/
│   │   │   │   │       │   └── send.ai-query.message.dto.ts
│   │   │   │   │       ├── entities/
│   │   │   │   │       │   └── ai-query.message.entity.ts
│   │   │   │   │       ├── exceptions/
│   │   │   │   │       │   ├── a-queryi.error.handler.spec.ts
│   │   │   │   │       │   ├── ai-query.bad-request.exception.ts
│   │   │   │   │       │   ├── ai-query.error.handler.ts
│   │   │   │   │       │   ├── ai-query.forbidden.exception.ts
│   │   │   │   │       │   ├── ai-query.internal-server-error.exception.ts
│   │   │   │   │       │   ├── ai-query.not-found.exception.ts
│   │   │   │   │       │   ├── ai-query.rate-limit.max-tokens.exception.ts
│   │   │   │   │       │   ├── ai-query.rate-limit.request.exception.ts
│   │   │   │   │       │   ├── ai-query.rate-limit.token.exception.ts
│   │   │   │   │       │   ├── ai-query.unauthorized.exception.ts
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       ├── models/
│   │   │   │   │       │   ├── ai-query.auth-data.ts
│   │   │   │   │       │   ├── ai-query.common.ts
│   │   │   │   │       │   ├── ai-query.intermediate-step.ts
│   │   │   │   │       │   ├── ai-query.message.ts
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       ├── providers/
│   │   │   │   │       │   ├── ai-query.provider.spec.ts
│   │   │   │   │       │   ├── ai-query.provider.ts
│   │   │   │   │       │   └── auth/
│   │   │   │   │       │       ├── ai-query-auth.provider.ts
│   │   │   │   │       │       ├── local.ai-query-auth.provider.spec.ts
│   │   │   │   │       │       └── local.ai-query-auth.provider.ts
│   │   │   │   │       ├── repositories/
│   │   │   │   │       │   ├── ai-query.context.repository.ts
│   │   │   │   │       │   ├── ai-query.message.repository.ts
│   │   │   │   │       │   ├── in-memory.ai-query.context.repository.spec.ts
│   │   │   │   │       │   ├── in-memory.ai-query.context.repository.ts
│   │   │   │   │       │   ├── local.ai-query.message.repository.spec.ts
│   │   │   │   │       │   └── local.ai-query.message.repository.ts
│   │   │   │   │       └── utils/
│   │   │   │   │           ├── context.util.spec.ts
│   │   │   │   │           └── context.util.ts
│   │   │   │   ├── analytics/
│   │   │   │   │   ├── analytics.controller.ts
│   │   │   │   │   ├── analytics.module.ts
│   │   │   │   │   ├── analytics.service.spec.ts
│   │   │   │   │   ├── analytics.service.ts
│   │   │   │   │   ├── command.telemetry.base.service.spec.ts
│   │   │   │   │   ├── command.telemetry.base.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── analytics.dto.ts
│   │   │   │   │   ├── telemetry.base.service.spec.ts
│   │   │   │   │   └── telemetry.base.service.ts
│   │   │   │   ├── auth/
│   │   │   │   │   ├── auth.module.ts
│   │   │   │   │   ├── session-metadata/
│   │   │   │   │   │   ├── adapters/
│   │   │   │   │   │   │   ├── session-metadata.adapter.spec.ts
│   │   │   │   │   │   │   └── session-metadata.adapter.ts
│   │   │   │   │   │   └── decorators/
│   │   │   │   │   │       └── ws-session-metadata.decorator.ts
│   │   │   │   │   └── window-auth/
│   │   │   │   │       ├── adapters/
│   │   │   │   │       │   └── window-auth.adapter.ts
│   │   │   │   │       ├── constants/
│   │   │   │   │       │   └── exceptions.ts
│   │   │   │   │       ├── middleware/
│   │   │   │   │       │   └── window.auth.middleware.ts
│   │   │   │   │       ├── strategies/
│   │   │   │   │       │   └── abstract.window.auth.strategy.ts
│   │   │   │   │       ├── window-auth.module.ts
│   │   │   │   │       ├── window-auth.service.spec.ts
│   │   │   │   │       └── window-auth.service.ts
│   │   │   │   ├── azure/
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── azure-auth-callback.template.ts
│   │   │   │   │   │   ├── azure-auth.analytics.ts
│   │   │   │   │   │   ├── azure-auth.controller.ts
│   │   │   │   │   │   ├── azure-auth.service.spec.ts
│   │   │   │   │   │   ├── azure-auth.service.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── azure-auth-login.dto.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── models/
│   │   │   │   │   │       ├── azure-auth.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── autodiscovery/
│   │   │   │   │   │   ├── azure-autodiscovery.analytics.ts
│   │   │   │   │   │   ├── azure-autodiscovery.controller.ts
│   │   │   │   │   │   ├── azure-autodiscovery.service.spec.ts
│   │   │   │   │   │   ├── azure-autodiscovery.service.ts
│   │   │   │   │   │   └── dto/
│   │   │   │   │   │       ├── import-azure-database.dto.ts
│   │   │   │   │   │       ├── import-azure-database.response.ts
│   │   │   │   │   │       ├── import-azure-databases.dto.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── azure-token-refresh.manager.spec.ts
│   │   │   │   │   ├── azure-token-refresh.manager.ts
│   │   │   │   │   ├── azure.module.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── azure-entra-id-token-expired.exception.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── models/
│   │   │   │   │       ├── azure-resource.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── browser/
│   │   │   │   │   ├── __mocks__/
│   │   │   │   │   │   ├── hash.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── keys.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── set.ts
│   │   │   │   │   │   ├── streams.ts
│   │   │   │   │   │   └── z-set.ts
│   │   │   │   │   ├── browser-history/
│   │   │   │   │   │   ├── browser-history.controller.ts
│   │   │   │   │   │   ├── browser-history.module.ts
│   │   │   │   │   │   ├── browser-history.service.spec.ts
│   │   │   │   │   │   ├── browser-history.service.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create.browser-history.dto.ts
│   │   │   │   │   │   │   ├── delete.browser-history.dto.ts
│   │   │   │   │   │   │   ├── delete.browser-history.query.dto.ts
│   │   │   │   │   │   │   ├── delete.browser-history.response.dto.ts
│   │   │   │   │   │   │   ├── get.browser-history.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── list.browser-history.dto.ts
│   │   │   │   │   │   ├── entities/
│   │   │   │   │   │   │   └── browser-history.entity.ts
│   │   │   │   │   │   └── repositories/
│   │   │   │   │   │       ├── browser-history.repository.ts
│   │   │   │   │   │       ├── local.browser-history.repository.spec.ts
│   │   │   │   │   │       └── local.browser-history.repository.ts
│   │   │   │   │   ├── browser.base.controller.ts
│   │   │   │   │   ├── browser.module.ts
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── browser-tool-commands.ts
│   │   │   │   │   ├── decorators/
│   │   │   │   │   │   └── browser-client-metadata.decorator.ts
│   │   │   │   │   ├── hash/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── add.fields-to-hash.dto.ts
│   │   │   │   │   │   │   ├── create.hash-with-expire.dto.ts
│   │   │   │   │   │   │   ├── delete.fields-from-hash.dto.ts
│   │   │   │   │   │   │   ├── delete.fields-from-hash.response.ts
│   │   │   │   │   │   │   ├── get.hash-fields.dto.ts
│   │   │   │   │   │   │   ├── get.hash-fields.response.ts
│   │   │   │   │   │   │   ├── hash-field-ttl.dto.ts
│   │   │   │   │   │   │   ├── hash-field.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── update.hash-fields-ttl.dto.ts
│   │   │   │   │   │   ├── hash.controller.ts
│   │   │   │   │   │   ├── hash.module.ts
│   │   │   │   │   │   ├── hash.service.spec.ts
│   │   │   │   │   │   └── hash.service.ts
│   │   │   │   │   ├── keys/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── delete.keys.dto.ts
│   │   │   │   │   │   │   ├── delete.keys.response.ts
│   │   │   │   │   │   │   ├── get.keys-info.dto.ts
│   │   │   │   │   │   │   ├── get.keys-info.response.ts
│   │   │   │   │   │   │   ├── get.keys-with-details.response.ts
│   │   │   │   │   │   │   ├── get.keys.dto.ts
│   │   │   │   │   │   │   ├── get.namespace-searchable.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── key-with-expire.dto.ts
│   │   │   │   │   │   │   ├── key.dto.ts
│   │   │   │   │   │   │   ├── rename.key.dto.ts
│   │   │   │   │   │   │   ├── rename.key.response.ts
│   │   │   │   │   │   │   ├── scan-data-type.dto.ts
│   │   │   │   │   │   │   ├── update.key-ttl.dto.ts
│   │   │   │   │   │   │   └── update.key-ttl.response.ts
│   │   │   │   │   │   ├── key-info/
│   │   │   │   │   │   │   ├── key-info.provider.spec.ts
│   │   │   │   │   │   │   ├── key-info.provider.ts
│   │   │   │   │   │   │   └── strategies/
│   │   │   │   │   │   │       ├── graph.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── graph.key-info.strategy.ts
│   │   │   │   │   │   │       ├── hash.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── hash.key-info.strategy.ts
│   │   │   │   │   │   │       ├── key-info.strategy.ts
│   │   │   │   │   │   │       ├── list.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── list.key-info.strategy.ts
│   │   │   │   │   │   │       ├── rejson-rl.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── rejson-rl.key-info.strategy.ts
│   │   │   │   │   │   │       ├── set.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── set.key-info.strategy.ts
│   │   │   │   │   │   │       ├── stream.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── stream.key-info.strategy.ts
│   │   │   │   │   │   │       ├── string.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── string.key-info.strategy.ts
│   │   │   │   │   │   │       ├── ts.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── ts.key-info.strategy.ts
│   │   │   │   │   │   │       ├── unsupported.key-info.strategy.spec.ts
│   │   │   │   │   │   │       ├── unsupported.key-info.strategy.ts
│   │   │   │   │   │   │       ├── z-set.key-info.strategy.spec.ts
│   │   │   │   │   │   │       └── z-set.key-info.strategy.ts
│   │   │   │   │   │   ├── keys.controller.ts
│   │   │   │   │   │   ├── keys.module.ts
│   │   │   │   │   │   ├── keys.service.spec.ts
│   │   │   │   │   │   ├── keys.service.ts
│   │   │   │   │   │   └── scanner/
│   │   │   │   │   │       ├── scanner.interface.ts
│   │   │   │   │   │       ├── scanner.spec.ts
│   │   │   │   │   │       ├── scanner.ts
│   │   │   │   │   │       └── strategies/
│   │   │   │   │   │           ├── cluster.scanner.strategy.spec.ts
│   │   │   │   │   │           ├── cluster.scanner.strategy.ts
│   │   │   │   │   │           ├── scanner.strategy.ts
│   │   │   │   │   │           ├── standalone.scanner.strategy.spec.ts
│   │   │   │   │   │           └── standalone.scanner.strategy.ts
│   │   │   │   │   ├── list/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create.list-with-expire.dto.ts
│   │   │   │   │   │   │   ├── delete.list-elements.dto.ts
│   │   │   │   │   │   │   ├── delete.list-elements.response.ts
│   │   │   │   │   │   │   ├── get.list-element.response.ts
│   │   │   │   │   │   │   ├── get.list-elements.dto.ts
│   │   │   │   │   │   │   ├── get.list-elements.response.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── push.element-to-list.dto.ts
│   │   │   │   │   │   │   ├── push.list-elements.response.ts
│   │   │   │   │   │   │   ├── set.list-element.dto.ts
│   │   │   │   │   │   │   └── set.list-element.response.ts
│   │   │   │   │   │   ├── list.controller.ts
│   │   │   │   │   │   ├── list.module.ts
│   │   │   │   │   │   ├── list.service.spec.ts
│   │   │   │   │   │   └── list.service.ts
│   │   │   │   │   ├── redisearch/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create.redisearch-index.dto.ts
│   │   │   │   │   │   │   ├── index.delete.dto.ts
│   │   │   │   │   │   │   ├── index.info.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── key-indexes.dto.ts
│   │   │   │   │   │   │   ├── list.redisearch-indexes.response.ts
│   │   │   │   │   │   │   └── search.redisearch.dto.ts
│   │   │   │   │   │   ├── key-indexes.service.spec.ts
│   │   │   │   │   │   ├── key-indexes.service.ts
│   │   │   │   │   │   ├── redisearch.controller.ts
│   │   │   │   │   │   ├── redisearch.module.ts
│   │   │   │   │   │   ├── redisearch.service.spec.ts
│   │   │   │   │   │   └── redisearch.service.ts
│   │   │   │   │   ├── rejson-rl/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create.rejson-rl-with-expire.dto.ts
│   │   │   │   │   │   │   ├── create.rejson-rl.dto.ts
│   │   │   │   │   │   │   ├── get.rejson-rl.dto.ts
│   │   │   │   │   │   │   ├── get.rejson-rl.response.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── modify.rejson-rl-arr-append.dto.ts
│   │   │   │   │   │   │   ├── modify.rejson-rl-set.dto.ts
│   │   │   │   │   │   │   ├── remove.rejson-rl.dto.ts
│   │   │   │   │   │   │   ├── remove.rejson-rl.response.ts
│   │   │   │   │   │   │   └── safe.rejson-rl-data.dto.ts
│   │   │   │   │   │   ├── rejson-rl.controller.ts
│   │   │   │   │   │   ├── rejson-rl.module.ts
│   │   │   │   │   │   ├── rejson-rl.service.spec.ts
│   │   │   │   │   │   └── rejson-rl.service.ts
│   │   │   │   │   ├── set/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── add.members-to-set.dto.ts
│   │   │   │   │   │   │   ├── create.set-with-expire.dto.ts
│   │   │   │   │   │   │   ├── delete.members-from-set.dto.ts
│   │   │   │   │   │   │   ├── delete.members-from-set.response.ts
│   │   │   │   │   │   │   ├── get.set-members.dto.ts
│   │   │   │   │   │   │   ├── get.set-members.response.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── set.controller.ts
│   │   │   │   │   │   ├── set.module.ts
│   │   │   │   │   │   ├── set.service.spec.ts
│   │   │   │   │   │   └── set.service.ts
│   │   │   │   │   ├── stream/
│   │   │   │   │   │   ├── controllers/
│   │   │   │   │   │   │   ├── consumer-group.controller.ts
│   │   │   │   │   │   │   ├── consumer.controller.ts
│   │   │   │   │   │   │   └── stream.controller.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── ack.pending-entries.dto.ts
│   │   │   │   │   │   │   ├── ack.pending-entries.response.ts
│   │   │   │   │   │   │   ├── add.stream-entries.dto.ts
│   │   │   │   │   │   │   ├── add.stream-entries.response.ts
│   │   │   │   │   │   │   ├── claim.pending-entries.response.ts
│   │   │   │   │   │   │   ├── claim.pending-entry.dto.ts
│   │   │   │   │   │   │   ├── create.consumer-groups.dto.ts
│   │   │   │   │   │   │   ├── create.stream.dto.ts
│   │   │   │   │   │   │   ├── delete.consumer-groups.dto.ts
│   │   │   │   │   │   │   ├── delete.consumer-groups.response.ts
│   │   │   │   │   │   │   ├── delete.consumers.dto.ts
│   │   │   │   │   │   │   ├── delete.stream-entries.dto.ts
│   │   │   │   │   │   │   ├── delete.stream-entries.response.ts
│   │   │   │   │   │   │   ├── get.consumers.dto.ts
│   │   │   │   │   │   │   ├── get.pending-entries.dto.ts
│   │   │   │   │   │   │   ├── get.stream-entries.dto.ts
│   │   │   │   │   │   │   ├── get.stream-entries.response.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── stream-entry.dto.ts
│   │   │   │   │   │   │   └── update.consumer-group.dto.ts
│   │   │   │   │   │   ├── services/
│   │   │   │   │   │   │   ├── consumer-group.service.spec.ts
│   │   │   │   │   │   │   ├── consumer-group.service.ts
│   │   │   │   │   │   │   ├── consumer.service.spec.ts
│   │   │   │   │   │   │   ├── consumer.service.ts
│   │   │   │   │   │   │   ├── stream.service.spec.ts
│   │   │   │   │   │   │   └── stream.service.ts
│   │   │   │   │   │   └── stream.module.ts
│   │   │   │   │   ├── string/
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── get.string-info.dto.ts
│   │   │   │   │   │   │   ├── get.string-value.response.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── set.string-with-expire.dto.ts
│   │   │   │   │   │   │   └── set.string.dto.ts
│   │   │   │   │   │   ├── string.controller.ts
│   │   │   │   │   │   ├── string.module.ts
│   │   │   │   │   │   ├── string.service.spec.ts
│   │   │   │   │   │   └── string.service.ts
│   │   │   │   │   ├── utils/
│   │   │   │   │   │   ├── checkKeyExistsing.spec.ts
│   │   │   │   │   │   ├── checkKeyExistsing.ts
│   │   │   │   │   │   ├── clusterCursor.spec.ts
│   │   │   │   │   │   ├── clusterCursor.ts
│   │   │   │   │   │   ├── getShards.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── redisIndexInfo.ts
│   │   │   │   │   └── z-set/
│   │   │   │   │       ├── dto/
│   │   │   │   │       │   ├── add.members-to-z-set.dto.ts
│   │   │   │   │       │   ├── create.z-set-with-expire.dto.ts
│   │   │   │   │       │   ├── delete.members-from-z-set.dto.ts
│   │   │   │   │       │   ├── delete.members-from-z-set.response.ts
│   │   │   │   │       │   ├── get.z-set-members.dto.ts
│   │   │   │   │       │   ├── get.z-set.response.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── search.z-set-members.dto.ts
│   │   │   │   │       │   ├── search.z-set-members.response.ts
│   │   │   │   │       │   ├── search.z-set.response.ts
│   │   │   │   │       │   ├── update.member-in-z-set.dto.ts
│   │   │   │   │       │   └── z-set-member.dto.ts
│   │   │   │   │       ├── z-set.controller.ts
│   │   │   │   │       ├── z-set.module.ts
│   │   │   │   │       ├── z-set.service.spec.ts
│   │   │   │   │       └── z-set.service.ts
│   │   │   │   ├── bulk-actions/
│   │   │   │   │   ├── bulk-actions.analytics.spec.ts
│   │   │   │   │   ├── bulk-actions.analytics.ts
│   │   │   │   │   ├── bulk-actions.controller.ts
│   │   │   │   │   ├── bulk-actions.gateway.ts
│   │   │   │   │   ├── bulk-actions.module.ts
│   │   │   │   │   ├── bulk-actions.service.spec.ts
│   │   │   │   │   ├── bulk-actions.service.ts
│   │   │   │   │   ├── bulk-import.controller.ts
│   │   │   │   │   ├── bulk-import.service.spec.ts
│   │   │   │   │   ├── bulk-import.service.ts
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── bulk-action-id.dto.ts
│   │   │   │   │   │   ├── create-bulk-action.dto.ts
│   │   │   │   │   │   └── upload-import-file-by-path.dto.ts
│   │   │   │   │   ├── interfaces/
│   │   │   │   │   │   ├── bulk-action-filter-overview.interface.ts
│   │   │   │   │   │   ├── bulk-action-overview.interface.ts
│   │   │   │   │   │   ├── bulk-action-progress-overview.interface.ts
│   │   │   │   │   │   ├── bulk-action-summary-overview.interface.ts
│   │   │   │   │   │   ├── bulk-action.interface.ts
│   │   │   │   │   │   ├── bulk-action.runner.interface.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── bulk-action-filter.spec.ts
│   │   │   │   │   │   ├── bulk-action-filter.ts
│   │   │   │   │   │   ├── bulk-action-progress.spec.ts
│   │   │   │   │   │   ├── bulk-action-progress.ts
│   │   │   │   │   │   ├── bulk-action-summary.spec.ts
│   │   │   │   │   │   ├── bulk-action-summary.ts
│   │   │   │   │   │   ├── bulk-action.spec.ts
│   │   │   │   │   │   ├── bulk-action.ts
│   │   │   │   │   │   └── runners/
│   │   │   │   │   │       ├── abstract.bulk-action.runner.spec.ts
│   │   │   │   │   │       ├── abstract.bulk-action.runner.ts
│   │   │   │   │   │       └── simple/
│   │   │   │   │   │           ├── abstract.bulk-action.simple.runner.spec.ts
│   │   │   │   │   │           ├── abstract.bulk-action.simple.runner.ts
│   │   │   │   │   │           ├── delete.bulk-action.simple.runner.spec.ts
│   │   │   │   │   │           ├── delete.bulk-action.simple.runner.ts
│   │   │   │   │   │           ├── unlink.bulk-action.simple.runner.spec.ts
│   │   │   │   │   │           └── unlink.bulk-action.simple.runner.ts
│   │   │   │   │   └── providers/
│   │   │   │   │       ├── bulk-actions.provider.spec.ts
│   │   │   │   │       └── bulk-actions.provider.ts
│   │   │   │   ├── certificate/
│   │   │   │   │   ├── ca-certificate.controller.ts
│   │   │   │   │   ├── ca-certificate.service.spec.ts
│   │   │   │   │   ├── ca-certificate.service.ts
│   │   │   │   │   ├── certificate.module.ts
│   │   │   │   │   ├── client-certificate.controller.ts
│   │   │   │   │   ├── client-certificate.service.spec.ts
│   │   │   │   │   ├── client-certificate.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.ca-certificate.dto.ts
│   │   │   │   │   │   ├── create.client-certificate.dto.ts
│   │   │   │   │   │   ├── use.ca-certificate.dto.ts
│   │   │   │   │   │   └── use.client-certificate.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   ├── ca-certificate.entity.ts
│   │   │   │   │   │   └── client-certificate.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── ca-certificate.ts
│   │   │   │   │   │   └── client-certificate.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── ca-certificate.repository.ts
│   │   │   │   │   │   ├── client-certificate.repository.ts
│   │   │   │   │   │   ├── local.ca-certificate.repository.spec.ts
│   │   │   │   │   │   ├── local.ca-certificate.repository.ts
│   │   │   │   │   │   ├── local.client-certificate.repository.spec.ts
│   │   │   │   │   │   └── local.client-certificate.repository.ts
│   │   │   │   │   └── transformers/
│   │   │   │   │       ├── ca-cert.transformer.spec.ts
│   │   │   │   │       ├── ca-cert.transformer.ts
│   │   │   │   │       ├── client-cert.transformer.spec.ts
│   │   │   │   │       └── client-cert.transformer.ts
│   │   │   │   ├── cli/
│   │   │   │   │   ├── cli.module.ts
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── errors.ts
│   │   │   │   │   ├── controllers/
│   │   │   │   │   │   └── cli.controller.ts
│   │   │   │   │   ├── decorators/
│   │   │   │   │   │   ├── api-cli-params.decorator.ts
│   │   │   │   │   │   └── cli-client-metadata.decorator.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── cli.dto.ts
│   │   │   │   │   ├── services/
│   │   │   │   │   │   ├── cli-analytics/
│   │   │   │   │   │   │   ├── cli-analytics.service.spec.ts
│   │   │   │   │   │   │   └── cli-analytics.service.ts
│   │   │   │   │   │   └── cli-business/
│   │   │   │   │   │       ├── cli-business.service.spec.ts
│   │   │   │   │   │       ├── cli-business.service.ts
│   │   │   │   │   │       └── output-formatter/
│   │   │   │   │   │           ├── output-formatter-manager.spec.ts
│   │   │   │   │   │           ├── output-formatter-manager.ts
│   │   │   │   │   │           ├── output-formatter.interface.ts
│   │   │   │   │   │           └── strategies/
│   │   │   │   │   │               ├── raw-formatter.strategy.spec.ts
│   │   │   │   │   │               ├── raw-formatter.strategy.ts
│   │   │   │   │   │               ├── text-formatter.strategy.spec.ts
│   │   │   │   │   │               ├── text-formatter.strategy.ts
│   │   │   │   │   │               └── utf-8-formatter.strategy.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── getUnsupportedCommands.spec.ts
│   │   │   │   │       └── getUnsupportedCommands.ts
│   │   │   │   ├── cloud/
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── auth-strategy/
│   │   │   │   │   │   │   ├── cloud-auth.strategy.spec.ts
│   │   │   │   │   │   │   ├── cloud-auth.strategy.ts
│   │   │   │   │   │   │   ├── github-idp.cloud.auth-strategy.ts
│   │   │   │   │   │   │   ├── google-idp.cloud.auth-strategy.ts
│   │   │   │   │   │   │   ├── sso-idp.cloud.auth-strategy.spec.ts
│   │   │   │   │   │   │   ├── sso-idp.cloud.auth-strategy.ts
│   │   │   │   │   │   │   └── tcp-cloud.auth.strategy.ts
│   │   │   │   │   │   ├── cloud-auth.analytics.spec.ts
│   │   │   │   │   │   ├── cloud-auth.analytics.ts
│   │   │   │   │   │   ├── cloud-auth.controller.ts
│   │   │   │   │   │   ├── cloud-auth.module.ts
│   │   │   │   │   │   ├── cloud-auth.service.spec.ts
│   │   │   │   │   │   ├── cloud-auth.service.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── cloud-oauth.canceled.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.github-email-permission.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.misconfiguration.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.missed-required-data.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.sso-unsupported-email.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.unexpected-error.exception.ts
│   │   │   │   │   │   │   ├── cloud-oauth.unknown-authorization-request.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── models/
│   │   │   │   │   │       ├── cloud-auth-request-info.ts
│   │   │   │   │   │       ├── cloud-auth-request.ts
│   │   │   │   │   │       ├── cloud-auth-response.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── autodiscovery/
│   │   │   │   │   │   ├── cloud-autodicovery.analytics.spec.ts
│   │   │   │   │   │   ├── cloud-autodiscovery.analytics.ts
│   │   │   │   │   │   ├── cloud-autodiscovery.service.spec.ts
│   │   │   │   │   │   ├── cloud-autodiscovery.service.ts
│   │   │   │   │   │   ├── cloud.autodiscovery.controller.ts
│   │   │   │   │   │   ├── cloud.autodiscovery.module.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── discover-cloud-databases.dto.ts
│   │   │   │   │   │   │   ├── import-cloud-database.dto.ts
│   │   │   │   │   │   │   ├── import-cloud-database.response.ts
│   │   │   │   │   │   │   ├── import-cloud-databases.dto.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── me.cloud-autodiscovery.service.spec.ts
│   │   │   │   │   │   ├── me.cloud-autodiscovery.service.ts
│   │   │   │   │   │   ├── me.cloud.autodiscovery.controller.ts
│   │   │   │   │   │   └── models/
│   │   │   │   │   │       ├── cloud-autodiscovery-auth-type.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── capi-key/
│   │   │   │   │   │   ├── cloud-capi-key.analytics.spec.ts
│   │   │   │   │   │   ├── cloud-capi-key.analytics.ts
│   │   │   │   │   │   ├── cloud-capi-key.api.provider.spec.ts
│   │   │   │   │   │   ├── cloud-capi-key.api.provider.ts
│   │   │   │   │   │   ├── cloud-capi-key.controller.ts
│   │   │   │   │   │   ├── cloud-capi-key.module.ts
│   │   │   │   │   │   ├── cloud-capi-key.service.spec.ts
│   │   │   │   │   │   ├── cloud-capi-key.service.ts
│   │   │   │   │   │   ├── entity/
│   │   │   │   │   │   │   └── cloud-capi-key.entity.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── cloud-capi-key.not-found.exception.ts
│   │   │   │   │   │   │   ├── cloud-capi-key.unauthorized.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── model/
│   │   │   │   │   │   │   ├── api.interface.ts
│   │   │   │   │   │   │   ├── cloud-capi-key.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── repository/
│   │   │   │   │   │       ├── cloud-capi-key.repository.ts
│   │   │   │   │   │       ├── local.cloud-capi-key.repository.spec.ts
│   │   │   │   │   │       └── local.cloud-capi-key.repository.ts
│   │   │   │   │   ├── cloud-sso.feature.flag.ts
│   │   │   │   │   ├── cloud.module.ts
│   │   │   │   │   ├── common/
│   │   │   │   │   │   ├── constants/
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── decorators/
│   │   │   │   │   │   │   └── cloud-auth.decorator.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── cloud.capi.auth.dto.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── cloud-api.bad-request.exception.ts
│   │   │   │   │   │   │   ├── cloud-api.error.handler.ts
│   │   │   │   │   │   │   ├── cloud-api.forbidden.exception.ts
│   │   │   │   │   │   │   ├── cloud-api.internal-server-error.exception.ts
│   │   │   │   │   │   │   ├── cloud-api.not-found.exception.ts
│   │   │   │   │   │   │   ├── cloud-api.unauthorized.exception.ts
│   │   │   │   │   │   │   ├── cloud-capi.error.handler.ts
│   │   │   │   │   │   │   ├── cloud-capi.unauthorized.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── api.interface.ts
│   │   │   │   │   │   │   ├── capi.interface.ts
│   │   │   │   │   │   │   ├── cloud-request-utm.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── providers/
│   │   │   │   │   │       ├── cloud.api.provider.spec.ts
│   │   │   │   │   │       ├── cloud.api.provider.ts
│   │   │   │   │   │       ├── cloud.capi.provider.spec.ts
│   │   │   │   │   │       └── cloud.capi.provider.ts
│   │   │   │   │   ├── database/
│   │   │   │   │   │   ├── cloud-database.analytics.spec.ts
│   │   │   │   │   │   ├── cloud-database.analytics.ts
│   │   │   │   │   │   ├── cloud-database.capi.provider.spec.ts
│   │   │   │   │   │   ├── cloud-database.capi.provider.ts
│   │   │   │   │   │   ├── cloud-database.capi.service.spec.ts
│   │   │   │   │   │   ├── cloud-database.capi.service.ts
│   │   │   │   │   │   ├── cloud-database.module.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create-free-cloud-database.dto.ts
│   │   │   │   │   │   │   ├── get-cloud-subscription-database.dto.ts
│   │   │   │   │   │   │   ├── get-cloud-subscription-databases.dto.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── entities/
│   │   │   │   │   │   │   └── cloud-database-details.entity.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── capi.interface.ts
│   │   │   │   │   │   │   ├── cloud-database-details.ts
│   │   │   │   │   │   │   ├── cloud-database.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── utils/
│   │   │   │   │   │       ├── cloud-data-converter.spec.ts
│   │   │   │   │   │       ├── cloud-data-converter.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── job/
│   │   │   │   │   │   ├── cloud-job.controller.ts
│   │   │   │   │   │   ├── cloud-job.factory.ts
│   │   │   │   │   │   ├── cloud-job.gateway.ts
│   │   │   │   │   │   ├── cloud-job.module.ts
│   │   │   │   │   │   ├── cloud-job.provider.ts
│   │   │   │   │   │   ├── cloud-job.service.spec.ts
│   │   │   │   │   │   ├── cloud-job.service.ts
│   │   │   │   │   │   ├── constants/
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create-database.cloud-job.data.dto.ts
│   │   │   │   │   │   │   ├── create-subscription-and-database.cloud-job.data.dto.ts
│   │   │   │   │   │   │   ├── create.cloud-job.dto.ts
│   │   │   │   │   │   │   ├── import-database.cloud-job.data.dto.ts
│   │   │   │   │   │   │   └── monitor.cloud-job.dto.ts
│   │   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   │   ├── cloud-database-already-exists-free.exception.ts
│   │   │   │   │   │   │   ├── cloud-database-endpoint-invalid.exception.ts
│   │   │   │   │   │   │   ├── cloud-database-import-forbidden.exception.ts
│   │   │   │   │   │   │   ├── cloud-database-in-failed-state.exception.ts
│   │   │   │   │   │   │   ├── cloud-database-in-unexpected-state.exception.ts
│   │   │   │   │   │   │   ├── cloud-job-aborted.exception.ts
│   │   │   │   │   │   │   ├── cloud-job-not-found.exception.ts
│   │   │   │   │   │   │   ├── cloud-job-unexpected-error.exception.ts
│   │   │   │   │   │   │   ├── cloud-job-unsupported.exception.ts
│   │   │   │   │   │   │   ├── cloud-job.error.handler.ts
│   │   │   │   │   │   │   ├── cloud-plan-not-found-free.exception.ts
│   │   │   │   │   │   │   ├── cloud-subscription-already-exists-free.exception.ts
│   │   │   │   │   │   │   ├── cloud-subscription-in-failed-state.exception.ts
│   │   │   │   │   │   │   ├── cloud-subscription-in-unexpected-state.exception.ts
│   │   │   │   │   │   │   ├── cloud-subscription-unable-to-determine.exception.ts
│   │   │   │   │   │   │   ├── cloud-task-no-resource-id.exception.ts
│   │   │   │   │   │   │   ├── cloud-task-not-found.exception.ts
│   │   │   │   │   │   │   ├── cloud-task-processing-error.exception.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── jobs/
│   │   │   │   │   │   │   ├── cloud-job.spec.ts
│   │   │   │   │   │   │   ├── cloud-job.ts
│   │   │   │   │   │   │   ├── create-free-database.cloud-job.ts
│   │   │   │   │   │   │   ├── create-free-subscription-and-database.cloud-job.ts
│   │   │   │   │   │   │   ├── create-free-subscription.cloud-job.ts
│   │   │   │   │   │   │   ├── import-free-database.cloud-job.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── wait-for-active-database.cloud-job.ts
│   │   │   │   │   │   │   ├── wait-for-active-subscription.cloud-job.ts
│   │   │   │   │   │   │   └── wait-for-task.cloud-job.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── cloud-job-info.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── transformers/
│   │   │   │   │   │       ├── cloud-job-data.transformer.spec.ts
│   │   │   │   │   │       └── cloud-job-data.transformer.ts
│   │   │   │   │   ├── session/
│   │   │   │   │   │   ├── cloud-session.module.ts
│   │   │   │   │   │   ├── cloud-session.service.spec.ts
│   │   │   │   │   │   ├── cloud-session.service.ts
│   │   │   │   │   │   ├── entities/
│   │   │   │   │   │   │   └── cloud.session.entity.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   └── cloud-session.ts
│   │   │   │   │   │   └── repositories/
│   │   │   │   │   │       ├── cloud.session.repository.ts
│   │   │   │   │   │       ├── local.cloud.session.repository.spec.ts
│   │   │   │   │   │       └── local.cloud.session.repository.ts
│   │   │   │   │   ├── subscription/
│   │   │   │   │   │   ├── cloud-subscription.api.service.spec.ts
│   │   │   │   │   │   ├── cloud-subscription.api.service.ts
│   │   │   │   │   │   ├── cloud-subscription.capi.service.spec.ts
│   │   │   │   │   │   ├── cloud-subscription.capi.service.ts
│   │   │   │   │   │   ├── cloud-subscription.controller.ts
│   │   │   │   │   │   ├── cloud-subscription.module.ts
│   │   │   │   │   │   ├── dto/
│   │   │   │   │   │   │   ├── create-free-cloud-subscription.dto.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── plans.cloud-subscription.dto.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── api.interface.ts
│   │   │   │   │   │   │   ├── capi.interface.ts
│   │   │   │   │   │   │   ├── cloud-subscription-plan.ts
│   │   │   │   │   │   │   ├── cloud-subscription-region.ts
│   │   │   │   │   │   │   ├── cloud-subscription.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── providers/
│   │   │   │   │   │   │   ├── cloud-subscription.api.provider.spec.ts
│   │   │   │   │   │   │   ├── cloud-subscription.api.provider.ts
│   │   │   │   │   │   │   ├── cloud-subscription.capi.provider.spec.ts
│   │   │   │   │   │   │   └── cloud-subscription.capi.provider.ts
│   │   │   │   │   │   └── utils/
│   │   │   │   │   │       ├── cloud-data-converter.spec.ts
│   │   │   │   │   │       ├── cloud-data-converter.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   ├── task/
│   │   │   │   │   │   ├── cloud-task.capi.service.spec.ts
│   │   │   │   │   │   ├── cloud-task.capi.service.ts
│   │   │   │   │   │   ├── cloud-task.module.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── capi.interface.ts
│   │   │   │   │   │   │   ├── cloud-task.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── providers/
│   │   │   │   │   │   │   ├── cloud-task.capi.provider.spec.ts
│   │   │   │   │   │   │   └── cloud-task.capi.provider.ts
│   │   │   │   │   │   └── utils/
│   │   │   │   │   │       ├── cloud-data-converter.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   └── user/
│   │   │   │   │       ├── cloud-user.api.service.spec.ts
│   │   │   │   │       ├── cloud-user.api.service.ts
│   │   │   │   │       ├── cloud-user.capi.service.spec.ts
│   │   │   │   │       ├── cloud-user.capi.service.ts
│   │   │   │   │       ├── cloud-user.controller.ts
│   │   │   │   │       ├── cloud-user.module.ts
│   │   │   │   │       ├── models/
│   │   │   │   │       │   ├── api.interface.ts
│   │   │   │   │       │   ├── capi.interface.ts
│   │   │   │   │       │   ├── cloud-account-info.ts
│   │   │   │   │       │   ├── cloud-user-account.ts
│   │   │   │   │       │   ├── cloud-user.ts
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       ├── providers/
│   │   │   │   │       │   ├── cloud-user.api.provider.spec.ts
│   │   │   │   │       │   ├── cloud-user.api.provider.ts
│   │   │   │   │       │   ├── cloud-user.capi.provider.spec.ts
│   │   │   │   │       │   └── cloud-user.capi.provider.ts
│   │   │   │   │       ├── repositories/
│   │   │   │   │       │   ├── cloud-user.repository.ts
│   │   │   │   │       │   ├── in-session.cloud-user.repository.spec.ts
│   │   │   │   │       │   └── in-session.cloud-user.repository.ts
│   │   │   │   │       └── utils/
│   │   │   │   │           ├── cloud-data-converter.ts
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── token.spec.ts
│   │   │   │   │           └── token.ts
│   │   │   │   ├── cluster-monitor/
│   │   │   │   │   ├── cluster-monitor.controller.ts
│   │   │   │   │   ├── cluster-monitor.module.ts
│   │   │   │   │   ├── cluster-monitor.service.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── cluster-details.ts
│   │   │   │   │   │   ├── cluster-node-details.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── strategies/
│   │   │   │   │       ├── abstract.info.strategy.spec.ts
│   │   │   │   │       ├── abstract.info.strategy.ts
│   │   │   │   │       ├── cluster-nodes.info.strategy.spec.ts
│   │   │   │   │       ├── cluster-nodes.info.strategy.ts
│   │   │   │   │       ├── cluster-shards.info.strategy.spec.ts
│   │   │   │   │       ├── cluster-shards.info.strategy.ts
│   │   │   │   │       └── cluster.info.interface.ts
│   │   │   │   ├── commands/
│   │   │   │   │   ├── commands-json.provider.spec.ts
│   │   │   │   │   ├── commands-json.provider.ts
│   │   │   │   │   ├── commands.controller.ts
│   │   │   │   │   ├── commands.module.ts
│   │   │   │   │   ├── commands.service.spec.ts
│   │   │   │   │   └── commands.service.ts
│   │   │   │   ├── constants/
│   │   │   │   │   ├── constants.module.ts
│   │   │   │   │   └── providers/
│   │   │   │   │       ├── constants.provider.ts
│   │   │   │   │       └── local.constants.provider.ts
│   │   │   │   ├── custom-tutorial/
│   │   │   │   │   ├── custom-tutorial.analytics.spec.ts
│   │   │   │   │   ├── custom-tutorial.analytics.ts
│   │   │   │   │   ├── custom-tutorial.controller.ts
│   │   │   │   │   ├── custom-tutorial.module.ts
│   │   │   │   │   ├── custom-tutorial.service.spec.ts
│   │   │   │   │   ├── custom-tutorial.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── upload.custom-tutorial.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── custom-tutorial.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── custom-tutorial.manifest.ts
│   │   │   │   │   │   └── custom-tutorial.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── custom-tutorial.fs.provider.spec.ts
│   │   │   │   │   │   ├── custom-tutorial.fs.provider.ts
│   │   │   │   │   │   ├── custom-tutorial.manifest.provider.spec.ts
│   │   │   │   │   │   └── custom-tutorial.manifest.provider.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── custom-tutorial.repository.ts
│   │   │   │   │       ├── local.custom-tutorial.repository.spec.ts
│   │   │   │   │       └── local.custom-tutorial.repository.ts
│   │   │   │   ├── database/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   ├── events.ts
│   │   │   │   │   │   └── overview.ts
│   │   │   │   │   ├── credentials/
│   │   │   │   │   │   ├── credential-strategy.provider.ts
│   │   │   │   │   │   ├── credentials.module.ts
│   │   │   │   │   │   ├── local.credential-strategy.provider.spec.ts
│   │   │   │   │   │   ├── local.credential-strategy.provider.ts
│   │   │   │   │   │   └── strategies/
│   │   │   │   │   │       ├── azure-entra-id.credential-strategy.spec.ts
│   │   │   │   │   │       ├── azure-entra-id.credential-strategy.ts
│   │   │   │   │   │       ├── default.credential-strategy.spec.ts
│   │   │   │   │   │       └── default.credential-strategy.ts
│   │   │   │   │   ├── database-connection.service.spec.ts
│   │   │   │   │   ├── database-connection.service.ts
│   │   │   │   │   ├── database-info.controller.ts
│   │   │   │   │   ├── database-info.service.spec.ts
│   │   │   │   │   ├── database-info.service.ts
│   │   │   │   │   ├── database.analytics.spec.ts
│   │   │   │   │   ├── database.analytics.ts
│   │   │   │   │   ├── database.controller.spec.ts
│   │   │   │   │   ├── database.controller.ts
│   │   │   │   │   ├── database.module.ts
│   │   │   │   │   ├── database.service.spec.ts
│   │   │   │   │   ├── database.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.database.dto.ts
│   │   │   │   │   │   ├── database.response.ts
│   │   │   │   │   │   ├── delete.databases.dto.ts
│   │   │   │   │   │   ├── delete.databases.response.ts
│   │   │   │   │   │   ├── export.databases.dto.ts
│   │   │   │   │   │   ├── redis-info.dto.ts
│   │   │   │   │   │   └── update.database.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── database.entity.ts
│   │   │   │   │   ├── exeptions/
│   │   │   │   │   │   ├── database-already-exists.exception.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── middleware/
│   │   │   │   │   │   └── connection.middleware.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── additional.redis.module.ts
│   │   │   │   │   │   ├── database-overview.ts
│   │   │   │   │   │   ├── database.ts
│   │   │   │   │   │   ├── export-database.ts
│   │   │   │   │   │   └── provider-details.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── database-info.provider.spec.ts
│   │   │   │   │   │   ├── database-info.provider.ts
│   │   │   │   │   │   ├── database-overview.provider.spec.ts
│   │   │   │   │   │   ├── database-overview.provider.ts
│   │   │   │   │   │   ├── database.client.factory.spec.ts
│   │   │   │   │   │   ├── database.client.factory.ts
│   │   │   │   │   │   ├── database.factory.spec.ts
│   │   │   │   │   │   └── database.factory.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── database.repository.ts
│   │   │   │   │       ├── local.database.repository.spec.ts
│   │   │   │   │       ├── local.database.repository.ts
│   │   │   │   │       ├── stack.database.repository.spec.ts
│   │   │   │   │       └── stack.databases.repository.ts
│   │   │   │   ├── database-analysis/
│   │   │   │   │   ├── database-analysis.controller.ts
│   │   │   │   │   ├── database-analysis.module.ts
│   │   │   │   │   ├── database-analysis.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create-database-analysis.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── recommendation-vote.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── database-analysis.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── analysis-progress.ts
│   │   │   │   │   │   ├── database-analysis.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── key.ts
│   │   │   │   │   │   ├── nsp-summary.ts
│   │   │   │   │   │   ├── nsp-type-summary.ts
│   │   │   │   │   │   ├── recommendation.ts
│   │   │   │   │   │   ├── scan-filter.ts
│   │   │   │   │   │   ├── short-database-analysis.ts
│   │   │   │   │   │   ├── simple-summary.ts
│   │   │   │   │   │   ├── simple-type-summary.ts
│   │   │   │   │   │   └── sum-group.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── database-analysis.provider.spec.ts
│   │   │   │   │   │   ├── database-analysis.provider.ts
│   │   │   │   │   │   ├── database-analyzer.spec.ts
│   │   │   │   │   │   └── database-analyzer.ts
│   │   │   │   │   └── scanner/
│   │   │   │   │       ├── key-info/
│   │   │   │   │       │   ├── key-info.provider.spec.ts
│   │   │   │   │       │   ├── key-info.provider.ts
│   │   │   │   │       │   ├── key-info.strategy.interface.ts
│   │   │   │   │       │   └── strategies/
│   │   │   │   │       │       ├── abstract.info.strategy.spec.ts
│   │   │   │   │       │       ├── abstract.info.strategy.ts
│   │   │   │   │       │       ├── default-info.strategy.spec.ts
│   │   │   │   │       │       ├── default-info.strategy.ts
│   │   │   │   │       │       ├── graph-info.strategy.spec.ts
│   │   │   │   │       │       ├── graph-info.strategy.ts
│   │   │   │   │       │       ├── hash-info.strategy.spec.ts
│   │   │   │   │       │       ├── hash-info.strategy.ts
│   │   │   │   │       │       ├── index.ts
│   │   │   │   │       │       ├── json-info.strategy.spec.ts
│   │   │   │   │       │       ├── json-info.strategy.ts
│   │   │   │   │       │       ├── list-info.strategy.spec.ts
│   │   │   │   │       │       ├── list-info.strategy.ts
│   │   │   │   │       │       ├── set-info.strategy.spec.ts
│   │   │   │   │       │       ├── set-info.strategy.ts
│   │   │   │   │       │       ├── stream-info.strategy.spec.ts
│   │   │   │   │       │       ├── stream-info.strategy.ts
│   │   │   │   │       │       ├── string-info.strategy.spec.ts
│   │   │   │   │       │       ├── string-info.strategy.ts
│   │   │   │   │       │       ├── ts-info.strategy.spec.ts
│   │   │   │   │       │       ├── ts-info.strategy.ts
│   │   │   │   │       │       ├── z-set-info.strategy.spec.ts
│   │   │   │   │       │       └── z-set-info.strategy.ts
│   │   │   │   │       ├── keys-scanner.spec.ts
│   │   │   │   │       └── keys-scanner.ts
│   │   │   │   ├── database-discovery/
│   │   │   │   │   ├── auto.database-discovery.service.spec.ts
│   │   │   │   │   ├── auto.database-discovery.service.ts
│   │   │   │   │   ├── database-discovery.module.ts
│   │   │   │   │   ├── database-discovery.service.ts
│   │   │   │   │   ├── local.database-discovery.service.spec.ts
│   │   │   │   │   ├── local.database-discovery.service.ts
│   │   │   │   │   ├── pre-setup.database-discovery.service.spec.ts
│   │   │   │   │   ├── pre-setup.database-discovery.service.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── autodiscovery.util.spec.ts
│   │   │   │   │       ├── autodiscovery.util.ts
│   │   │   │   │       ├── pre-setup.discovery.util.spec.ts
│   │   │   │   │       └── pre-setup.discovery.util.ts
│   │   │   │   ├── database-import/
│   │   │   │   │   ├── certificate-import.service.spec.ts
│   │   │   │   │   ├── certificate-import.service.ts
│   │   │   │   │   ├── database-import.analytics.spec.ts
│   │   │   │   │   ├── database-import.analytics.ts
│   │   │   │   │   ├── database-import.controller.spec.ts
│   │   │   │   │   ├── database-import.controller.ts
│   │   │   │   │   ├── database-import.module.ts
│   │   │   │   │   ├── database-import.service.spec.ts
│   │   │   │   │   ├── database-import.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── database-import.response.ts
│   │   │   │   │   │   └── import.database.dto.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── invalid-ca-certificate-body.exception.ts
│   │   │   │   │   │   ├── invalid-certificate-name.exception.ts
│   │   │   │   │   │   ├── invalid-client-certificate-body.exception.ts
│   │   │   │   │   │   ├── invalid-client-private-key.exception.ts
│   │   │   │   │   │   ├── invalid-compressor.exception.ts
│   │   │   │   │   │   ├── invalid-ssh-body.exception.ts
│   │   │   │   │   │   ├── invalid-ssh-private-key-body.exception.ts
│   │   │   │   │   │   ├── no-database-import-file-provided.exception.ts
│   │   │   │   │   │   ├── size-limit-exceeded-database-import-file.exception.ts
│   │   │   │   │   │   ├── ssh-agents-are-not-supported.exception.ts
│   │   │   │   │   │   └── unable-to-parse-database-import-file.exception.ts
│   │   │   │   │   ├── ssh-import.service.spec.ts
│   │   │   │   │   └── ssh-import.service.ts
│   │   │   │   ├── database-recommendation/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── database-recommendation.analytics.spec.ts
│   │   │   │   │   ├── database-recommendation.analytics.ts
│   │   │   │   │   ├── database-recommendation.controller.ts
│   │   │   │   │   ├── database-recommendation.gateway.ts
│   │   │   │   │   ├── database-recommendation.module.ts
│   │   │   │   │   ├── database-recommendation.service.spec.ts
│   │   │   │   │   ├── database-recommendation.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.database-recommendation.dto.ts
│   │   │   │   │   │   ├── database-recommendations.response.ts
│   │   │   │   │   │   ├── delete.database-recommendation.dto.ts
│   │   │   │   │   │   ├── delete.database-recommendation.response.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── modify.database-recommendation.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── database-recommendation.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── database-recommendation-params.ts
│   │   │   │   │   │   ├── database-recommendation.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── integersInSet.ts
│   │   │   │   │   │   └── searchJSON.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── database-recommendation.emitter.spec.ts
│   │   │   │   │   │   └── database-recommendation.emitter.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── database-recommendation.repository.ts
│   │   │   │   │   │   ├── local.database.recommendation.repository.spec.ts
│   │   │   │   │   │   └── local.database.recommendation.repository.ts
│   │   │   │   │   └── scanner/
│   │   │   │   │       ├── recommendation.provider.spec.ts
│   │   │   │   │       ├── recommendation.provider.ts
│   │   │   │   │       ├── recommendation.strategy.interface.ts
│   │   │   │   │       ├── recommendations.scanner.spec.ts
│   │   │   │   │       ├── recommendations.scanner.ts
│   │   │   │   │       └── strategies/
│   │   │   │   │           ├── abstract.recommendation.strategy.spec.ts
│   │   │   │   │           ├── abstract.recommendation.strategy.ts
│   │   │   │   │           ├── avoid-logical-databases.strategy.spec.ts
│   │   │   │   │           ├── avoid-logical-databases.strategy.ts
│   │   │   │   │           ├── avoid-lua-scripts.strategy.spec.ts
│   │   │   │   │           ├── avoid-lua-scripts.strategy.ts
│   │   │   │   │           ├── big-amount-connected-clients.strategy.spec.ts
│   │   │   │   │           ├── big-amount-connected-clients.strategy.ts
│   │   │   │   │           ├── big-set.strategy.spec.ts
│   │   │   │   │           ├── big-set.strategy.ts
│   │   │   │   │           ├── big-string.strategy.spec.ts
│   │   │   │   │           ├── big-string.strategy.ts
│   │   │   │   │           ├── compression-for-list.strategy.spec.ts
│   │   │   │   │           ├── compression-for-list.strategy.ts
│   │   │   │   │           ├── default.recommendation.strategy.spec.ts
│   │   │   │   │           ├── default.recommendation.strategy.ts
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── redis-version.strategy.spec.ts
│   │   │   │   │           ├── redis-version.strategy.ts
│   │   │   │   │           ├── rts.strategy.spec.ts
│   │   │   │   │           ├── rts.strategy.ts
│   │   │   │   │           ├── search-JSON.strategy.spec.ts
│   │   │   │   │           ├── search-JSON.strategy.ts
│   │   │   │   │           ├── search-visualization.strategy.spec.ts
│   │   │   │   │           ├── search-visualization.strategy.ts
│   │   │   │   │           ├── shard-hash.strategy.spec.ts
│   │   │   │   │           ├── shard-hash.strategy.ts
│   │   │   │   │           ├── string-to-json.strategy.spec.ts
│   │   │   │   │           ├── string-to-json.strategy.ts
│   │   │   │   │           ├── try-rdi.strategy.spec.ts
│   │   │   │   │           ├── try-rdi.strategy.ts
│   │   │   │   │           ├── use-smaller-keys.strategy.spec.ts
│   │   │   │   │           └── use-smaller-keys.strategy.ts
│   │   │   │   ├── database-settings/
│   │   │   │   │   ├── database-settings.controller.ts
│   │   │   │   │   ├── database-settings.module.ts
│   │   │   │   │   ├── database-settings.service.spec.ts
│   │   │   │   │   ├── database-settings.service.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── database-setting.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── database-setting.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── database-settings.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── database-settings.repository.ts
│   │   │   │   │       ├── local-database-settings.repository.spec.ts
│   │   │   │   │       └── local-database-settings.repository.ts
│   │   │   │   ├── encryption/
│   │   │   │   │   ├── encryption.module.ts
│   │   │   │   │   ├── encryption.service.spec.ts
│   │   │   │   │   ├── encryption.service.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── encryption-service-error.exception.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── key-decryption-error.exception.ts
│   │   │   │   │   │   ├── key-encryption-error.exception.ts
│   │   │   │   │   │   ├── key-unavailable.exception.ts
│   │   │   │   │   │   ├── keytar-decryption-error.exception.ts
│   │   │   │   │   │   ├── keytar-encryption-error.exception.ts
│   │   │   │   │   │   ├── keytar-unavailable.exception.ts
│   │   │   │   │   │   └── unsupported-encryption-strategy.exception.ts
│   │   │   │   │   ├── model.encryptor.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── encryption-result.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── strategies/
│   │   │   │   │       ├── encryption-strategy.interface.ts
│   │   │   │   │       ├── key-encryption.strategy.spec.ts
│   │   │   │   │       ├── key-encryption.strategy.ts
│   │   │   │   │       ├── keytar-encryption.strategy.spec.ts
│   │   │   │   │       ├── keytar-encryption.strategy.ts
│   │   │   │   │       ├── plain-encryption.strategy.spec.ts
│   │   │   │   │       └── plain-encryption.strategy.ts
│   │   │   │   ├── feature/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── known-features.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   ├── feature.entity.ts
│   │   │   │   │   │   └── features-config.entity.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── unable-to-fetch-remote-config.exception.ts
│   │   │   │   │   ├── feature.analytics.spec.ts
│   │   │   │   │   ├── feature.analytics.ts
│   │   │   │   │   ├── feature.controller.ts
│   │   │   │   │   ├── feature.gateway.ts
│   │   │   │   │   ├── feature.module.ts
│   │   │   │   │   ├── feature.service.ts
│   │   │   │   │   ├── features-config.service.ts
│   │   │   │   │   ├── local.feature.service.spec.ts
│   │   │   │   │   ├── local.feature.service.ts
│   │   │   │   │   ├── local.features-config.service.spec.ts
│   │   │   │   │   ├── local.features-config.service.ts
│   │   │   │   │   ├── model/
│   │   │   │   │   │   ├── feature.ts
│   │   │   │   │   │   ├── features-config.spec.ts
│   │   │   │   │   │   └── features-config.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   └── feature-flag/
│   │   │   │   │   │       ├── feature-flag.provider.spec.ts
│   │   │   │   │   │       ├── feature-flag.provider.ts
│   │   │   │   │   │       └── strategies/
│   │   │   │   │   │           ├── cloud-sso.flag.strategy.ts
│   │   │   │   │   │           ├── common.flag.strategy.ts
│   │   │   │   │   │           ├── default.flag.strategy.ts
│   │   │   │   │   │           ├── feature.flag.strategy.spec.ts
│   │   │   │   │   │           ├── feature.flag.strategy.ts
│   │   │   │   │   │           ├── switchable.flag.strategy.spec.ts
│   │   │   │   │   │           ├── switchable.flag.strategy.ts
│   │   │   │   │   │           └── with-data.flag.strategy.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── feature.repository.ts
│   │   │   │   │   │   ├── features-config.repository.ts
│   │   │   │   │   │   ├── local.feature.repository.spec.ts
│   │   │   │   │   │   ├── local.feature.repository.ts
│   │   │   │   │   │   ├── local.features-config.repository.spec.ts
│   │   │   │   │   │   └── local.features-config.repository.ts
│   │   │   │   │   └── transformers/
│   │   │   │   │       ├── feature-config-filter.transformer.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── init/
│   │   │   │   │   ├── init.module.ts
│   │   │   │   │   ├── init.service.ts
│   │   │   │   │   └── local.init.service.ts
│   │   │   │   ├── notification/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create-notification.dto.ts
│   │   │   │   │   │   ├── create-notifications.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── notifications.dto.ts
│   │   │   │   │   │   └── read-notifications.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── notification.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── notification.ts
│   │   │   │   │   ├── notification.controller.ts
│   │   │   │   │   ├── notification.gateway.ts
│   │   │   │   │   ├── notification.module.ts
│   │   │   │   │   ├── notification.service.spec.ts
│   │   │   │   │   ├── notification.service.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── global-notification.provider.spec.ts
│   │   │   │   │   │   ├── global-notification.provider.ts
│   │   │   │   │   │   ├── notification.emitter.spec.ts
│   │   │   │   │   │   └── notification.emitter.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── local.notification.repository.spec.ts
│   │   │   │   │       ├── local.notification.repository.ts
│   │   │   │   │       └── notification.repository.ts
│   │   │   │   ├── plugin/
│   │   │   │   │   ├── plugin.controller.ts
│   │   │   │   │   ├── plugin.module.ts
│   │   │   │   │   ├── plugin.response.ts
│   │   │   │   │   └── plugin.service.ts
│   │   │   │   ├── profiler/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── emitters/
│   │   │   │   │   │   ├── client.logs-emiter.spec.ts
│   │   │   │   │   │   ├── client.logs-emitter.ts
│   │   │   │   │   │   ├── file.logs-emiter.spec.ts
│   │   │   │   │   │   └── file.logs-emitter.ts
│   │   │   │   │   ├── interfaces/
│   │   │   │   │   │   ├── logs-emitter.interface.ts
│   │   │   │   │   │   ├── monitor-data.interface.ts
│   │   │   │   │   │   └── shard-observer.interface.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── log-file.spec.ts
│   │   │   │   │   │   ├── log-file.ts
│   │   │   │   │   │   ├── monitor-settings.ts
│   │   │   │   │   │   ├── profiler.client.spec.ts
│   │   │   │   │   │   ├── profiler.client.ts
│   │   │   │   │   │   ├── redis.observer.spec.ts
│   │   │   │   │   │   └── redis.observer.ts
│   │   │   │   │   ├── monitor.service.spec.ts
│   │   │   │   │   ├── profiler-analytics.service.ts
│   │   │   │   │   ├── profiler.controller.ts
│   │   │   │   │   ├── profiler.gateway.ts
│   │   │   │   │   ├── profiler.module.ts
│   │   │   │   │   ├── profiler.service.ts
│   │   │   │   │   └── providers/
│   │   │   │   │       ├── log-file.provider.spec.ts
│   │   │   │   │       ├── log-file.provider.ts
│   │   │   │   │       ├── profiler-client.provider.spec.ts
│   │   │   │   │       ├── profiler-client.provider.ts
│   │   │   │   │       ├── redis-observer.provider.spec.ts
│   │   │   │   │       └── redis-observer.provider.ts
│   │   │   │   ├── pub-sub/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── decorators/
│   │   │   │   │   │   └── client.decorator.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── messages.response.ts
│   │   │   │   │   │   ├── publish.dto.ts
│   │   │   │   │   │   ├── publish.response.ts
│   │   │   │   │   │   ├── subscribe.dto.ts
│   │   │   │   │   │   └── subscription.dto.ts
│   │   │   │   │   ├── errors/
│   │   │   │   │   │   └── pub-sub-ws.exception.ts
│   │   │   │   │   ├── filters/
│   │   │   │   │   │   └── ack-ws-exception.filter.ts
│   │   │   │   │   ├── interfaces/
│   │   │   │   │   │   ├── message.interface.ts
│   │   │   │   │   │   └── subscription.interface.ts
│   │   │   │   │   ├── model/
│   │   │   │   │   │   ├── abstract.subscription.ts
│   │   │   │   │   │   ├── pattern.subscription.ts
│   │   │   │   │   │   ├── redis-client-subscriber.spec.ts
│   │   │   │   │   │   ├── redis-client-subscriber.ts
│   │   │   │   │   │   ├── simple.subscription.ts
│   │   │   │   │   │   ├── user-client.ts
│   │   │   │   │   │   ├── user-session.spec.ts
│   │   │   │   │   │   └── user-session.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── redis-client.provider.spec.ts
│   │   │   │   │   │   ├── redis-client.provider.ts
│   │   │   │   │   │   ├── subscription.provider.spec.ts
│   │   │   │   │   │   ├── subscription.provider.ts
│   │   │   │   │   │   ├── user-session.provider.spec.ts
│   │   │   │   │   │   └── user-session.provider.ts
│   │   │   │   │   ├── pub-sub.analytics.service.spec.ts
│   │   │   │   │   ├── pub-sub.analytics.service.ts
│   │   │   │   │   ├── pub-sub.controller.ts
│   │   │   │   │   ├── pub-sub.gateway.ts
│   │   │   │   │   ├── pub-sub.module.ts
│   │   │   │   │   ├── pub-sub.service.spec.ts
│   │   │   │   │   └── pub-sub.service.ts
│   │   │   │   ├── query-library/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── query-library.factory.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create-query-library-item.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── query-library-filter.dto.ts
│   │   │   │   │   │   ├── seed-query-library-item.dto.ts
│   │   │   │   │   │   ├── seed-query-library.dto.ts
│   │   │   │   │   │   └── update-query-library-item.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── query-library.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── query-library-type.enum.ts
│   │   │   │   │   │   └── query-library.ts
│   │   │   │   │   ├── query-library.controller.spec.ts
│   │   │   │   │   ├── query-library.controller.ts
│   │   │   │   │   ├── query-library.module.ts
│   │   │   │   │   ├── query-library.service.spec.ts
│   │   │   │   │   ├── query-library.service.ts
│   │   │   │   │   └── repositories/
│   │   │   │   │       ├── local-query-library.repository.spec.ts
│   │   │   │   │       ├── local-query-library.repository.ts
│   │   │   │   │       └── query-library.repository.ts
│   │   │   │   ├── rdi/
│   │   │   │   │   ├── client/
│   │   │   │   │   │   ├── api/
│   │   │   │   │   │   │   ├── v1/
│   │   │   │   │   │   │   │   ├── api.rdi.client.spec.ts
│   │   │   │   │   │   │   │   ├── api.rdi.client.ts
│   │   │   │   │   │   │   │   ├── responses/
│   │   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   │   ├── statistics.responses.ts
│   │   │   │   │   │   │   │   │   └── status.responses.ts
│   │   │   │   │   │   │   │   └── transformers/
│   │   │   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │   │   │       ├── statistics.transformers.spec.ts
│   │   │   │   │   │   │   │       ├── statistics.transformers.ts
│   │   │   │   │   │   │   │       ├── status.transformers.spec.ts
│   │   │   │   │   │   │   │       └── status.transformers.ts
│   │   │   │   │   │   │   └── v2/
│   │   │   │   │   │   │       ├── api.v2.rdi.client.spec.ts
│   │   │   │   │   │   │       ├── api.v2.rdi.client.ts
│   │   │   │   │   │   │       ├── responses/
│   │   │   │   │   │   │       │   ├── index.ts
│   │   │   │   │   │   │       │   ├── info.responses.ts
│   │   │   │   │   │   │       │   ├── metrics-collections.response.ts
│   │   │   │   │   │   │       │   ├── pipeline.responses.ts
│   │   │   │   │   │   │       │   └── status.responses.ts
│   │   │   │   │   │   │       └── transformers/
│   │   │   │   │   │   │           ├── index.ts
│   │   │   │   │   │   │           ├── metrics-collections.transformer.spec.ts
│   │   │   │   │   │   │           └── metrics-collections.transformer.ts
│   │   │   │   │   │   └── rdi.client.ts
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── decorators/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── request.rdi.client.metadata.decorator.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.rdi.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── rdi-template.response.dto.ts
│   │   │   │   │   │   ├── rdi-test-connections.response.dto.ts
│   │   │   │   │   │   ├── rdi.dry-run.job.dto.ts
│   │   │   │   │   │   ├── rdi.dry-run.job.response.dto.ts
│   │   │   │   │   │   └── update.rdi.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── rdi.entity.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── rdi-deploy-failed.exception.spec.ts
│   │   │   │   │   │   ├── rdi-deploy-failed.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.bad-request.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.error.handler.spec.ts
│   │   │   │   │   │   ├── rdi-pipeline.error.handler.ts
│   │   │   │   │   │   ├── rdi-pipeline.forbidden.exception.spec.ts
│   │   │   │   │   │   ├── rdi-pipeline.forbidden.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.internal-server-error.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.not-found.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.timeout-error.exception.spec.ts
│   │   │   │   │   │   ├── rdi-pipeline.timeout-error.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.unauthorized.exception.ts
│   │   │   │   │   │   ├── rdi-pipeline.validation.exception.ts
│   │   │   │   │   │   ├── rdi-reset-pipeline-failed.exception.spec.ts
│   │   │   │   │   │   ├── rdi-reset-pipeline-failed.exception.ts
│   │   │   │   │   │   ├── rdi-start-pipeline-failed.exception.spec.ts
│   │   │   │   │   │   ├── rdi-start-pipeline-failed.exception.ts
│   │   │   │   │   │   ├── rdi-stop-pipeline-failed.exception.spec.ts
│   │   │   │   │   │   └── rdi-stop-pipeline-failed.exception.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── rdi-dry-run.ts
│   │   │   │   │   │   ├── rdi-info.ts
│   │   │   │   │   │   ├── rdi-pipeline.ts
│   │   │   │   │   │   ├── rdi-statistics.ts
│   │   │   │   │   │   ├── rdi.client.metadata.ts
│   │   │   │   │   │   ├── rdi.pipeline.status.ts
│   │   │   │   │   │   └── rdi.ts
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── rdi.client.factory.spec.ts
│   │   │   │   │   │   ├── rdi.client.factory.ts
│   │   │   │   │   │   ├── rdi.client.provider.spec.ts
│   │   │   │   │   │   ├── rdi.client.provider.ts
│   │   │   │   │   │   ├── rdi.client.storage.spec.ts
│   │   │   │   │   │   └── rdi.client.storage.ts
│   │   │   │   │   ├── rdi-pipeline.analytics.spec.ts
│   │   │   │   │   ├── rdi-pipeline.analytics.ts
│   │   │   │   │   ├── rdi-pipeline.controller.ts
│   │   │   │   │   ├── rdi-pipeline.service.spec.ts
│   │   │   │   │   ├── rdi-pipeline.service.ts
│   │   │   │   │   ├── rdi-statistics.controller.ts
│   │   │   │   │   ├── rdi-statistics.service.spec.ts
│   │   │   │   │   ├── rdi-statistics.service.ts
│   │   │   │   │   ├── rdi.analytics.spec.ts
│   │   │   │   │   ├── rdi.analytics.ts
│   │   │   │   │   ├── rdi.controller.ts
│   │   │   │   │   ├── rdi.module.ts
│   │   │   │   │   ├── rdi.service.spec.ts
│   │   │   │   │   ├── rdi.service.ts
│   │   │   │   │   ├── repository/
│   │   │   │   │   │   ├── local.rdi.repository.spec.ts
│   │   │   │   │   │   ├── local.rdi.repository.ts
│   │   │   │   │   │   └── rdi.repository.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── pipeline.util.spec.ts
│   │   │   │   │       ├── pipeline.util.ts
│   │   │   │   │       ├── transformer.util.spec.ts
│   │   │   │   │       └── transformer.util.ts
│   │   │   │   ├── recommendation/
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── recommendation.provider.spec.ts
│   │   │   │   │   │   └── recommendation.provider.ts
│   │   │   │   │   ├── recommendation.module.ts
│   │   │   │   │   └── recommendation.service.ts
│   │   │   │   ├── redis/
│   │   │   │   │   ├── client/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── ioredis/
│   │   │   │   │   │   │   ├── cluster.ioredis.client.ts
│   │   │   │   │   │   │   ├── ioredis.client.ts
│   │   │   │   │   │   │   ├── sentinel.ioredis.client.ts
│   │   │   │   │   │   │   └── standalone.ioredis.client.ts
│   │   │   │   │   │   ├── node-redis/
│   │   │   │   │   │   │   ├── cluster.node-redis.client.ts
│   │   │   │   │   │   │   ├── node-redis.client.ts
│   │   │   │   │   │   │   └── standalone.node-redis.client.ts
│   │   │   │   │   │   └── redis.client.ts
│   │   │   │   │   ├── connection/
│   │   │   │   │   │   ├── ioredis.redis.connection.strategy.spec.ts
│   │   │   │   │   │   ├── ioredis.redis.connection.strategy.ts
│   │   │   │   │   │   ├── node.redis.connection.strategy.spec.ts
│   │   │   │   │   │   ├── node.redis.connection.strategy.ts
│   │   │   │   │   │   ├── redis.connection.strategy.spec.ts
│   │   │   │   │   │   └── redis.connection.strategy.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── client-not-found-error.exception.ts
│   │   │   │   │   │   └── connection/
│   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │       ├── redis-connection-auth-unsupported.exception.ts
│   │   │   │   │   │       ├── redis-connection-cluster-nodes-unavailable.exception.ts
│   │   │   │   │   │       ├── redis-connection-default-user-disabled.exception.ts
│   │   │   │   │   │       ├── redis-connection-failed.exception.ts
│   │   │   │   │   │       ├── redis-connection-incorrect-certificate.exception.ts
│   │   │   │   │   │       ├── redis-connection-sentinel-master-required.exception.ts
│   │   │   │   │   │       ├── redis-connection-timeout.exception.ts
│   │   │   │   │   │       ├── redis-connection-unauthorized.exception.ts
│   │   │   │   │   │       └── redis-connection-unavailable.exception.ts
│   │   │   │   │   ├── local.redis.client.factory.spec.ts
│   │   │   │   │   ├── local.redis.client.factory.ts
│   │   │   │   │   ├── redis.client.factory.ts
│   │   │   │   │   ├── redis.client.storage.spec.ts
│   │   │   │   │   ├── redis.client.storage.ts
│   │   │   │   │   ├── redis.module.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── cluster.util.spec.ts
│   │   │   │   │       ├── cluster.util.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── keys.util.spec.ts
│   │   │   │   │       ├── keys.util.ts
│   │   │   │   │       ├── reply.util.spec.ts
│   │   │   │   │       ├── reply.util.ts
│   │   │   │   │       ├── sentinel.util.spec.ts
│   │   │   │   │       └── sentinel.util.ts
│   │   │   │   ├── redis-enterprise/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── cluster.dto.ts
│   │   │   │   │   │   └── redis-enterprise-cluster.dto.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── redis-enterprise-database.ts
│   │   │   │   │   ├── redis-enterprise.analytics.spec.ts
│   │   │   │   │   ├── redis-enterprise.analytics.ts
│   │   │   │   │   ├── redis-enterprise.controller.spec.ts
│   │   │   │   │   ├── redis-enterprise.controller.ts
│   │   │   │   │   ├── redis-enterprise.module.ts
│   │   │   │   │   ├── redis-enterprise.service.spec.ts
│   │   │   │   │   ├── redis-enterprise.service.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── redis-enterprise-converter.spec.ts
│   │   │   │   │       └── redis-enterprise-converter.ts
│   │   │   │   ├── redis-sentinel/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.sentinel.database.dto.ts
│   │   │   │   │   │   ├── create.sentinel.database.response.ts
│   │   │   │   │   │   ├── create.sentinel.databases.dto.ts
│   │   │   │   │   │   ├── discover.sentinel-masters.dto.ts
│   │   │   │   │   │   ├── sentinel.master.response.dto.ts
│   │   │   │   │   │   └── update.sentinel.master.dto.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── sentinel-master.ts
│   │   │   │   │   │   └── sentinel.ts
│   │   │   │   │   ├── redis-sentinel.analytics.spec.ts
│   │   │   │   │   ├── redis-sentinel.analytics.ts
│   │   │   │   │   ├── redis-sentinel.controller.spec.ts
│   │   │   │   │   ├── redis-sentinel.controller.ts
│   │   │   │   │   ├── redis-sentinel.module.ts
│   │   │   │   │   ├── redis-sentinel.service.spec.ts
│   │   │   │   │   └── redis-sentinel.service.ts
│   │   │   │   ├── server/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── server.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── server.entity.ts
│   │   │   │   │   ├── health.controller.ts
│   │   │   │   │   ├── local.server.service.spec.ts
│   │   │   │   │   ├── local.server.service.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── server.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── local.server.repository.spec.ts
│   │   │   │   │   │   ├── local.server.repository.ts
│   │   │   │   │   │   └── server.repository.ts
│   │   │   │   │   ├── server.controller.ts
│   │   │   │   │   ├── server.module.ts
│   │   │   │   │   └── server.service.ts
│   │   │   │   ├── session/
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── session.provider.ts
│   │   │   │   │   │   ├── single-user.session.provider.spec.ts
│   │   │   │   │   │   ├── single-user.session.provider.ts
│   │   │   │   │   │   └── storage/
│   │   │   │   │   │       ├── in-memory.session.storage.spec.ts
│   │   │   │   │   │       ├── in-memory.session.storage.ts
│   │   │   │   │   │       └── session.storage.ts
│   │   │   │   │   ├── session.module.ts
│   │   │   │   │   ├── session.service.spec.ts
│   │   │   │   │   └── session.service.ts
│   │   │   │   ├── settings/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── settings.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   └── settings.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   ├── agreements.entity.ts
│   │   │   │   │   │   └── settings.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── agreements.interface.ts
│   │   │   │   │   │   ├── agreements.ts
│   │   │   │   │   │   └── settings.ts
│   │   │   │   │   ├── repositories/
│   │   │   │   │   │   ├── agreements.repository.ts
│   │   │   │   │   │   ├── local.agreements.repository.spec.ts
│   │   │   │   │   │   ├── local.agreements.repository.ts
│   │   │   │   │   │   ├── local.settings.repository.spec.ts
│   │   │   │   │   │   ├── local.settings.repository.ts
│   │   │   │   │   │   └── settings.repository.ts
│   │   │   │   │   ├── settings.analytics.spec.ts
│   │   │   │   │   ├── settings.analytics.ts
│   │   │   │   │   ├── settings.controller.ts
│   │   │   │   │   ├── settings.module.ts
│   │   │   │   │   ├── settings.service.spec.ts
│   │   │   │   │   └── settings.service.ts
│   │   │   │   ├── slow-log/
│   │   │   │   │   ├── constants/
│   │   │   │   │   │   └── commands.ts
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── get-slow-logs.dto.ts
│   │   │   │   │   │   └── update-slow-log-config.dto.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── slow-log-config.ts
│   │   │   │   │   │   └── slow-log.ts
│   │   │   │   │   ├── slow-log.analytics.ts
│   │   │   │   │   ├── slow-log.controller.ts
│   │   │   │   │   ├── slow-log.module.ts
│   │   │   │   │   ├── slow-log.service.spec.ts
│   │   │   │   │   └── slow-log.service.ts
│   │   │   │   ├── ssh/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create.basic-ssh-options.dto.ts
│   │   │   │   │   │   ├── create.cert-ssh-options.dto.ts
│   │   │   │   │   │   ├── ssh-options.response.ts
│   │   │   │   │   │   └── update.ssh-options.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── ssh-options.entity.ts
│   │   │   │   │   ├── exceptions/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── tunnel-connection-lost.exception.ts
│   │   │   │   │   │   ├── unable-to-create-local-server.exception.ts
│   │   │   │   │   │   ├── unable-to-create-ssh-connection.exception.ts
│   │   │   │   │   │   └── unable-to-create-tunnel.exception.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── ssh-options.ts
│   │   │   │   │   │   └── ssh-tunnel.ts
│   │   │   │   │   ├── ssh-tunnel.provider.spec.ts
│   │   │   │   │   ├── ssh-tunnel.provider.ts
│   │   │   │   │   ├── ssh.module.ts
│   │   │   │   │   ├── transformers/
│   │   │   │   │   │   ├── ssh-options.transformer.spec.ts
│   │   │   │   │   │   └── ssh-options.transformer.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── error-message.spec.ts
│   │   │   │   │       ├── error-message.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── statics-management/
│   │   │   │   │   ├── providers/
│   │   │   │   │   │   ├── auto-updated-statics.interface.ts
│   │   │   │   │   │   ├── auto-updated-statics.provider.spec.ts
│   │   │   │   │   │   └── auto-updated-statics.provider.ts
│   │   │   │   │   └── statics-management.module.ts
│   │   │   │   ├── tag/
│   │   │   │   │   ├── dto/
│   │   │   │   │   │   ├── create-tag.dto.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── update-tag.dto.ts
│   │   │   │   │   ├── entities/
│   │   │   │   │   │   └── tag.entity.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   └── tag.ts
│   │   │   │   │   ├── repository/
│   │   │   │   │   │   ├── local.tag.repository.spec.ts
│   │   │   │   │   │   ├── local.tag.repository.ts
│   │   │   │   │   │   └── tag.repository.ts
│   │   │   │   │   ├── tag.controller.ts
│   │   │   │   │   ├── tag.module.ts
│   │   │   │   │   ├── tag.service.spec.ts
│   │   │   │   │   └── tag.service.ts
│   │   │   │   └── workbench/
│   │   │   │       ├── decorators/
│   │   │   │       │   └── workbench-client-metadata.decorator.ts
│   │   │   │       ├── dto/
│   │   │   │       │   ├── create-command-execution.dto.ts
│   │   │   │       │   ├── create-command-executions.dto.ts
│   │   │   │       │   └── create-plugin-state.dto.ts
│   │   │   │       ├── entities/
│   │   │   │       │   ├── command-execution.entity.ts
│   │   │   │       │   └── plugin-state.entity.ts
│   │   │   │       ├── models/
│   │   │   │       │   ├── command-execution-result.ts
│   │   │   │       │   ├── command-execution.ts
│   │   │   │       │   ├── command-executions.filter.ts
│   │   │   │       │   ├── plugin-command-execution.ts
│   │   │   │       │   ├── plugin-state.ts
│   │   │   │       │   └── short-command-execution.ts
│   │   │   │       ├── plugins.controller.ts
│   │   │   │       ├── plugins.service.spec.ts
│   │   │   │       ├── plugins.service.ts
│   │   │   │       ├── providers/
│   │   │   │       │   ├── plugin-commands-whitelist.provider.spec.ts
│   │   │   │       │   ├── plugin-commands-whitelist.provider.ts
│   │   │   │       │   ├── workbench-commands.executor.spec.ts
│   │   │   │       │   └── workbench-commands.executor.ts
│   │   │   │       ├── repositories/
│   │   │   │       │   ├── command-execution.repository.ts
│   │   │   │       │   ├── local-command-execution.repository.spec.ts
│   │   │   │       │   ├── local-command-execution.repository.ts
│   │   │   │       │   ├── local-plugin-state.repository.spec.ts
│   │   │   │       │   ├── local-plugin-state.repository.ts
│   │   │   │       │   └── plugin-state.repository.ts
│   │   │   │       ├── utils/
│   │   │   │       │   ├── getUnsupportedCommands.spec.ts
│   │   │   │       │   └── getUnsupportedCommands.ts
│   │   │   │       ├── workbench.analytics.spec.ts
│   │   │   │       ├── workbench.analytics.ts
│   │   │   │       ├── workbench.controller.ts
│   │   │   │       ├── workbench.module.ts
│   │   │   │       ├── workbench.service.spec.ts
│   │   │   │       └── workbench.service.ts
│   │   │   ├── utils/
│   │   │   │   ├── analytics-helper.spec.ts
│   │   │   │   ├── analytics-helper.ts
│   │   │   │   ├── base.helper.spec.ts
│   │   │   │   ├── base.helper.ts
│   │   │   │   ├── big-string.spec.ts
│   │   │   │   ├── big-string.ts
│   │   │   │   ├── catch-redis-errors.spec.ts
│   │   │   │   ├── catch-redis-errors.ts
│   │   │   │   ├── class-transformer.ts
│   │   │   │   ├── cli-helper.spec.ts
│   │   │   │   ├── cli-helper.ts
│   │   │   │   ├── config.spec.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── converter.spec.ts
│   │   │   │   ├── converter.ts
│   │   │   │   ├── createHttpOptions.ts
│   │   │   │   ├── feature-version-filter.helper.spec.ts
│   │   │   │   ├── feature-version-filter.helper.ts
│   │   │   │   ├── file-helper.ts
│   │   │   │   ├── glob-pattern-helper.spec.ts
│   │   │   │   ├── glob-pattern-helper.ts
│   │   │   │   ├── hosting-provider-helper.spec.ts
│   │   │   │   ├── hosting-provider-helper.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── logsFormatter.spec.ts
│   │   │   │   ├── logsFormatter.ts
│   │   │   │   ├── path.spec.ts
│   │   │   │   ├── path.ts
│   │   │   │   ├── promise-with-timeout.spec.ts
│   │   │   │   ├── promise-with-timeout.ts
│   │   │   │   ├── recommendation-helper.spec.ts
│   │   │   │   ├── recommendation-helper.ts
│   │   │   │   ├── redis-modules-summary.spec.ts
│   │   │   │   ├── redis-modules-summary.ts
│   │   │   │   ├── redis-reply-converter.spec.ts
│   │   │   │   └── redis-reply-converter.ts
│   │   │   └── validators/
│   │   │       ├── index.ts
│   │   │       ├── isObjectWithValues.validator.ts
│   │   │       ├── serializedJson.validator.spec.ts
│   │   │       └── serializedJson.validator.ts
│   │   ├── stubs/
│   │   │   └── cpu-features/
│   │   │       ├── index.js
│   │   │       └── package.json
│   │   ├── test/
│   │   │   ├── README.md
│   │   │   ├── api/
│   │   │   │   ├── .mocharc.yml
│   │   │   │   ├── _init/
│   │   │   │   │   └── WS-notifications-global-sync.test.ts
│   │   │   │   ├── ai/
│   │   │   │   │   └── assistant/
│   │   │   │   │       ├── DELETE-ai-assistant-chats-id.test.ts
│   │   │   │   │       ├── GET-ai-assistant-chats-id.test.ts
│   │   │   │   │       ├── POST-ai-assistant-chats-id-messages.test.ts
│   │   │   │   │       └── POST-ai-assistant-chats.test.ts
│   │   │   │   ├── analytics/
│   │   │   │   │   ├── POST-analytics-send-event.test.ts
│   │   │   │   │   ├── POST-analytics-send-page.test.ts
│   │   │   │   │   └── analytics.test.ts
│   │   │   │   ├── api.deps.init.ts
│   │   │   │   ├── api.tsconfig.json
│   │   │   │   ├── browser-history/
│   │   │   │   │   ├── DELETE-browser-histories.test.ts
│   │   │   │   │   ├── DELETE-browser-history-id.test.ts
│   │   │   │   │   └── GET-browser-histories.test.ts
│   │   │   │   ├── bulk-actions/
│   │   │   │   │   ├── POST-databases-id-bulk_actions-import-default_data.test.ts
│   │   │   │   │   ├── POST-databases-id-bulk_actions-import-tutorial_data.test.ts
│   │   │   │   │   └── POST-databases-id-bulk_actions-import.test.ts
│   │   │   │   ├── certificate/
│   │   │   │   │   └── constants.ts
│   │   │   │   ├── cli/
│   │   │   │   │   ├── POST-databases-id-cli-uuid-send_cluster_command.test.ts
│   │   │   │   │   ├── POST-databases-id-cli-uuid-send_command.test.ts
│   │   │   │   │   └── POST-databases-id-cli.test.ts
│   │   │   │   ├── cloud/
│   │   │   │   │   ├── autodiscovery/
│   │   │   │   │   │   ├── GET-cloud-autodiscovery-account.test.ts
│   │   │   │   │   │   ├── GET-cloud-autodiscovery-subscriptions.test.ts
│   │   │   │   │   │   ├── GET-cloud-me-autodiscovery-account.test.ts
│   │   │   │   │   │   ├── POST-cloud-autodiscovery-databases.test.ts
│   │   │   │   │   │   └── POST-cloud-autodiscovery-get_databases.test.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   └── user/
│   │   │   │   │       ├── GET-cloud-me.test.ts
│   │   │   │   │       └── PUT-cloud-me-accounts-id-current.test.ts
│   │   │   │   ├── cluster-monitor/
│   │   │   │   │   └── GET-databases-id-cluster_details.test.ts
│   │   │   │   ├── commands/
│   │   │   │   │   └── GET-commands.test.ts
│   │   │   │   ├── custom-tutorials/
│   │   │   │   │   └── POST-custom-tutorials.test.ts
│   │   │   │   ├── database/
│   │   │   │   │   ├── DELETE-databases-id.test.ts
│   │   │   │   │   ├── DELETE-databases.test.ts
│   │   │   │   │   ├── GET-databases-id-connect.test.ts
│   │   │   │   │   ├── GET-databases-id-info.test.ts
│   │   │   │   │   ├── GET-databases-id-overview.test.ts
│   │   │   │   │   ├── GET-databases.test.ts
│   │   │   │   │   ├── PATCH-databases-id.test.ts
│   │   │   │   │   ├── POST-databases-clone-id.test.ts
│   │   │   │   │   ├── POST-databases-export.test.ts
│   │   │   │   │   ├── POST-databases-test-id.test.ts
│   │   │   │   │   ├── POST-databases-test.test.ts
│   │   │   │   │   ├── POST-databases.test.ts
│   │   │   │   │   └── constants.ts
│   │   │   │   ├── database-analysis/
│   │   │   │   │   ├── GET-databases-id-analysis-id.test.ts
│   │   │   │   │   ├── GET-databases-id-analysis.test.ts
│   │   │   │   │   ├── PATCH-databases-id-analysis.test.ts
│   │   │   │   │   ├── POST-databases-id-analysis.test.ts
│   │   │   │   │   └── constants.ts
│   │   │   │   ├── database-discovery/
│   │   │   │   │   └── pre-setup-databases.tests.ts
│   │   │   │   ├── database-import/
│   │   │   │   │   └── POST-databases-import.test.ts
│   │   │   │   ├── database-recommendations/
│   │   │   │   │   ├── DELETE-databases-id-recommendations.test.ts
│   │   │   │   │   ├── GET-databases-id-recommendations.test.ts
│   │   │   │   │   ├── PATCH-databases-id-recommendations-id.test.ts
│   │   │   │   │   ├── PATCH-databases-id-recommendations-read.test.ts
│   │   │   │   │   ├── WS-new-recommendations.test.ts
│   │   │   │   │   └── constants.ts
│   │   │   │   ├── deps.ts
│   │   │   │   ├── enterprise/
│   │   │   │   │   └── POST-redis-enterprise-cluster-get_dbs.test.ts
│   │   │   │   ├── feature/
│   │   │   │   │   ├── GET-features.test.ts
│   │   │   │   │   └── POST-features-sync.test.ts
│   │   │   │   ├── hash/
│   │   │   │   │   ├── DELETE-databases-id-hash-fields.test.ts
│   │   │   │   │   ├── POST-databases-id-hash-get_fields.test.ts
│   │   │   │   │   ├── POST-databases-id-hash.test.ts
│   │   │   │   │   └── PUT-databases-id-hash.test.ts
│   │   │   │   ├── info/
│   │   │   │   │   ├── GET-health.test.ts
│   │   │   │   │   ├── GET-info-cli-blocking-commands.test.ts
│   │   │   │   │   ├── GET-info-cli-unsupported-commands.test.ts
│   │   │   │   │   └── GET-info.test.ts
│   │   │   │   ├── keys/
│   │   │   │   │   ├── DELETE-databases-id-keys.test.ts
│   │   │   │   │   ├── PATCH-databases-id-keys-name.test.ts
│   │   │   │   │   ├── PATCH-databases-id-keys-ttl.test.ts
│   │   │   │   │   ├── POST-databases-id-keys-get_info.test.ts
│   │   │   │   │   ├── POST-databases-id-keys-get_infos.test.ts
│   │   │   │   │   └── POST-databases-id-keys.test.ts
│   │   │   │   ├── list/
│   │   │   │   │   ├── DELETE-databases-id-list-elements.test.ts
│   │   │   │   │   ├── PATCH-databases-id-list.test.ts
│   │   │   │   │   ├── POST-databases-id-list-get_elements-index.test.ts
│   │   │   │   │   ├── POST-databases-id-list-get_elements.test.ts
│   │   │   │   │   ├── POST-databases-id-list.test.ts
│   │   │   │   │   └── PUT-databases-id-list.test.ts
│   │   │   │   ├── notifications/
│   │   │   │   │   ├── GET-notifications.test.ts
│   │   │   │   │   ├── PATCH-notifications.test.ts
│   │   │   │   │   └── notifications.json
│   │   │   │   ├── plugins/
│   │   │   │   │   ├── GET-databases-id-plugins-commands.test.ts
│   │   │   │   │   ├── GET-databases-id-plugins-id-command_executions-id-state.test.ts
│   │   │   │   │   ├── GET-plugins.test.ts
│   │   │   │   │   ├── POST-databases-id-plugins-command_executions.test.ts
│   │   │   │   │   └── POST-databases-id-plugins-id-command_executions-id-state.test.ts
│   │   │   │   ├── pub-sub/
│   │   │   │   │   └── POST-databases-id-pub-sub-messages.test.ts
│   │   │   │   ├── query-library/
│   │   │   │   │   ├── DELETE-databases-id-query_library-id.test.ts
│   │   │   │   │   ├── GET-databases-id-query_library-id.test.ts
│   │   │   │   │   ├── GET-databases-id-query_library.test.ts
│   │   │   │   │   ├── PATCH-databases-id-query_library-id.test.ts
│   │   │   │   │   ├── POST-databases-id-query_library-seed.test.ts
│   │   │   │   │   └── POST-databases-id-query_library.test.ts
│   │   │   │   ├── rdi/
│   │   │   │   │   ├── DELETE-rdi.test.ts
│   │   │   │   │   ├── GET-rdi-id-connect.test.ts
│   │   │   │   │   ├── GET-rdi-id.test.ts
│   │   │   │   │   ├── GET-rdi.test.ts
│   │   │   │   │   ├── PATCH-rdi-id.test.ts
│   │   │   │   │   ├── POST-rdi.test.ts
│   │   │   │   │   ├── pipeline/
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-config-template-pipelineType-dbType.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-job-functions.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-job-template-pipelineType.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-schema.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-status.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline-strategies.test.ts
│   │   │   │   │   │   ├── GET-rdi-id-pipeline.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-deploy.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-dry-run-job.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-reset.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-start.test.ts
│   │   │   │   │   │   ├── POST-rdi-id-pipeline-stop.test.ts
│   │   │   │   │   │   └── POST-rdi-id-pipeline-test-connections.test.ts
│   │   │   │   │   └── statistics/
│   │   │   │   │       └── GET-rdi-id-statistics.test.ts
│   │   │   │   ├── redisearch/
│   │   │   │   │   ├── DELETE-databases-id-redisearch.test.ts
│   │   │   │   │   ├── GET-databases-id-redisearch.test.ts
│   │   │   │   │   ├── POST-databases-id-redisearch-info.test.ts
│   │   │   │   │   ├── POST-databases-id-redisearch-key-indexes.test.ts
│   │   │   │   │   ├── POST-databases-id-redisearch-search.test.ts
│   │   │   │   │   └── POST-databases-id-redisearch.test.ts
│   │   │   │   ├── rejson-rl/
│   │   │   │   │   ├── DELETE-databases-id-rejson_rl.test.ts
│   │   │   │   │   ├── PATCH-databases-id-rejson_rl-arrappend.test.ts
│   │   │   │   │   ├── PATCH-databases-id-rejson_rl-set.test.ts
│   │   │   │   │   ├── POST-databases-id-rejson_rl-get.test.ts
│   │   │   │   │   └── POST-databases-id-rejson_rl.test.ts
│   │   │   │   ├── reporters.json
│   │   │   │   ├── sentinel/
│   │   │   │   │   ├── POST-redis_sentinel-databases.test.ts
│   │   │   │   │   └── POST-redis_sentinel-get_databases.test.ts
│   │   │   │   ├── set/
│   │   │   │   │   ├── DELETE-databases-id-set-members.test.ts
│   │   │   │   │   ├── POST-databases-id-set-get_members.test.ts
│   │   │   │   │   ├── POST-databases-id-set.test.ts
│   │   │   │   │   └── PUT-databases-id-set.test.ts
│   │   │   │   ├── settings/
│   │   │   │   │   ├── GET-settings-agreements-spec.test.ts
│   │   │   │   │   ├── GET-settings.test.ts
│   │   │   │   │   └── PATCH-settings.test.ts
│   │   │   │   ├── slowlog/
│   │   │   │   │   ├── DELETE-databases-id-slow_logs.test.ts
│   │   │   │   │   ├── GET-databases-id-slow_logs-config.test.ts
│   │   │   │   │   ├── GET-databases-id-slow_logs.test.ts
│   │   │   │   │   └── PATCH-databases-id-slow_logs-config.test.ts
│   │   │   │   ├── stream/
│   │   │   │   │   ├── DELETE-databases-id-streams-consumer_groups-consumers.test.ts
│   │   │   │   │   ├── DELETE-databases-id-streams-consumer_groups.test.ts
│   │   │   │   │   ├── PATCH-databases-id-streams-consumer_groups.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-consumers-get.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-consumers-pending_messages-ack.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-consumers-pending_messages-claim.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-consumers-pending_messages-get.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups-get.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-consumer_groups.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-entries-get.test.ts
│   │   │   │   │   ├── POST-databases-id-streams-entries.test.ts
│   │   │   │   │   └── POST-databases-id-streams.test.ts
│   │   │   │   ├── string/
│   │   │   │   │   ├── POST-databases-id-string-download_value.test.ts
│   │   │   │   │   ├── POST-databases-id-string-get_value.test.ts
│   │   │   │   │   ├── POST-databases-id-string.test.ts
│   │   │   │   │   └── PUT-databases-id-string.test.ts
│   │   │   │   ├── triggered-functions/
│   │   │   │   │   ├── DELETE-databases-id-library.test.ts
│   │   │   │   │   ├── GET-databases-id-functions.test.ts
│   │   │   │   │   ├── GET-databases-id-libraries.test.ts
│   │   │   │   │   └── POST-databases-id-library.test.ts
│   │   │   │   ├── workbench/
│   │   │   │   │   ├── DELETE-databases-id-workbench-command_executions-id.test.ts
│   │   │   │   │   ├── DELETE-databases-id-workbench-command_executions.test.ts
│   │   │   │   │   ├── GET-databases-id-workbench-command_executions-id.test.ts
│   │   │   │   │   ├── GET-databases-id-workbench-command_executions.test.ts
│   │   │   │   │   └── POST-databases-id-workbench-command_executions.test.ts
│   │   │   │   ├── ws/
│   │   │   │   │   ├── bulk-actions/
│   │   │   │   │   │   └── bulk-actions-create.test.ts
│   │   │   │   │   ├── monitor/
│   │   │   │   │   │   └── monitor.test.ts
│   │   │   │   │   └── pub-sub/
│   │   │   │   │       └── pub-sub.test.ts
│   │   │   │   └── z-set/
│   │   │   │       ├── DELETE-databases-id-zSet-members.test.ts
│   │   │   │       ├── PATCH-databases-id-zSet.test.ts
│   │   │   │       ├── POST-databases-id-zSet-get_members.test.ts
│   │   │   │       ├── POST-databases-id-zSet-search.test.ts
│   │   │   │       ├── POST-databases-id-zSet.test.ts
│   │   │   │       └── PUT-databases-id-zSet.test.ts
│   │   │   ├── helpers/
│   │   │   │   ├── analytics.ts
│   │   │   │   ├── cloud.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── data/
│   │   │   │   │   └── redis.ts
│   │   │   │   ├── local-db.ts
│   │   │   │   ├── redis.ts
│   │   │   │   ├── remote-server.ts
│   │   │   │   ├── server.ts
│   │   │   │   ├── test/
│   │   │   │   │   ├── conditionalIgnore.ts
│   │   │   │   │   └── dataGenerator.ts
│   │   │   │   ├── test.ts
│   │   │   │   └── utils.ts
│   │   │   └── test-runs/
│   │   │       ├── cloud-st/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── docker.build.env
│   │   │       ├── docker.build.yml
│   │   │       ├── gears-clu/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── local.build.env
│   │   │       ├── local.build.yml
│   │   │       ├── mods-preview/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-clu/
│   │   │       │   ├── Dockerfile
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-clu-tls/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   ├── redis.key
│   │   │       │   │   └── redisCA.crt
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-sent/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── docker-compose.yml
│   │   │       │   ├── redis.conf
│   │   │       │   ├── sentinel.Dockerfile
│   │   │       │   ├── sentinel.conf
│   │   │       │   ├── sentinel.users.acl
│   │   │       │   └── users.acl
│   │   │       ├── oss-sent-tls-auth/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── ca.crt
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   └── redis.key
│   │   │       │   ├── docker-compose.yml
│   │   │       │   ├── redis.conf
│   │   │       │   ├── sentinel.Dockerfile
│   │   │       │   ├── sentinel.conf
│   │   │       │   └── users.acl
│   │   │       ├── oss-st-5/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── redis.conf
│   │   │       ├── oss-st-5-pass/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-st-6/
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-st-6-tls/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   ├── redis.key
│   │   │       │   │   └── redisCA.crt
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-st-6-tls-auth/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   ├── redis.key
│   │   │       │   │   ├── redisCA.crt
│   │   │       │   │   ├── user.crt
│   │   │       │   │   └── user.key
│   │   │       │   └── docker-compose.yml
│   │   │       ├── oss-st-6-tls-auth-ssh/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── certs/
│   │   │       │   │   ├── redis.crt
│   │   │       │   │   ├── redis.key
│   │   │       │   │   ├── redisCA.crt
│   │   │       │   │   ├── user.crt
│   │   │       │   │   └── user.key
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── ssh/
│   │   │       │       └── keys/
│   │   │       │           ├── pub/
│   │   │       │           │   ├── test.pub
│   │   │       │           │   └── testp.pub
│   │   │       │           ├── test
│   │   │       │           └── testp
│   │   │       ├── oss-st-big/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── entrypoint.sh
│   │   │       ├── re-clu/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── db.json
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── entrypoint.sh
│   │   │       ├── re-crdt/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── entrypoint.sh
│   │   │       ├── re-st/
│   │   │       │   ├── Dockerfile
│   │   │       │   ├── db.json
│   │   │       │   ├── docker-compose.yml
│   │   │       │   └── entrypoint.sh
│   │   │       ├── run-all.sh
│   │   │       ├── start-test-run.sh
│   │   │       ├── test-docker-entry.sh
│   │   │       ├── test.Dockerfile
│   │   │       └── wait-for-it.sh
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.build.prod.json
│   │   └── tsconfig.json
│   ├── desktop/
│   │   ├── app.ts
│   │   ├── config.json
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── preload.ts
│   │   ├── splash.html
│   │   ├── src/
│   │   │   ├── config/
│   │   │   │   ├── configMain.ts
│   │   │   │   ├── configRenderer.ts
│   │   │   │   └── index.ts
│   │   │   ├── index.html
│   │   │   ├── lib/
│   │   │   │   ├── aboutPanel/
│   │   │   │   │   └── aboutPanel.ts
│   │   │   │   ├── app/
│   │   │   │   │   ├── app.handlers.ts
│   │   │   │   │   ├── deep-link.handlers.ts
│   │   │   │   │   ├── dialog.handlers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── ipc.handlers.ts
│   │   │   │   ├── auth/
│   │   │   │   │   ├── auth.factory.ts
│   │   │   │   │   ├── auth.interface.ts
│   │   │   │   │   ├── service.auth.strategy.ts
│   │   │   │   │   └── tcp.auth.strategy.ts
│   │   │   │   ├── azure/
│   │   │   │   │   ├── azure-auth.service.provider.ts
│   │   │   │   │   ├── azure-oauth-errors.spec.ts
│   │   │   │   │   ├── azure-oauth-errors.ts
│   │   │   │   │   ├── deep-link.handlers.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── cloud/
│   │   │   │   │   ├── cloud-oauth.handlers.ts
│   │   │   │   │   ├── deep-link.handlers.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── extensions/
│   │   │   │   │   └── extensions.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── logging/
│   │   │   │   │   └── logging.ts
│   │   │   │   ├── menu/
│   │   │   │   │   └── menu.ts
│   │   │   │   ├── server/
│   │   │   │   │   └── server.ts
│   │   │   │   ├── store/
│   │   │   │   │   └── store.ts
│   │   │   │   ├── tray/
│   │   │   │   │   ├── tray.ts
│   │   │   │   │   └── trayManager.ts
│   │   │   │   ├── updater/
│   │   │   │   │   ├── updater.handlers.ts
│   │   │   │   │   └── updater.ts
│   │   │   │   └── window/
│   │   │   │       ├── browserWindow.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── window.handlers.ts
│   │   │   └── utils/
│   │   │       ├── getAssetPath.ts
│   │   │       ├── index.ts
│   │   │       ├── resolveHtmlPath.ts
│   │   │       ├── showOrCreateWindow.ts
│   │   │       ├── window-size.ts
│   │   │       └── wrapErrorSensitiveData.ts
│   │   ├── views/
│   │   │   └── cloud_outh_callback/
│   │   │       ├── callback.html
│   │   │       ├── index.js
│   │   │       └── styles.css
│   │   ├── vite.main.config.ts
│   │   ├── vite.preload.config.ts
│   │   └── vite.renderer.config.ts
│   ├── package.json
│   ├── patches/
│   │   └── sqlite3+5.1.7.patch
│   └── ui/
│       ├── .eslintignore
│       ├── README.md
│       ├── index.html
│       ├── index.tsx
│       ├── indexElectron.tsx
│       ├── package.json
│       ├── src/
│       │   ├── App.scss
│       │   ├── App.spec.tsx
│       │   ├── App.tsx
│       │   ├── Router.spec.tsx
│       │   ├── Router.tsx
│       │   ├── RouterElectron.tsx
│       │   ├── assets/
│       │   │   └── assets.d.ts
│       │   ├── components/
│       │   │   ├── ContentEditable.tsx
│       │   │   ├── MonacoEnvironmentInitializer/
│       │   │   │   ├── MonacoEnvironmentInitializer.spec.tsx
│       │   │   │   ├── MonacoEnvironmentInitializer.tsx
│       │   │   │   └── yaml.worker.js
│       │   │   ├── analytics-tabs/
│       │   │   │   ├── AnalyticsTabs.spec.tsx
│       │   │   │   ├── AnalyticsTabs.stories.tsx
│       │   │   │   ├── AnalyticsTabs.tsx
│       │   │   │   └── index.ts
│       │   │   ├── auto-discover/
│       │   │   │   ├── EmptyState.tsx
│       │   │   │   ├── EmptyState.types.ts
│       │   │   │   ├── Header.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.ts
│       │   │   ├── auto-refresh/
│       │   │   │   ├── AutoRefresh.spec.tsx
│       │   │   │   ├── AutoRefresh.stories.tsx
│       │   │   │   ├── AutoRefresh.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   └── utils.ts
│       │   │   ├── base/
│       │   │   │   ├── code-editor/
│       │   │   │   │   ├── CodeEditor.styles.ts
│       │   │   │   │   ├── CodeEditor.tsx
│       │   │   │   │   ├── CodeEditor.types.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── display/
│       │   │   │   │   ├── accordion/
│       │   │   │   │   │   ├── RiAccordion.spec.tsx
│       │   │   │   │   │   ├── RiAccordion.tsx
│       │   │   │   │   │   └── RiAccordion.types.ts
│       │   │   │   │   ├── badge/
│       │   │   │   │   │   └── RiBadge.tsx
│       │   │   │   │   ├── banner/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── call-out/
│       │   │   │   │   │   └── CallOut.tsx
│       │   │   │   │   ├── collapsible-nav-group/
│       │   │   │   │   │   └── RICollapsibleNavGroup.tsx
│       │   │   │   │   ├── image/
│       │   │   │   │   │   ├── RiImage.tsx
│       │   │   │   │   │   └── image.styles.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── loader/
│       │   │   │   │   │   └── Loader.tsx
│       │   │   │   │   ├── loading-logo/
│       │   │   │   │   │   └── RiLoadingLogo.tsx
│       │   │   │   │   ├── modal/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── progress-bar/
│       │   │   │   │   │   ├── ProgressBarLoader.tsx
│       │   │   │   │   │   └── progress-bar-loader.styles.ts
│       │   │   │   │   ├── section/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── toast/
│       │   │   │   │   │   ├── RiToast.tsx
│       │   │   │   │   │   ├── RiToaster.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── tour/
│       │   │   │   │       ├── TourStep.tsx
│       │   │   │   │       └── types.ts
│       │   │   │   ├── forms/
│       │   │   │   │   ├── FormField.tsx
│       │   │   │   │   ├── button-group/
│       │   │   │   │   │   └── ButtonGroup.tsx
│       │   │   │   │   ├── buttons/
│       │   │   │   │   │   ├── ActionIconButton.stories.tsx
│       │   │   │   │   │   ├── ActionIconButton.tsx
│       │   │   │   │   │   ├── Button.stories.tsx
│       │   │   │   │   │   ├── Button.tsx
│       │   │   │   │   │   ├── DestructiveButton.stories.tsx
│       │   │   │   │   │   ├── DestructiveButton.tsx
│       │   │   │   │   │   ├── EmptyButton.stories.tsx
│       │   │   │   │   │   ├── EmptyButton.tsx
│       │   │   │   │   │   ├── EmptyButton.types.ts
│       │   │   │   │   │   ├── IconButton.stories.tsx
│       │   │   │   │   │   ├── IconButton.tsx
│       │   │   │   │   │   ├── PrimaryButton.stories.tsx
│       │   │   │   │   │   ├── PrimaryButton.tsx
│       │   │   │   │   │   ├── SecondaryButton.stories.tsx
│       │   │   │   │   │   ├── SecondaryButton.tsx
│       │   │   │   │   │   ├── ToggleButton.stories.tsx
│       │   │   │   │   │   ├── ToggleButton.tsx
│       │   │   │   │   │   ├── button.styles.ts
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── checkbox/
│       │   │   │   │   │   ├── Checkbox.test.tsx
│       │   │   │   │   │   └── Checkbox.tsx
│       │   │   │   │   ├── combo-box/
│       │   │   │   │   │   ├── AutoTag.spec.tsx
│       │   │   │   │   │   └── AutoTag.tsx
│       │   │   │   │   ├── fieldset/
│       │   │   │   │   │   ├── FormFieldset.spec.tsx
│       │   │   │   │   │   ├── FormFieldset.styles.ts
│       │   │   │   │   │   ├── FormFieldset.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── file-picker/
│       │   │   │   │   │   ├── RiFilePicker.tsx
│       │   │   │   │   │   └── styles.tsx
│       │   │   │   │   ├── radio-group/
│       │   │   │   │   │   └── RadioGroup.tsx
│       │   │   │   │   └── select/
│       │   │   │   │       ├── RISelectWithActions.spec.tsx
│       │   │   │   │       ├── RISelectWithActions.tsx
│       │   │   │   │       └── RiSelect.tsx
│       │   │   │   ├── icons/
│       │   │   │   │   ├── Icon.tsx
│       │   │   │   │   ├── RiIcon.tsx
│       │   │   │   │   ├── iconRegistry.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── inputs/
│       │   │   │   │   ├── ComposedInput.tsx
│       │   │   │   │   ├── NumericInput.tsx
│       │   │   │   │   ├── PasswordInput.tsx
│       │   │   │   │   ├── SearchInput.tsx
│       │   │   │   │   ├── SwitchInput.spec.tsx
│       │   │   │   │   ├── SwitchInput.tsx
│       │   │   │   │   ├── TextArea.ts
│       │   │   │   │   ├── TextInput.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── layout/
│       │   │   │   │   ├── card/
│       │   │   │   │   │   └── index.tsx
│       │   │   │   │   ├── drawer/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── empty-prompt/
│       │   │   │   │   │   └── RiEmptyPrompt.tsx
│       │   │   │   │   ├── flex/
│       │   │   │   │   │   ├── flex.spec.tsx
│       │   │   │   │   │   ├── flex.styles.ts
│       │   │   │   │   │   ├── flex.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── flex.module.scss
│       │   │   │   │   ├── horizontal-rule/
│       │   │   │   │   │   ├── HorizontalRule.spec.tsx
│       │   │   │   │   │   ├── HorizontalRule.tsx
│       │   │   │   │   │   └── horizontal-rule.styles.ts
│       │   │   │   │   ├── horizontal-spacer/
│       │   │   │   │   │   ├── HorizontalSpacer.spec.tsx
│       │   │   │   │   │   ├── horizontal-spacer.styles.ts
│       │   │   │   │   │   ├── horizontal-spacer.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── list/
│       │   │   │   │   │   ├── Group.tsx
│       │   │   │   │   │   ├── Item.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── list.styles.ts
│       │   │   │   │   ├── loading-content/
│       │   │   │   │   │   ├── LoadingContent.spec.tsx
│       │   │   │   │   │   ├── LoadingContent.tsx
│       │   │   │   │   │   └── loading-content.styles.ts
│       │   │   │   │   ├── menu/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── page/
│       │   │   │   │   │   ├── Page.tsx
│       │   │   │   │   │   ├── PageBody.tsx
│       │   │   │   │   │   ├── PageContentBody.tsx
│       │   │   │   │   │   ├── PageHeader.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   ├── page-body.spec.tsx
│       │   │   │   │   │   ├── page-body.styles.ts
│       │   │   │   │   │   ├── page-heading.styles.ts
│       │   │   │   │   │   ├── page.spec.tsx
│       │   │   │   │   │   └── page.styles.ts
│       │   │   │   │   ├── profile-icon/
│       │   │   │   │   │   └── ProfileIcon.tsx
│       │   │   │   │   ├── resize/
│       │   │   │   │   │   ├── container/
│       │   │   │   │   │   │   └── ResizableContainer.tsx
│       │   │   │   │   │   ├── handle/
│       │   │   │   │   │   │   ├── ResizablePanelHandle.tsx
│       │   │   │   │   │   │   └── resizable-panel-handle.styles.ts
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── panel/
│       │   │   │   │   │       └── ResizablePanel.tsx
│       │   │   │   │   ├── sidebar/
│       │   │   │   │   │   ├── SideBarItemIcon.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── sidebar-item-icon.styles.ts
│       │   │   │   │   ├── spacer/
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   ├── spacer.spec.tsx
│       │   │   │   │   │   ├── spacer.styles.ts
│       │   │   │   │   │   └── spacer.tsx
│       │   │   │   │   ├── stepper/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── table/
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── tabs/
│       │   │   │   │       └── index.ts
│       │   │   │   ├── link/
│       │   │   │   │   ├── Link.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── link.styles.ts
│       │   │   │   │   └── link.types.ts
│       │   │   │   ├── navigation/
│       │   │   │   │   └── breadcrumbs/
│       │   │   │   │       ├── RiBreadcrumbs.tsx
│       │   │   │   │       └── index.ts
│       │   │   │   ├── popover/
│       │   │   │   │   ├── RiPopover.constants.ts
│       │   │   │   │   ├── RiPopover.spec.tsx
│       │   │   │   │   ├── RiPopover.tsx
│       │   │   │   │   ├── RiPopover.types.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── shared/
│       │   │   │   │   └── WindowControlGroup.tsx
│       │   │   │   ├── text/
│       │   │   │   │   ├── ColorText.tsx
│       │   │   │   │   ├── HealthText.tsx
│       │   │   │   │   ├── MultilineEllipsisText.tsx
│       │   │   │   │   ├── Text.tsx
│       │   │   │   │   ├── Title.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── text.styles.ts
│       │   │   │   ├── theme/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── types.ts
│       │   │   │   ├── tooltip/
│       │   │   │   │   ├── HoverContent.tsx
│       │   │   │   │   ├── RITooltip.tsx
│       │   │   │   │   ├── RiTooltip.spec.tsx
│       │   │   │   │   └── index.tsx
│       │   │   │   └── utils/
│       │   │   │       ├── FocusTrap.tsx
│       │   │   │       ├── OutsideClickDetector.tsx
│       │   │   │       ├── ShowHide.spec.tsx
│       │   │   │       ├── ShowHide.tsx
│       │   │   │       ├── WindowEvent.spec.tsx
│       │   │   │       ├── WindowEvent.tsx
│       │   │   │       ├── hooks/
│       │   │   │       │   ├── generate-id.ts
│       │   │   │       │   └── inner-text.ts
│       │   │   │       ├── index.ts
│       │   │   │       ├── outsideClickDetector.spec.tsx
│       │   │   │       ├── pluginsThemeContext.tsx
│       │   │   │       └── resize-observer/
│       │   │   │           └── ResizeObserver.tsx
│       │   │   ├── bottom-group-components/
│       │   │   │   ├── BottomGroupComponents.spec.tsx
│       │   │   │   ├── BottomGroupComponents.stories.tsx
│       │   │   │   ├── BottomGroupComponents.tsx
│       │   │   │   ├── components/
│       │   │   │   │   └── bottom-group-minimized/
│       │   │   │   │       ├── BottomGroupMinimized.spec.tsx
│       │   │   │   │       ├── BottomGroupMinimized.stories.tsx
│       │   │   │   │       ├── BottomGroupMinimized.tsx
│       │   │   │   │       ├── ButtonGroupMinimized.styles.ts
│       │   │   │   │       └── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── browser/
│       │   │   │   ├── KeysBrowser.spec.tsx
│       │   │   │   ├── KeysBrowser.styles.ts
│       │   │   │   ├── KeysBrowser.tsx
│       │   │   │   ├── KeysBrowser.types.ts
│       │   │   │   ├── columns-menu/
│       │   │   │   │   ├── ColumnsMenu.styles.ts
│       │   │   │   │   ├── ColumnsMenu.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── useResponsiveColumns.ts
│       │   │   │   ├── index.ts
│       │   │   │   └── view-switch/
│       │   │   │       ├── ViewSwitch.styles.ts
│       │   │   │       ├── ViewSwitch.tsx
│       │   │   │       ├── ViewSwitch.types.ts
│       │   │   │       └── index.ts
│       │   │   ├── bulk-actions-config/
│       │   │   │   ├── BulkActionsConfig.spec.tsx
│       │   │   │   ├── BulkActionsConfig.tsx
│       │   │   │   └── index.ts
│       │   │   ├── charts/
│       │   │   │   ├── bar-chart/
│       │   │   │   │   ├── BarChart.spec.tsx
│       │   │   │   │   ├── BarChart.stories.tsx
│       │   │   │   │   ├── BarChart.styles.ts
│       │   │   │   │   ├── BarChart.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── donut-chart/
│       │   │   │   │   ├── DonutChart.spec.tsx
│       │   │   │   │   ├── DonutChart.stories.tsx
│       │   │   │   │   ├── DonutChart.styles.ts
│       │   │   │   │   ├── DonutChart.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   └── index.ts
│       │   │   ├── cli/
│       │   │   │   ├── Cli/
│       │   │   │   │   ├── Cli.spec.tsx
│       │   │   │   │   ├── Cli.stories.tsx
│       │   │   │   │   ├── Cli.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── CliWrapper.spec.tsx
│       │   │   │   ├── CliWrapper.stories.tsx
│       │   │   │   ├── CliWrapper.tsx
│       │   │   │   └── components/
│       │   │   │       ├── cli-body/
│       │   │   │       │   ├── CliBody/
│       │   │   │       │   │   ├── CliBody.spec.tsx
│       │   │   │       │   │   ├── CliBody.stories.tsx
│       │   │   │       │   │   ├── CliBody.tsx
│       │   │   │       │   │   ├── index.ts
│       │   │   │       │   │   └── styles.module.scss
│       │   │   │       │   ├── CliBodyWrapper.spec.tsx
│       │   │   │       │   ├── CliBodyWrapper.stories.tsx
│       │   │   │       │   ├── CliBodyWrapper.tsx
│       │   │   │       │   └── index.ts
│       │   │   │       ├── cli-header/
│       │   │   │       │   ├── CliHeader.spec.tsx
│       │   │   │       │   ├── CliHeader.stories.tsx
│       │   │   │       │   ├── CliHeader.tsx
│       │   │   │       │   ├── index.ts
│       │   │   │       │   └── styles.module.scss
│       │   │   │       └── cli-input/
│       │   │   │           ├── CliAutocomplete/
│       │   │   │           │   ├── CliAutocomplete.spec.tsx
│       │   │   │           │   ├── CliAutocomplete.stories.tsx
│       │   │   │           │   ├── CliAutocomplete.tsx
│       │   │   │           │   ├── index.ts
│       │   │   │           │   └── styles.module.scss
│       │   │   │           ├── CliInput/
│       │   │   │           │   ├── CliInput.spec.tsx
│       │   │   │           │   ├── CliInput.stories.tsx
│       │   │   │           │   ├── CliInput.tsx
│       │   │   │           │   ├── index.ts
│       │   │   │           │   └── styles.module.scss
│       │   │   │           ├── CliInputWrapper.spec.tsx
│       │   │   │           ├── CliInputWrapper.stories.tsx
│       │   │   │           ├── CliInputWrapper.tsx
│       │   │   │           └── index.ts
│       │   │   ├── code-block/
│       │   │   │   ├── CodeBlock.spec.tsx
│       │   │   │   ├── CodeBlock.stories.tsx
│       │   │   │   ├── CodeBlock.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── column-header/
│       │   │   │   ├── ColumnHeader.spec.tsx
│       │   │   │   ├── ColumnHeader.tsx
│       │   │   │   └── index.ts
│       │   │   ├── columns-config/
│       │   │   │   ├── ColumnsConfigPopover.spec.tsx
│       │   │   │   └── ColumnsConfigPopover.tsx
│       │   │   ├── command-helper/
│       │   │   │   ├── CommandHelper/
│       │   │   │   │   ├── CommandHelper.spec.tsx
│       │   │   │   │   ├── CommandHelper.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── CommandHelperHeader/
│       │   │   │   │   ├── CommandHelperHeader.spec.tsx
│       │   │   │   │   ├── CommandHelperHeader.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── CommandHelperWrapper.spec.tsx
│       │   │   │   ├── CommandHelperWrapper.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── command-helper-info/
│       │   │   │   │   │   ├── CHCommandInfo.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── command-helper-search/
│       │   │   │   │   │   ├── CHSearchFilter/
│       │   │   │   │   │   │   ├── CHSearchFilter.spec.tsx
│       │   │   │   │   │   │   ├── CHSearchFilter.tsx
│       │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   ├── CHSearchInput/
│       │   │   │   │   │   │   ├── CHSearchInput.spec.tsx
│       │   │   │   │   │   │   ├── CHSearchInput.tsx
│       │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   ├── CHSearchWrapper.spec.tsx
│       │   │   │   │   │   ├── CHSearchWrapper.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── command-helper-search-output/
│       │   │   │   │       ├── CHSearchOutput.tsx
│       │   │   │   │       ├── CliSearchOutput.spec.tsx
│       │   │   │   │       ├── index.ts
│       │   │   │   │       └── styles.module.scss
│       │   │   │   └── index.ts
│       │   │   ├── config/
│       │   │   │   ├── Config.spec.tsx
│       │   │   │   ├── Config.tsx
│       │   │   │   └── index.ts
│       │   │   ├── confirmation-popover/
│       │   │   │   ├── ConfirmationPopover.spec.tsx
│       │   │   │   ├── ConfirmationPopover.tsx
│       │   │   │   └── index.ts
│       │   │   ├── connectivity-error/
│       │   │   │   ├── ConnectivityError.spec.tsx
│       │   │   │   └── ConnectivityError.tsx
│       │   │   ├── consents-settings/
│       │   │   │   ├── ConsentOption/
│       │   │   │   │   ├── ConsentOption.spec.tsx
│       │   │   │   │   ├── ConsentOption.tsx
│       │   │   │   │   ├── components/
│       │   │   │   │   │   ├── ItemDescription.tsx
│       │   │   │   │   │   └── index.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── ConsentsNotifications/
│       │   │   │   │   ├── ConsentsNotifications.spec.tsx
│       │   │   │   │   ├── ConsentsNotifications.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── ConsentsPrivacy/
│       │   │   │   │   ├── ConsentsPrivacy.spec.tsx
│       │   │   │   │   ├── ConsentsPrivacy.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── ConsentsSettings.spec.tsx
│       │   │   │   ├── ConsentsSettings.tsx
│       │   │   │   ├── ConsentsSettingsPopup/
│       │   │   │   │   ├── ConsentsSettingsPopup.spec.tsx
│       │   │   │   │   └── ConsentsSettingsPopup.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   └── styles.ts
│       │   │   ├── copy-button/
│       │   │   │   ├── CopyButton.spec.tsx
│       │   │   │   ├── CopyButton.styles.ts
│       │   │   │   ├── CopyButton.tsx
│       │   │   │   ├── CopyButton.types.ts
│       │   │   │   ├── components/
│       │   │   │   │   ├── ButtonWithTooltip/
│       │   │   │   │   │   ├── ButtonWithTooltip.tsx
│       │   │   │   │   │   ├── ButtonWithTooltip.types.ts
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── index.ts
│       │   │   │   └── index.ts
│       │   │   ├── css.d.ts
│       │   │   ├── database-list-modules/
│       │   │   │   ├── DatabaseListModules.spec.tsx
│       │   │   │   ├── DatabaseListModules.stories.tsx
│       │   │   │   ├── DatabaseListModules.styles.ts
│       │   │   │   ├── DatabaseListModules.tsx
│       │   │   │   ├── DatabaseListModules.types.ts
│       │   │   │   ├── components/
│       │   │   │   │   ├── DatabaseModuleContent/
│       │   │   │   │   │   ├── DatabaseModuleContent.tsx
│       │   │   │   │   │   └── DatabaseModuleContent.types.ts
│       │   │   │   │   ├── DatabaseModuleContentItem/
│       │   │   │   │   │   ├── DatabaseModuleContentItem.styles.ts
│       │   │   │   │   │   ├── DatabaseModuleContentItem.tsx
│       │   │   │   │   │   └── DatabaseModuleContentItem.types.ts
│       │   │   │   │   ├── DatabaseModuleItem/
│       │   │   │   │   │   ├── DatabaseModuleItem.styles.ts
│       │   │   │   │   │   ├── DatabaseModuleItem.tsx
│       │   │   │   │   │   └── DatabaseModuleItem.types.ts
│       │   │   │   │   ├── DatabaseModulesList/
│       │   │   │   │   │   ├── DatabaseModulesList.tsx
│       │   │   │   │   │   └── DatabaseModulesList.types.ts
│       │   │   │   │   └── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── database-list-options/
│       │   │   │   ├── DatabaseListOptions.spec.tsx
│       │   │   │   ├── DatabaseListOptions.stories.tsx
│       │   │   │   ├── DatabaseListOptions.styles.ts
│       │   │   │   ├── DatabaseListOptions.tsx
│       │   │   │   ├── components/
│       │   │   │   │   └── Tooltip.tsx
│       │   │   │   └── constants.ts
│       │   │   ├── database-overview/
│       │   │   │   ├── DatabaseOverview.spec.tsx
│       │   │   │   ├── DatabaseOverview.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── OverviewMetrics/
│       │   │   │   │   │   ├── MetricItem.tsx
│       │   │   │   │   │   ├── OverviewMetrics.spec.tsx
│       │   │   │   │   │   ├── OverviewMetrics.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── icons.ts
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── useDatabaseOverview.spec.ts
│       │   │   │   │   └── useDatabaseOverview.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── divider/
│       │   │   │   ├── Divider.spec.tsx
│       │   │   │   ├── Divider.styles.ts
│       │   │   │   ├── Divider.tsx
│       │   │   │   └── Divider.types.ts
│       │   │   ├── explore-guides/
│       │   │   │   ├── ExploreGuides.spec.tsx
│       │   │   │   ├── ExploreGuides.styles.ts
│       │   │   │   ├── ExploreGuides.tsx
│       │   │   │   ├── icons.ts
│       │   │   │   └── index.ts
│       │   │   ├── feature-flag-component/
│       │   │   │   ├── FeatureFlagComponent.spec.tsx
│       │   │   │   ├── FeatureFlagComponent.tsx
│       │   │   │   └── index.ts
│       │   │   ├── field-message/
│       │   │   │   ├── FieldMessage.spec.tsx
│       │   │   │   ├── FieldMessage.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── form-dialog/
│       │   │   │   ├── FooterDatabaseForm.ts
│       │   │   │   ├── FormDialog.spec.tsx
│       │   │   │   ├── FormDialog.styles.ts
│       │   │   │   ├── FormDialog.tsx
│       │   │   │   └── index.ts
│       │   │   ├── formated-date/
│       │   │   │   ├── FormatedDate.spec.tsx
│       │   │   │   ├── FormatedDate.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── full-screen/
│       │   │   │   ├── FullScreen.spec.tsx
│       │   │   │   ├── FullScreen.tsx
│       │   │   │   └── index.ts
│       │   │   ├── global-azure-auth/
│       │   │   │   ├── AzureAuthCallbackPage.spec.tsx
│       │   │   │   ├── AzureAuthCallbackPage.styles.ts
│       │   │   │   ├── AzureAuthCallbackPage.tsx
│       │   │   │   ├── GlobalAzureAuth.spec.tsx
│       │   │   │   ├── GlobalAzureAuth.tsx
│       │   │   │   └── index.ts
│       │   │   ├── global-dialogs/
│       │   │   │   ├── GlobalDialogs.tsx
│       │   │   │   └── index.ts
│       │   │   ├── global-subscriptions/
│       │   │   │   ├── CommonAppSubscription/
│       │   │   │   │   ├── CommonAppSubscription.spec.tsx
│       │   │   │   │   ├── CommonAppSubscription.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── GlobalSubscriptions.tsx
│       │   │   │   └── index.ts
│       │   │   ├── global-url-handler/
│       │   │   │   ├── GlobalUrlHandler.spec.tsx
│       │   │   │   ├── GlobalUrlHandler.tsx
│       │   │   │   └── index.ts
│       │   │   ├── group-badge/
│       │   │   │   ├── GroupBadge.stories.tsx
│       │   │   │   ├── GroupBadge.styles.ts
│       │   │   │   ├── GroupBadge.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── hightlighted-feature/
│       │   │   │   ├── HighlightedFeature.spec.tsx
│       │   │   │   ├── HighlightedFeature.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── home-tabs/
│       │   │   │   ├── HomeTabs.spec.tsx
│       │   │   │   ├── HomeTabs.tsx
│       │   │   │   ├── constants.ts
│       │   │   │   └── index.ts
│       │   │   ├── hooks/
│       │   │   │   ├── useAzureAuth.spec.ts
│       │   │   │   ├── useAzureAuth.ts
│       │   │   │   ├── useConnectionType.spec.ts
│       │   │   │   └── useConnectionType.ts
│       │   │   ├── import-file-modal/
│       │   │   │   ├── ImportFileModal.spec.tsx
│       │   │   │   ├── ImportFileModal.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── index.ts
│       │   │   ├── init/
│       │   │   │   ├── AppInit.spec.tsx
│       │   │   │   └── AppInit.tsx
│       │   │   ├── inline-item-editor/
│       │   │   │   ├── InlineItemEditor.spec.tsx
│       │   │   │   ├── InlineItemEditor.styles.tsx
│       │   │   │   ├── InlineItemEditor.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── input-field-sentinel/
│       │   │   │   ├── InputFieldSentinel.spec.tsx
│       │   │   │   ├── InputFieldSentinel.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── instance-header/
│       │   │   │   ├── InstanceHeader.spec.tsx
│       │   │   │   ├── InstanceHeader.stories.tsx
│       │   │   │   ├── InstanceHeader.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── ShortInstanceInfo.spec.tsx
│       │   │   │   │   ├── ShortInstanceInfo.styles.ts
│       │   │   │   │   ├── ShortInstanceInfo.tsx
│       │   │   │   │   ├── instances-navigation-popover/
│       │   │   │   │   │   ├── InstancesNavigationPopover.spec.tsx
│       │   │   │   │   │   ├── InstancesNavigationPopover.styles.ts
│       │   │   │   │   │   ├── InstancesNavigationPopover.tsx
│       │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   └── instances-list/
│       │   │   │   │   │   │       ├── InstancesList.spec.tsx
│       │   │   │   │   │   │       ├── InstancesList.tsx
│       │   │   │   │   │   │       └── index.tsx
│       │   │   │   │   │   ├── index.tsx
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── user-profile/
│       │   │   │   │       ├── CloudUserProfile.tsx
│       │   │   │   │       ├── UserProfile.spec.tsx
│       │   │   │   │       ├── UserProfile.tsx
│       │   │   │   │       ├── UserProfileBadge.spec.tsx
│       │   │   │   │       └── UserProfileBadge.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── item-list/
│       │   │   │   └── components/
│       │   │   │       ├── action-bar/
│       │   │   │       │   ├── ActionBar.spec.tsx
│       │   │   │       │   ├── ActionBar.styles.ts
│       │   │   │       │   └── ActionBar.tsx
│       │   │   │       ├── delete-action/
│       │   │   │       │   ├── DeleteAction.spec.tsx
│       │   │   │       │   └── DeleteAction.tsx
│       │   │   │       ├── export-action/
│       │   │   │       │   ├── ExportAction.spec.tsx
│       │   │   │       │   └── ExportAction.tsx
│       │   │   │       ├── index.ts
│       │   │   │       └── styles.module.scss
│       │   │   ├── json-viewer/
│       │   │   │   ├── JSONViewer.spec.tsx
│       │   │   │   ├── JSONViewer.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── json-array/
│       │   │   │   │   │   ├── JsonArray.spec.tsx
│       │   │   │   │   │   ├── JsonArray.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── json-object/
│       │   │   │   │   │   ├── JsonObject.spec.tsx
│       │   │   │   │   │   ├── JsonObject.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── json-pretty/
│       │   │   │   │   │   ├── JsonPretty.spec.tsx
│       │   │   │   │   │   ├── JsonPretty.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── json-primitive/
│       │   │   │   │       ├── JsonPrimitive.spec.tsx
│       │   │   │   │       ├── JsonPrimitive.tsx
│       │   │   │   │       └── index.ts
│       │   │   │   ├── interfaces.ts
│       │   │   │   ├── utils.spec.ts
│       │   │   │   └── utils.ts
│       │   │   ├── keyboard-shortcut/
│       │   │   │   ├── KeyboardShortcut.spec.tsx
│       │   │   │   ├── KeyboardShortcut.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── keys-summary/
│       │   │   │   ├── KeysSummary.spec.tsx
│       │   │   │   ├── KeysSummary.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── main/
│       │   │   │   └── MainComponent.tsx
│       │   │   ├── main-router/
│       │   │   │   ├── MainRouter.spec.tsx
│       │   │   │   ├── MainRouter.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── RedisStackRoutes.spec.tsx
│       │   │   │   │   ├── RedisStackRoutes.tsx
│       │   │   │   │   ├── SuspenseLoader.tsx
│       │   │   │   │   └── loader.module.scss
│       │   │   │   ├── config.ts
│       │   │   │   ├── constants/
│       │   │   │   │   ├── commonRoutes.ts
│       │   │   │   │   ├── defaultRoutes.ts
│       │   │   │   │   ├── redisStackRoutes.ts
│       │   │   │   │   └── sub-routes/
│       │   │   │   │       ├── analyticsRoutes.ts
│       │   │   │   │       ├── index.ts
│       │   │   │   │       ├── rdiPipelineManagementRoutes.ts
│       │   │   │   │       └── vectorSearchRoutes.ts
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── useActivityMonitor.spec.ts
│       │   │   │   │   └── useActivityMonitor.ts
│       │   │   │   └── interfaces.ts
│       │   │   ├── markdown/
│       │   │   │   ├── CloudLink/
│       │   │   │   │   ├── CloudLink.spec.tsx
│       │   │   │   │   ├── CloudLink.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── CodeButtonBlock/
│       │   │   │   │   ├── CodeButtonBlock.spec.tsx
│       │   │   │   │   ├── CodeButtonBlock.tsx
│       │   │   │   │   ├── components/
│       │   │   │   │   │   ├── RunConfirmationPopover.spec.tsx
│       │   │   │   │   │   ├── RunConfirmationPopover.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── Image/
│       │   │   │   │   ├── Image.spec.tsx
│       │   │   │   │   ├── Image.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── RedisInsightLink/
│       │   │   │   │   ├── RedisInsightLink.spec.tsx
│       │   │   │   │   ├── RedisInsightLink.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── RedisUploadButton/
│       │   │   │   │   ├── RedisUploadButton.spec.tsx
│       │   │   │   │   ├── RedisUploadButton.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── index.ts
│       │   │   ├── message-bar/
│       │   │   │   ├── MessageBar.spec.tsx
│       │   │   │   ├── MessageBar.styles.ts
│       │   │   │   ├── MessageBar.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── messages/
│       │   │   │   ├── cli-output/
│       │   │   │   │   ├── cliOutput.spec.tsx
│       │   │   │   │   └── cliOutput.tsx
│       │   │   │   ├── database-not-opened/
│       │   │   │   │   ├── DatabaseNotOpened.spec.tsx
│       │   │   │   │   ├── DatabaseNotOpened.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── feature-not-available/
│       │   │   │   │   ├── FeatureNotAvailable.spec.tsx
│       │   │   │   │   ├── FeatureNotAvailable.styles.ts
│       │   │   │   │   ├── FeatureNotAvailable.tsx
│       │   │   │   │   ├── FeatureNotAvailable.types.ts
│       │   │   │   │   ├── constants.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── module-not-loaded/
│       │   │   │   │   ├── ModuleNotLoaded.spec.tsx
│       │   │   │   │   ├── ModuleNotLoaded.tsx
│       │   │   │   │   ├── ModuleNotLoadedButton.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── module-not-loaded-minimalized/
│       │   │   │       ├── ModuleNotLoadedMinimalized.spec.tsx
│       │   │   │       ├── ModuleNotLoadedMinimalized.tsx
│       │   │   │       ├── constants.ts
│       │   │   │       ├── index.ts
│       │   │   │       └── styles.module.scss
│       │   │   ├── monaco-editor/
│       │   │   │   ├── MonacoEditor.spec.tsx
│       │   │   │   ├── MonacoEditor.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── dedicated-editor/
│       │   │   │   │   │   ├── DedicatedEditor.spec.tsx
│       │   │   │   │   │   ├── DedicatedEditor.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── monaco-json/
│       │   │   │   │   │   ├── MonacoJson.spec.tsx
│       │   │   │   │   │   ├── MonacoJson.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── monaco-yaml/
│       │   │   │   │       ├── MonacoYaml.spec.tsx
│       │   │   │   │       ├── MonacoYaml.tsx
│       │   │   │   │       ├── index.ts
│       │   │   │   │       └── monacoYamlModel.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   ├── useMonacoValidation.spec.tsx
│       │   │   │   └── useMonacoValidation.ts
│       │   │   ├── monaco-laguages/
│       │   │   │   ├── MonacoLanguages.spec.tsx
│       │   │   │   ├── MonacoLanguages.tsx
│       │   │   │   └── index.ts
│       │   │   ├── monitor/
│       │   │   │   ├── Monitor/
│       │   │   │   │   ├── Monitor.spec.tsx
│       │   │   │   │   ├── Monitor.styles.tsx
│       │   │   │   │   ├── Monitor.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── MonitorHeader/
│       │   │   │   │   ├── MonitorHeader.spec.tsx
│       │   │   │   │   ├── MonitorHeader.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── MonitorLog/
│       │   │   │   │   ├── MonitorLog.spec.tsx
│       │   │   │   │   ├── MonitorLog.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── MonitorOutputList/
│       │   │   │   │   ├── MonitorOutputList.spec.tsx
│       │   │   │   │   ├── MonitorOutputList.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── MonitorWrapper.spec.tsx
│       │   │   │   ├── MonitorWrapper.tsx
│       │   │   │   └── index.ts
│       │   │   ├── monitor-config/
│       │   │   │   ├── MonitorConfig.spec.tsx
│       │   │   │   ├── MonitorConfig.tsx
│       │   │   │   └── index.ts
│       │   │   ├── multi-search/
│       │   │   │   ├── MultiSearch.spec.tsx
│       │   │   │   ├── MultiSearch.styles.ts
│       │   │   │   └── MultiSearch.tsx
│       │   │   ├── navigation-menu/
│       │   │   │   ├── NavigationMenu.spec.tsx
│       │   │   │   ├── NavigationMenu.tsx
│       │   │   │   ├── app-navigation/
│       │   │   │   │   ├── AppNavigation.styles.ts
│       │   │   │   │   ├── AppNavigation.tsx
│       │   │   │   │   └── AppNavigationTabTrigger.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── create-cloud/
│       │   │   │   │   │   ├── CreateCloud.spec.tsx
│       │   │   │   │   │   ├── CreateCloud.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── help-menu/
│       │   │   │   │   │   ├── HelpMenu.spec.tsx
│       │   │   │   │   │   ├── HelpMenu.tsx
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── notifications-center/
│       │   │   │   │   │   ├── Notification/
│       │   │   │   │   │   │   ├── Notification.tsx
│       │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   ├── NotificationCenter.spec.tsx
│       │   │   │   │   │   ├── NotificationCenter.tsx
│       │   │   │   │   │   ├── NotificationMenu.spec.tsx
│       │   │   │   │   │   ├── NotificationMenu.tsx
│       │   │   │   │   │   ├── PopoverNotification/
│       │   │   │   │   │   │   ├── PopoverNotification.spec.tsx
│       │   │   │   │   │   │   ├── PopoverNotification.tsx
│       │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── redis-logo/
│       │   │   │   │       ├── RedisLogo.spec.tsx
│       │   │   │   │       └── RedisLogo.tsx
│       │   │   │   ├── hooks/
│       │   │   │   │   └── useNavigation.ts
│       │   │   │   ├── navigation.types.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── notifications/
│       │   │   │   ├── Notifications.spec.tsx
│       │   │   │   ├── Notifications.stories.tsx
│       │   │   │   ├── Notifications.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── azure-token-expired/
│       │   │   │   │   │   ├── AzureTokenExpiredErrorContent.spec.tsx
│       │   │   │   │   │   ├── AzureTokenExpiredErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── cloud-capi-unauthorized/
│       │   │   │   │   │   ├── CloudCapiUnAuthorizedErrorContent.spec.tsx
│       │   │   │   │   │   ├── CloudCapiUnAuthorizedErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── default-error-content/
│       │   │   │   │   │   ├── DefaultErrorContent.spec.tsx
│       │   │   │   │   │   ├── DefaultErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── encryption-error-content/
│       │   │   │   │   │   ├── EncryptionErrorContent.spec.tsx
│       │   │   │   │   │   ├── EncryptionErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── infinite-messages/
│       │   │   │   │   │   ├── InfiniteMessages.spec.tsx
│       │   │   │   │   │   ├── InfiniteMessages.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── persistent-error-content/
│       │   │   │   │   │   ├── PersistentErrorContent.spec.tsx
│       │   │   │   │   │   ├── PersistentErrorContent.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   └── rdi-deploy-error-content/
│       │   │   │   │       ├── RdiDeployErrorContent.spec.tsx
│       │   │   │   │       ├── RdiDeployErrorContent.tsx
│       │   │   │   │       └── index.ts
│       │   │   │   ├── constants.ts
│       │   │   │   ├── error-messages.spec.tsx
│       │   │   │   ├── error-messages.tsx
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── useErrorNotifications.spec.tsx
│       │   │   │   │   ├── useErrorNotifications.ts
│       │   │   │   │   ├── useInfiniteNotifications.ts
│       │   │   │   │   └── useMessageNotifications.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── success-messages.tsx
│       │   │   ├── oauth/
│       │   │   │   ├── index.ts
│       │   │   │   ├── oauth-connect-free-db/
│       │   │   │   │   ├── OAuthConnectFreeDb.spec.tsx
│       │   │   │   │   ├── OAuthConnectFreeDb.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── oauth-jobs/
│       │   │   │   │   ├── OAuthJobs.spec.tsx
│       │   │   │   │   ├── OAuthJobs.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── oauth-select-account-dialog/
│       │   │   │   │   ├── OAuthSelectAccountDialog.spec.tsx
│       │   │   │   │   ├── OAuthSelectAccountDialog.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── oauth-select-plan/
│       │   │   │   │   ├── OAuthSelectPlan.spec.tsx
│       │   │   │   │   ├── OAuthSelectPlan.styles.ts
│       │   │   │   │   ├── OAuthSelectPlan.tsx
│       │   │   │   │   ├── constants.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── oauth-sign-in-button/
│       │   │   │   │   ├── OAuthSignInButton.spec.tsx
│       │   │   │   │   ├── OAuthSignInButton.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── oauth-sso/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── oauth-autodiscovery/
│       │   │   │   │   │   ├── OAuthAutodiscovery.spec.tsx
│       │   │   │   │   │   ├── OAuthAutodiscovery.styles.ts
│       │   │   │   │   │   ├── OAuthAutodiscovery.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── oauth-create-db/
│       │   │   │   │   │   ├── OAuthCreateDb.spec.tsx
│       │   │   │   │   │   ├── OAuthCreateDb.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── oauth-sign-in/
│       │   │   │   │       ├── OAuthSignIn.spec.tsx
│       │   │   │   │       ├── OAuthSignIn.tsx
│       │   │   │   │       ├── index.ts
│       │   │   │   │       └── styles.module.scss
│       │   │   │   ├── oauth-sso-dialog/
│       │   │   │   │   ├── OAuthSsoDialog.spec.tsx
│       │   │   │   │   ├── OAuthSsoDialog.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── oauth-sso-handler-dialog/
│       │   │   │   │   ├── OAuthSsoHandlerDialog.spec.tsx
│       │   │   │   │   ├── OAuthSsoHandlerDialog.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── oauth-user-profile/
│       │   │   │   │   ├── OAuthUserProfile.spec.tsx
│       │   │   │   │   ├── OAuthUserProfile.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── shared/
│       │   │   │       ├── index.ts
│       │   │   │       ├── oauth-advantages/
│       │   │   │       │   ├── OAuthAdvantages.spec.tsx
│       │   │   │       │   ├── OAuthAdvantages.tsx
│       │   │   │       │   ├── constants.ts
│       │   │   │       │   ├── index.ts
│       │   │   │       │   └── styles.module.scss
│       │   │   │       ├── oauth-agreement/
│       │   │   │       │   ├── OAuthAgreement.spec.tsx
│       │   │   │       │   ├── OAuthAgreement.tsx
│       │   │   │       │   ├── index.ts
│       │   │   │       │   └── styles.module.scss
│       │   │   │       ├── oauth-form/
│       │   │   │       │   ├── OAuthForm.spec.tsx
│       │   │   │       │   ├── OAuthForm.tsx
│       │   │   │       │   ├── components/
│       │   │   │       │   │   └── oauth-sso-form/
│       │   │   │       │   │       ├── OAuthSsoForm.styles.ts
│       │   │   │       │   │       ├── OAuthSsoForm.tsx
│       │   │   │       │   │       └── index.ts
│       │   │   │       │   └── index.ts
│       │   │   │       ├── oauth-recommended-settings/
│       │   │   │       │   ├── OAuthRecommendedSettings.spec.tsx
│       │   │   │       │   ├── OAuthRecommendedSettings.tsx
│       │   │   │       │   └── index.ts
│       │   │   │       ├── oauth-social-buttons/
│       │   │   │       │   ├── OAuthSocialButtons.spec.tsx
│       │   │   │       │   ├── OAuthSocialButtons.styles.ts
│       │   │   │       │   ├── OAuthSocialButtons.tsx
│       │   │   │       │   └── index.ts
│       │   │   │       └── styles.ts
│       │   │   ├── onboarding-features/
│       │   │   │   ├── OnboardingFeatures.spec.tsx
│       │   │   │   ├── OnboardingFeatures.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── onboarding-tour/
│       │   │   │   ├── OnboardingTour.spec.tsx
│       │   │   │   ├── OnboardingTour.tsx
│       │   │   │   ├── OnboardingTourWrapper.spec.tsx
│       │   │   │   ├── OnboardingTourWrapper.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── interfaces.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── page-header/
│       │   │   │   ├── PageHeader.module.scss
│       │   │   │   ├── PageHeader.spec.tsx
│       │   │   │   ├── PageHeader.tsx
│       │   │   │   └── components/
│       │   │   │       └── index.ts
│       │   │   ├── page-placeholder/
│       │   │   │   ├── PagePlaceholder.spec.tsx
│       │   │   │   ├── PagePlaceholder.tsx
│       │   │   │   └── index.ts
│       │   │   ├── panel/
│       │   │   │   └── index.ts
│       │   │   ├── promo-link/
│       │   │   │   ├── PromoLink.spec.tsx
│       │   │   │   ├── PromoLink.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── pub-sub-config/
│       │   │   │   ├── PubSubConfig.spec.tsx
│       │   │   │   ├── PubSubConfig.tsx
│       │   │   │   └── index.ts
│       │   │   ├── query/
│       │   │   │   ├── components/
│       │   │   │   │   └── RunButton.tsx
│       │   │   │   ├── context/
│       │   │   │   │   ├── query-editor-context.spec.tsx
│       │   │   │   │   ├── query-editor.context.tsx
│       │   │   │   │   ├── query-editor.context.types.ts
│       │   │   │   │   ├── query-results-context.spec.tsx
│       │   │   │   │   ├── query-results.context.tsx
│       │   │   │   │   ├── view-mode-context.spec.tsx
│       │   │   │   │   └── view-mode.context.tsx
│       │   │   │   ├── hooks/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── useCommandHistory.ts
│       │   │   │   │   ├── useCommandHistory.types.ts
│       │   │   │   │   ├── useDslSyntax.ts
│       │   │   │   │   ├── useDslSyntax.types.ts
│       │   │   │   │   ├── useMonacoRedisEditor.ts
│       │   │   │   │   ├── useMonacoRedisEditor.types.ts
│       │   │   │   │   ├── useQueryDecorations.ts
│       │   │   │   │   ├── useQueryDecorations.types.ts
│       │   │   │   │   ├── useQueryEditor.ts
│       │   │   │   │   ├── useQueryEditor.types.ts
│       │   │   │   │   ├── useRedisCompletions.ts
│       │   │   │   │   └── useRedisCompletions.types.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── query-actions/
│       │   │   │   │   ├── QueryActions.spec.tsx
│       │   │   │   │   ├── QueryActions.styles.ts
│       │   │   │   │   ├── QueryActions.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── query-card/
│       │   │   │   │   ├── QueryCard.spec.tsx
│       │   │   │   │   ├── QueryCard.tsx
│       │   │   │   │   ├── QueryCardCliDefaultResult/
│       │   │   │   │   │   ├── QueryCardCliDefaultResult.spec.tsx
│       │   │   │   │   │   ├── QueryCardCliDefaultResult.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardCliGroupResult/
│       │   │   │   │   │   ├── QueryCardCliGroupResult.spec.tsx
│       │   │   │   │   │   ├── QueryCardCliGroupResult.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── QueryCardCliPlugin/
│       │   │   │   │   │   ├── QueryCardCliPlugin.spec.tsx
│       │   │   │   │   │   ├── QueryCardCliPlugin.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardCliResultWrapper/
│       │   │   │   │   │   ├── QueryCardCliResultWrapper.spec.tsx
│       │   │   │   │   │   ├── QueryCardCliResultWrapper.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardCommonResult/
│       │   │   │   │   │   ├── QueryCardCommonResult.spec.tsx
│       │   │   │   │   │   ├── QueryCardCommonResult.tsx
│       │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   └── CommonErrorResponse/
│       │   │   │   │   │   │       ├── CommonErrorResponse.tsx
│       │   │   │   │   │   │       └── index.ts
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardHeader/
│       │   │   │   │   │   ├── QueryCardHeader.spec.tsx
│       │   │   │   │   │   ├── QueryCardHeader.styles.ts
│       │   │   │   │   │   ├── QueryCardHeader.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── QueryCardTooltip/
│       │   │   │   │   │   ├── QueryCardTooltip.spec.tsx
│       │   │   │   │   │   ├── QueryCardTooltip.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   ├── query-lite-actions/
│       │   │   │   │   ├── QueryActions.spec.tsx
│       │   │   │   │   ├── QueryLiteActions.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── query-results/
│       │   │   │   │   ├── QueryResults.spec.tsx
│       │   │   │   │   ├── QueryResults.styles.ts
│       │   │   │   │   ├── QueryResults.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── query-tutorials/
│       │   │   │   │   ├── QueryTutorials.spec.tsx
│       │   │   │   │   ├── QueryTutorials.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── query.styles.ts
│       │   │   ├── range-filter/
│       │   │   │   ├── RangeFilter.spec.tsx
│       │   │   │   ├── RangeFilter.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── rdi-instance-header/
│       │   │   │   ├── RdiInstanceHeader.spec.tsx
│       │   │   │   ├── RdiInstanceHeader.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── recommendation/
│       │   │   │   ├── badge-icon/
│       │   │   │   │   ├── BadgeIcon.spec.tsx
│       │   │   │   │   ├── BadgeIcon.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── constants.tsx
│       │   │   │   ├── content-element/
│       │   │   │   │   ├── ContentElement.spec.tsx
│       │   │   │   │   ├── ContentElement.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── internal-link/
│       │   │   │   │   ├── InternalLink.spec.tsx
│       │   │   │   │   ├── InternalLink.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-badges/
│       │   │   │   │   ├── RecommendationBadges.spec.tsx
│       │   │   │   │   ├── RecommendationBadges.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-badges-legend/
│       │   │   │   │   ├── RecommendationBadgesLegend.spec.tsx
│       │   │   │   │   ├── RecommendationBadgesLegend.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-body/
│       │   │   │   │   ├── RecommendationBody.spec.tsx
│       │   │   │   │   ├── RecommendationBody.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-copy-component/
│       │   │   │   │   ├── RecommendationCopyComponent.spec.tsx
│       │   │   │   │   ├── RecommendationCopyComponent.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── recommendation-voting/
│       │   │   │   │   ├── RecommendationVoting.spec.tsx
│       │   │   │   │   ├── RecommendationVoting.tsx
│       │   │   │   │   ├── components/
│       │   │   │   │   │   └── vote-option/
│       │   │   │   │   │       ├── VoteOption.spec.tsx
│       │   │   │   │   │       ├── VoteOption.tsx
│       │   │   │   │   │       ├── index.ts
│       │   │   │   │   │       ├── styles.module.scss
│       │   │   │   │   │       └── utils.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── styles.module.scss
│       │   │   │   └── styles.module.scss
│       │   │   ├── scan-more/
│       │   │   │   ├── ScanMore.spec.tsx
│       │   │   │   ├── ScanMore.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── settings-item/
│       │   │   │   ├── SettingItem.spec.tsx
│       │   │   │   ├── SettingItem.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── shortcuts-flyout/
│       │   │   │   ├── ShortcutsFlyout.spec.tsx
│       │   │   │   ├── ShortcutsFlyout.tsx
│       │   │   │   └── schema.tsx
│       │   │   ├── side-panels/
│       │   │   │   ├── SidePanels.styles.ts
│       │   │   │   ├── SidePanels.test.tsx
│       │   │   │   ├── SidePanels.tsx
│       │   │   │   ├── components/
│       │   │   │   │   ├── copilot-panel/
│       │   │   │   │   │   ├── CopilotPanel.spec.tsx
│       │   │   │   │   │   ├── CopilotPanel.tsx
│       │   │   │   │   │   └── index.ts
│       │   │   │   │   ├── header/
│       │   │   │   │   │   ├── Header.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── insights-panel/
│       │   │   │   │       ├── InsightsPanel.spec.tsx
│       │   │   │   │       ├── InsightsPanel.tsx
│       │   │   │   │       └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── panels/
│       │   │   │   │   ├── ai-assistant/
│       │   │   │   │   │   ├── AiAssistant.spec.tsx
│       │   │   │   │   │   ├── AiAssistant.tsx
│       │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   ├── assistance-chat/
│       │   │   │   │   │   │   │   ├── AssistanceChat.spec.tsx
│       │   │   │   │   │   │   │   ├── AssistanceChat.tsx
│       │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   ├── chats-wrapper/
│       │   │   │   │   │   │   │   ├── ChatsWrapper.spec.tsx
│       │   │   │   │   │   │   │   ├── ChatsWrapper.tsx
│       │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   ├── expert-chat/
│       │   │   │   │   │   │   │   ├── ExpertChat.spec.tsx
│       │   │   │   │   │   │   │   ├── ExpertChat.tsx
│       │   │   │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   │   │   ├── expert-chat-header/
│       │   │   │   │   │   │   │   │   │   ├── ExpertChatHeader.spec.tsx
│       │   │   │   │   │   │   │   │   │   ├── ExpertChatHeader.tsx
│       │   │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   │   └── no-indexes-initial-message/
│       │   │   │   │   │   │   │   │       ├── NoIndexesInitialMessage.spec.tsx
│       │   │   │   │   │   │   │   │       ├── NoIndexesInitialMessage.tsx
│       │   │   │   │   │   │   │   │       ├── index.ts
│       │   │   │   │   │   │   │   │       └── styles.module.scss
│       │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   ├── shared/
│       │   │   │   │   │   │   │   ├── chat-form/
│       │   │   │   │   │   │   │   │   ├── ChatForm.spec.tsx
│       │   │   │   │   │   │   │   │   ├── ChatForm.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── chat-history/
│       │   │   │   │   │   │   │   │   ├── ChatHistory.spec.tsx
│       │   │   │   │   │   │   │   │   ├── ChatHistory.styles.ts
│       │   │   │   │   │   │   │   │   ├── ChatHistory.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── texts.tsx
│       │   │   │   │   │   │   │   ├── error-message/
│       │   │   │   │   │   │   │   │   ├── ErrorMessage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── ErrorMessage.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   ├── loading-message/
│       │   │   │   │   │   │   │   │   ├── LoadingMessage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── LoadingMessage.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── markdown-message/
│       │   │   │   │   │   │   │   │   ├── MarkdownMessage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── MarkdownMessage.tsx
│       │   │   │   │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   │   │   │   ├── chat-external-link/
│       │   │   │   │   │   │   │   │   │   │   ├── ChatExternalLink.spec.tsx
│       │   │   │   │   │   │   │   │   │   │   ├── ChatExternalLink.tsx
│       │   │   │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   │   │   ├── code-block/
│       │   │   │   │   │   │   │   │   │   │   ├── CodeBlock.spec.tsx
│       │   │   │   │   │   │   │   │   │   │   ├── CodeBlock.tsx
│       │   │   │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   └── restart-chat/
│       │   │   │   │   │   │   │       ├── RestartChat.spec.tsx
│       │   │   │   │   │   │   │       ├── RestartChat.tsx
│       │   │   │   │   │   │   │       ├── index.ts
│       │   │   │   │   │   │   │       └── styles.module.scss
│       │   │   │   │   │   │   ├── texts.tsx
│       │   │   │   │   │   │   └── welcome-ai-assistant/
│       │   │   │   │   │   │       ├── WelcomeAiAssistant.spec.tsx
│       │   │   │   │   │   │       ├── WelcomeAiAssistant.tsx
│       │   │   │   │   │   │       ├── index.ts
│       │   │   │   │   │   │       └── styles.module.scss
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   ├── enablement-area/
│       │   │   │   │   │   ├── EnablementArea/
│       │   │   │   │   │   │   ├── EnablementArea.spec.tsx
│       │   │   │   │   │   │   ├── EnablementArea.tsx
│       │   │   │   │   │   │   ├── components/
│       │   │   │   │   │   │   │   ├── Code/
│       │   │   │   │   │   │   │   │   ├── Code.spec.tsx
│       │   │   │   │   │   │   │   │   ├── Code.tsx
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   ├── CreateTutorialLink/
│       │   │   │   │   │   │   │   │   ├── CreateTutorialLink.spec.tsx
│       │   │   │   │   │   │   │   │   ├── CreateTutorialLink.tsx
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   ├── DeleteTutorialButton/
│       │   │   │   │   │   │   │   │   ├── DeleteTutorialButton.spec.tsx
│       │   │   │   │   │   │   │   │   ├── DeleteTutorialButton.styles.ts
│       │   │   │   │   │   │   │   │   ├── DeleteTutorialButton.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── EmptyPrompt/
│       │   │   │   │   │   │   │   │   ├── EmptyPrompt.spec.tsx
│       │   │   │   │   │   │   │   │   ├── EmptyPrompt.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── Group/
│       │   │   │   │   │   │   │   │   ├── Group.spec.tsx
│       │   │   │   │   │   │   │   │   ├── Group.styles.ts
│       │   │   │   │   │   │   │   │   ├── Group.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.scss
│       │   │   │   │   │   │   │   ├── InternalLink/
│       │   │   │   │   │   │   │   │   ├── InternalLink.spec.tsx
│       │   │   │   │   │   │   │   │   ├── InternalLink.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   ├── styles.module.scss
│       │   │   │   │   │   │   │   │   └── styles.scss
│       │   │   │   │   │   │   │   ├── InternalPage/
│       │   │   │   │   │   │   │   │   ├── InternalPage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── InternalPage.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── LazyInternalPage/
│       │   │   │   │   │   │   │   │   ├── LazyInternalPage.spec.tsx
│       │   │   │   │   │   │   │   │   ├── LazyInternalPage.tsx
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   ├── Navigation/
│       │   │   │   │   │   │   │   │   ├── Navigation.spec.tsx
│       │   │   │   │   │   │   │   │   ├── Navigation.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── Pagination/
│       │   │   │   │   │   │   │   │   ├── Pagination.spec.tsx
│       │   │   │   │   │   │   │   │   ├── Pagination.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   ├── PlainText/
│       │   │   │   │   │   │   │   │   ├── PlainText.spec.tsx
│       │   │   │   │   │   │   │   │   ├── PlainText.tsx
│       │   │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   │   ├── UploadTutorialForm/
│       │   │   │   │   │   │   │   │   ├── UploadTutorialForm.spec.tsx
│       │   │   │   │   │   │   │   │   ├── UploadTutorialForm.styles.ts
│       │   │   │   │   │   │   │   │   ├── UploadTutorialForm.tsx
│       │   │   │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   │   │   │   └── index.ts
│       │   │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   │   ├── styles.module.scss
│       │   │   │   │   │   │   └── utils/
│       │   │   │   │   │   │       ├── getFileInfo.ts
│       │   │   │   │   │   │       ├── index.ts
│       │   │   │   │   │   │       └── tests/
│       │   │   │   │   │   │           └── getFileInfo.spec.ts
│       │   │   │   │   │   ├── EnablementAreaWrapper.spec.tsx
│       │   │   │   │   │   ├── EnablementAreaWrapper.tsx
│       │   │   │   │   │   ├── index.ts
│       │   │   │   │   │   └── styles.module.scss
│       │   │   │   │   └── live-time-recommendations/
│       │   │   │   │       ├── LiveTimeRecommendations.spec.tsx
│       │   │   │   │       ├── LiveTimeRecommendations.tsx
│       │   │   │   │       ├── components/
│       │   │   │   │       │   ├── popover-run-analyze/
│       │   │   │   │       │   │   ├── PopoverRunAnalyze.spec.tsx
│       │   │   │   │       │   │   ├── PopoverRunAnalyze.tsx
│       │   │   │   │       │   │   ├── index.ts
│       │   │   │   │       │   │   └── styles.module.scss
│       │   │   │   │       │   ├── recommendation/
│       │   │   │   │       │   │   ├── Recommendation.spec.tsx
│       │   │   │   │       │   │   ├── Recommendation.styles.ts
│       │   │   │   │       │   │   ├── Recommendation.tsx
│       │   │   │   │       │   │   ├── index.ts
│       │   │   │   │       │   │   └── styles.module.scss
│       │   │   │   │       │   └── welcome-screen/
│       │   │   │   │       │       ├── WelcomeScreen.spec.tsx
│       │   │   │   │       │       ├── WelcomeScreen.tsx
│       │   │   │   │       │       ├── index.ts
│       │   │   │   │       │       └── styles.module.scss
│       │   │   │   │       ├── index.ts
│       │   │   │   │       └── styles.module.scss
│       │   │   │   └── styles.module.scss
│       │   │   ├── table-column-search/
│       │   │   │   ├── TableColumnSearch.spec.tsx
│       │   │   │   ├── TableColumnSearch.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── table-column-search-trigger/
│       │   │   │   ├── TableColumnSearchTrigger.spec.tsx
│       │   │   │   ├── TableColumnSearchTrigger.tsx
│       │   │   │   └── styles.module.scss
│       │   │   ├── triggers/
│       │   │   │   ├── copilot-trigger/
│       │   │   │   │   ├── CopilotTrigger.styles.ts
│       │   │   │   │   ├── CopilotTrigger.tsx
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   └── insights-trigger/
│       │   │   │       ├── InsightsTrigger.spec.tsx
│       │   │   │       ├── InsightsTrigger.styles.ts
│       │   │   │       ├── InsightsTrigger.tsx
│       │   │   │       └── index.ts
│       │   │   ├── upload-file/
│       │   │   │   ├── UploadFile.spec.tsx
│       │   │   │   ├── UploadFile.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── upload-warning/
│       │   │   │   ├── UploadWarning.spec.tsx
│       │   │   │   ├── UploadWarning.tsx
│       │   │   │   ├── index.tsx
│       │   │   │   └── styles.ts
│       │   │   ├── virtual-grid/
│       │   │   │   ├── VirtualGrid.spec.tsx
│       │   │   │   ├── VirtualGrid.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── interfaces.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   ├── tests/
│       │   │   │   │   └── utils.spec.ts
│       │   │   │   └── utils.tsx
│       │   │   ├── virtual-list/
│       │   │   │   ├── VirtualList.spec.tsx
│       │   │   │   ├── VirtualList.tsx
│       │   │   │   ├── index.ts
│       │   │   │   └── styles.module.scss
│       │   │   ├── virtual-table/
│       │   │   │   ├── VirtualTable.spec.tsx
│       │   │   │   ├── VirtualTable.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── interfaces.ts
│       │   │   │   ├── styles.module.scss
│       │   │   │   └── utils.tsx
│       │   │   └── yaml-validator/
│       │   │       ├── index.ts
│       │   │       ├── validatePipeline.test.ts
│       │   │       ├── validatePipeline.ts
│       │   │       ├── validateYamlSchema.test.ts
│       │   │       └── validateYamlSchema.ts
│       │   ├── config/
│       │   │   ├── default.ts
│       │   │   ├── domain.ts
│       │   │   └── index.ts
│       │   ├── constants/
│       │   │   ├── allRedisModules.json
│       │   │   ├── api.ts
│       │   │   ├── apiErrors.ts
│       │   │   ├── apiStatusCode.ts
│       │   │   ├── breadcrumbs.ts
│       │   │   ├── browser/
│       │   │   │   └── keyDetailsHeader.ts
│       │   │   ├── browser.ts
│       │   │   ├── bulkActions.ts
│       │   │   ├── cliOutput.ts
│       │   │   ├── commands.ts
│       │   │   ├── commandsVersions.ts
│       │   │   ├── customErrorCodes.ts
│       │   │   ├── databaseList.ts
│       │   │   ├── datetime.ts
│       │   │   ├── durationUnits.tsx
│       │   │   ├── env.ts
│       │   │   ├── featureFlags.ts
│       │   │   ├── featuresHighlighting.tsx
│       │   │   ├── help-texts.tsx
│       │   │   ├── importDatabasesTableResult.ts
│       │   │   ├── index.ts
│       │   │   ├── keyboardShortcuts.tsx
│       │   │   ├── keys.ts
│       │   │   ├── links.ts
│       │   │   ├── mocks/
│       │   │   │   ├── mock-custom-tutorials.ts
│       │   │   │   ├── mock-explore-guides.ts
│       │   │   │   ├── mock-recommendations.ts
│       │   │   │   ├── mock-redis-commands.ts
│       │   │   │   ├── mock-sso.ts
│       │   │   │   └── mock-tutorials.ts
│       │   │   ├── modules.ts
│       │   │   ├── monaco/
│       │   │   │   ├── cypher/
│       │   │   │   │   ├── functions.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── monacoCypher.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── jmespath/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── monacoJmespath.ts
│       │   │   │   ├── monaco.ts
│       │   │   │   ├── monacoRedis.ts
│       │   │   │   ├── monitorEvents.ts
│       │   │   │   ├── sqliteFunctions/
│       │   │   │   │   ├── functions.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── monacoSQLiteFunctions.ts
│       │   │   │   └── theme.ts
│       │   │   ├── notifications.ts
│       │   │   ├── onboarding.ts
│       │   │   ├── pages.ts
│       │   │   ├── prop-types/
│       │   │   │   ├── keys.ts
│       │   │   │   └── zset.ts
│       │   │   ├── pubSub.ts
│       │   │   ├── rdiList.ts
│       │   │   ├── recommendations.ts
│       │   │   ├── redisearch.ts
│       │   │   ├── redisinsight.ts
│       │   │   ├── regex.ts
│       │   │   ├── securityField.ts
│       │   │   ├── serverVersions.ts
│       │   │   ├── socketErrors.ts
│       │   │   ├── socketEvents.ts
│       │   │   ├── sorting.ts
│       │   │   ├── storage.ts
│       │   │   ├── streamViews.ts
│       │   │   ├── string.ts
│       │   │   ├── table.ts
│       │   │   ├── telemetry.ts
│       │   │   ├── texts.tsx
│       │   │   ├── themes.tsx
│       │   │   ├── tutorials.ts
│       │   │   ├── validationErrors.ts
│       │   │   ├── workbench.ts
│       │   │   └── workbenchResults.ts
│       │   ├── contexts/
│       │   │   ├── AppNavigationActionsProvider.tsx
│       │   │   ├── ModalTitleProvider.tsx
│       │   │   └── themeContext.tsx
│       │   ├── electron/
│       │   │   ├── AppElectron.spec.tsx
│       │   │   ├── AppElectron.tsx
│       │   │   ├── components/
│       │   │   │   ├── ConfigAzureAuth/
│       │   │   │   │   ├── ConfigAzureAuth.spec.tsx
│       │   │   │   │   ├── ConfigAzureAuth.tsx
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── ConfigElectron/
│       │   │   │   │   ├── ConfigElectron.spec.tsx
│       │   │   │   │   ├── ConfigElectron.tsx
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── ConfigOAuth/
│       │   │   │   │   ├── ConfigOAuth.spec.tsx
│       │   │   │   │   ├── ConfigOAuth.tsx
│       │   │   │   │   └── index.tsx
│       │   │   │   └── index.ts
│       │   │   ├── constants/
│       │   │   │   ├── cloudAuth.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── ipcEvent.ts
│       │   │   │   └── storageElectron.ts
│       │   │   └── utils/
│       │   │       ├── index.ts
│       │   │       ├── ipcAppRestart.ts
│       │   │       ├── ipcAuth.ts
│       │   │       ├── ipcCheckUpdates.ts
│       │   │       ├── ipcDeleteStoreValues.ts
│       │   │       ├── ipcThemeChange.ts
│       │   │       └── tests/
│       │   │           └── ipcCheckUpdates.spec.ts
│       │   ├── helpers/
│       │   │   ├── constructKeysToTree.ts
│       │   │   ├── index.ts
│       │   │   └── tests/
│       │   │       ├── constructKeysToTree.spec.ts
│       │   │       └── constructKeysToTreeMockResult.ts
│       │   ├── hoc/
│       │   │   └── extractRouter.hoc.tsx
│       │   ├── mocks/
│       │   │   ├── content/
│       │   │   │   └── content.ts
│       │   │   ├── data/
│       │   │   │   ├── analysis.ts
│       │   │   │   ├── bigString.ts
│       │   │   │   ├── dateNow.ts
│       │   │   │   ├── instances.ts
│       │   │   │   ├── mocked_redis_commands.ts
│       │   │   │   ├── oauth.ts
│       │   │   │   └── rdi.ts
│       │   │   ├── factories/
│       │   │   │   ├── browser/
│       │   │   │   │   └── bulkActions/
│       │   │   │   │       └── bulkActionOverview.factory.ts
│       │   │   │   ├── cloud/
│       │   │   │   │   ├── AzureAccount.factory.ts
│       │   │   │   │   ├── RedisCloudAccount.factory.ts
│       │   │   │   │   ├── RedisCloudInstance.factory.ts
│       │   │   │   │   └── RedisCloudSubscription.factory.ts
│       │   │   │   ├── cluster/
│       │   │   │   │   ├── ClusterNodeDetails.factory.ts
│       │   │   │   │   └── RedisClusterInstance.factory.ts
│       │   │   │   ├── database/
│       │   │   │   │   ├── DBInstance.factory.ts
│       │   │   │   │   └── DbConnectionInfo.factory.ts
│       │   │   │   ├── database-analysis/
│       │   │   │   │   └── DatabaseAnalysis.factory.ts
│       │   │   │   ├── pubsub/
│       │   │   │   │   └── PubSubMessage.factory.ts
│       │   │   │   ├── query-library/
│       │   │   │   │   └── queryLibraryItem.factory.ts
│       │   │   │   ├── rdi/
│       │   │   │   │   └── RdiStatistics.factory.ts
│       │   │   │   ├── redisearch/
│       │   │   │   │   ├── IndexField.factory.ts
│       │   │   │   │   └── IndexInfo.factory.ts
│       │   │   │   ├── sentinel/
│       │   │   │   │   └── SentinelMaster.factory.ts
│       │   │   │   ├── vector-search/
│       │   │   │   │   ├── indexInfo.factory.ts
│       │   │   │   │   └── indexList.factory.ts
│       │   │   │   └── workbench/
│       │   │   │       └── commandExectution.factory.ts
│       │   │   ├── handlers/
│       │   │   │   ├── ai/
│       │   │   │   │   ├── assistantHandlers.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── analytics/
│       │   │   │   │   ├── clusterDetailsHandlers.ts
│       │   │   │   │   ├── dbAnalysisHistoryHandlers.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── app/
│       │   │   │   │   ├── featureHandlers.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── infoHandlers.ts
│       │   │   │   │   └── telemetryHandlers.ts
│       │   │   │   ├── browser/
│       │   │   │   │   ├── bulkActionsHandlers.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── queryLibraryHandlers.ts
│       │   │   │   │   └── redisearchHandlers.ts
│       │   │   │   ├── content/
│       │   │   │   │   ├── createRedisButtonsHandlers.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── instances/
│       │   │   │   │   ├── caCertsHandlers.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── instancesHandlers.ts
│       │   │   │   ├── misc/
│       │   │   │   │   └── index.ts
│       │   │   │   ├── oauth/
│       │   │   │   │   ├── cloud.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── rdi/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── rdiHandler.ts
│       │   │   │   │   └── rdiPipelineStrategiesHandlers.ts
│       │   │   │   ├── recommendations/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── recommendationsHandler.ts
│       │   │   │   │   └── recommendationsReadHandler.ts
│       │   │   │   ├── tutorials/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── tutorialsHandlers.ts
│       │   │   │   ├── user/
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── userSettingsHandlers.ts
│       │   │   │   └── workbench/
│       │   │   │       ├── commands.ts
│       │   │   │       └── index.ts
│       │   │   ├── rdi/
│       │   │   │   └── RdiInstance.factory.ts
│       │   │   ├── res/
│       │   │   │   └── responseComposition.ts
│       │   │   └── server.ts
│       │   ├── packages/
│       │   │   ├── clients-list/
│       │   │   │   ├── README.md
│       │   │   │   ├── index.html
│       │   │   │   ├── package.json
│       │   │   │   └── src/
│       │   │   │       ├── App.tsx
│       │   │   │       ├── components/
│       │   │   │       │   ├── index.ts
│       │   │   │       │   ├── json-view/
│       │   │   │       │   │   ├── JSONView.spec.tsx
│       │   │   │       │   │   ├── JSONView.tsx
│       │   │   │       │   │   ├── components/
│       │   │   │       │   │   │   ├── json-array/
│       │   │   │       │   │   │   │   ├── JsonArray.tsx
│       │   │   │       │   │   │   │   └── index.ts
│       │   │   │       │   │   │   ├── json-object/
│       │   │   │       │   │   │   │   ├── JsonObject.tsx
│       │   │   │       │   │   │   │   └── index.ts
│       │   │   │       │   │   │   ├── json-pretty/
│       │   │   │       │   │   │   │   ├── JsonPretty.tsx
│       │   │   │       │   │   │   │   └── index.ts
│       │   │   │       │   │   │   └── json-primitive/
│       │   │   │       │   │   │       ├── JsonPrimitive.tsx
│       │   │   │       │   │   │       └── index.ts
│       │   │   │       │   │   ├── index.ts
│       │   │   │       │   │   ├── interfaces.ts
│       │   │   │       │   │   └── utils.ts
│       │   │   │       │   └── table-view/
│       │   │   │       │       ├── TableView.spec.tsx
│       │   │   │       │       ├── TableView.tsx
│       │   │   │       │       └── index.ts
│       │   │   │       ├── global.d.ts
│       │   │   │       ├── icons/
│       │   │   │       │   ├── arrow_down.jsx
│       │   │   │       │   ├── arrow_left.jsx
│       │   │   │       │   ├── arrow_right.jsx
│       │   │   │       │   ├── check.js
│       │   │   │       │   ├── copy.js
│       │   │   │       │   ├── cross.js
│       │   │   │       │   └── empty.js
│       │   │   │       ├── main.tsx
│       │   │   │       ├── result.json
│       │   │   │       ├── styles/
│       │   │   │       │   └── styles.scss
│       │   │   │       └── utils/
│       │   │   │           ├── cachedIcons.ts
│       │   │   │           ├── index.ts
│       │   │   │           └── parseResponse.ts
│       │   │   ├── common/
│       │   │   │   └── package.json
│       │   │   ├── package.json
│       │   │   ├── redisearch/
│       │   │   │   ├── index.html
│       │   │   │   ├── package.json
│       │   │   │   └── src/
│       │   │   │       ├── App.tsx
│       │   │   │       ├── components/
│ 
Download .txt
Showing preview only (813K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7959 symbols across 2425 files)

FILE: .github/deps-audit-report.js
  constant FILENAME (line 4) | const FILENAME = process.env.FILENAME;
  constant DEPS (line 5) | const DEPS = process.env.DEPS || '';
  function generateSlackMessage (line 9) | function generateSlackMessage(summary) {
  function main (line 63) | async function main() {

FILE: .github/deps-licenses-report.js
  function main (line 17) | async function main() {
  function findPackageJsonFiles (line 42) | function findPackageJsonFiles(folderPath) {
  function runLicenseCheck (line 76) | async function runLicenseCheck(path) {
  function sendLicensesToGoogleSheet (line 100) | async function sendLicensesToGoogleSheet() {
  function generateSummary (line 258) | async function generateSummary() {

FILE: .github/generate-build-summary.js
  function generateBuildSummary (line 23) | async function generateBuildSummary() {

FILE: .github/generate-checksums-summary.js
  function parseYamlFile (line 27) | function parseYamlFile(content) {
  function generateChecksumsSummary (line 53) | async function generateChecksumsSummary() {

FILE: .github/lint-report.js
  constant FILENAME (line 3) | const FILENAME = process.env.FILENAME || 'lint.audit.json';
  constant WORKDIR (line 4) | const WORKDIR = process.env.WORKDIR || '.';
  constant TARGET (line 5) | const TARGET = process.env.TARGET || '';
  function generateSlackMessage (line 9) | function generateSlackMessage(summary) {
  function main (line 42) | async function main() {

FILE: .storybook/RootStoryLayout.tsx
  type Parameters (line 4) | interface Parameters {

FILE: .storybook/main.ts
  method viteFinal (line 6) | async viteFinal(inlineConfig) {

FILE: .storybook/vite.config.ts
  method transformIndexHtml (line 27) | transformIndexHtml(html) {
  method manualChunks (line 60) | manualChunks(id) {
  method renderBuiltUrl (line 136) | renderBuiltUrl() {

FILE: configs/webpack.config.base.ts
  method checkResource (line 57) | checkResource(resource) {

FILE: redisinsight/__mocks__/monacoMock.js
  function MonacoEditor (line 66) | function MonacoEditor(props) {

FILE: redisinsight/__mocks__/react-resizable-panels.js
  constant DATA_ATTRIBUTES (line 6) | const DATA_ATTRIBUTES = {};

FILE: redisinsight/api/config/logger.ts
  constant PATH_CONFIG (line 12) | const PATH_CONFIG = config.get('dir_path');
  constant LOGGER_CONFIG (line 13) | const LOGGER_CONFIG = config.get('logger');

FILE: redisinsight/api/config/swagger.ts
  constant SWAGGER_CONFIG (line 3) | const SWAGGER_CONFIG: Omit<OpenAPIObject, 'paths'> = {

FILE: redisinsight/api/esbuild.js
  function main (line 25) | async function main() {
  function copySource (line 54) | function copySource(source, destination) {
  method setup (line 70) | setup(build) {

FILE: redisinsight/api/migration/1614164490968-initial-migration.ts
  class initialMigration1614164490968 (line 3) | class initialMigration1614164490968 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 28) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1615480887019-connection-type.ts
  class connectionType1615480887019 (line 3) | class connectionType1615480887019 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1615990079125-database-name-from-provider.ts
  class databaseNameFromProvider1615990079125 (line 3) | class databaseNameFromProvider1615990079125
    method up (line 8) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 21) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1615992183565-remove-database-type.ts
  class removeDatabaseType1615992183565 (line 3) | class removeDatabaseType1615992183565 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1616520395940-oss-sentinel.ts
  class ossSentinel1616520395940 (line 3) | class ossSentinel1616520395940 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1625771635418-agreements.ts
  class agreements1625771635418 (line 3) | class agreements1625771635418 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 12) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1626086601057-server-info.ts
  class serverInfo1626086601057 (line 3) | class serverInfo1626086601057 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 12) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1626904405170-database-hosting-provider.ts
  class databaseHostingProvider1626904405170 (line 3) | class databaseHostingProvider1626904405170
    method up (line 8) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 21) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1627556171227-settings.ts
  class settings1627556171227 (line 3) | class settings1627556171227 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 12) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1629729923740-database-modules.ts
  class databaseModules1629729923740 (line 3) | class databaseModules1629729923740 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1634219846022-database-db-index.ts
  class databaseDbIndex1634219846022 (line 3) | class databaseDbIndex1634219846022 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1634557312500-encryption.ts
  class encryption1634557312500 (line 3) | class encryption1634557312500 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 59) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1641795882696-command-execution.ts
  class commandExecution1641795882696 (line 3) | class commandExecution1641795882696 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 29) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1641805606399-plugin-state.ts
  class pluginState1641805606399 (line 3) | class pluginState1641805606399 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 22) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1650278664000-sni.ts
  class sni1650278664000 (line 3) | class sni1650278664000 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1655821010349-notification.ts
  class notification1655821010349 (line 3) | class notification1655821010349 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 12) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1659687030433-notification-category.ts
  class notificationCategory1659687030433 (line 3) | class notificationCategory1659687030433 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1660664717573-workbench-mode.ts
  class workbenchMode1660664717573 (line 3) | class workbenchMode1660664717573 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 23) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1663093411715-workbench-group-mode.ts
  class workbenchGroupMode1663093411715 (line 3) | class workbenchGroupMode1663093411715 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 23) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1664785208236-database-analysis.ts
  class databaseAnalysis1664785208236 (line 3) | class databaseAnalysis1664785208236 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 36) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1664886479051-database-analysis-expiration-groups.ts
  class databaseAnalysisExpirationGroups1664886479051 (line 3) | class databaseAnalysisExpirationGroups1664886479051
    method up (line 8) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 29) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1667368983699-workbench-execution-time.ts
  class workbenchExecutionTime1667368983699 (line 3) | class workbenchExecutionTime1667368983699 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 23) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1667477693934-database.ts
  class database1667477693934 (line 3) | class database1667477693934 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1670252337342-database-new.ts
  class databaseNew1670252337342 (line 3) | class databaseNew1670252337342 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1673035852335-ssh-options.ts
  class sshOptions1673035852335 (line 3) | class sshOptions1673035852335 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 32) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1673934231410-workbench-and-analysis-db.ts
  class workbenchAndAnalysisDbIndex1673934231410 (line 3) | class workbenchAndAnalysisDbIndex1673934231410
    method up (line 8) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 43) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1674539211397-browser-history.ts
  class browserHistory1674539211397 (line 3) | class browserHistory1674539211397 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 36) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1674660306971-database-analysis-recommendations.ts
  class databaseAnalysisRecommendations1674660306971 (line 3) | class databaseAnalysisRecommendations1674660306971
    method up (line 8) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 29) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1675398140189-database-timeout.ts
  class databaseTimeout1675398140189 (line 3) | class databaseTimeout1675398140189 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1677135091633-custom-tutorials.ts
  class customTutorials1677135091633 (line 3) | class customTutorials1677135091633 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 12) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1678182722874-database-compressor.ts
  class databaseCompressor1678182722874 (line 3) | class databaseCompressor1678182722874 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1681900503586-database-recommendations.ts
  class databaseRecommendations1681900503586 (line 3) | class databaseRecommendations1681900503586
    method up (line 8) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 38) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1683006064293-database-recommendation-params.ts
  class databaseRecommendationParams1683006064293 (line 3) | class databaseRecommendationParams1683006064293
    method up (line 8) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 29) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1684931530343-feature.ts
  class Feature1684931530343 (line 3) | class Feature1684931530343 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 15) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1686719451753-database-redis-server.ts
  class DatabaseRedisServer1686719451753 (line 3) | class DatabaseRedisServer1686719451753 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1687166457712-cloud-database-details.ts
  class CloudDatabaseDetails1687166457712 (line 3) | class CloudDatabaseDetails1687166457712 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 22) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1687435940110-database-recommendation-unique.ts
  class DatabaseRecommendationUnique1687435940110 (line 3) | class DatabaseRecommendationUnique1687435940110
    method up (line 8) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 29) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1688989337247-freeCloudDatabase.ts
  class FreeCloudDatabase1688989337247 (line 3) | class FreeCloudDatabase1688989337247 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1691061058385-cloud-capi-keys.ts
  class CloudCapiKeys1691061058385 (line 3) | class CloudCapiKeys1691061058385 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 12) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1691476419592-feature-sso.ts
  class FeatureSso1691476419592 (line 3) | class FeatureSso1691476419592 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1713515657364-ai-history.ts
  class AiHistory1713515657364 (line 3) | class AiHistory1713515657364 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 21) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1714501203616-ai-history-steps.ts
  class AiHistorySteps1714501203616 (line 3) | class AiHistorySteps1714501203616 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 31) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1716370509836-rdi.ts
  class Rdi1716370509836 (line 3) | class Rdi1716370509836 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 12) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1718260230164-ai-history.ts
  class AiHistory1718260230164 (line 3) | class AiHistory1718260230164 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 31) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1726058563737-command-execution.ts
  class CommandExecution1726058563737 (line 3) | class CommandExecution1726058563737 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 23) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1729085495444-cloud-session.ts
  class CloudSession1729085495444 (line 3) | class CloudSession1729085495444 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 12) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1733740794737-database-createdAt.ts
  class DatabaseCreatedAt1733740794737 (line 3) | class DatabaseCreatedAt1733740794737 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1737362130798-db-settings.ts
  class DbSettings1737362130798 (line 3) | class DbSettings1737362130798 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 29) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1738829743482-database-forceStandalone.ts
  class DatabaseForceStandalone1738829743482 (line 3) | class DatabaseForceStandalone1738829743482
    method up (line 8) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 21) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1740579711635-rdi-optional-auth.ts
  class RdiOptionalAuth1740579711635 (line 3) | class RdiOptionalAuth1740579711635 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 17) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1741610039177-database-tags.ts
  class DatabaseTags1741610039177 (line 3) | class DatabaseTags1741610039177 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 39) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1741786803681-pre-setup-databases.ts
  class PreSetupDatabases1741786803681 (line 3) | class PreSetupDatabases1741786803681 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 39) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1742303245547-key-name-format.ts
  class KeyNameFormatAdded1742303245547 (line 3) | class KeyNameFormatAdded1742303245547 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 19) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1743432519891-cascade-tags.ts
  class CascadeTags1743432519891 (line 3) | class CascadeTags1743432519891 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 45) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1743606395647-encrypt-tags.ts
  class EncryptTags1743606395647 (line 3) | class EncryptTags1743606395647 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 17) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1755086732238-update-provider-names.ts
  class UpdateProviderNames1755086732238 (line 3) | class UpdateProviderNames1755086732238 implements MigrationInterface {
    method up (line 4) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 17) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1769785218000-provider-details.ts
  class ProviderDetails1769785218000 (line 3) | class ProviderDetails1769785218000 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 12) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/migration/1771500000000-query-library.ts
  class QueryLibrary1771500000000 (line 3) | class QueryLibrary1771500000000 implements MigrationInterface {
    method up (line 6) | public async up(queryRunner: QueryRunner): Promise<void> {
    method down (line 27) | public async down(queryRunner: QueryRunner): Promise<void> {

FILE: redisinsight/api/scripts/default-commands.ts
  constant PATH_CONFIG (line 6) | const PATH_CONFIG = get('dir_path');
  constant COMMANDS_CONFIG (line 7) | const COMMANDS_CONFIG = get('commands');
  function init (line 9) | async function init() {

FILE: redisinsight/api/scripts/default-content.ts
  constant PATH_CONFIG (line 9) | const PATH_CONFIG = get('dir_path');
  constant CONTENT_CONFIG (line 10) | const CONTENT_CONFIG = get('content');
  function init (line 20) | async function init() {

FILE: redisinsight/api/scripts/default-tutorials.ts
  constant PATH_CONFIG (line 9) | const PATH_CONFIG = get('dir_path');
  constant TUTORIALS_CONFIG (line 10) | const TUTORIALS_CONFIG = get('tutorials');
  function init (line 20) | async function init() {

FILE: redisinsight/api/src/__mocks__/cloud-job.ts
  method constructor (line 24) | constructor() {

FILE: redisinsight/api/src/__mocks__/common.ts
  type MockType (line 15) | type MockType<T> = {

FILE: redisinsight/api/src/__mocks__/rdi.ts
  class MockRdiClient (line 24) | class MockRdiClient extends ApiRdiClient {
    method constructor (line 25) | constructor(metadata: RdiClientMetadata, client: any = jest.fn()) {

FILE: redisinsight/api/src/__mocks__/redis-client.ts
  type IRedisClientInstance (line 17) | interface IRedisClientInstance {
  class MockRedisClient (line 32) | class MockRedisClient extends RedisClient {
    method constructor (line 33) | constructor(
  class MockClusterRedisClient (line 85) | class MockClusterRedisClient extends MockRedisClient {
    method constructor (line 86) | constructor(clientMetadata: ClientMetadata, client: any = jest.fn()) {
  class MockSentinelRedisClient (line 103) | class MockSentinelRedisClient extends MockRedisClient {
    method constructor (line 104) | constructor(clientMetadata: ClientMetadata, client: any = jest.fn()) {

FILE: redisinsight/api/src/__mocks__/redis-rs.ts
  type InfoReplyRaw (line 170) | type InfoReplyRaw = string | number | InfoReplyRaw[];

FILE: redisinsight/api/src/__mocks__/redisearch.ts
  type IndexInfoRawOverrides (line 3) | interface IndexInfoRawOverrides {

FILE: redisinsight/api/src/__mocks__/server.ts
  constant SERVER_CONFIG (line 7) | const SERVER_CONFIG = config.get('server') as Config['server'];

FILE: redisinsight/api/src/app.module.ts
  constant SERVER_CONFIG (line 49) | const SERVER_CONFIG = config.get('server') as Config['server'];
  constant PATH_CONFIG (line 50) | const PATH_CONFIG = config.get('dir_path') as Config['dir_path'];
  constant STATICS_CONFIG (line 51) | const STATICS_CONFIG = config.get('statics') as Config['statics'];
  class AppModule (line 92) | class AppModule implements OnModuleInit, NestModule {
    method onModuleInit (line 93) | onModuleInit() {
    method configure (line 107) | configure(consumer: MiddlewareConsumer) {

FILE: redisinsight/api/src/common/constants/api.ts
  constant API_PARAM_DATABASE_ID (line 1) | const API_PARAM_DATABASE_ID = 'dbInstance';
  constant API_HEADER_DATABASE_INDEX (line 2) | const API_HEADER_DATABASE_INDEX = 'ri-db-index';
  constant API_HEADER_WINDOW_ID (line 3) | const API_HEADER_WINDOW_ID = 'x-window-id';
  constant API_PARAM_CLI_CLIENT_ID (line 4) | const API_PARAM_CLI_CLIENT_ID = 'uuid';

FILE: redisinsight/api/src/common/constants/general.ts
  type TransformGroup (line 1) | enum TransformGroup {
  constant UNKNOWN_REDIS_INFO (line 5) | const UNKNOWN_REDIS_INFO = {

FILE: redisinsight/api/src/common/constants/history.ts
  type BrowserHistoryMode (line 1) | enum BrowserHistoryMode {

FILE: redisinsight/api/src/common/constants/recommendations.ts
  type SearchVisualizationCommands (line 1) | enum SearchVisualizationCommands {
  constant LUA_SCRIPT_RECOMMENDATION_COUNT (line 11) | const LUA_SCRIPT_RECOMMENDATION_COUNT = 10;
  constant BIG_HASHES_RECOMMENDATION_LENGTH (line 12) | const BIG_HASHES_RECOMMENDATION_LENGTH = 5000;
  constant COMBINE_SMALL_STRINGS_TO_HASHES_RECOMMENDATION_MEMORY (line 13) | const COMBINE_SMALL_STRINGS_TO_HASHES_RECOMMENDATION_MEMORY = 200;
  constant USE_SMALLER_KEYS_RECOMMENDATION_TOTAL (line 14) | const USE_SMALLER_KEYS_RECOMMENDATION_TOTAL = 1_000_000;
  constant COMPRESS_HASH_FIELD_NAMES_RECOMMENDATION_LENGTH (line 15) | const COMPRESS_HASH_FIELD_NAMES_RECOMMENDATION_LENGTH = 1000;
  constant COMPRESSION_FOR_LIST_RECOMMENDATION_LENGTH (line 16) | const COMPRESSION_FOR_LIST_RECOMMENDATION_LENGTH = 1000;
  constant BIG_SETS_RECOMMENDATION_LENGTH (line 17) | const BIG_SETS_RECOMMENDATION_LENGTH = 1_000;
  constant BIG_AMOUNT_OF_CONNECTED_CLIENTS_RECOMMENDATION_CLIENTS (line 18) | const BIG_AMOUNT_OF_CONNECTED_CLIENTS_RECOMMENDATION_CLIENTS = 100;
  constant BIG_STRINGS_RECOMMENDATION_MEMORY (line 19) | const BIG_STRINGS_RECOMMENDATION_MEMORY = 100_000;
  constant SEARCH_INDEXES_RECOMMENDATION_KEYS_FOR_CHECK (line 20) | const SEARCH_INDEXES_RECOMMENDATION_KEYS_FOR_CHECK = 100;
  constant REDIS_VERSION_RECOMMENDATION_VERSION (line 21) | const REDIS_VERSION_RECOMMENDATION_VERSION = '7.3';
  constant COMBINE_SMALL_STRINGS_TO_HASHES_RECOMMENDATION_KEYS_COUNT (line 22) | const COMBINE_SMALL_STRINGS_TO_HASHES_RECOMMENDATION_KEYS_COUNT = 10;
  constant SEARCH_HASH_RECOMMENDATION_KEYS_FOR_CHECK (line 23) | const SEARCH_HASH_RECOMMENDATION_KEYS_FOR_CHECK = 50;
  constant SEARCH_HASH_RECOMMENDATION_KEYS_LENGTH (line 24) | const SEARCH_HASH_RECOMMENDATION_KEYS_LENGTH = 2;
  constant RTS_KEYS_FOR_CHECK (line 25) | const RTS_KEYS_FOR_CHECK = 100;

FILE: redisinsight/api/src/common/constants/redis-string.ts
  constant REDIS_STRING_ENCODING_QUERY_PARAM_NAME (line 3) | const REDIS_STRING_ENCODING_QUERY_PARAM_NAME = 'encoding';
  type RedisStringResponseEncoding (line 5) | enum RedisStringResponseEncoding {
  type RedisString (line 11) | type RedisString = string | Buffer;
  type RedisStringTransformOptions (line 13) | interface RedisStringTransformOptions extends TransformOptions {

FILE: redisinsight/api/src/common/constants/user.ts
  constant DEFAULT_USER_ID (line 1) | const DEFAULT_USER_ID = '1';
  constant DEFAULT_ACCOUNT_ID (line 2) | const DEFAULT_ACCOUNT_ID = '1';
  constant DEFAULT_SESSION_ID (line 3) | const DEFAULT_SESSION_ID = '1';

FILE: redisinsight/api/src/common/decorators/client-metadata/client-metadata.decorator.ts
  type IClientMetadataParamOptions (line 18) | interface IClientMetadataParamOptions {

FILE: redisinsight/api/src/common/decorators/data-as-json-string.decorator.ts
  function DataAsJsonString (line 4) | function DataAsJsonString() {

FILE: redisinsight/api/src/common/decorators/database-management.decorator.ts
  function DatabaseManagement (line 4) | function DatabaseManagement() {

FILE: redisinsight/api/src/common/decorators/default.ts
  function Default (line 4) | function Default(defaultValue: unknown): PropertyDecorator {

FILE: redisinsight/api/src/common/decorators/hidden-field.decorator.ts
  function HiddenField (line 3) | function HiddenField(field: any): PropertyDecorator {

FILE: redisinsight/api/src/common/decorators/is-bigger-than.decorator.ts
  function IsBiggerThan (line 4) | function IsBiggerThan(

FILE: redisinsight/api/src/common/decorators/is-github-link.decorator.ts
  function IsGitHubLink (line 4) | function IsGitHubLink(validationOptions?: ValidationOptions) {

FILE: redisinsight/api/src/common/decorators/is-multi-number.decorator.ts
  function IsMultiNumber (line 4) | function IsMultiNumber(validationOptions?: ValidationOptions) {

FILE: redisinsight/api/src/common/decorators/no-duplicates.decorator.ts
  function NoDuplicatesByKey (line 4) | function NoDuplicatesByKey(

FILE: redisinsight/api/src/common/decorators/object-as-map.decorator.ts
  function ObjectAsMap (line 6) | function ObjectAsMap<T>(targetClass: ClassConstructor<T>) {

FILE: redisinsight/api/src/common/decorators/redis-string/is-redis-string.decorator.ts
  function IsRedisString (line 4) | function IsRedisString(validationOptions?: ValidationOptions) {

FILE: redisinsight/api/src/common/decorators/redis-string/redis-string-type.decorator.ts
  function RedisStringType (line 13) | function RedisStringType(opts?: RedisStringTransformOptions) {

FILE: redisinsight/api/src/common/decorators/transform-to-map.decorator.spec.ts
  class DummyClass (line 4) | class DummyClass {
  class TestDto (line 12) | class TestDto {

FILE: redisinsight/api/src/common/decorators/transform-to-map.decorator.ts
  function TransformToMap (line 5) | function TransformToMap<T>(targetClass: ClassConstructor<T>) {

FILE: redisinsight/api/src/common/decorators/zset-score/zset-score.decorator.ts
  function isZSetScore (line 4) | function isZSetScore(validationOptions?: ValidationOptions) {

FILE: redisinsight/api/src/common/exceptions/validation.exception.ts
  class ValidationException (line 3) | class ValidationException extends BadRequestException {}

FILE: redisinsight/api/src/common/guards/database-management.guard.ts
  constant SERVER_CONFIG (line 5) | const SERVER_CONFIG = config.get('server') as Config['server'];
  class DatabaseManagementGuard (line 8) | class DatabaseManagementGuard implements CanActivate {
    method canActivate (line 9) | canActivate(): boolean {

FILE: redisinsight/api/src/common/interceptors/browser-serialize.interceptor.ts
  class BrowserSerializeInterceptor (line 11) | class BrowserSerializeInterceptor extends ClassSerializerInterceptor {
    method intercept (line 12) | intercept(context: ExecutionContext, next: CallHandler): Observable<an...

FILE: redisinsight/api/src/common/interceptors/timeout.interceptor.ts
  class TimeoutInterceptor (line 16) | class TimeoutInterceptor implements NestInterceptor {
    method constructor (line 23) | constructor(message: string = 'Request timeout', timeoutMs?: number) {
    method intercept (line 28) | intercept(context: ExecutionContext, next: CallHandler): Observable<an...

FILE: redisinsight/api/src/common/logger/app-logger.ts
  type LogMeta (line 8) | type LogMeta = object;
  type ErrorOrMeta (line 10) | type ErrorOrMeta = Error | LogMeta | string | ClientMetadata | SessionMe...
  class AppLogger (line 13) | class AppLogger implements LoggerService {
    method constructor (line 16) | constructor(loggerConfig: WinstonModuleOptions) {
    method getContext (line 27) | static getContext(args: ErrorOrMeta[] = []) {
    method getError (line 43) | static getError(args: ErrorOrMeta[] = []): Error {
    method getUserMetadata (line 61) | static getUserMetadata(args: ErrorOrMeta[] = []): {
    method parseLoggerArgs (line 101) | private parseLoggerArgs(message: string, optionalParams: ErrorOrMeta[]...
    method log (line 121) | log(message: string, ...optionalParams: ErrorOrMeta[]) {
    method fatal (line 128) | fatal(message: string, ...optionalParams: ErrorOrMeta[]) {
    method error (line 135) | error(message: string, ...optionalParams: ErrorOrMeta[]) {
    method warn (line 142) | warn(message: string, ...optionalParams: ErrorOrMeta[]) {
    method debug (line 149) | debug?(message: string, ...optionalParams: ErrorOrMeta[]) {
    method verbose (line 156) | verbose?(message: string, ...optionalParams: ErrorOrMeta[]) {

FILE: redisinsight/api/src/common/middlewares/body-parser.middleware.ts
  type BodyParserError (line 7) | interface BodyParserError extends Error {

FILE: redisinsight/api/src/common/middlewares/single-user-auth.middleware.ts
  class SingleUserAuthMiddleware (line 17) | class SingleUserAuthMiddleware implements NestMiddleware {
    method constructor (line 18) | constructor(private readonly sessionService: SessionService) {}
    method use (line 20) | async use(req: Request, res: Response, next: NextFunction): Promise<an...

FILE: redisinsight/api/src/common/models/client-metadata.ts
  type ClientContext (line 15) | enum ClientContext {
  class ClientMetadata (line 24) | class ClientMetadata {
    method validate (line 57) | static validate(clientMetadata: ClientMetadata) {

FILE: redisinsight/api/src/common/models/common.ts
  type ActionStatus (line 1) | enum ActionStatus {

FILE: redisinsight/api/src/common/models/database-index.ts
  class DatabaseIndex (line 4) | class DatabaseIndex extends PickType(ClientMetadata, ['db'] as const) {}

FILE: redisinsight/api/src/common/models/endpoint.ts
  type IEndpoint (line 5) | interface IEndpoint {
  class Endpoint (line 10) | class Endpoint implements IEndpoint {

FILE: redisinsight/api/src/common/models/session.ts
  type ISessionMetadata (line 6) | interface ISessionMetadata {
  class SessionMetadata (line 13) | class SessionMetadata implements ISessionMetadata {
    method validate (line 53) | static validate(sessionMetadata: SessionMetadata) {
  class Session (line 64) | class Session {

FILE: redisinsight/api/src/common/pipes/database-index.validation.pipe.ts
  class DbIndexValidationPipe (line 3) | class DbIndexValidationPipe extends ValidationPipe {
    method transform (line 4) | async transform(db, metadata: ArgumentMetadata) {

FILE: redisinsight/api/src/common/transformers/redis-reply/formatter-manager.ts
  class FormatterManager (line 3) | class FormatterManager {
    method addStrategy (line 6) | addStrategy(name: FormatterTypes, strategy: IFormatterStrategy): void {
    method getStrategy (line 10) | getStrategy(name: FormatterTypes): IFormatterStrategy {

FILE: redisinsight/api/src/common/transformers/redis-reply/formatter.interface.ts
  type FormatterTypes (line 1) | enum FormatterTypes {
  type IFormatterStrategy (line 6) | interface IFormatterStrategy {

FILE: redisinsight/api/src/common/transformers/redis-reply/strategies/ascii-formatter.strategy.ts
  class ASCIIFormatterStrategy (line 5) | class ASCIIFormatterStrategy implements IFormatterStrategy {
    method format (line 6) | public format(reply: any): any {
    method formatRedisArrayReply (line 19) | private formatRedisArrayReply(reply: Buffer | Buffer[]): any[] {
    method formatRedisObjectReply (line 33) | private formatRedisObjectReply(reply: Object): object | string {

FILE: redisinsight/api/src/common/transformers/redis-reply/strategies/utf8-formatter.strategy.ts
  class UTF8FormatterStrategy (line 5) | class UTF8FormatterStrategy implements IFormatterStrategy {
    method format (line 6) | public format(reply: any): any {
    method formatRedisArrayReply (line 19) | private formatRedisArrayReply(reply: Buffer | Buffer[]): any[] {
    method formatRedisObjectReply (line 33) | private formatRedisObjectReply(reply: Object): object | string {

FILE: redisinsight/api/src/common/validators/bigger-than.validator.ts
  class BiggerThan (line 8) | class BiggerThan implements ValidatorConstraintInterface {
    method validate (line 9) | validate(value: any, args: ValidationArguments) {
    method defaultMessage (line 19) | defaultMessage(args: ValidationArguments) {

FILE: redisinsight/api/src/common/validators/github-link.validator.ts
  class GitHubLink (line 7) | class GitHubLink implements ValidatorConstraintInterface {
    method validate (line 8) | validate(value: any) {
    method defaultMessage (line 15) | defaultMessage() {

FILE: redisinsight/api/src/common/validators/multi-number.validator.ts
  class MultiNumberValidator (line 9) | class MultiNumberValidator implements ValidatorConstraintInterface {
    method validate (line 10) | async validate(value: any) {
    method defaultMessage (line 24) | defaultMessage(args: ValidationArguments) {

FILE: redisinsight/api/src/common/validators/no-duplicates.validator.ts
  class NoDuplicates (line 8) | class NoDuplicates implements ValidatorConstraintInterface {
    method validate (line 9) | validate(value: any, args: ValidationArguments) {
    method defaultMessage (line 34) | defaultMessage(args: ValidationArguments) {

FILE: redisinsight/api/src/common/validators/redis-string.validator.ts
  class RedisStringValidator (line 9) | class RedisStringValidator implements ValidatorConstraintInterface {
    method validate (line 10) | async validate(value: any) {
    method defaultMessage (line 14) | defaultMessage(args: ValidationArguments) {

FILE: redisinsight/api/src/common/validators/zset-score.validator.ts
  class ZSetScoreValidator (line 9) | class ZSetScoreValidator implements ValidatorConstraintInterface {
    method validate (line 10) | async validate(value: any) {
    method defaultMessage (line 14) | defaultMessage(args: ValidationArguments) {

FILE: redisinsight/api/src/constants/app-events.ts
  type AppAnalyticsEvents (line 1) | enum AppAnalyticsEvents {
  type AppRedisInstanceEvents (line 7) | enum AppRedisInstanceEvents {
  type RedisClientEvents (line 11) | enum RedisClientEvents {

FILE: redisinsight/api/src/constants/custom-error-codes.ts
  type CustomErrorCodes (line 1) | enum CustomErrorCodes {

FILE: redisinsight/api/src/constants/exceptions.ts
  class AgreementIsNotDefinedException (line 4) | class AgreementIsNotDefinedException extends HttpException {
    method constructor (line 5) | constructor(message) {
  class ServerInfoNotFoundException (line 17) | class ServerInfoNotFoundException extends HttpException {
    method constructor (line 18) | constructor(message = ERROR_MESSAGES.SERVER_INFO_NOT_FOUND()) {

FILE: redisinsight/api/src/constants/recommendations.ts
  constant RECOMMENDATION_NAMES (line 1) | const RECOMMENDATION_NAMES = Object.freeze({
  constant ONE_NODE_RECOMMENDATIONS (line 28) | const ONE_NODE_RECOMMENDATIONS = [
  constant REDIS_STACK (line 35) | const REDIS_STACK = [

FILE: redisinsight/api/src/constants/redis-connection.ts
  constant CONNECTION_NAME_GLOBAL_PREFIX (line 1) | const CONNECTION_NAME_GLOBAL_PREFIX = 'redisinsight';

FILE: redisinsight/api/src/constants/redis-error-codes.ts
  type RedisErrorCodes (line 1) | enum RedisErrorCodes {
  type RedisearchErrorCodes (line 25) | enum RedisearchErrorCodes {
  type CertificatesErrorCodes (line 35) | enum CertificatesErrorCodes {

FILE: redisinsight/api/src/constants/redis-keys.ts
  constant MAX_TTL_NUMBER (line 1) | const MAX_TTL_NUMBER = 2147483647;
  constant DEFAULT_MATCH (line 3) | const DEFAULT_MATCH = '*';

FILE: redisinsight/api/src/constants/redis-modules.ts
  type AdditionalRedisModuleName (line 1) | enum AdditionalRedisModuleName {
  type AdditionalSearchModuleName (line 11) | enum AdditionalSearchModuleName {
  constant SUPPORTED_REDIS_MODULES (line 17) | const SUPPORTED_REDIS_MODULES = Object.freeze({
  constant REDIS_CLOUD_MODULES_NAMES (line 27) | const REDIS_CLOUD_MODULES_NAMES = Object.freeze({
  constant REDIS_SOFTWARE_MODULES_NAMES (line 37) | const REDIS_SOFTWARE_MODULES_NAMES = Object.freeze({
  constant REDIS_MODULES_COMMANDS (line 47) | const REDIS_MODULES_COMMANDS = new Map([
  constant REDISEARCH_MODULES (line 60) | const REDISEARCH_MODULES: string[] = [

FILE: redisinsight/api/src/constants/regex.ts
  constant ARG_IN_QUOTATION_MARKS_REGEX (line 1) | const ARG_IN_QUOTATION_MARKS_REGEX = /"[^"]*|'[^']*'|"+/g;
  constant IS_INTEGER_NUMBER_REGEX (line 2) | const IS_INTEGER_NUMBER_REGEX = /^\d+$/;
  constant IS_NUMBER_REGEX (line 3) | const IS_NUMBER_REGEX = /^-?\d*(\.\d+)?$/;
  constant IS_NON_PRINTABLE_ASCII_CHARACTER (line 4) | const IS_NON_PRINTABLE_ASCII_CHARACTER = /[^ -~\u0007\b\t\n\r]/;
  constant IP_ADDRESS_REGEX (line 5) | const IP_ADDRESS_REGEX =
  constant PRIVATE_IP_ADDRESS_REGEX (line 7) | const PRIVATE_IP_ADDRESS_REGEX =
  constant IS_TIMESTAMP (line 9) | const IS_TIMESTAMP = /^(\d{10}|\d{13}|\d{16}|\d{19})$/;

FILE: redisinsight/api/src/constants/sort.ts
  type SortOrder (line 1) | enum SortOrder {

FILE: redisinsight/api/src/constants/telemetry-events.ts
  type TelemetryEvents (line 1) | enum TelemetryEvents {
  type CommandType (line 120) | enum CommandType {

FILE: redisinsight/api/src/core.module.ts
  class CoreModule (line 58) | class CoreModule {}

FILE: redisinsight/api/src/decorators/api-endpoint.decorator.ts
  constant SERVER_CONFIG (line 7) | const SERVER_CONFIG = config.get('server') as Config['server'];
  type IApiEndpointOptions (line 9) | interface IApiEndpointOptions {
  function ApiEndpoint (line 16) | function ApiEndpoint(

FILE: redisinsight/api/src/decorators/api-redis-instance-operation.decorator.ts
  function ApiRedisInstanceOperation (line 8) | function ApiRedisInstanceOperation(

FILE: redisinsight/api/src/decorators/api-redis-params.decorator.ts
  function ApiRedisParams (line 4) | function ApiRedisParams(): MethodDecorator & ClassDecorator {

FILE: redisinsight/api/src/exceptions/global-exception.filter.ts
  class GlobalExceptionFilter (line 5) | class GlobalExceptionFilter extends BaseExceptionFilter {
    method catch (line 8) | catch(exception: Error, host: ArgumentsHost) {

FILE: redisinsight/api/src/init-helper.ts
  constant PATH_CONFIG (line 6) | const PATH_CONFIG = config.get('dir_path');
  constant DB_CONFIG (line 7) | const DB_CONFIG = config.get('db');

FILE: redisinsight/api/src/local-database.module.ts
  class LocalDatabaseModule (line 16) | class LocalDatabaseModule {}

FILE: redisinsight/api/src/main.ts
  type IApp (line 31) | interface IApp {
  function bootstrap (line 37) | async function bootstrap(apiPort?: number): Promise<IApp> {

FILE: redisinsight/api/src/middleware/exclude-route.middleware.ts
  class ExcludeRouteMiddleware (line 5) | class ExcludeRouteMiddleware implements NestMiddleware {
    method use (line 6) | use(req: Request) {

FILE: redisinsight/api/src/middleware/redis-connection/redis-connection.middleware.ts
  class RedisConnectionMiddleware (line 14) | class RedisConnectionMiddleware implements NestMiddleware {
    method constructor (line 17) | constructor(private databaseService: DatabaseService) {}
    method use (line 19) | async use(req: Request, res: Response, next: NextFunction): Promise<an...
    method getConnectionConfigFromReq (line 39) | private static getConnectionConfigFromReq(req: Request) {
    method throwError (line 43) | private throwError(req: Request, message: string) {

FILE: redisinsight/api/src/middleware/subpath-proxy.middleware.ts
  class SubpathProxyMiddleware (line 7) | class SubpathProxyMiddleware implements NestMiddleware {
    method use (line 8) | async use(req: Request, res: Response, next: NextFunction) {

FILE: redisinsight/api/src/middleware/x-frame-options.middleware.ts
  class XFrameOptionsMiddleware (line 5) | class XFrameOptionsMiddleware implements NestMiddleware {
    method use (line 6) | use(req: Request, res: Response, next: NextFunction) {

FILE: redisinsight/api/src/models/redis-client.ts
  class RedisError (line 1) | class RedisError extends Error {
  class ReplyError (line 6) | class ReplyError extends RedisError {
  type AppTool (line 12) | enum AppTool {
  class IRedisModule (line 19) | class IRedisModule {

FILE: redisinsight/api/src/models/redis-cluster.ts
  type IRedisClusterInfo (line 1) | interface IRedisClusterInfo {
  type IRedisClusterNodeAddress (line 14) | interface IRedisClusterNodeAddress {
  type IRedisClusterNode (line 19) | interface IRedisClusterNode extends IRedisClusterNodeAddress {
  type RedisClusterNodeLinkState (line 26) | enum RedisClusterNodeLinkState {

FILE: redisinsight/api/src/modules/ai/chat/ai-chat.controller.ts
  class AiChatController (line 27) | class AiChatController {
    method constructor (line 28) | constructor(private readonly service: AiChatService) {}
    method create (line 36) | async create(
    method getHistory (line 48) | async getHistory(
    method postMessage (line 61) | async postMessage(
    method delete (line 76) | async delete(

FILE: redisinsight/api/src/modules/ai/chat/ai-chat.module.ts
  class AiChatModule (line 10) | class AiChatModule {}

FILE: redisinsight/api/src/modules/ai/chat/ai-chat.service.ts
  class AiChatService (line 9) | class AiChatService {
    method constructor (line 10) | constructor(private readonly convAiProvider: ConvAiProvider) {}
    method create (line 12) | async create(sessionMetadata: SessionMetadata): Promise<Partial<AiChat...
    method postMessage (line 17) | async postMessage(
    method getHistory (line 29) | async getHistory(
    method delete (line 39) | async delete(

FILE: redisinsight/api/src/modules/ai/chat/dto/send.ai-chat.message.dto.ts
  class SendAiChatMessageDto (line 4) | class SendAiChatMessageDto {

FILE: redisinsight/api/src/modules/ai/chat/exceptions/conv-ai.bad-request.exception.ts
  class ConvAiBadRequestException (line 9) | class ConvAiBadRequestException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/chat/exceptions/conv-ai.forbidden.exception.ts
  class ConvAiForbiddenException (line 9) | class ConvAiForbiddenException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/chat/exceptions/conv-ai.internal-server-error.exception.ts
  class ConvAiInternalServerErrorException (line 9) | class ConvAiInternalServerErrorException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/chat/exceptions/conv-ai.not-found.exception.ts
  class ConvAiNotFoundException (line 9) | class ConvAiNotFoundException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/chat/exceptions/conv-ai.unauthorized.exception.ts
  class ConvAiUnauthorizedException (line 9) | class ConvAiUnauthorizedException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/chat/models/ai-chat.message.ts
  type AiChatMessageType (line 4) | enum AiChatMessageType {
  class AiChatMessageContextRecord (line 9) | class AiChatMessageContextRecord {
  class AiChatMessage (line 17) | class AiChatMessage {

FILE: redisinsight/api/src/modules/ai/chat/models/ai-chat.ts
  class AiChat (line 5) | class AiChat {

FILE: redisinsight/api/src/modules/ai/chat/providers/conv-ai.provider.ts
  class ConvAiProvider (line 9) | class ConvAiProvider {
    method auth (line 14) | async auth(_sessionMetadata: SessionMetadata): Promise<string> {
    method getHistory (line 33) | async getHistory(
    method postMessage (line 50) | async postMessage(
    method reset (line 78) | async reset(

FILE: redisinsight/api/src/modules/ai/query/ai-query.controller.ts
  class AiQueryController (line 27) | class AiQueryController {
    method constructor (line 30) | constructor(private readonly service: AiQueryService) {}
    method streamQuestion (line 38) | async streamQuestion(
    method getHistory (line 53) | async getHistory(
    method clearHistory (line 66) | async clearHistory(

FILE: redisinsight/api/src/modules/ai/query/ai-query.module.ts
  class AiQueryModule (line 13) | class AiQueryModule {
    method register (line 14) | static register(

FILE: redisinsight/api/src/modules/ai/query/ai-query.service.spec.ts
  method write (line 116) | write(chunk) {
  method reset (line 120) | reset() {

FILE: redisinsight/api/src/modules/ai/query/ai-query.service.ts
  constant COMMANDS_WHITELIST (line 32) | const COMMANDS_WHITELIST = {
  class AiQueryService (line 38) | class AiQueryService {
    method constructor (line 41) | constructor(
    method prepareHistoryIntermediateSteps (line 49) | static prepareHistoryIntermediateSteps(
    method limitQueryReply (line 69) | static limitQueryReply(reply: any, maxResults = aiConfig.queryMaxResul...
    method prepareHistory (line 88) | static prepareHistory(messages: AiQueryMessage[]): string[][] {
    method getConversationId (line 111) | static getConversationId(messages: AiQueryMessage[]): string {
    method stream (line 115) | async stream(
    method getHistory (line 286) | async getHistory(
    method clearHistory (line 308) | async clearHistory(

FILE: redisinsight/api/src/modules/ai/query/dto/send.ai-query.message.dto.ts
  class SendAiQueryMessageDto (line 4) | class SendAiQueryMessageDto {

FILE: redisinsight/api/src/modules/ai/query/entities/ai-query.message.entity.ts
  class AiQueryMessageEntity (line 12) | class AiQueryMessageEntity {

FILE: redisinsight/api/src/modules/ai/query/exceptions/ai-query.bad-request.exception.ts
  class AiQueryBadRequestException (line 9) | class AiQueryBadRequestException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/query/exceptions/ai-query.forbidden.exception.ts
  class AiQueryForbiddenException (line 9) | class AiQueryForbiddenException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/query/exceptions/ai-query.internal-server-error.exception.ts
  class AiQueryInternalServerErrorException (line 9) | class AiQueryInternalServerErrorException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/query/exceptions/ai-query.not-found.exception.ts
  class AiQueryNotFoundException (line 9) | class AiQueryNotFoundException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/query/exceptions/ai-query.rate-limit.max-tokens.exception.ts
  class AiQueryRateLimitMaxTokensException (line 9) | class AiQueryRateLimitMaxTokensException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/query/exceptions/ai-query.rate-limit.request.exception.ts
  class AiQueryRateLimitRequestException (line 9) | class AiQueryRateLimitRequestException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/query/exceptions/ai-query.rate-limit.token.exception.ts
  class AiQueryRateLimitTokenException (line 9) | class AiQueryRateLimitTokenException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/query/exceptions/ai-query.unauthorized.exception.ts
  class AiQueryUnauthorizedException (line 9) | class AiQueryUnauthorizedException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/ai/query/models/ai-query.auth-data.ts
  class AiQueryAuthData (line 3) | class AiQueryAuthData {

FILE: redisinsight/api/src/modules/ai/query/models/ai-query.common.ts
  type AiQueryWsEvents (line 1) | enum AiQueryWsEvents {
  type AiQueryMessageRole (line 14) | enum AiQueryMessageRole {
  type AiQueryServerErrors (line 21) | enum AiQueryServerErrors {

FILE: redisinsight/api/src/modules/ai/query/models/ai-query.intermediate-step.ts
  type AiQueryIntermediateStepType (line 4) | enum AiQueryIntermediateStepType {
  class AiQueryIntermediateStep (line 9) | class AiQueryIntermediateStep {

FILE: redisinsight/api/src/modules/ai/query/models/ai-query.message.ts
  type AiQueryMessageType (line 7) | enum AiQueryMessageType {
  class AiQueryMessage (line 12) | class AiQueryMessage {

FILE: redisinsight/api/src/modules/ai/query/providers/ai-query.provider.ts
  class AiQueryProvider (line 11) | class AiQueryProvider {
    method getSocket (line 14) | async getSocket(auth: AiQueryAuthData): Promise<Socket> {

FILE: redisinsight/api/src/modules/ai/query/providers/auth/local.ai-query-auth.provider.ts
  class LocalAiQueryAuthProvider (line 10) | class LocalAiQueryAuthProvider extends AiQueryAuthProvider {
    method constructor (line 11) | constructor(private readonly cloudUserApiService: CloudUserApiService) {
    method getAuthData (line 15) | async getAuthData(
    method callWithAuthRetry (line 28) | async callWithAuthRetry(

FILE: redisinsight/api/src/modules/ai/query/repositories/in-memory.ai-query.context.repository.ts
  class InMemoryAiQueryContextRepository (line 7) | class InMemoryAiQueryContextRepository extends AiQueryContextRepository {
    method getChatId (line 11) | static getChatId(databaseId: string, accountId: string) {
    method getFullDbContext (line 18) | async getFullDbContext(
    method setFullDbContext (line 34) | async setFullDbContext(
    method getIndexContext (line 53) | async getIndexContext(
    method setIndexContext (line 70) | async setIndexContext(
    method reset (line 90) | async reset(

FILE: redisinsight/api/src/modules/ai/query/repositories/local.ai-query.message.repository.ts
  class LocalAiQueryMessageRepository (line 16) | class LocalAiQueryMessageRepository extends AiQueryMessageRepository {
    method constructor (line 21) | constructor(
    method cleanupDatabaseHistory (line 38) | private async cleanupDatabaseHistory(
    method list (line 60) | async list(
    method createMany (line 87) | async createMany(
    method clearHistory (line 116) | async clearHistory(

FILE: redisinsight/api/src/modules/ai/query/utils/context.util.ts
  type ArrayReplyEntry (line 8) | type ArrayReplyEntry = string | string[];
  type RedisClient (line 10) | type RedisClient = { sendCommand: (args: any, options: any) => Promise<a...
  constant DOCUMENT_SAMPLES_PER_PREFIX (line 12) | const DOCUMENT_SAMPLES_PER_PREFIX = 5;
  constant HSCAN_COUNT (line 13) | const HSCAN_COUNT = 500;

FILE: redisinsight/api/src/modules/analytics/analytics.controller.ts
  class AnalyticsController (line 18) | class AnalyticsController {
    method constructor (line 19) | constructor(private service: AnalyticsService) {}
    method sendEvent (line 31) | async sendEvent(
    method sendPage (line 48) | async sendPage(

FILE: redisinsight/api/src/modules/analytics/analytics.module.ts
  class AnalyticsModule (line 10) | class AnalyticsModule {}

FILE: redisinsight/api/src/modules/analytics/analytics.service.ts
  constant NON_TRACKING_ANONYMOUS_ID (line 14) | const NON_TRACKING_ANONYMOUS_ID = '00000000-0000-0000-0000-000000000001';
  constant SERVER_CONFIG (line 16) | const SERVER_CONFIG = config.get('server') as Config['server'];
  constant ANALYTICS_CONFIG (line 17) | const ANALYTICS_CONFIG = config.get('analytics') as Config['analytics'];
  type ITelemetryEvent (line 19) | interface ITelemetryEvent {
  type ITelemetryInitEvent (line 26) | interface ITelemetryInitEvent {
  type Telemetry (line 37) | enum Telemetry {
  class AnalyticsService (line 43) | class AnalyticsService {
    method constructor (line 58) | constructor(
    method getAnonymousId (line 73) | public getAnonymousId(sessionMetadata?: SessionMetadata): string {
    method getSessionId (line 87) | public getSessionId(sessionMetadata?: SessionMetadata): number {
    method init (line 99) | public async init(initConfig: ITelemetryInitEvent) {
    method sendEvent (line 145) | async sendEvent(sessionMetadata: SessionMetadata, payload: ITelemetryE...
    method sendPage (line 169) | async sendPage(sessionMetadata: SessionMetadata, payload: ITelemetryEv...
    method prepareEventData (line 191) | private async prepareEventData(
    method checkIsAnalyticsGranted (line 234) | private async checkIsAnalyticsGranted(sessionMetadata: SessionMetadata) {

FILE: redisinsight/api/src/modules/analytics/command.telemetry.base.service.spec.ts
  class Service (line 8) | class Service extends CommandTelemetryBaseService {
    method constructor (line 9) | constructor(

FILE: redisinsight/api/src/modules/analytics/command.telemetry.base.service.ts
  method constructor (line 8) | protected constructor(
  method getCommandAdditionalInfo (line 15) | protected async getCommandAdditionalInfo(command: string): Promise<objec...

FILE: redisinsight/api/src/modules/analytics/dto/analytics.dto.ts
  class SendEventDto (line 11) | class SendEventDto {

FILE: redisinsight/api/src/modules/analytics/telemetry.base.service.spec.ts
  class Service (line 11) | class Service extends TelemetryBaseService {
    method constructor (line 12) | constructor(protected eventEmitter: EventEmitter2) {

FILE: redisinsight/api/src/modules/analytics/telemetry.base.service.ts
  method constructor (line 9) | constructor(protected readonly eventEmitter: EventEmitter2) {}
  method sendEvent (line 11) | protected sendEvent(
  method sendFailedEvent (line 31) | protected sendFailedEvent(

FILE: redisinsight/api/src/modules/auth/auth.module.ts
  constant SERVER_CONFIG (line 6) | const SERVER_CONFIG = config.get('server') as Config['server'];
  class AuthModule (line 9) | class AuthModule {
    method register (line 10) | static register() {

FILE: redisinsight/api/src/modules/auth/session-metadata/adapters/session-metadata.adapter.ts
  class SessionMetadataAdapter (line 16) | class SessionMetadataAdapter extends IoAdapter {
    method bindMessageHandlers (line 17) | async bindMessageHandlers(

FILE: redisinsight/api/src/modules/auth/window-auth/adapters/window-auth.adapter.ts
  class WindowsAuthAdapter (line 11) | class WindowsAuthAdapter extends IoAdapter {
    method constructor (line 16) | constructor(private app: INestApplication) {
    method bindMessageHandlers (line 21) | async bindMessageHandlers(

FILE: redisinsight/api/src/modules/auth/window-auth/constants/exceptions.ts
  class WindowUnauthorizedException (line 4) | class WindowUnauthorizedException extends HttpException {
    method constructor (line 5) | constructor(message) {

FILE: redisinsight/api/src/modules/auth/window-auth/middleware/window.auth.middleware.ts
  class WindowAuthMiddleware (line 9) | class WindowAuthMiddleware implements NestMiddleware {
    method constructor (line 12) | constructor(private windowAuthService: WindowAuthService) {}
    method use (line 14) | async use(req: Request, res: Response, next: NextFunction): Promise<an...
    method getWindowIdFromReq (line 26) | private static getWindowIdFromReq(req: Request) {
    method throwError (line 30) | private throwError(req: Request, message: string) {

FILE: redisinsight/api/src/modules/auth/window-auth/window-auth.module.ts
  constant SERVER_CONFIG (line 6) | const SERVER_CONFIG = config.get('server') as Config['server'];
  class WindowAuthModule (line 11) | class WindowAuthModule implements NestModule {
    method configure (line 12) | configure(consumer: MiddlewareConsumer) {

FILE: redisinsight/api/src/modules/auth/window-auth/window-auth.service.spec.ts
  class TestAuthStrategy (line 5) | class TestAuthStrategy extends AbstractWindowAuthStrategy {
    method isAuthorized (line 6) | async isAuthorized(): Promise<boolean> {

FILE: redisinsight/api/src/modules/auth/window-auth/window-auth.service.ts
  class WindowAuthService (line 5) | class WindowAuthService {
    method setStrategy (line 12) | setStrategy(strategy: AbstractWindowAuthStrategy): void {
    method isAuthorized (line 16) | isAuthorized(id: string = ''): Promise<boolean> {

FILE: redisinsight/api/src/modules/azure/auth/azure-auth-callback.template.ts
  type AzureOAuthCallbackResult (line 6) | interface AzureOAuthCallbackResult {
  type GenerateCallbackOptions (line 16) | interface GenerateCallbackOptions {

FILE: redisinsight/api/src/modules/azure/auth/azure-auth.analytics.ts
  class AzureAuthAnalytics (line 8) | class AzureAuthAnalytics extends TelemetryBaseService {
    method constructor (line 9) | constructor(protected eventEmitter: EventEmitter2) {
    method sendAzureSignInSucceeded (line 13) | sendAzureSignInSucceeded(sessionMetadata: SessionMetadata) {
    method sendAzureSignInFailed (line 17) | sendAzureSignInFailed(

FILE: redisinsight/api/src/modules/azure/auth/azure-auth.controller.ts
  class AzureAuthController (line 33) | class AzureAuthController {
    method constructor (line 36) | constructor(
    method login (line 65) | async login(@Query() dto: AzureAuthLoginDto): Promise<{ url: string }> {
    method callback (line 86) | async callback(
    method status (line 230) | async status() {
    method logout (line 247) | async logout(

FILE: redisinsight/api/src/modules/azure/auth/azure-auth.service.ts
  type AuthRequestData (line 59) | interface AuthRequestData {
  constant AUTH_REQUEST_MAX_AGE_MS (line 70) | const AUTH_REQUEST_MAX_AGE_MS = 10 * 60 * 1000;
  class AzureAuthService (line 73) | class AzureAuthService {
    method constructor (line 83) | constructor(private readonly eventEmitter: EventEmitter2) {}
    method cleanupExpiredAuthRequests (line 88) | private cleanupExpiredAuthRequests(): void {
    method removeAuthRequest (line 103) | removeAuthRequest(state: string): AzureOAuthRedirectType | null {
    method getRedirectUri (line 117) | private getRedirectUri(
    method getMsalClient (line 132) | private getMsalClient(): PublicClientApplication {
    method getAuthorizationUrl (line 157) | async getAuthorizationUrl(
    method handleCallback (line 198) | async handleCallback(
    method getStatus (line 252) | async getStatus(): Promise<AzureAuthStatusResponse> {
    method logout (line 278) | async logout(accountId: string): Promise<void> {
    method getRedisTokenByAccountId (line 303) | async getRedisTokenByAccountId(
    method getManagementTokenByAccountId (line 336) | async getManagementTokenByAccountId(
    method getTokenByAccountId (line 346) | private async getTokenByAccountId(

FILE: redisinsight/api/src/modules/azure/auth/dto/azure-auth-login.dto.ts
  type AzureOAuthPrompt (line 9) | enum AzureOAuthPrompt {
  class AzureAuthLoginDto (line 26) | class AzureAuthLoginDto {

FILE: redisinsight/api/src/modules/azure/auth/models/azure-auth.ts
  type AzureTokenResult (line 3) | interface AzureTokenResult {
  type AzureAuthStatusResponse (line 9) | interface AzureAuthStatusResponse {

FILE: redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.analytics.ts
  class AzureAutodiscoveryAnalytics (line 15) | class AzureAutodiscoveryAnalytics extends TelemetryBaseService {
    method constructor (line 16) | constructor(protected eventEmitter: EventEmitter2) {
    method sendAzureSubscriptionsDiscoverySucceeded (line 20) | sendAzureSubscriptionsDiscoverySucceeded(
    method sendAzureSubscriptionsDiscoveryFailed (line 40) | sendAzureSubscriptionsDiscoveryFailed(
    method sendAzureDatabasesDiscoverySucceeded (line 51) | sendAzureDatabasesDiscoverySucceeded(
    method sendAzureDatabasesDiscoveryFailed (line 75) | sendAzureDatabasesDiscoveryFailed(
    method sendAzureDatabaseAdded (line 86) | sendAzureDatabaseAdded(
    method sendAzureDatabaseAddFailed (line 99) | sendAzureDatabaseAddFailed(

FILE: redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.controller.ts
  class AzureAutodiscoveryController (line 29) | class AzureAutodiscoveryController {
    method constructor (line 30) | constructor(
    method validateSubscriptionId (line 36) | private validateSubscriptionId(subscriptionId: string): void {
    method ensureAuthenticated (line 45) | private async ensureAuthenticated(accountId: string): Promise<void> {
    method listSubscriptions (line 77) | async listSubscriptions(
    method listDatabasesInSubscription (line 113) | async listDatabasesInSubscription(
    method addDiscoveredDatabases (line 149) | async addDiscoveredDatabases(

FILE: redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.service.ts
  class AzureAutodiscoveryService (line 27) | class AzureAutodiscoveryService {
    method constructor (line 30) | constructor(
    method getUserFriendlyErrorMessage (line 39) | private getUserFriendlyErrorMessage(error: Error): string {
    method isValidSubscriptionId (line 57) | private isValidSubscriptionId(subscriptionId: string): boolean {
    method getAuthenticatedClient (line 61) | private async getAuthenticatedClient(
    method fetchAllPages (line 87) | private async fetchAllPages<T>(
    method listSubscriptions (line 103) | async listSubscriptions(accountId: string): Promise<AzureSubscription[...
    method listDatabasesInSubscription (line 122) | async listDatabasesInSubscription(
    method getConnectionDetails (line 165) | async getConnectionDetails(
    method findDatabaseById (line 181) | private async findDatabaseById(
    method fetchStandardRedis (line 211) | private async fetchStandardRedis(
    method fetchEnterpriseRedis (line 225) | private async fetchEnterpriseRedis(
    method mapStandardRedis (line 253) | private mapStandardRedis(
    method listEnterpriseDatabases (line 275) | private async listEnterpriseDatabases(
    method extractResourceGroup (line 327) | private extractResourceGroup(resourceId: string): string {
    method getEntraIdConnectionDetails (line 332) | private async getEntraIdConnectionDetails(
    method getTlsPort (line 364) | private getTlsPort(database: AzureRedisDatabase): number {
    method addDatabases (line 378) | async addDatabases(

FILE: redisinsight/api/src/modules/azure/autodiscovery/dto/import-azure-database.dto.ts
  class ImportAzureDatabaseDto (line 4) | class ImportAzureDatabaseDto {

FILE: redisinsight/api/src/modules/azure/autodiscovery/dto/import-azure-database.response.ts
  class ImportAzureDatabaseResponse (line 4) | class ImportAzureDatabaseResponse {

FILE: redisinsight/api/src/modules/azure/autodiscovery/dto/import-azure-databases.dto.ts
  class ImportAzureDatabasesDto (line 13) | class ImportAzureDatabasesDto {

FILE: redisinsight/api/src/modules/azure/azure-token-refresh.manager.ts
  type ScheduledTimer (line 22) | interface ScheduledTimer {
  class AzureTokenRefreshManager (line 28) | class AzureTokenRefreshManager implements OnModuleDestroy {
    method constructor (line 33) | constructor(
    method onModuleDestroy (line 38) | onModuleDestroy(): void {
    method handleTokenAcquired (line 43) | async handleTokenAcquired({
    method scheduleRefresh (line 60) | scheduleRefresh(azureAccountId: string, expiresOn: Date): void {
    method clearTimer (line 105) | clearTimer(azureAccountId: string): void {
    method clearAllTimers (line 113) | clearAllTimers(): void {
    method refreshToken (line 118) | private async refreshToken(azureAccountId: string): Promise<void> {
    method reAuthenticateClients (line 142) | private async reAuthenticateClients(

FILE: redisinsight/api/src/modules/azure/azure.module.ts
  class AzureModule (line 28) | class AzureModule {}

FILE: redisinsight/api/src/modules/azure/constants.ts
  constant AZURE_OAUTH_STORAGE_KEY (line 6) | const AZURE_OAUTH_STORAGE_KEY = 'ri_azure_oauth_result';
  constant AZURE_AUTHORITY (line 12) | const AZURE_AUTHORITY = 'https://login.microsoftonline.com/common';
  constant AZURE_CLIENT_ID (line 17) | const AZURE_CLIENT_ID = '61f3d82d-2bf3-432a-ba1b-c056e4cf0fd0';
  constant AZURE_REDIS_SCOPE (line 23) | const AZURE_REDIS_SCOPE = 'https://redis.azure.com/.default';
  constant AZURE_MANAGEMENT_SCOPE (line 29) | const AZURE_MANAGEMENT_SCOPE = 'https://management.azure.com/.default';
  type AzureOAuthRedirectType (line 36) | enum AzureOAuthRedirectType {
  constant AZURE_OAUTH_DEEPLINK_REDIRECT_PATH (line 44) | const AZURE_OAUTH_DEEPLINK_REDIRECT_PATH =
  constant AZURE_OAUTH_REDIRECT_PATH (line 51) | const AZURE_OAUTH_REDIRECT_PATH = AZURE_OAUTH_DEEPLINK_REDIRECT_PATH;
  constant AZURE_OAUTH_WEB_CALLBACK_ENDPOINT (line 56) | const AZURE_OAUTH_WEB_CALLBACK_ENDPOINT = '/azure/auth/callback';
  constant AZURE_OAUTH_SCOPES (line 70) | const AZURE_OAUTH_SCOPES = [
  type AzureAuthStatus (line 77) | enum AzureAuthStatus {
  type AzureRedisType (line 83) | enum AzureRedisType {
  type AzureAuthType (line 88) | enum AzureAuthType {
  type AzureAccessKeysStatus (line 93) | enum AzureAccessKeysStatus {
  type AzureSubscriptionState (line 103) | enum AzureSubscriptionState {
  type AzureProvisioningState (line 112) | enum AzureProvisioningState {
  constant AZURE_API_BASE (line 116) | const AZURE_API_BASE = 'https://management.azure.com';
  type AzureRedisTokenEvents (line 118) | enum AzureRedisTokenEvents {
  constant TOKEN_REFRESH_BUFFER_MS (line 122) | const TOKEN_REFRESH_BUFFER_MS = 5 * 60 * 1000;
  constant MIN_REFRESH_DELAY_MS (line 125) | const MIN_REFRESH_DELAY_MS = 30 * 1000;
  constant API_VERSION_SUBSCRIPTIONS (line 130) | const API_VERSION_SUBSCRIPTIONS = '2022-12-01';
  constant API_VERSION_REDIS (line 132) | const API_VERSION_REDIS = '2024-11-01';
  constant API_VERSION_REDIS_ENTERPRISE (line 134) | const API_VERSION_REDIS_ENTERPRISE = '2025-07-01';
  constant AUTODISCOVERY_MAX_CONCURRENT_REQUESTS (line 136) | const AUTODISCOVERY_MAX_CONCURRENT_REQUESTS = 20;
  constant AZURE_SUBSCRIPTION_ID_REGEX (line 139) | const AZURE_SUBSCRIPTION_ID_REGEX =

FILE: redisinsight/api/src/modules/azure/exceptions/azure-entra-id-token-expired.exception.ts
  class AzureEntraIdTokenExpiredException (line 9) | class AzureEntraIdTokenExpiredException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/azure/models/azure-resource.ts
  class AzureSubscription (line 8) | class AzureSubscription {
  class AzureRedisSku (line 28) | class AzureRedisSku {
  class AzureRedisDatabase (line 48) | class AzureRedisDatabase {
  class AzureConnectionDetails (line 122) | class AzureConnectionDetails {

FILE: redisinsight/api/src/modules/browser/browser-history/browser-history.controller.ts
  class BrowserHistoryController (line 32) | class BrowserHistoryController {
    method constructor (line 33) | constructor(private readonly service: BrowserHistoryService) {}
    method list (line 50) | async list(
    method delete (line 64) | async delete(
    method bulkDelete (line 85) | async bulkDelete(

FILE: redisinsight/api/src/modules/browser/browser-history/browser-history.module.ts
  class BrowserHistoryModule (line 9) | class BrowserHistoryModule {
    method register (line 10) | static register(

FILE: redisinsight/api/src/modules/browser/browser-history/browser-history.service.ts
  class BrowserHistoryService (line 15) | class BrowserHistoryService {
    method constructor (line 18) | constructor(
    method create (line 27) | public async create(
    method get (line 59) | async get(
    method list (line 71) | async list(
    method delete (line 89) | async delete(
    method bulkDelete (line 111) | async bulkDelete(

FILE: redisinsight/api/src/modules/browser/browser-history/dto/create.browser-history.dto.ts
  class CreateBrowserHistoryDto (line 7) | class CreateBrowserHistoryDto {

FILE: redisinsight/api/src/modules/browser/browser-history/dto/delete.browser-history.dto.ts
  class DeleteBrowserHistoryItemsDto (line 5) | class DeleteBrowserHistoryItemsDto {

FILE: redisinsight/api/src/modules/browser/browser-history/dto/delete.browser-history.query.dto.ts
  class DeleteBrowserHistoryQueryDto (line 5) | class DeleteBrowserHistoryQueryDto {

FILE: redisinsight/api/src/modules/browser/browser-history/dto/delete.browser-history.response.dto.ts
  class DeleteBrowserHistoryItemsResponse (line 3) | class DeleteBrowserHistoryItemsResponse {

FILE: redisinsight/api/src/modules/browser/browser-history/dto/get.browser-history.dto.ts
  class ScanFilter (line 7) | class ScanFilter {
  class BrowserHistory (line 34) | class BrowserHistory {

FILE: redisinsight/api/src/modules/browser/browser-history/dto/list.browser-history.dto.ts
  class ListBrowserHistoryDto (line 4) | class ListBrowserHistoryDto {

FILE: redisinsight/api/src/modules/browser/browser-history/entities/browser-history.entity.ts
  class BrowserHistoryEntity (line 16) | class BrowserHistoryEntity {
    method constructor (line 50) | constructor(entity: Partial<BrowserHistoryEntity>) {

FILE: redisinsight/api/src/modules/browser/browser-history/repositories/local.browser-history.repository.ts
  constant BROWSER_HISTORY_CONFIG (line 21) | const BROWSER_HISTORY_CONFIG = config.get('browser_history');
  class LocalBrowserHistoryRepository (line 24) | class LocalBrowserHistoryRepository extends BrowserHistoryRepository {
    method constructor (line 29) | constructor(
    method create (line 44) | async create(
    method get (line 79) | async get(
    method list (line 107) | async list(
    method delete (line 145) | async delete(
    method cleanupDatabaseHistory (line 176) | async cleanupDatabaseHistory(

FILE: redisinsight/api/src/modules/browser/browser.base.controller.ts
  class BrowserBaseController (line 6) | class BrowserBaseController {}

FILE: redisinsight/api/src/modules/browser/browser.module.ts
  class BrowserModule (line 18) | class BrowserModule {
    method register (line 19) | static register(

FILE: redisinsight/api/src/modules/browser/constants/browser-tool-commands.ts
  type BrowserToolKeysCommands (line 1) | enum BrowserToolKeysCommands {
  type BrowserToolStringCommands (line 15) | enum BrowserToolStringCommands {
  type BrowserToolHashCommands (line 22) | enum BrowserToolHashCommands {
  type BrowserToolListCommands (line 35) | enum BrowserToolListCommands {
  type BrowserToolSetCommands (line 48) | enum BrowserToolSetCommands {
  type BrowserToolZSetCommands (line 56) | enum BrowserToolZSetCommands {
  type BrowserToolRejsonRlCommands (line 66) | enum BrowserToolRejsonRlCommands {
  type BrowserToolGraphCommands (line 79) | enum BrowserToolGraphCommands {
  type BrowserToolStreamCommands (line 82) | enum BrowserToolStreamCommands {
  type BrowserToolTSCommands (line 100) | enum BrowserToolTSCommands {
  type BrowserToolCommands (line 104) | type BrowserToolCommands =

FILE: redisinsight/api/src/modules/browser/hash/dto/add.fields-to-hash.dto.ts
  class AddFieldsToHashDto (line 12) | class AddFieldsToHashDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/hash/dto/create.hash-with-expire.dto.ts
  class CreateHashWithExpireDto (line 5) | class CreateHashWithExpireDto extends IntersectionType(

FILE: redisinsight/api/src/modules/browser/hash/dto/delete.fields-from-hash.dto.ts
  class DeleteFieldsFromHashDto (line 7) | class DeleteFieldsFromHashDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/hash/dto/delete.fields-from-hash.response.ts
  class DeleteFieldsFromHashResponse (line 3) | class DeleteFieldsFromHashResponse {

FILE: redisinsight/api/src/modules/browser/hash/dto/get.hash-fields.dto.ts
  class GetHashFieldsDto (line 3) | class GetHashFieldsDto extends ScanDataTypeDto {}

FILE: redisinsight/api/src/modules/browser/hash/dto/get.hash-fields.response.ts
  class HashScanResponse (line 5) | class HashScanResponse extends KeyResponse {
  class GetHashFieldsResponse (line 23) | class GetHashFieldsResponse extends HashScanResponse {

FILE: redisinsight/api/src/modules/browser/hash/dto/hash-field-ttl.dto.ts
  class HashFieldTtlDto (line 6) | class HashFieldTtlDto extends PickType(HashFieldDto, [

FILE: redisinsight/api/src/modules/browser/hash/dto/hash-field.dto.ts
  class HashFieldDto (line 7) | class HashFieldDto {

FILE: redisinsight/api/src/modules/browser/hash/dto/update.hash-fields-ttl.dto.ts
  class UpdateHashFieldsTtlDto (line 12) | class UpdateHashFieldsTtlDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/hash/hash.controller.ts
  class HashController (line 35) | class HashController extends BrowserBaseController {
    method constructor (line 36) | constructor(private hashService: HashService) {
    method createHash (line 45) | async createHash(
    method getMembers (line 65) | async getMembers(
    method addMember (line 79) | async addMember(
    method updateTtl (line 93) | async updateTtl(
    method deleteFields (line 107) | async deleteFields(

FILE: redisinsight/api/src/modules/browser/hash/hash.module.ts
  class HashModule (line 7) | class HashModule {
    method register (line 8) | static register({ route }): DynamicModule {

FILE: redisinsight/api/src/modules/browser/hash/hash.service.spec.ts
  constant REDIS_SCAN_CONFIG (line 51) | const REDIS_SCAN_CONFIG = apiConfig.get('redis_scan') as Config['redis_s...

FILE: redisinsight/api/src/modules/browser/hash/hash.service.ts
  constant REDIS_SCAN_CONFIG (line 47) | const REDIS_SCAN_CONFIG = config.get('redis_scan') as Config['redis_scan'];
  class HashService (line 50) | class HashService {
    method constructor (line 53) | constructor(
    method getFieldExpireCommands (line 58) | static getFieldExpireCommands(keyName: RedisString, fields: HashFieldD...
    method createHash (line 74) | public async createHash(
    method getFields (line 122) | public async getFields(
    method addFields (line 219) | public async addFields(
    method updateTtl (line 265) | public async updateTtl(
    method deleteFields (line 321) | public async deleteFields(
    method scanHash (line 360) | public async scanHash(

FILE: redisinsight/api/src/modules/browser/keys/dto/delete.keys.dto.ts
  class DeleteKeysDto (line 6) | class DeleteKeysDto {

FILE: redisinsight/api/src/modules/browser/keys/dto/delete.keys.response.ts
  class DeleteKeysResponse (line 3) | class DeleteKeysResponse {

FILE: redisinsight/api/src/modules/browser/keys/dto/get.keys-info.dto.ts
  class GetKeyInfoDto (line 7) | class GetKeyInfoDto extends KeyDto {
  class GetKeysInfoDto (line 18) | class GetKeysInfoDto {

FILE: redisinsight/api/src/modules/browser/keys/dto/get.keys-info.response.ts
  class GetKeyInfoResponse (line 5) | class GetKeyInfoResponse {

FILE: redisinsight/api/src/modules/browser/keys/dto/get.keys-with-details.response.ts
  class GetKeysWithDetailsResponse (line 6) | class GetKeysWithDetailsResponse {

FILE: redisinsight/api/src/modules/browser/keys/dto/get.keys.dto.ts
  class GetKeysDto (line 19) | class GetKeysDto {

FILE: redisinsight/api/src/modules/browser/keys/dto/get.namespace-searchable.dto.ts
  class GetNamespaceSearchableDto (line 6) | class GetNamespaceSearchableDto {
  class NamespaceSearchableKeyResponse (line 18) | class NamespaceSearchableKeyResponse {
  class NamespaceSearchableResponse (line 33) | class NamespaceSearchableResponse {

FILE: redisinsight/api/src/modules/browser/keys/dto/key-with-expire.dto.ts
  class KeyWithExpireDto (line 6) | class KeyWithExpireDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/keys/dto/key.dto.ts
  type RedisDataType (line 6) | enum RedisDataType {
  class KeyDto (line 18) | class KeyDto {

FILE: redisinsight/api/src/modules/browser/keys/dto/rename.key.dto.ts
  class RenameKeyDto (line 7) | class RenameKeyDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/keys/dto/rename.key.response.ts
  class KeyResponse (line 6) | class KeyResponse {
  class RenameKeyResponse (line 17) | class RenameKeyResponse extends KeyResponse {}

FILE: redisinsight/api/src/modules/browser/keys/dto/scan-data-type.dto.ts
  class ScanDataTypeDto (line 6) | class ScanDataTypeDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/keys/dto/update.key-ttl.dto.ts
  class UpdateKeyTtlDto (line 6) | class UpdateKeyTtlDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/keys/dto/update.key-ttl.response.ts
  class KeyTtlResponse (line 4) | class KeyTtlResponse {

FILE: redisinsight/api/src/modules/browser/keys/key-info/key-info.provider.ts
  class KeyInfoProvider (line 16) | class KeyInfoProvider {
    method constructor (line 17) | constructor(
    method getStrategy (line 30) | getStrategy(type?: string): KeyInfoStrategy {

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/graph.key-info.strategy.ts
  class GraphKeyInfoStrategy (line 13) | class GraphKeyInfoStrategy extends KeyInfoStrategy {
    method getInfo (line 14) | public async getInfo(
    method getNodesCount (line 36) | private async getNodesCount(

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/hash.key-info.strategy.ts
  class HashKeyInfoStrategy (line 13) | class HashKeyInfoStrategy extends KeyInfoStrategy {
    method getInfo (line 14) | public async getInfo(

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/list.key-info.strategy.ts
  class ListKeyInfoStrategy (line 13) | class ListKeyInfoStrategy extends KeyInfoStrategy {
    method getInfo (line 14) | public async getInfo(

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/rejson-rl.key-info.strategy.ts
  class RejsonRlKeyInfoStrategy (line 13) | class RejsonRlKeyInfoStrategy extends KeyInfoStrategy {
    method getInfo (line 14) | public async getInfo(
    method getLength (line 62) | private async getLength(

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/set.key-info.strategy.ts
  class SetKeyInfoStrategy (line 13) | class SetKeyInfoStrategy extends KeyInfoStrategy {
    method getInfo (line 14) | public async getInfo(

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/stream.key-info.strategy.ts
  class StreamKeyInfoStrategy (line 13) | class StreamKeyInfoStrategy extends KeyInfoStrategy {
    method getInfo (line 14) | public async getInfo(

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/string.key-info.strategy.ts
  class StringKeyInfoStrategy (line 13) | class StringKeyInfoStrategy extends KeyInfoStrategy {
    method getInfo (line 14) | public async getInfo(

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/ts.key-info.strategy.ts
  class TsKeyInfoStrategy (line 14) | class TsKeyInfoStrategy extends KeyInfoStrategy {
    method getTotalSamples (line 15) | private async getTotalSamples(
    method getInfo (line 31) | public async getInfo(

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/unsupported.key-info.strategy.ts
  class UnsupportedKeyInfoStrategy (line 7) | class UnsupportedKeyInfoStrategy extends KeyInfoStrategy {
    method getInfo (line 8) | public async getInfo(

FILE: redisinsight/api/src/modules/browser/keys/key-info/strategies/z-set.key-info.strategy.ts
  class ZSetKeyInfoStrategy (line 13) | class ZSetKeyInfoStrategy extends KeyInfoStrategy {
    method getInfo (line 14) | public async getInfo(

FILE: redisinsight/api/src/modules/browser/keys/keys.controller.ts
  class KeysController (line 39) | class KeysController {
    method constructor (line 40) | constructor(private keysService: KeysService) {}
    method getKeys (line 51) | async getKeys(
    method getKeysInfo (line 68) | async getKeysInfo(
    method getKeyInfo (line 86) | async getKeyInfo(
    method getNamespaceSearchable (line 109) | async getNamespaceSearchable(
    method deleteKey (line 125) | async deleteKey(
    method renameKey (line 141) | async renameKey(
    method updateTtl (line 157) | async updateTtl(

FILE: redisinsight/api/src/modules/browser/keys/keys.module.ts
  class KeysModule (line 21) | class KeysModule {
    method register (line 22) | static register({ route }): DynamicModule {

FILE: redisinsight/api/src/modules/browser/keys/keys.service.ts
  class KeysService (line 43) | class KeysService {
    method constructor (line 46) | constructor(
    method getKeys (line 54) | public async getKeys(
    method getKeysInfo (line 111) | public async getKeysInfo(
    method getKeyInfo (line 144) | public async getKeyInfo(
    method deleteKeys (line 198) | public async deleteKeys(
    method renameKey (line 237) | public async renameKey(
    method getNamespaceSearchable (line 285) | public async getNamespaceSearchable(
    method findFirstSearchableKey (line 322) | private async findFirstSearchableKey(
    method updateTtl (line 391) | public async updateTtl(
    method setKeyExpiration (line 406) | public async setKeyExpiration(
    method removeKeyExpiration (line 452) | public async removeKeyExpiration(

FILE: redisinsight/api/src/modules/browser/keys/scanner/scanner.interface.ts
  type IScannerGetKeysArgs (line 8) | interface IScannerGetKeysArgs {
  type IScannerNodeKeys (line 17) | interface IScannerNodeKeys {
  type IScannerStrategy (line 27) | interface IScannerStrategy {

FILE: redisinsight/api/src/modules/browser/keys/scanner/scanner.ts
  class Scanner (line 8) | class Scanner {
    method constructor (line 9) | constructor(
    method getStrategy (line 14) | getStrategy(connectionType: RedisClientConnectionType): ScannerStrategy {

FILE: redisinsight/api/src/modules/browser/keys/scanner/strategies/cluster.scanner.strategy.ts
  constant REDIS_SCAN_CONFIG (line 25) | const REDIS_SCAN_CONFIG = config.get('redis_scan');
  class ClusterScannerStrategy (line 28) | class ClusterScannerStrategy extends ScannerStrategy {
    method getNodesToScan (line 29) | private async getNodesToScan(
    method calculateNodesTotalKeys (line 64) | private async calculateNodesTotalKeys(
    method scanNodes (line 78) | private async scanNodes(
    method getKeys (line 113) | public async getKeys(
    method getKeysInfo (line 190) | public async getKeysInfo(

FILE: redisinsight/api/src/modules/browser/keys/scanner/strategies/standalone.scanner.strategy.spec.ts
  constant REDIS_SCAN_CONFIG (line 16) | const REDIS_SCAN_CONFIG = config.get('redis_scan');

FILE: redisinsight/api/src/modules/browser/keys/scanner/strategies/standalone.scanner.strategy.ts
  constant REDIS_SCAN_CONFIG (line 21) | const REDIS_SCAN_CONFIG = config.get('redis_scan');
  class StandaloneScannerStrategy (line 24) | class StandaloneScannerStrategy extends ScannerStrategy {
    method getKeysTtl (line 31) | private async getKeysTtl(
    method getKeysType (line 48) | private async getKeysType(
    method getKeysSize (line 66) | private async getKeysSize(
    method scan (line 82) | private async scan(
    method getKeys (line 121) | public async getKeys(
    method getKeysInfo (line 189) | public async getKeysInfo(

FILE: redisinsight/api/src/modules/browser/list/dto/create.list-with-expire.dto.ts
  class CreateListWithExpireDto (line 5) | class CreateListWithExpireDto extends IntersectionType(

FILE: redisinsight/api/src/modules/browser/list/dto/delete.list-elements.dto.ts
  class DeleteListElementsDto (line 7) | class DeleteListElementsDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/list/dto/delete.list-elements.response.ts
  class DeleteListElementsResponse (line 5) | class DeleteListElementsResponse {

FILE: redisinsight/api/src/modules/browser/list/dto/get.list-element.response.ts
  class GetListElementResponse (line 6) | class GetListElementResponse extends KeyResponse {

FILE: redisinsight/api/src/modules/browser/list/dto/get.list-elements.dto.ts
  class GetListElementsDto (line 6) | class GetListElementsDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/list/dto/get.list-elements.response.ts
  class GetListElementsResponse (line 6) | class GetListElementsResponse extends KeyResponse {

FILE: redisinsight/api/src/modules/browser/list/dto/push.element-to-list.dto.ts
  type ListElementDestination (line 7) | enum ListElementDestination {
  class PushElementToListDto (line 12) | class PushElementToListDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/list/dto/push.list-elements.response.ts
  class PushListElementsResponse (line 4) | class PushListElementsResponse extends KeyResponse {

FILE: redisinsight/api/src/modules/browser/list/dto/set.list-element.dto.ts
  class SetListElementDto (line 7) | class SetListElementDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/list/dto/set.list-element.response.ts
  class SetListElementResponse (line 5) | class SetListElementResponse {

FILE: redisinsight/api/src/modules/browser/list/list.controller.ts
  class ListController (line 47) | class ListController extends BrowserBaseController {
    method constructor (line 48) | constructor(private listService: ListService) {
    method createList (line 57) | async createList(
    method pushElement (line 77) | async pushElement(
    method getElements (line 96) | async getElements(
    method updateElement (line 110) | async updateElement(
    method getElement (line 139) | async getElement(
    method deleteElement (line 161) | async deleteElement(

FILE: redisinsight/api/src/modules/browser/list/list.module.ts
  class ListModule (line 7) | class ListModule {
    method register (line 8) | static register({ route }): DynamicModule {

FILE: redisinsight/api/src/modules/browser/list/list.service.ts
  class ListService (line 39) | class ListService {
    method constructor (line 42) | constructor(private databaseClientFactory: DatabaseClientFactory) {}
    method createList (line 44) | public async createList(
    method pushElement (line 74) | public async pushElement(
    method getElements (line 122) | public async getElements(
    method getElement (line 182) | public async getElement(
    method setElement (line 224) | public async setElement(
    method deleteElements (line 269) | public async deleteElements(
    method createSimpleList (line 325) | public async createSimpleList(
    method createListWithExpiration (line 339) | public async createListWithExpiration(

FILE: redisinsight/api/src/modules/browser/redisearch/dto/create.redisearch-index.dto.ts
  type RedisearchIndexKeyType (line 13) | enum RedisearchIndexKeyType {
  type RedisearchIndexDataType (line 18) | enum RedisearchIndexDataType {
  class CreateRedisearchIndexFieldDto (line 27) | class CreateRedisearchIndexFieldDto {
  class CreateRedisearchIndexDto (line 50) | class CreateRedisearchIndexDto {

FILE: redisinsight/api/src/modules/browser/redisearch/dto/index.delete.dto.ts
  class IndexDeleteRequestBodyDto (line 6) | class IndexDeleteRequestBodyDto {

FILE: redisinsight/api/src/modules/browser/redisearch/dto/index.info.dto.ts
  class IndexInfoRequestBodyDto (line 7) | class IndexInfoRequestBodyDto {
  class IndexOptionsDto (line 18) | class IndexOptionsDto {
  class IndexDefinitionDto (line 36) | class IndexDefinitionDto {
  class IndexAttibuteDto (line 68) | class IndexAttibuteDto {
  class FieldStatisticsDto (line 144) | class FieldStatisticsDto {
  class IndexInfoDto (line 169) | class IndexInfoDto {

FILE: redisinsight/api/src/modules/browser/redisearch/dto/key-indexes.dto.ts
  class KeyIndexesDto (line 7) | class KeyIndexesDto {
  class IndexSummaryDto (line 18) | class IndexSummaryDto {
  class KeyIndexesResponse (line 42) | class KeyIndexesResponse {

FILE: redisinsight/api/src/modules/browser/redisearch/dto/list.redisearch-indexes.response.ts
  class ListRedisearchIndexesResponse (line 5) | class ListRedisearchIndexesResponse {

FILE: redisinsight/api/src/modules/browser/redisearch/dto/search.redisearch.dto.ts
  class SearchRedisearchDto (line 6) | class SearchRedisearchDto {

FILE: redisinsight/api/src/modules/browser/redisearch/key-indexes.service.ts
  type IndexEntry (line 17) | interface IndexEntry {
  class KeyIndexesService (line 23) | class KeyIndexesService {
    method constructor (line 26) | constructor(private databaseClientFactory: DatabaseClientFactory) {}
    method getKeyIndexes (line 32) | public async getKeyIndexes(
    method listIndexNames (line 57) | private async listIndexNames(client: RedisClient): Promise<string[]> {
    method fetchIndexesInfo (line 69) | private async fetchIndexesInfo(
    method findMatchingIndexes (line 94) | private findMatchingIndexes(

FILE: redisinsight/api/src/modules/browser/redisearch/redisearch.controller.ts
  class RedisearchController (line 37) | class RedisearchController extends BrowserBaseController {
    method constructor (line 38) | constructor(
    method list (line 50) | async list(
    method createIndex (line 61) | async createIndex(
    method search (line 74) | async search(
    method info (line 85) | async info(
    method delete (line 95) | async delete(
    method getKeyIndexes (line 106) | async getKeyIndexes(

FILE: redisinsight/api/src/modules/browser/redisearch/redisearch.module.ts
  class RedisearchModule (line 8) | class RedisearchModule {
    method register (line 9) | static register({ route }): DynamicModule {

FILE: redisinsight/api/src/modules/browser/redisearch/redisearch.service.ts
  class RedisearchService (line 30) | class RedisearchService {
    method constructor (line 35) | constructor(
    method list (line 45) | public async list(
    method createIndex (line 76) | public async createIndex(
    method getInfo (line 157) | public async getInfo(
    method search (line 191) | public async search(
    method deleteIndex (line 276) | public async deleteIndex(

FILE: redisinsight/api/src/modules/browser/rejson-rl/dto/create.rejson-rl-with-expire.dto.ts
  class CreateRejsonRlWithExpireDto (line 5) | class CreateRejsonRlWithExpireDto extends IntersectionType(

FILE: redisinsight/api/src/modules/browser/rejson-rl/dto/create.rejson-rl.dto.ts
  class CreateRejsonRlDto (line 6) | class CreateRejsonRlDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/rejson-rl/dto/get.rejson-rl.dto.ts
  class GetRejsonRlDto (line 5) | class GetRejsonRlDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/rejson-rl/dto/get.rejson-rl.response.ts
  class GetRejsonRlResponseDto (line 4) | class GetRejsonRlResponseDto {

FILE: redisinsight/api/src/modules/browser/rejson-rl/dto/modify.rejson-rl-arr-append.dto.ts
  class ModifyRejsonRlArrAppendDto (line 6) | class ModifyRejsonRlArrAppendDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/rejson-rl/dto/modify.rejson-rl-set.dto.ts
  class ModifyRejsonRlSetDto (line 6) | class ModifyRejsonRlSetDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/rejson-rl/dto/remove.rejson-rl.dto.ts
  class RemoveRejsonRlDto (line 5) | class RemoveRejsonRlDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/rejson-rl/dto/remove.rejson-rl.response.ts
  class RemoveRejsonRlResponse (line 3) | class RemoveRejsonRlResponse {

FILE: redisinsight/api/src/modules/browser/rejson-rl/dto/safe.rejson-rl-data.dto.ts
  type RejsonRlDataType (line 3) | enum RejsonRlDataType {
  class SafeRejsonRlDataDto (line 13) | class SafeRejsonRlDataDto {

FILE: redisinsight/api/src/modules/browser/rejson-rl/rejson-rl.controller.ts
  class RejsonRlController (line 29) | class RejsonRlController extends BrowserBaseController {
    method constructor (line 30) | constructor(private service: RejsonRlService) {
    method getJson (line 47) | async getJson(
    method createJson (line 59) | async createJson(
    method jsonSet (line 71) | async jsonSet(
    method arrAppend (line 83) | async arrAppend(
    method remove (line 95) | async remove(

FILE: redisinsight/api/src/modules/browser/rejson-rl/rejson-rl.module.ts
  class RejsonRlModule (line 7) | class RejsonRlModule {
    method register (line 8) | static register({ route }): DynamicModule {

FILE: redisinsight/api/src/modules/browser/rejson-rl/rejson-rl.service.ts
  constant MODULES_CONFIG (line 37) | const MODULES_CONFIG = config.get('modules') as Config['modules'];
  class RejsonRlService (line 44) | class RejsonRlService {
    method constructor (line 47) | constructor(
    method prepareJsonPath (line 52) | private async prepareJsonPath(
    method forceGetJson (line 78) | private async forceGetJson(
    method estimateSize (line 97) | private async estimateSize(
    method getObjectKeys (line 124) | private async getObjectKeys(
    method getJsonDataType (line 137) | private async getJsonDataType(
    method isUnsafeBigJsonLength (line 150) | private async isUnsafeBigJsonLength(
    method getDetails (line 192) | private async getDetails(
    method safeGetJsonByType (line 232) | private async safeGetJsonByType(
    method create (line 285) | public async create(
    method getJson (line 348) | public async getJson(
    method jsonSet (line 421) | public async jsonSet(
    method arrAppend (line 480) | public async arrAppend(
    method remove (line 536) | public async remove(

FILE: redisinsight/api/src/modules/browser/set/dto/add.members-to-set.dto.ts
  class AddMembersToSetDto (line 7) | class AddMembersToSetDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/set/dto/create.set-with-expire.dto.ts
  class CreateSetWithExpireDto (line 5) | class CreateSetWithExpireDto extends IntersectionType(

FILE: redisinsight/api/src/modules/browser/set/dto/delete.members-from-set.dto.ts
  class DeleteMembersFromSetDto (line 7) | class DeleteMembersFromSetDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/set/dto/delete.members-from-set.response.ts
  class DeleteMembersFromSetResponse (line 3) | class DeleteMembersFromSetResponse {

FILE: redisinsight/api/src/modules/browser/set/dto/get.set-members.dto.ts
  class GetSetMembersDto (line 3) | class GetSetMembersDto extends ScanDataTypeDto {}

FILE: redisinsight/api/src/modules/browser/set/dto/get.set-members.response.ts
  class SetScanResponse (line 6) | class SetScanResponse extends KeyResponse {
  class GetSetMembersResponse (line 25) | class GetSetMembersResponse extends SetScanResponse {

FILE: redisinsight/api/src/modules/browser/set/set.controller.ts
  class SetController (line 33) | class SetController extends BrowserBaseController {
    method constructor (line 34) | constructor(private setService: SetService) {
    method createSet (line 43) | async createSet(
    method getMembers (line 63) | async getMembers(
    method addMembers (line 77) | async addMembers(
    method deleteMembers (line 91) | async deleteMembers(

FILE: redisinsight/api/src/modules/browser/set/set.module.ts
  class SetModule (line 7) | class SetModule {
    method register (line 8) | static register({ route }): DynamicModule {

FILE: redisinsight/api/src/modules/browser/set/set.service.ts
  constant REDIS_SCAN_CONFIG (line 39) | const REDIS_SCAN_CONFIG = config.get('redis_scan');
  class SetService (line 42) | class SetService {
    method constructor (line 45) | constructor(private databaseClientFactory: DatabaseClientFactory) {}
    method createSet (line 47) | public async createSet(
    method getMembers (line 80) | public async getMembers(
    method addMembers (line 145) | public async addMembers(
    method deleteMembers (line 181) | public async deleteMembers(
    method createSimpleSet (line 220) | public async createSimpleSet(
    method createSetWithExpiration (line 232) | public async createSetWithExpiration(
    method scanSet (line 250) | public async scanSet(

FILE: redisinsight/api/src/modules/browser/stream/controllers/consumer-group.controller.ts
  class ConsumerGroupController (line 32) | class ConsumerGroupController extends BrowserBaseController {
    method constructor (line 33) | constructor(private service: ConsumerGroupService) {
    method getGroups (line 51) | async getGroups(
    method createGroups (line 63) | async createGroups(
    method updateGroup (line 75) | async updateGroup(
    method deleteGroup (line 94) | async deleteGroup(

FILE: redisinsight/api/src/modules/browser/stream/controllers/consumer.controller.ts
  class ConsumerController (line 35) | class ConsumerController extends BrowserBaseController {
    method constructor (line 36) | constructor(private service: ConsumerService) {
    method getConsumers (line 53) | async getConsumers(
    method deleteConsumers (line 65) | async deleteConsumers(
    method getPendingEntries (line 85) | async getPendingEntries(
    method ackPendingEntries (line 103) | async ackPendingEntries(
    method claimPendingEntries (line 121) | async claimPendingEntries(

FILE: redisinsight/api/src/modules/browser/stream/controllers/stream.controller.ts
  class StreamController (line 31) | class StreamController {
    method constructor (line 32) | constructor(private service: StreamService) {}
    method createStream (line 39) | async createStream(
    method addEntries (line 59) | async addEntries(
    method getEntries (line 79) | async getEntries(
    method deleteEntries (line 98) | async deleteEntries(

FILE: redisinsight/api/src/modules/browser/stream/dto/ack.pending-entries.dto.ts
  class AckPendingEntriesDto (line 7) | class AckPendingEntriesDto extends GetConsumersDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/ack.pending-entries.response.ts
  class AckPendingEntriesResponse (line 3) | class AckPendingEntriesResponse {

FILE: redisinsight/api/src/modules/browser/stream/dto/add.stream-entries.dto.ts
  class AddStreamEntriesDto (line 12) | class AddStreamEntriesDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/add.stream-entries.response.ts
  class AddStreamEntriesResponse (line 4) | class AddStreamEntriesResponse extends KeyResponse {

FILE: redisinsight/api/src/modules/browser/stream/dto/claim.pending-entries.response.ts
  class ClaimPendingEntriesResponse (line 5) | class ClaimPendingEntriesResponse {

FILE: redisinsight/api/src/modules/browser/stream/dto/claim.pending-entry.dto.ts
  class ClaimPendingEntryDto (line 17) | class ClaimPendingEntryDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/create.consumer-groups.dto.ts
  class ConsumerGroupDto (line 14) | class ConsumerGroupDto {
  class CreateConsumerGroupDto (line 59) | class CreateConsumerGroupDto {
  class CreateConsumerGroupsDto (line 80) | class CreateConsumerGroupsDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/create.stream.dto.ts
  class CreateStreamDto (line 5) | class CreateStreamDto extends IntersectionType(

FILE: redisinsight/api/src/modules/browser/stream/dto/delete.consumer-groups.dto.ts
  class DeleteConsumerGroupsDto (line 7) | class DeleteConsumerGroupsDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/delete.consumer-groups.response.ts
  class DeleteConsumerGroupsResponse (line 3) | class DeleteConsumerGroupsResponse {

FILE: redisinsight/api/src/modules/browser/stream/dto/delete.consumers.dto.ts
  class DeleteConsumersDto (line 7) | class DeleteConsumersDto extends GetConsumersDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/delete.stream-entries.dto.ts
  class DeleteStreamEntriesDto (line 6) | class DeleteStreamEntriesDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/delete.stream-entries.response.ts
  class DeleteStreamEntriesResponse (line 3) | class DeleteStreamEntriesResponse {

FILE: redisinsight/api/src/modules/browser/stream/dto/get.consumers.dto.ts
  class ConsumerDto (line 7) | class ConsumerDto {
  class GetConsumersDto (line 34) | class GetConsumersDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/get.pending-entries.dto.ts
  class PendingEntryDto (line 12) | class PendingEntryDto {
  class GetPendingEntriesDto (line 45) | class GetPendingEntriesDto extends IntersectionType(

FILE: redisinsight/api/src/modules/browser/stream/dto/get.stream-entries.dto.ts
  class GetStreamEntriesDto (line 6) | class GetStreamEntriesDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/get.stream-entries.response.ts
  class GetStreamEntriesResponse (line 6) | class GetStreamEntriesResponse extends KeyResponse {

FILE: redisinsight/api/src/modules/browser/stream/dto/stream-entry.dto.ts
  class StreamEntryFieldDto (line 14) | class StreamEntryFieldDto {
  class StreamEntryDto (line 38) | class StreamEntryDto {

FILE: redisinsight/api/src/modules/browser/stream/dto/update.consumer-group.dto.ts
  class UpdateConsumerGroupDto (line 5) | class UpdateConsumerGroupDto extends IntersectionType(

FILE: redisinsight/api/src/modules/browser/stream/services/consumer-group.service.spec.ts
  constant REDIS_CLIENTS_CONFIG (line 33) | const REDIS_CLIENTS_CONFIG = config.get(
  constant BIG_STRING_PREFIX (line 36) | const BIG_STRING_PREFIX = REDIS_CLIENTS_CONFIG.truncatedStringPrefix;

FILE: redisinsight/api/src/modules/browser/stream/services/consumer-group.service.ts
  class ConsumerGroupService (line 35) | class ConsumerGroupService {
    method constructor (line 38) | constructor(private databaseClientFactory: DatabaseClientFactory) {}
    method getGroups (line 47) | async getGroups(
    method getGroupInfo (line 93) | async getGroupInfo(
    method createGroups (line 120) | async createGroups(
    method updateGroup (line 171) | async updateGroup(
    method deleteGroup (line 214) | async deleteGroup(
    method formatReplyToDto (line 285) | static formatReplyToDto(
    method formatArrayToDto (line 295) | static formatArrayToDto(

FILE: redisinsight/api/src/modules/browser/stream/services/consumer.service.ts
  class ConsumerService (line 32) | class ConsumerService {
    method constructor (line 35) | constructor(private databaseClientFactory: DatabaseClientFactory) {}
    method getConsumers (line 42) | async getConsumers(
    method deleteConsumers (line 83) | async deleteConsumers(
    method getPendingEntries (line 133) | async getPendingEntries(
    method ackPendingEntries (line 178) | async ackPendingEntries(
    method claimPendingEntries (line 220) | async claimPendingEntries(
    method formatReplyToDto (line 313) | static formatReplyToDto(reply: Array<Array<string | number>>): Consume...
    method formatArrayToDto (line 321) | static formatArrayToDto(entry: Array<string | number>): ConsumerDto {
    method formatReplyToPendingEntriesDto (line 355) | static formatReplyToPendingEntriesDto(
    method formatArrayToPendingEntryDto (line 365) | static formatArrayToPendingEntryDto(

FILE: redisinsight/api/src/modules/browser/stream/services/stream.service.ts
  class StreamService (line 38) | class StreamService {
    method constructor (line 41) | constructor(private databaseClientFactory: DatabaseClientFactory) {}
    method getEntries (line 51) | public async getEntries(
    method getRange (line 118) | public async getRange(
    method getRevRange (line 142) | public async getRevRange(
    method createStream (line 165) | public async createStream(
    method addEntries (line 229) | public async addEntries(
    method deleteEntries (line 297) | public async deleteEntries(
    method formatReplyToDto (line 353) | static formatReplyToDto(reply: Array<string | string[]>): StreamEntryD...
    method formatArrayToDto (line 361) | static formatArrayToDto(entry: Array<string>): StreamEntryDto {

FILE: redisinsight/api/src/modules/browser/stream/stream.module.ts
  class StreamModule (line 11) | class StreamModule {
    method register (line 12) | static register({ route }): DynamicModule {

FILE: redisinsight/api/src/modules/browser/string/dto/get.string-info.dto.ts
  class GetStringInfoDto (line 7) | class GetStringInfoDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/string/dto/get.string-value.response.ts
  class GetStringValueResponse (line 6) | class GetStringValueResponse extends KeyResponse {

FILE: redisinsight/api/src/modules/browser/string/dto/set.string-with-expire.dto.ts
  class SetStringWithExpireDto (line 5) | class SetStringWithExpireDto extends IntersectionType(

FILE: redisinsight/api/src/modules/browser/string/dto/set.string.dto.ts
  class SetStringDto (line 7) | class SetStringDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/string/string.controller.ts
  class StringController (line 34) | class StringController extends BrowserBaseController {
    method constructor (line 35) | constructor(private stringService: StringService) {
    method setString (line 44) | async setString(
    method getStringValue (line 62) | async getStringValue(
    method downloadStringFile (line 77) | async downloadStringFile(
    method updateStringValue (line 99) | async updateStringValue(

FILE: redisinsight/api/src/modules/browser/string/string.module.ts
  class StringModule (line 7) | class StringModule {
    method register (line 8) | static register({ route }): DynamicModule {

FILE: redisinsight/api/src/modules/browser/string/string.service.ts
  class StringService (line 27) | class StringService {
    method constructor (line 30) | constructor(
    method setString (line 35) | public async setString(
    method getStringValue (line 73) | public async getStringValue(
    method downloadStringValue (line 117) | public async downloadStringValue(
    method updateStringValue (line 127) | public async updateStringValue(

FILE: redisinsight/api/src/modules/browser/utils/clusterCursor.ts
  constant NODES_SEPARATOR (line 4) | const NODES_SEPARATOR = '||';
  constant CURSOR_SEPARATOR (line 5) | const CURSOR_SEPARATOR = '@';
  constant CLUSTER_CURSOR_REGEX (line 7) | const CLUSTER_CURSOR_REGEX =

FILE: redisinsight/api/src/modules/browser/utils/getShards.ts
  function getShards (line 11) | async function getShards(client: RedisClient): Promise<RedisClient[]> {

FILE: redisinsight/api/src/modules/browser/utils/redisIndexInfo.ts
  type ArrayReplyEntry (line 3) | type ArrayReplyEntry = string | string[];

FILE: redisinsight/api/src/modules/browser/z-set/dto/add.members-to-z-set.dto.ts
  class AddMembersToZSetDto (line 12) | class AddMembersToZSetDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/z-set/dto/create.z-set-with-expire.dto.ts
  class CreateZSetWithExpireDto (line 5) | class CreateZSetWithExpireDto extends IntersectionType(

FILE: redisinsight/api/src/modules/browser/z-set/dto/delete.members-from-z-set.dto.ts
  class DeleteMembersFromZSetDto (line 3) | class DeleteMembersFromZSetDto extends DeleteMembersFromSetDto {}

FILE: redisinsight/api/src/modules/browser/z-set/dto/delete.members-from-z-set.response.ts
  class DeleteMembersFromZSetResponse (line 3) | class DeleteMembersFromZSetResponse extends DeleteMembersFromSetResponse {}

FILE: redisinsight/api/src/modules/browser/z-set/dto/get.z-set-members.dto.ts
  class GetZSetMembersDto (line 7) | class GetZSetMembersDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/z-set/dto/get.z-set.response.ts
  class GetZSetResponse (line 5) | class GetZSetResponse extends KeyResponse {

FILE: redisinsight/api/src/modules/browser/z-set/dto/search.z-set-members.dto.ts
  class SearchZSetMembersDto (line 5) | class SearchZSetMembersDto extends PickType(ScanDataTypeDto, [

FILE: redisinsight/api/src/modules/browser/z-set/dto/search.z-set-members.response.ts
  class SearchZSetMembersResponse (line 4) | class SearchZSetMembersResponse extends ScanZSetResponse {

FILE: redisinsight/api/src/modules/browser/z-set/dto/search.z-set.response.ts
  class ScanZSetResponse (line 5) | class ScanZSetResponse extends KeyResponse {

FILE: redisinsight/api/src/modules/browser/z-set/dto/update.member-in-z-set.dto.ts
  class UpdateMemberInZSetDto (line 7) | class UpdateMemberInZSetDto extends KeyDto {

FILE: redisinsight/api/src/modules/browser/z-set/dto/z-set-member.dto.ts
  class ZSetMemberDto (line 10) | class ZSetMemberDto {

FILE: redisinsight/api/src/modules/browser/z-set/z-set.controller.ts
  class ZSetController (line 36) | class ZSetController extends BrowserBaseController {
    method constructor (line 37) | constructor(private zSetService: ZSetService) {
    method createSet (line 47) | async createSet(
    method getZSet (line 68) | async getZSet(
    method addMembers (line 81) | async addMembers(
    method updateMember (line 94) | async updateMember(
    method deleteMembers (line 114) | async deleteMembers(
    method searchZSet (line 135) | async searchZSet(

FILE: redisinsight/api/src/modules/browser/z-set/z-set.module.ts
  class ZSetModule (line 7) | class ZSetModule {
    method register (line 8) | static register({ route }): DynamicModule {

FILE: redisinsight/api/src/modules/browser/z-set/z-set.service.ts
  constant REDIS_SCAN_CONFIG (line 46) | const REDIS_SCAN_CONFIG = config.get('redis_scan');
  class ZSetService (line 49) | class ZSetService {
    method constructor (line 52) | constructor(
    method createZSet (line 57) | public async createZSet(
    method getMembers (line 90) | public async getMembers(
    method addMembers (line 152) | public async addMembers(
    method updateMember (line 192) | public async updateMember(
    method deleteMembers (line 240) | public async deleteMembers(
    method searchMembers (line 279) | public async searchMembers(
    method getZRange (line 354) | public async getZRange(
    method getZRevRange (line 371) | public async getZRevRange(
    method createSimpleZSet (line 388) | public async createSimpleZSet(
    method createZSetWithExpiration (line 402) | public async createZSetWithExpiration(
    method scanZSet (line 422) | public async scanZSet(
    method formatZRangeWithScoresReply (line 457) | private formatZRangeWithScoresReply(reply: string[]): ZSetMemberDto[] {
    method formatMembersDtoToCommandArgs (line 475) | private formatMembersDtoToCommandArgs(

FILE: redisinsight/api/src/modules/bulk-actions/bulk-actions.analytics.ts
  class BulkActionsAnalytics (line 9) | class BulkActionsAnalytics extends TelemetryBaseService {
    method sendActionStarted (line 10) | sendActionStarted(
    method sendActionStopped (line 41) | sendActionStopped(
    method sendActionSucceed (line 89) | sendActionSucceed(
    method sendActionFailed (line 125) | sendActionFailed(
    method sendImportSamplesUploaded (line 141) | sendImportSamplesUploaded(

FILE: redisinsight/api/src/modules/bulk-actions/bulk-actions.controller.ts
  class BulkActionsController (line 18) | class BulkActionsController {
    method constructor (line 19) | constructor(private readonly service: BulkActionsService) {}
    method downloadReport (line 31) | async downloadReport(

FILE: redisinsight/api/src/modules/bulk-actions/bulk-actions.gateway.ts
  constant SOCKETS_CONFIG (line 26) | const SOCKETS_CONFIG = config.get('sockets') as Config['sockets'];
  class BulkActionsGateway (line 41) | class BulkActionsGateway
    method constructor (line 48) | constructor(private service: BulkActionsService) {}
    method create (line 51) | create(
    method get (line 61) | get(
    method abort (line 70) | abort(
    method handleConnection (line 78) | async handleConnection(socket: Socket): Promise<void> {
    method handleDisconnect (line 82) | async handleDisconnect(socket: Socket): Promise<void> {

FILE: redisinsight/api/src/modules/bulk-actions/bulk-actions.module.ts
  class BulkActionsModule (line 21) | class BulkActionsModule {}

FILE: redisinsight/api/src/modules/bulk-actions/bulk-actions.service.ts
  class BulkActionsService (line 15) | class BulkActionsService {
    method constructor (line 16) | constructor(
    method create (line 21) | async create(
    method get (line 38) | async get(dto: BulkActionIdDto) {
    method abort (line 43) | async abort(dto: BulkActionIdDto) {
    method disconnect (line 49) | disconnect(socketId: string) {
    method streamReport (line 58) | async streamReport(id: string, res: Response): Promise<void> {

FILE: redisinsight/api/src/modules/bulk-actions/bulk-import.controller.ts
  class BulkImportController (line 30) | class BulkImportController {
    method constructor (line 31) | constructor(private readonly service: BulkImportService) {}
    method import (line 44) | async import(
    method uploadFromTutorial (line 69) | async uploadFromTutorial(
    method importDefaultData (line 86) | async importDefaultData(
    method importVectorCollection (line 102) | async importVectorCollection(

FILE: redisinsight/api/src/modules/bulk-actions/bulk-import.service.spec.ts
  constant PATH_CONFIG (line 40) | const PATH_CONFIG = config.get('dir_path');

FILE: redisinsight/api/src/modules/bulk-actions/bulk-import.service.ts
  constant BATCH_LIMIT (line 36) | const BATCH_LIMIT = 10_000;
  constant PATH_CONFIG (line 37) | const PATH_CONFIG = config.get('dir_path') as Config['dir_path'];
  constant SERVER_CONFIG (line 38) | const SERVER_CONFIG = config.get('server') as Config['server'];
  constant ALLOWED_VECTOR_INDEX_COLLECTIONS (line 40) | const ALLOWED_VECTOR_INDEX_COLLECTIONS = ['bikes', 'movies'];
  class BulkImportService (line 43) | class BulkImportService {
    method constructor (line 46) | constructor(
    method executeBatch (line 52) | private async executeBatch(
    method import (line 94) | public async import(
    method uploadFromTutorial (line 198) | public async uploadFromTutorial(
    method importDefaultData (line 236) | public async importDefaultData(
    method importVectorCollection (line 294) | public async importVectorCollection(

FILE: redisinsight/api/src/modules/bulk-actions/constants/index.ts
  type BulkActionsServerEvents (line 1) | enum BulkActionsServerEvents {
  type BulkActionType (line 7) | enum BulkActionType {
  type BulkActionStatus (line 13) | enum BulkActionStatus {

FILE: redisinsight/api/src/modules/bulk-actions/dto/bulk-action-id.dto.ts
  class BulkActionIdDto (line 3) | class BulkActionIdDto {

FILE: redisinsight/api/src/modules/bulk-actions/dto/create-bulk-action.dto.ts
  class CreateBulkActionDto (line 16) | class CreateBulkActionDto extends BulkActionIdDto {

FILE: redisinsight/api/src/modules/bulk-actions/dto/upload-import-file-by-path.dto.ts
  class UploadImportFileByPathDto (line 4) | class UploadImportFileByPathDto {
  class ImportVectorCollectionDto (line 14) | class ImportVectorCollectionDto {

FILE: redisinsight/api/src/modules/bulk-actions/interfaces/bulk-action-filter-overview.interface.ts
  type IBulkActionFilterOverview (line 3) | interface IBulkActionFilterOverview {

FILE: redisinsight/api/src/modules/bulk-actions/interfaces/bulk-action-overview.interface.ts
  type IBulkActionOverview (line 9) | interface IBulkActionOverview {

FILE: redisinsight/api/src/modules/bulk-actions/interfaces/bulk-action-progress-overview.interface.ts
  type IBulkActionProgressOverview (line 1) | interface IBulkActionProgressOverview {

FILE: redisinsight/api/src/modules/bulk-actions/interfaces/bulk-action-summary-overview.interface.ts
  type IBulkActionSummaryOverview (line 3) | interface IBulkActionSummaryOverview {

FILE: redisinsight/api/src/modules/bulk-actions/interfaces/bulk-action.interface.ts
  type IBulkAction (line 5) | interface IBulkAction {

FILE: redisinsight/api/src/modules/bulk-actions/interfaces/bulk-action.runner.interface.ts
  type IBulkActionRunner (line 4) | interface IBulkActionRunner {

FILE: redisinsight/api/src/modules/bulk-actions/models/bulk-action-filter.ts
  class BulkActionFilter (line 5) | class BulkActionFilter {
    method getScanArgsArray (line 25) | getScanArgsArray(): Array<number | string> {
    method getCount (line 35) | getCount(): number {
    method getOverview (line 39) | getOverview(): IBulkActionFilterOverview {

FILE: redisinsight/api/src/modules/bulk-actions/models/bulk-action-progress.ts
  class BulkActionProgress (line 3) | class BulkActionProgress {
    method setTotal (line 10) | setTotal(total) {
    method setCursor (line 14) | setCursor(cursor) {
    method getCursor (line 23) | getCursor(): number {
    method addScanned (line 27) | addScanned(scanned) {
    method getOverview (line 35) | getOverview(): IBulkActionProgressOverview {

FILE: redisinsight/api/src/modules/bulk-actions/models/bulk-action-summary.ts
  class BulkActionSummary (line 4) | class BulkActionSummary {
    method addProcessed (line 15) | addProcessed(count: number) {
    method addSuccess (line 19) | addSuccess(count: number) {
    method addFailed (line 23) | addFailed(count: number) {
    method addErrors (line 27) | addErrors(err: Array<Record<string, string>>) {
    method addKeys (line 35) | addKeys(keys: Array<RedisString>) {
    method getOverview (line 39) | getOverview(): IBulkActionSummaryOverview {

FILE: redisinsight/api/src/modules/bulk-actions/models/bulk-action.ts
  class BulkAction (line 19) | class BulkAction implements IBulkAction {
    method constructor (line 40) | constructor(
    method prepare (line 61) | async prepare(redisClient: RedisClient, RunnerClassName) {
    method start (line 82) | async start() {
    method run (line 98) | private async run() {
    method waitForStreamIfNeeded (line 119) | private async waitForStreamIfNeeded(): Promise<void> {
    method isReportEnabled (line 141) | isReportEnabled(): boolean {
    method setStreamingResponse (line 145) | setStreamingResponse(res: Response): void {
    method writeReportHeader (line 161) | private writeReportHeader(): void {
    method writeToReport (line 175) | writeToReport(keyName: Buffer, success: boolean, error?: string): void {
    method finalizeReport (line 186) | private finalizeReport(): void {
    method getOverview (line 207) | getOverview(): IBulkActionOverview {
    method getDownloadUrl (line 267) | private getDownloadUrl(): string {
    method getId (line 271) | getId() {
    method getStatus (line 275) | getStatus(): BulkActionStatus {
    method setStatus (line 279) | setStatus(status) {
    method getFilter (line 305) | getFilter(): BulkActionFilter {
    method getSocket (line 309) | getSocket(): Socket {
    method changeState (line 313) | changeState() {
    method sendOverview (line 321) | sendOverview(sessionMetadata: SessionMetadata) {

FILE: redisinsight/api/src/modules/bulk-actions/models/runners/abstract.bulk-action.runner.ts
  method constructor (line 15) | protected constructor(bulkAction) {
  method getProgress (line 32) | getProgress(): BulkActionProgress {
  method getSummary (line 36) | getSummary() {

FILE: redisinsight/api/src/modules/bulk-actions/models/runners/simple/abstract.bulk-action.simple.runner.ts
  method constructor (line 13) | constructor(bulkAction, node) {
  method prepareToStart (line 27) | async prepareToStart() {
  method run (line 34) | async run() {
  method runIteration (line 46) | async runIteration() {
  method getKeysToProcess (line 62) | async getKeysToProcess(): Promise<Buffer[]> {
  method processIterationResults (line 84) | processIterationResults(

FILE: redisinsight/api/src/modules/bulk-actions/models/runners/simple/delete.bulk-action.simple.runner.ts
  class DeleteBulkActionSimpleRunner (line 5) | class DeleteBulkActionSimpleRunner extends AbstractBulkActionSimpleRunner {
    method prepareCommands (line 6) | prepareCommands(keys: Buffer[]): RedisClientCommand[] {

FILE: redisinsight/api/src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner.ts
  class UnlinkBulkActionSimpleRunner (line 5) | class UnlinkBulkActionSimpleRunner extends AbstractBulkActionSimpleRunner {
    method prepareToStart (line 12) | async prepareToStart(): Promise<void> {
    method prepareCommands (line 23) | prepareCommands(keys: Buffer[]): RedisClientCommand[] {

FILE: redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.ts
  class BulkActionsProvider (line 21) | class BulkActionsProvider {
    method constructor (line 26) | constructor(
    method create (line 36) | async create(
    method getSimpleRunnerClass (line 80) | static getSimpleRunnerClass(dto: CreateBulkActionDto) {
    method get (line 98) | get(id: string): BulkAction {
    method abort (line 112) | abort(id: string): BulkAction {
    method abortUsersBulkActions (line 127) | abortUsersBulkActions(socketId: string): number {

FILE: redisinsight/api/src/modules/certificate/ca-certificate.controller.ts
  class CaCertificateController (line 24) | class CaCertificateController {
    method constructor (line 25) | constructor(private service: CaCertificateService) {}
    method list (line 34) | async list(): Promise<CaCertificate[]> {
    method delete (line 41) | async delete(@Param('id') id: string): Promise<void> {

FILE: redisinsight/api/src/modules/certificate/ca-certificate.service.ts
  class CaCertificateService (line 17) | class CaCertificateService {
    method constructor (line 20) | constructor(
    method get (line 25) | async get(id: string): Promise<CaCertificate> {
    method list (line 37) | async list(): Promise<CaCertificate[]> {
    method create (line 43) | async create(dto: CreateCaCertificateDto): Promise<CaCertificate> {
    method delete (line 59) | async delete(id: string): Promise<void> {

FILE: redisinsight/api/src/modules/certificate/certificate.module.ts
  class CertificateModule (line 12) | class CertificateModule {
    method register (line 13) | static register(

FILE: redisinsight/api/src/modules/certificate/client-certificate.controller.ts
  class ClientCertificateController (line 24) | class ClientCertificateController {
    method constructor (line 25) | constructor(private service: ClientCertificateService) {}
    method getClientCertList (line 35) | async getClientCertList(): Promise<ClientCertificate[]> {
    method deleteClientCertificatePair (line 42) | async deleteClientCertificatePair(@Param('id') id: string): Promise<vo...

FILE: redisinsight/api/src/modules/certificate/client-certificate.service.ts
  class ClientCertificateService (line 17) | class ClientCertificateService {
    method constructor (line 20) | constructor(
    method get (line 29) | async get(id: string): Promise<ClientCertificate> {
    method list (line 44) | async list(): Promise<ClientCertificate[]> {
    method create (line 50) | async create(dto: CreateClientCertificateDto): Promise<ClientCertifica...
    method delete (line 67) | async delete(id: string): Promise<void> {

FILE: redisinsight/api/src/modules/certificate/dto/create.ca-certificate.dto.ts
  class CreateCaCertificateDto (line 5) | class CreateCaCertificateDto extends OmitType(CaCertificate, [

FILE: redisinsight/api/src/modules/certificate/dto/create.client-certificate.dto.ts
  class CreateClientCertificateDto (line 5) | class CreateClientCertificateDto extends OmitType(ClientCertificate, [

FILE: redisinsight/api/src/modules/certificate/dto/use.ca-certificate.dto.ts
  class UseCaCertificateDto (line 4) | class UseCaCertificateDto extends PickType(CaCertificate, [

FILE: redisinsight/api/src/modules/certificate/dto/use.client-certificate.dto.ts
  class UseClientCertificateDto (line 4) | class UseClientCertificateDto extends PickType(ClientCertificate, [

FILE: redisinsight/api/src/modules/certificate/entities/ca-certificate.entity.ts
  class CaCertificateEntity (line 6) | class CaCertificateEntity {

FILE: redisinsight/api/src/modules/certificate/entities/client-certificate.entity.ts
  class ClientCertificateEntity (line 6) | class ClientCertificateEntity {

FILE: redisinsight/api/src/modules/certificate/models/ca-certificate.ts
  class CaCertificate (line 5) | class CaCertificate {

FILE: redisinsight/api/src/modules/certificate/models/client-certificate.ts
  class ClientCertificate (line 5) | class ClientCertificate {

FILE: redisinsight/api/src/modules/certificate/repositories/local.ca-certificate.repository.ts
  class LocalCaCertificateRepository (line 19) | class LocalCaCertificateRepository extends CaCertificateRepository {
    method constructor (line 24) | constructor(
    method get (line 40) | async get(id: string): Promise<CaCertificate> {
    method list (line 52) | async list(): Promise<CaCertificate[]> {
    method create (line 64) | async create(
    method delete (line 94) | async delete(id: string): Promise<{ affectedDatabases: string[] }> {
    method cleanupPreSetup (line 125) | async cleanupPreSetup(excludeIds?: string[]): Promise<{ affected: numb...

FILE: redisinsight/api/src/modules/certificate/repositories/local.client-certificate.repository.ts
  class LocalClientCertificateRepository (line 19) | class LocalClientCertificateRepository extends ClientCertificateReposito...
    method constructor (line 24) | constructor(
    method get (line 41) | async get(id: string): Promise<ClientCertificate> {
    method list (line 53) | async list(): Promise<ClientCertificate[]> {
    method create (line 65) | async create(
    method delete (line 94) | async delete(id: string): Promise<{ affectedDatabases: string[] }> {
    method cleanupPreSetup (line 124) | async cleanupPreSetup(excludeIds?: string[]): Promise<{ affected: numb...

FILE: redisinsight/api/src/modules/cli/cli.module.ts
  constant COMMANDS_CONFIGS (line 12) | const COMMANDS_CONFIGS = config.get('commands');
  class CliModule (line 33) | class CliModule {}

FILE: redisinsight/api/src/modules/cli/constants/errors.ts
  class CommandParsingError (line 3) | class CommandParsingError extends ReplyError {
    method constructor (line 4) | constructor(args) {
  class RedirectionParsingError (line 10) | class RedirectionParsingError extends ReplyError {
    method constructor (line 11) | constructor(args = 'Could not parse redirection error.') {
  class CommandNotSupportedError (line 17) | class CommandNotSupportedError extends ReplyError {
    method constructor (line 18) | constructor(args) {
  class WrongDatabaseTypeError (line 24) | class WrongDatabaseTypeError extends Error {
    method constructor (line 25) | constructor(args) {
  class ClusterNodeNotFoundError (line 31) | class ClusterNodeNotFoundError extends Error {
    method constructor (line 32) | constructor(args) {

FILE: redisinsight/api/src/modules/cli/controllers/cli.controller.ts
  class CliController (line 26) | class CliController {
    method constructor (line 27) | constructor(private service: CliBusinessService) {}
    method getClient (line 42) | async getClient(
    method sendCommand (line 61) | async sendCommand(
    method sendClusterCommand (line 82) | async sendClusterCommand(
    method deleteClient (line 102) | async deleteClient(
    method reCreateClient (line 114) | async reCreateClient(

FILE: redisinsight/api/src/modules/cli/decorators/api-cli-params.decorator.ts
  function ApiCLIParams (line 4) | function ApiCLIParams(

FILE: redisinsight/api/src/modules/cli/dto/cli.dto.ts
  type CommandExecutionStatus (line 5) | enum CommandExecutionStatus {
  type ICliExecResultFromNode (line 10) | interface ICliExecResultFromNode {
  class SendCommandDto (line 19) | class SendCommandDto {
  class SendCommandResponse (line 42) | class SendCommandResponse {
  class CreateCliClientResponse (line 57) | class CreateCliClientResponse {
  class DeleteClientResponse (line 65) | class DeleteClientResponse {

FILE: redisinsight/api/src/modules/cli/services/cli-analytics/cli-analytics.service.ts
  class CliAnalyticsService (line 14) | class CliAnalyticsService extends CommandTelemetryBaseService {
    method constructor (line 15) | constructor(
    method sendClientCreatedEvent (line 22) | sendClientCreatedEvent(
    method sendClientCreationFailedEvent (line 33) | sendClientCreationFailedEvent(
    method sendClientRecreatedEvent (line 50) | sendClientRecreatedEvent(
    method sendClientDeletedEvent (line 61) | sendClientDeletedEvent(
    method sendIndexInfoEvent (line 79) | sendIndexInfoEvent(
    method sendCommandExecutedEvent (line 98) | public async sendCommandExecutedEvent(
    method sendCommandErrorEvent (line 114) | public async sendCommandErrorEvent(
    method sendClusterCommandExecutedEvent (line 133) | public async sendClusterCommandExecutedEvent(
    method sendConnectionErrorEvent (line 170) | public async sendConnectionErrorEvent(

FILE: redisinsight/api/src/modules/cli/services/cli-business/cli-business.service.ts
  class CliBusinessService (line 40) | class CliBusinessService {
    method constructor (line 45) | constructor(
    method getClient (line 66) | public async getClient(
    method reCreateClient (line 105) | public async reCreateClient(
    method deleteClient (line 146) | public async deleteClient(
    method sendCommand (line 182) | public async sendCommand(
    method checkUnsupportedCommands (line 285) | private checkUnsupportedCommands(commandLine: string) {

FILE: redisinsight/api/src/modules/cli/services/cli-business/output-formatter/output-formatter-manager.spec.ts
  class TestFormatterStrategy (line 9) | class TestFormatterStrategy implements IOutputFormatterStrategy {
    method format (line 10) | public format() {

FILE: redisinsight/api/src/modules/cli/services/cli-business/output-formatter/output-formatter-manager.ts
  class OutputFormatterManager (line 6) | class OutputFormatterManager {
    method addStrategy (line 9) | addStrategy(
    method getStrategy (line 16) | getStrategy(name: CliOutputFormatterTypes): IOutputFormatterStrategy {

FILE: redisinsight/api/src/modules/cli/services/cli-business/output-formatter/output-formatter.interface.ts
  type CliOutputFormatterTypes (line 1) | enum CliOutputFormatterTypes {
  type IRedirectionInfo (line 6) | interface IRedirectionInfo {
  type IOutputFormatterStrategy (line 11) | interface IOutputFormatterStrategy {

FILE: redisinsight/api/src/modules/cli/services/cli-business/output-formatter/strategies/raw-formatter.strategy.ts
  class RawFormatterStrategy (line 5) | class RawFormatterStrategy implements IOutputFormatterStrategy {
    method format (line 6) | public format(reply: any): any {
    method formatRedisArrayReply (line 19) | private formatRedisArrayReply(reply: Buffer | Buffer[]): any[] {
    method formatRedisObjectReply (line 33) | private formatRedisObjectReply(reply: Object): object | string {

FILE: redisinsight/api/src/modules/cli/services/cli-business/output-formatter/strategies/text-formatter.strategy.ts
  class TextFormatterStrategy (line 6) | class TextFormatterStrategy implements IOutputFormatterStrategy {
    method format (line 7) | public format(reply: any): string {
    method formatRedisArrayReply (line 25) | private formatRedisArrayReply(reply: Buffer | Buffer[], level = 0): st...
    method formatRedisBufferReply (line 49) | private formatRedisBufferReply(reply: Buffer): string {

FILE: redisinsight/api/src/modules/cli/services/cli-business/output-formatter/strategies/utf-8-formatter.strategy.ts
  class UTF8FormatterStrategy (line 5) | class UTF8FormatterStrategy implements IOutputFormatterStrategy {
    method format (line 6) | public format(reply: any): any {
    method formatRedisArrayReply (line 19) | private formatRedisArrayReply(reply: Buffer | Buffer[]): any[] {
    method formatRedisObjectReply (line 33) | private formatRedisObjectReply(reply: Object): object | string {

FILE: redisinsight/api/src/modules/cli/utils/getUnsupportedCommands.ts
  constant REDIS_CLI_CONFIG (line 3) | const REDIS_CLI_CONFIG = config.get('redis_cli');
  type CliToolUnsupportedCommands (line 5) | enum CliToolUnsupportedCommands {

FILE: redisinsight/api/src/modules/cloud/auth/auth-strategy/cloud-auth.strategy.ts
  method generateAuthRequest (line 17) | async generateAuthRequest(
  method generateRenewTokensUrl (line 32) | generateRenewTokensUrl(refreshToken: string): URL {
  method generateRevokeTokensUrl (line 43) | generateRevokeTokensUrl(token: string, hint: string): URL {
  method generateAuthUrl (line 52) | static generateAuthUrl(authRequest: any): URL {
  method generateExchangeCodeUrl (line 72) | static generateExchangeCodeUrl(authRequest: any, code: string): URL {

FILE: redisinsight/api/src/modules/cloud/auth/auth-strategy/github-idp.cloud.auth-strategy.ts
  class GithubIdpCloudAuthStrategy (line 10) | class GithubIdpCloudAuthStrategy extends CloudAuthStrategy {
    method constructor (line 11) | constructor() {

FILE: redisinsight/api/src/modules/cloud/auth/auth-strategy/google-idp.cloud.auth-strategy.ts
  class GoogleIdpCloudAuthStrategy (line 10) | class GoogleIdpCloudAuthStrategy extends CloudAuthStrategy {
    method constructor (line 11) | constructor() {

FILE: redisinsight/api/src/modules/cloud/auth/auth-strategy/sso-idp.cloud.auth-strategy.ts
  class SsoIdpCloudAuthStrategy (line 21) | class SsoIdpCloudAuthStrategy extends CloudAuthStrategy {
    method constructor (line 24) | constructor() {
    method determineIdp (line 46) | private async determineIdp(email: string) {
    method generateAuthRequest (line 64) | async generateAuthRequest(

FILE: redisinsight/api/src/modules/cloud/auth/auth-strategy/tcp-cloud.auth.strategy.ts
  class TcpCloudAuthStrategy (line 7) | class TcpCloudAuthStrategy extends CloudAuthStrategy {
    method constructor (line 16) | constructor(private readonly cloudAuthService: CloudAuthService) {
    method initServer (line 22) | private initServer() {

FILE: redisinsight/api/src/modules/cloud/auth/cloud-auth.analytics.ts
  class CloudAuthAnalytics (line 9) | class CloudAuthAnalytics extends TelemetryBaseService {
    method constructor (line 10) | constructor(protected eventEmitter: EventEmitter2) {
    method sendCloudSignInSucceeded (line 14) | sendCloudSignInSucceeded(
    method sendCloudSignInFailed (line 25) | sendCloudSignInFailed(

FILE: redisinsight/api/src/modules/cloud/auth/cloud-auth.controller.ts
  class CloudAuthController (line 16) | class CloudAuthController {
    method constructor (line 17) | constructor(private readonly cloudAuthService: CloudAuthService) {}
    method callback (line 25) | async callback(@Query() query) {

FILE: redisinsight/api/src/modules/cloud/auth/cloud-auth.module.ts
  class CloudAuthModule (line 31) | class CloudAuthModule {}

FILE: redisinsight/api/src/modules/cloud/auth/cloud-auth.service.ts
  class CloudAuthService (line 36) | class CloudAuthService {
    method constructor (line 43) | constructor(
    method getOAuthHttpRequestHeaders (line 52) | static getOAuthHttpRequestHeaders() {
    method getAuthorizationServerRedirectError (line 60) | static getAuthorizationServerRedirectError(
    method getAuthStrategy (line 86) | getAuthStrategy(strategy: CloudAuthIdpType): CloudAuthStrategy {
    method getAuthorizationUrl (line 106) | async getAuthorizationUrl(
    method exchangeCode (line 140) | private async exchangeCode(
    method getAuthRequestInfo (line 173) | private async getAuthRequestInfo(query): Promise<CloudAuthRequestInfo> {
    method callback (line 196) | private async callback(query): Promise<Function | void> {
    method revokeRefreshToken (line 236) | private async revokeRefreshToken(
    method handleCallback (line 272) | async handleCallback(
    method renewTokens (line 327) | async renewTokens(
    method logout (line 364) | async logout(sessionMetadata: SessionMetadata): Promise<void> {
    method isRequestInProgress (line 379) | isRequestInProgress(query) {
    method finishInProgressRequest (line 383) | finishInProgressRequest(query) {

FILE: redisinsight/api/src/modules/cloud/auth/exceptions/cloud-oauth.canceled.exception.ts
  class CloudOauthCanceledException (line 5) | class CloudOauthCanceledException extends HttpException {
    method constructor (line 6) | constructor(

FILE: redisinsight/api/src/modules/cloud/auth/exceptions/cloud-oauth.github-email-permission.exception.ts
  class CloudOauthGithubEmailPermissionException (line 9) | class CloudOauthGithubEmailPermissionException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/auth/exceptions/cloud-oauth.misconfiguration.exception.ts
  class CloudOauthMisconfigurationException (line 9) | class CloudOauthMisconfigurationException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/auth/exceptions/cloud-oauth.missed-required-data.exception.ts
  class CloudOauthMissedRequiredDataException (line 9) | class CloudOauthMissedRequiredDataException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/auth/exceptions/cloud-oauth.sso-unsupported-email.exception.ts
  class CloudOauthSsoUnsupportedEmailException (line 9) | class CloudOauthSsoUnsupportedEmailException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/auth/exceptions/cloud-oauth.unexpected-error.exception.ts
  class CloudOauthUnexpectedErrorException (line 9) | class CloudOauthUnexpectedErrorException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/auth/exceptions/cloud-oauth.unknown-authorization-request.exception.ts
  class CloudOauthUnknownAuthorizationRequestException (line 9) | class CloudOauthUnknownAuthorizationRequestException extends HttpExcepti...
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/auth/models/cloud-auth-request-info.ts
  class CloudAuthRequestInfo (line 4) | class CloudAuthRequestInfo extends PickType(CloudAuthRequest, [

FILE: redisinsight/api/src/modules/cloud/auth/models/cloud-auth-request.ts
  type CloudAuthIdpType (line 3) | enum CloudAuthIdpType {
  class CloudAuthRequestOptions (line 9) | class CloudAuthRequestOptions {
  class CloudAuthRequest (line 19) | class CloudAuthRequest extends CloudAuthRequestOptions {

FILE: redisinsight/api/src/modules/cloud/auth/models/cloud-auth-response.ts
  type CloudAuthStatus (line 1) | enum CloudAuthStatus {
  class CloudAuthResponse (line 6) | class CloudAuthResponse {

FILE: redisinsight/api/src/modules/cloud/autodiscovery/cloud-autodiscovery.analytics.ts
  class CloudAutodiscoveryAnalytics (line 19) | class CloudAutodiscoveryAnalytics extends TelemetryBaseService {
    method constructor (line 20) | constructor(protected eventEmitter: EventEmitter2) {
    method sendGetRedisCloudSubsSucceedEvent (line 24) | sendGetRedisCloudSubsSucceedEvent(
    method sendGetRedisCloudSubsFailedEvent (line 48) | sendGetRedisCloudSubsFailedEvent(
    method sendGetRedisCloudDbsSucceedEvent (line 65) | sendGetRedisCloudDbsSucceedEvent(
    method sendGetRedisCloudDbsFailedEvent (line 93) | sendGetRedisCloudDbsFailedEvent(

FILE: redisinsight/api/src/modules/cloud/autodiscovery/cloud-autodiscovery.service.ts
  class CloudAutodiscoveryService (line 38) | class CloudAutodiscoveryService {
    method constructor (line 41) | constructor(
    method getAccount (line 53) | async getAccount(authDto: CloudCapiAuthDto): Promise<CloudAccountInfo> {
    method getSubscriptions (line 69) | private async getSubscriptions(
    method discoverSubscriptions (line 107) | async discoverSubscriptions(
    method discoverDatabases (line 137) | async discoverDatabases(
    method addRedisCloudDatabases (line 194) | async addRedisCloudDatabases(

FILE: redisinsight/api/src/modules/cloud/autodiscovery/cloud.autodiscovery.controller.ts
  class CloudAutodiscoveryController (line 47) | class CloudAutodiscoveryController {
    method constructor (line 48) | constructor(private service: CloudAutodiscoveryService) {}
    method getAccount (line 63) | async getAccount(
    method discoverSubscriptions (line 83) | async discoverSubscriptions(
    method discoverDatabases (line 109) | async discoverDatabases(
    method addDiscoveredDatabases (line 136) | async addDiscoveredDatabases(

FILE: redisinsight/api/src/modules/cloud/autodiscovery/cloud.autodiscovery.module.ts
  class CloudAutodiscoveryModule (line 26) | class CloudAutodiscoveryModule {}

FILE: redisinsight/api/src/modules/cloud/autodiscovery/dto/discover-cloud-databases.dto.ts
  class DiscoverCloudDatabasesDto (line 6) | class DiscoverCloudDatabasesDto {

FILE: redisinsight/api/src/modules/cloud/autodiscovery/dto/import-cloud-database.dto.ts
  class ImportCloudDatabaseDto (line 12) | class ImportCloudDatabaseDto {

FILE: redisinsight/api/src/modules/cloud/autodiscovery/dto/import-cloud-database.response.ts
  class ImportCloudDatabaseResponse (line 5) | class ImportCloudDatabaseResponse {

FILE: redisinsight/api/src/modules/cloud/autodiscovery/dto/import-cloud-databases.dto.ts
  class ImportCloudDatabasesDto (line 11) | class ImportCloudDatabasesDto {

FILE: redisinsight/api/src/modules/cloud/autodiscovery/me.cloud-autodiscovery.service.ts
  class MeCloudAutodiscoveryService (line 20) | class MeCloudAutodiscoveryService {
    method constructor (line 21) | constructor(
    method getCapiCredentials (line 27) | private async getCapiCredentials(
    method getAccount (line 39) | async getAccount(
    method discoverSubscriptions (line 64) | async discoverSubscriptions(
    method discoverDatabases (line 92) | async discoverDatabases(
    method addRedisCloudDatabases (line 122) | async addRedisCloudDatabases(

FILE: redisinsight/api/src/modules/cloud/autodiscovery/me.cloud.autodiscovery.controller.ts
  class MeCloudAutodiscoveryController (line 38) | class MeCloudAutodiscoveryController {
    method constructor (line 39) | constructor(private service: MeCloudAutodiscoveryService) {}
    method getAccount (line 54) | async getAccount(
    method discoverSubscriptions (line 75) | async discoverSubscriptions(
    method discoverDatabases (line 97) | async discoverDatabases(
    method addDiscoveredDatabases (line 119) | async addDiscoveredDatabases(

FILE: redisinsight/api/src/modules/cloud/autodiscovery/models/cloud-autodiscovery-auth-type.ts
  type CloudAutodiscoveryAuthType (line 1) | enum CloudAutodiscoveryAuthType {

FILE: redisinsight/api/src/modules/cloud/capi-key/cloud-capi-key.analytics.ts
  class CloudCapiKeyAnalytics (line 8) | class CloudCapiKeyAnalytics extends TelemetryBaseService {
    method constructor (line 9) | constructor(protected eventEmitter: EventEmitter2) {
    method sendCloudAccountKeyGenerated (line 13) | sendCloudAccountKeyGenerated(sessionMetadata: SessionMetadata) {
    method sendCloudAccountKeyGenerationFailed (line 21) | sendCloudAccountKeyGenerationFailed(
    method sendCloudAccountSecretGenerated (line 32) | sendCloudAccountSecretGenerated(sessionMetadata: SessionMetadata) {
    method sendCloudAccountSecretGenerationFailed (line 43) | sendCloudAccountSecretGenerationFailed(

FILE: redisinsight/api/src/modules/cloud/capi-key/cloud-capi-key.api.provider.ts
  class CloudCapiKeyApiProvider (line 8) | class CloudCapiKeyApiProvider extends CloudApiProvider {
    method enableCapi (line 13) | async enableCapi(credentials: ICloudApiCredentials): Promise<string> {
    method createCapiKey (line 33) | async createCapiKey(

FILE: redisinsight/api/src/modules/cloud/capi-key/cloud-capi-key.controller.ts
  class CloudCapiKeyController (line 21) | class CloudCapiKeyController {
    method constructor (line 22) | constructor(private readonly service: CloudCapiKeyService) {}
    method list (line 30) | async list(
    method delete (line 41) | async delete(
    method deleteAll (line 53) | async deleteAll(@RequestSessionMetadata() sessionMetadata): Promise<vo...

FILE: redisinsight/api/src/modules/cloud/capi-key/cloud-capi-key.module.ts
  class CloudCapiKeyModule (line 25) | class CloudCapiKeyModule {}

FILE: redisinsight/api/src/modules/cloud/capi-key/cloud-capi-key.service.ts
  class CloudCapiKeyService (line 23) | class CloudCapiKeyService {
    method constructor (line 26) | constructor(
    method generateName (line 35) | private async generateName(
    method ensureCapiKeys (line 49) | private async ensureCapiKeys(
    method getCapiCredentials (line 178) | async getCapiCredentials(
    method get (line 193) | async get(id: string): Promise<CloudCapiKey> {
    method getByUserAccount (line 217) | async getByUserAccount(
    method list (line 254) | async list(sessionMetadata: SessionMetadata): Promise<CloudCapiKey[]> {
    method delete (line 274) | async delete(sessionMetadata: SessionMetadata, id: string): Promise<vo...
    method deleteAll (line 289) | async deleteAll(sessionMetadata: SessionMetadata): Promise<void> {
    method handleCapiKeyUnauthorizedError (line 305) | async handleCapiKeyUnauthorizedError(

FILE: redisinsight/api/src/modules/cloud/capi-key/entity/cloud-capi-key.entity.ts
  class CloudCapiKeyEntity (line 6) | class CloudCapiKeyEntity {

FILE: redisinsight/api/src/modules/cloud/capi-key/exceptions/cloud-capi-key.not-found.exception.ts
  class CloudCapiKeyNotFoundException (line 9) | class CloudCapiKeyNotFoundException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/capi-key/exceptions/cloud-capi-key.unauthorized.exception.ts
  class CloudCapiKeyUnauthorizedException (line 9) | class CloudCapiKeyUnauthorizedException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/capi-key/model/api.interface.ts
  type ICloudApiCapiAccessKey (line 1) | interface ICloudApiCapiAccessKey {
  type ICloudApiCapiKey (line 5) | interface ICloudApiCapiKey {

FILE: redisinsight/api/src/modules/cloud/capi-key/model/cloud-capi-key.ts
  class CloudCapiKey (line 4) | class CloudCapiKey {

FILE: redisinsight/api/src/modules/cloud/capi-key/repository/local.cloud-capi-key.repository.ts
  class LocalCloudCapiKeyRepository (line 11) | class LocalCloudCapiKeyRepository extends CloudCapiKeyRepository {
    method constructor (line 14) | constructor(
    method get (line 29) | async get(id: string): Promise<CloudCapiKey> {
    method update (line 44) | public async update(
    method getByUserAccount (line 65) | async getByUserAccount(
    method create (line 89) | async create(model: CloudCapiKey): Promise<CloudCapiKey> {
    method list (line 114) | async list(userId: string): Promise<CloudCapiKey[]> {
    method delete (line 128) | async delete(userId: string, id: string): Promise<void> {
    method deleteAll (line 135) | async deleteAll(userId: string): Promise<void> {

FILE: redisinsight/api/src/modules/cloud/cloud-sso.feature.flag.ts
  type CloudSsoFeatureStrategy (line 7) | enum CloudSsoFeatureStrategy {
  class CloudSsoFeatureFlag (line 12) | class CloudSsoFeatureFlag {
    method getFeature (line 13) | static getFeature(): Partial<Feature> {

FILE: redisinsight/api/src/modules/cloud/cloud.module.ts
  class CloudModule (line 11) | class CloudModule {
    method register (line 12) | static register() {

FILE: redisinsight/api/src/modules/cloud/common/constants/index.ts
  type CloudAuthServerEvent (line 1) | enum CloudAuthServerEvent {
  type CloudJobEvents (line 5) | enum CloudJobEvents {

FILE: redisinsight/api/src/modules/cloud/common/dto/cloud.capi.auth.dto.ts
  class CloudCapiAuthDto (line 5) | class CloudCapiAuthDto implements ICloudCapiCredentials {

FILE: redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.bad-request.exception.ts
  class CloudApiBadRequestException (line 9) | class CloudApiBadRequestException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.forbidden.exception.ts
  class CloudApiForbiddenException (line 9) | class CloudApiForbiddenException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.internal-server-error.exception.ts
  class CloudApiInternalServerErrorException (line 9) | class CloudApiInternalServerErrorException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.not-found.exception.ts
  class CloudApiNotFoundException (line 9) | class CloudApiNotFoundException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.unauthorized.exception.ts
  class CloudApiUnauthorizedException (line 9) | class CloudApiUnauthorizedException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/common/exceptions/cloud-capi.unauthorized.exception.ts
  class CloudCapiUnauthorizedException (line 9) | class CloudCapiUnauthorizedException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/common/models/api.interface.ts
  type ICloudApiCredentials (line 3) | interface ICloudApiCredentials {

FILE: redisinsight/api/src/modules/cloud/common/models/capi.interface.ts
  type ICloudCapiCredentials (line 1) | interface ICloudCapiCredentials {

FILE: redisinsight/api/src/modules/cloud/common/models/cloud-request-utm.ts
  class CloudRequestUtm (line 5) | class CloudRequestUtm {

FILE: redisinsight/api/src/modules/cloud/common/providers/cloud.api.provider.ts
  class CloudApiProvider (line 15) | class CloudApiProvider {
    method constructor (line 20) | constructor(private readonly cloudSessionService: CloudSessionService) {}
    method callWithAuthRetry (line 22) | async callWithAuthRetry(
    method generateUtmBody (line 45) | static generateUtmBody(utm: CloudRequestUtm): Record<string, string> {
    method getHeaders (line 59) | static getHeaders(credentials: ICloudApiCredentials): { headers: {} } {

FILE: redisinsight/api/src/modules/cloud/common/providers/cloud.capi.provider.ts
  class CloudCapiProvider (line 9) | class CloudCapiProvider {
    method getPrefix (line 19) | static getPrefix(type?: CloudSubscriptionType): string {
    method getHeaders (line 28) | static getHeaders(credentials: ICloudCapiCredentials): {

FILE: redisinsight/api/src/modules/cloud/database/cloud-database.analytics.ts
  class CloudDatabaseAnalytics (line 8) | class CloudDatabaseAnalytics extends TelemetryBaseService {
    method constructor (line 9) | constructor(protected eventEmitter: EventEmitter2) {
    method sendCloudFreeDatabaseCreated (line 13) | sendCloudFreeDatabaseCreated(
    method sendCloudFreeDatabaseFailed (line 24) | sendCloudFreeDatabaseFailed(

FILE: redisinsight/api/src/modules/cloud/database/cloud-database.capi.provider.ts
  class CloudDatabaseCapiProvider (line 18) | class CloudDatabaseCapiProvider extends CloudCapiProvider {
    method getDatabase (line 24) | async getDatabase(
    method getDatabases (line 47) | async getDatabases(
    method createFreeDatabase (line 70) | async createFreeDatabase(
    method getDatabaseTags (line 94) | async getDatabaseTags(

FILE: redisinsight/api/src/modules/cloud/database/cloud-database.capi.service.ts
  class CloudDatabaseCapiService (line 26) | class CloudDatabaseCapiService {
    method constructor (line 29) | constructor(private readonly capi: CloudDatabaseCapiProvider) {}
    method getDatabase (line 36) | async getDatabase(
    method getDatabases (line 68) | async getDatabases(
    method createFreeDatabase (line 94) | async createFreeDatabase(

FILE: redisinsight/api/src/modules/cloud/database/cloud-database.module.ts
  class CloudDatabaseModule (line 15) | class CloudDatabaseModule {}

FILE: redisinsight/api/src/modules/cloud/database/dto/create-free-cloud-database.dto.ts
  class CreateFreeCloudDatabaseDto (line 20) | class CreateFreeCloudDatabaseDto {

FILE: redisinsight/api/src/modules/cloud/database/dto/get-cloud-subscription-database.dto.ts
  class GetCloudSubscriptionDatabaseDto (line 13) | class GetCloudSubscriptionDatabaseDto {

FILE: redisinsight/api/src/modules/cloud/database/dto/get-cloud-subscription-databases.dto.ts
  class GetCloudSubscriptionDatabasesDto (line 13) | class GetCloudSubscriptionDatabasesDto {

FILE: redisinsight/api/src/modules/cloud/database/entities/cloud-database-details.entity.ts
  class CloudDatabaseDetailsEntity (line 12) | class CloudDatabaseDetailsEntity {

FILE: redisinsight/api/src/modules/cloud/database/models/capi.interface.ts
  type ICloudCapiDatabaseAlert (line 6) | interface ICloudCapiDatabaseAlert {
  type ICloudCapiDatabaseClustering (line 11) | interface ICloudCapiDatabaseClustering {
  type ICloudCapiDatabaseModule (line 17) | interface ICloudCapiDatabaseModule {
  type ICloudCapiDatabaseSecurity (line 25) | interface ICloudCapiDatabaseSecurity {
  type ICloudCapiDatabaseTag (line 31) | interface ICloudCapiDatabaseTag {
  type ICloudCapiDatabase (line 39) | interface ICloudCapiDatabase {
  type ICloudCapiSubscriptionDatabasesSubscription (line 74) | interface ICloudCapiSubscriptionDatabasesSubscription {
  type ICloudCapiSubscriptionDatabases (line 80) | interface ICloudCapiSubscriptionDatabases {

FILE: redisinsight/api/src/modules/cloud/database/models/cloud-database-details.ts
  class CloudDatabaseDetails (line 14) | class CloudDatabaseDetails {

FILE: redisinsight/api/src/modules/cloud/database/models/cloud-database.ts
  type CloudDatabaseProtocol (line 8) | enum CloudDatabaseProtocol {
  type CloudDatabasePersistencePolicy (line 14) | enum CloudDatabasePersistencePolicy {
  type CloudDatabaseDataEvictionPolicy (line 23) | enum CloudDatabaseDataEvictionPolicy {
  type CloudDatabaseMemoryStorage (line 34) | enum CloudDatabaseMemoryStorage {
  type CloudDatabaseStatus (line 39) | enum CloudDatabaseStatus {
  type CloudDatabaseAlertName (line 50) | enum CloudDatabaseAlertName {
  class CloudDatabaseAlert (line 61) | class CloudDatabaseAlert {
  class CloudDatabase (line 81) | class CloudDatabase {

FILE: redisinsight/api/src/modules/cloud/database/utils/cloud-data-converter.ts
  function convertRedisCloudModuleName (line 16) | function convertRedisCloudModuleName(name: string): string {

FILE: redisinsight/api/src/modules/cloud/job/cloud-job.controller.ts
  class CloudJobController (line 27) | class CloudJobController {
    method constructor (line 28) | constructor(private readonly service: CloudJobService) {}
    method createFreeDatabase (line 36) | async createFreeDatabase(
    method getUserJobsInfo (line 50) | async getUserJobsInfo(
    method getJobInfo (line 62) | async getJobInfo(

FILE: redisinsight/api/src/modules/cloud/job/cloud-job.factory.ts
  class CloudJobFactory (line 25) | class CloudJobFactory {
    method constructor (line 26) | constructor(
    method create (line 39) | async create(

FILE: redisinsight/api/src/modules/cloud/job/cloud-job.gateway.ts
  constant SOCKETS_CONFIG (line 20) | const SOCKETS_CONFIG = config.get('sockets') as Config['sockets'];
  class CloudJobGateway (line 31) | class CloudJobGateway {
    method constructor (line 40) | constructor(private readonly cloudJobService: CloudJobService) {}
    method monitor (line 43) | async monitor(

FILE: redisinsight/api/src/modules/cloud/job/cloud-job.module.ts
  class CloudJobModule (line 31) | class CloudJobModule {}

FILE: redisinsight/api/src/modules/cloud/job/cloud-job.provider.ts
  class CloudJobProvider (line 12) | class CloudJobProvider {
    method constructor (line 15) | constructor(private readonly cloudJobFactory: CloudJobFactory) {}
    method addJob (line 17) | async addJob(
    method get (line 51) | async get(id: string): Promise<CloudJob> {
    method findUserJobs (line 55) | async findUserJobs(sessionMetadata: SessionMetadata): Promise<CloudJob...

FILE: redisinsight/api/src/modules/cloud/job/cloud-job.service.ts
  class CloudJobService (line 15) | class CloudJobService {
    method constructor (line 16) | constructor(private readonly cloudJobProvider: CloudJobProvider) {}
    method create (line 24) | async create(
    method getUserJobsInfo (line 40) | async getUserJobsInfo(
    method get (line 57) | async get(sessionMetadata: SessionMetadata, id: string): Promise<Cloud...
    method getJobInfo (line 80) | async getJobInfo(
    method monitorJob (line 93) | async monitorJob(

FILE: redisinsight/api/src/modules/cloud/job/constants/index.ts
  type CloudJobName (line 1) | enum CloudJobName {

FILE: redisinsight/api/src/modules/cloud/job/dto/create-database.cloud-job.data.dto.ts
  class CreateDatabaseCloudJobDataDto (line 4) | class CreateDatabaseCloudJobDataDto {

FILE: redisinsight/api/src/modules/cloud/job/dto/create-subscription-and-database.cloud-job.data.dto.ts
  class CreateSubscriptionAndDatabaseCloudJobDataDto (line 10) | class CreateSubscriptionAndDatabaseCloudJobDataDto {

FILE: redisinsight/api/src/modules/cloud/job/dto/create.cloud-job.dto.ts
  class CreateCloudJobDto (line 27) | class CreateCloudJobDto {

FILE: redisinsight/api/src/modules/cloud/job/dto/import-database.cloud-job.data.dto.ts
  class ImportDatabaseCloudJobDataDto (line 4) | class ImportDatabaseCloudJobDataDto {

FILE: redisinsight/api/src/modules/cloud/job/dto/monitor.cloud-job.dto.ts
  class MonitorCloudJobDto (line 4) | class MonitorCloudJobDto {

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-database-already-exists-free.exception.ts
  class CloudDatabaseAlreadyExistsFreeException (line 9) | class CloudDatabaseAlreadyExistsFreeException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-database-endpoint-invalid.exception.ts
  class CloudDatabaseEndpointInvalidException (line 9) | class CloudDatabaseEndpointInvalidException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-database-import-forbidden.exception.ts
  class CloudDatabaseImportForbiddenException (line 9) | class CloudDatabaseImportForbiddenException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-database-in-failed-state.exception.ts
  class CloudDatabaseInFailedStateException (line 9) | class CloudDatabaseInFailedStateException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-database-in-unexpected-state.exception.ts
  class CloudDatabaseInUnexpectedStateException (line 9) | class CloudDatabaseInUnexpectedStateException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-job-aborted.exception.ts
  class CloudJobAbortedException (line 5) | class CloudJobAbortedException extends HttpException {
    method constructor (line 6) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-job-not-found.exception.ts
  class CloudJobNotFoundException (line 9) | class CloudJobNotFoundException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-job-unexpected-error.exception.ts
  class CloudJobUnexpectedErrorException (line 9) | class CloudJobUnexpectedErrorException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-job-unsupported.exception.ts
  class CloudJobUnsupportedException (line 9) | class CloudJobUnsupportedException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-plan-not-found-free.exception.ts
  class CloudPlanNotFoundFreeException (line 9) | class CloudPlanNotFoundFreeException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-subscription-already-exists-free.exception.ts
  class CloudSubscriptionAlreadyExistsFreeException (line 9) | class CloudSubscriptionAlreadyExistsFreeException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-subscription-in-failed-state.exception.ts
  class CloudSubscriptionInFailedStateException (line 9) | class CloudSubscriptionInFailedStateException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-subscription-in-unexpected-state.exception.ts
  class CloudSubscriptionInUnexpectedStateException (line 9) | class CloudSubscriptionInUnexpectedStateException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-subscription-unable-to-determine.exception.ts
  class CloudSubscriptionUnableToDetermineException (line 9) | class CloudSubscriptionUnableToDetermineException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-task-no-resource-id.exception.ts
  class CloudTaskNoResourceIdException (line 9) | class CloudTaskNoResourceIdException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-task-not-found.exception.ts
  class CloudTaskNotFoundException (line 9) | class CloudTaskNotFoundException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/exceptions/cloud-task-processing-error.exception.ts
  class CloudTaskProcessingErrorException (line 9) | class CloudTaskProcessingErrorException extends HttpException {
    method constructor (line 10) | constructor(

FILE: redisinsight/api/src/modules/cloud/job/jobs/cloud-job.ts
  class CloudJobOptions (line 22) | class CloudJobOptions {
  method constructor (line 61) | protected constructor(options: CloudJobOptions) {
  method triggerChangeStateCallbacks (line 79) | private triggerChangeStateCallbacks() {
  method run (line 89) | public async run(sessionMetadata: SessionMetadata): Promise<void> {
  method abort (line 127) | public abort(reason?: string) {
  method getState (line 132) | public getState(): CloudJobInfo {
  method createChildJob (line 146) | public createChildJob<T>(
  method runChildJob (line 163) | public async runChildJob(
  method addStateCallback (line 180) | public addStateCallback(callback: (self: CloudJob) => any) {
  method changeState (line 184) | protected changeState(state = {}) {
  method checkSignal (line 196) | protected checkSignal() {
  method runNextIteration (line 205) | protected runNextIteration(

FILE: redisinsight/api/src/modules/cloud/job/jobs/create-free-database.cloud-job.ts
  class CreateFreeDatabaseCloudJob (line 37) | class CreateFreeDatabaseCloudJob extends CloudJob {
    method constructor (line 40) | constructor(
    method iteration (line 60) | async iteration(sessionMetadata: SessionMetadata): Promise<Database> {

FILE: redisinsight/api/src/modules/cloud/job/jobs/create-free-subscription-and-database.cloud-job.ts
  class CreateFreeSubscriptionAndDatabaseCloudJob (line 25) | class CreateFreeSubscriptionAndDatabaseCloudJob extends CloudJob {
    method constructor (line 28) | constructor(
    method iteration (line 52) | async iteration(sessionMetadata: SessionMetadata): Promise<Database> {
    method getRecommendedPlanId (line 105) | private getRecommendedPlanId(plans: CloudSubscriptionPlanResponse[]) {

FILE: redisinsight/api/src/modules/cloud/job/jobs/create-free-subscription.cloud-job.ts
  class CreateFreeSubscriptionCloudJob (line 26) | class CreateFreeSubscriptionCloudJob extends CloudJob {
    method constructor (line 29) | constructor(
    method iteration (line 43) | async iteration(

FILE: redisinsight/api/src/modules/cloud/job/jobs/import-free-database.cloud-job.ts
  class ImportFreeDatabaseCloudJob (line 26) | class ImportFreeDatabaseCloudJob extends CloudJob {
    method constructor (line 29) | constructor(
    method iteration (line 50) | async iteration(sessionMetadata: SessionMetadata): Promise<Database> {

FILE: redisinsight/api/src/modules/cloud/job/jobs/wait-for-active-database.cloud-job.ts
  class WaitForActiveDatabaseCloudJob (line 19) | class WaitForActiveDatabaseCloudJob extends CloudJob {
    method constructor (line 22) | constructor(
    method iteration (line 36) | async iteration(sessionMetadata: SessionMetadata): Promise<CloudDataba...

FILE: redisinsight/api/src/modules/cloud/job/jobs/wait-for-active-subscription.cloud-job.ts
  class WaitForActiveSubscriptionCloudJob (line 19) | class WaitForActiveSubscriptionCloudJob extends CloudJob {
    method constructor (line 22) | constructor(
    method iteration (line 35) | async iteration(

FILE: redisinsight/api/src/modules/cloud/job/jobs/wait-for-task.cloud-job.ts
  class WaitForTaskCloudJob (line 15) | class WaitForTaskCloudJob extends CloudJob {
    method constructor (line 18) | constructor(
    method iteration (line 30) | async iteration(sessionMetadata: SessionMetadata): Promise<CloudTask> {

FILE: redisinsight/api/src/modules/cloud/job/models/cloud-job-info.ts
  type CloudJobRunMode (line 6) | enum CloudJobRunMode {
  type CloudJobStatus (line 11) | enum CloudJobStatus {
  type CloudJobStep (line 18) | enum CloudJobStep {
  class CloudJobInfo (line 25) | class CloudJobInfo {

FILE: redisinsight/api/src/modules/cloud/session/cloud-session.module.ts
  class CloudSessionModule (line 7) | class CloudSessionModule {
    method register (line 8) | static register(

FILE: redisinsight/api/src/modules/cloud/session/cloud-session.service.ts
  class CloudSessionService (line 9) | class CloudSessionService {
    method constructor (line 10) | constructor(
    method getSession (line 15) | async getSession(id: string): Promise<CloudSession> {
    method updateSessionData (line 37) | async updateSessionData(id: string, cloud: any): Promise<CloudSession> {
    method deleteSessionData (line 70) | async deleteSessionData(id: string): Promise<void> {
    method invalidateApiSession (line 80) | async invalidateApiSession(id: string): Promise<void> {

FILE: redisinsight/api/src/modules/cloud/session/entities/cloud.session.entity.ts
  class CloudSessionEntity (line 6) | class CloudSessionEntity {

FILE: redisinsight/api/src/modules/cloud/session/models/cloud-session.ts
  class CloudSession (line 5) | class CloudSession {
  class CloudSessionData (line 28) | class CloudSessionData {

FILE: redisinsight/api/src/modules/cloud/session/repositories/local.cloud.session.repository.ts
  constant SESSION_ID (line 11) | const SESSION_ID = '1';
  class LocalCloudSessionRepository (line 13) | class LocalCloudSessionRepository extends CloudSessionRepository {
    method constructor (line 16) | constructor(
    method get (line 25) | async get(): Promise<CloudSessionData> {
    method save (line 37) | async save(cloudAuth: Partial<CloudSessionData>): Promise<void> {

FILE: redisinsight/api/src/modules/cloud/subscription/cloud-subscription.api.service.ts
  class CloudSubscriptionApiService (line 20) | class CloudSubscriptionApiService {
    method constructor (line 23) | constructor(
    method getSubscriptionPlans (line 36) | async getSubscriptionPlans(
    method getCloudRegions (line 96) | private async getCloudRegions(

FILE: redisinsight/api/src/modules/cloud/subscription/cloud-subscription.capi.service.ts
  class CloudSubscriptionCapiService (line 24) | class CloudSubscriptionCapiService {
    method constructor (line 27) | constructor(private readonly capi: CloudSubscriptionCapiProvider) {}
    method findFreeSubscription (line 29) | static findFreeSubscription(
    method findFreePlan (line 40) | static findFreePlan(plans: CloudSubscriptionPlan[]): CloudSubscription...
    method findFreePlanById (line 60) | static findFreePlanById(
    method getSubscriptions (line 74) | async getSubscriptions(
    method getSubscription (line 100) | async getSubscription(
    method getSubscriptionsPlans (line 127) | async getSubscriptionsPlans(
    method createFreeSubscription (line 149) | async createFreeSubscription(

FILE: redisinsight/api/src/modules/cloud/subscription/cloud-subscription.controller.ts
  class CloudSubscriptionController (line 21) | class CloudSubscriptionController {
    method constructor (line 22) | constructor(private readonly service: CloudSubscriptionApiService) {}
    method getPlans (line 37) | async getPlans(

FILE: redisinsight/api/src/modules/cloud/subscription/cloud-subscription.module.ts
  class CloudSubscriptionModule (line 22) | class CloudSubscriptionModule {}

FILE: redisinsight/api/src/modules/cloud/subscription/dto/create-free-cloud-subscription.dto.ts
  class CreateFreeCloudSubscriptionDto (line 11) | class CreateFreeCloudSubscriptionDto {

FILE: redisinsight/api/src/modules/cloud/subscription/dto/plans.cloud-subscription.dto.ts
  class CloudSubscriptionPlanResponse (line 3) | class CloudSubscriptionPlanResponse extends CloudSubscriptionPlan {

FILE: redisinsight/api/src/modules/cloud/subscription/models/api.interface.ts
  type ICloudApiSubscriptionCloudRegion (line 1) | interface ICloudApiSubscriptionCloudRegion {

FILE: redisinsight/api/src/modules/cloud/subscription/models/capi.interface.ts
  type ICloudCapiSubscriptionPricing (line 3) | interface ICloudCapiSubscriptionPricing {
  type ICloudCapiSubscriptionRegion (line 13) | interface ICloudCapiSubscriptionRegion {
  type ICloudCapiSubscriptionDetails (line 20) | interface ICloudCapiSubscriptionDetails {
  type ICloudCapiSubscription (line 27) | interface ICloudCapiSubscription {
  type ICloudCapiSubscriptions (line 40) | interface ICloudCapiSubscriptions {
  type ICloudCapiSubscriptionPlan (line 45) | interface ICloudCapiSubscriptionPlan {

FILE: redisinsight/api/src/modules/cloud/subscription/models/cloud-subscription-plan.ts
  type CloudSubscriptionPlanProvider (line 4) | enum CloudSubscriptionPlanProvider {
  class CloudSubscriptionPlan (line 10) | class CloudSubscriptionPlan {

FILE: redisinsight/api/src/modules/cloud/subscription/models/cloud-subscription-region.ts
  class CloudSubscriptionRegion (line 3) | class CloudSubscriptionRegion {

FILE: redisinsight/api/src/modules/cloud/subscription/models/cloud-subscription.ts
  type CloudSubscriptionStatus (line 3) | enum CloudSubscriptionStatus {
  type CloudSubscriptionType (line 11) | enum CloudSubscriptionType {
  class CloudSubscription (line 16) | class CloudSubscription {

FILE: redisinsight/api/src/modules/cloud/subscription/providers/cloud-subscription.api.provider.ts
  class CloudSubscriptionApiProvider (line 8) | class CloudSubscriptionApiProvider extends CloudApiProvider {
    method getCloudRegions (line 13) | async getCloudRegions(

FILE: redisinsight/api/src/modules/cloud/subscription/providers/cloud-subscription.capi.provider.ts
  class CloudSubscriptionCapiProvider (line 14) | class CloudSubscriptionCapiProvider extends CloudCapiProvider {
    method getSubscriptionsByType (line 20) | async getSubscriptionsByType(
    method getSubscriptionByType (line 42) | async getSubscriptionByType(
    method getSubscriptionsPlansByType (line 64) | async getSubscriptionsPlansByType(
    method createFreeSubscription (line 85) | async createFreeSubscription(

FILE: redisinsight/api/src/modules/cloud/task/cloud-task.capi.service.ts
  class CloudTaskCapiService (line 10) | class CloudTaskCapiService {
    method constructor (line 13) | constructor(private readonly cloudTaskCapiProvider: CloudTaskCapiProvi...
    method getTask (line 15) | async getTask(credentials: CloudCapiAuthDto, id: string): Promise<Clou...

FILE: redisinsight/api/src/modules/cloud/task/cloud-task.module.ts
  class CloudTaskModule (line 9) | class CloudTaskModule {}

FILE: redisinsight/api/src/modules/cloud/task/models/capi.interface.ts
  type ICloudCapiTask (line 1) | interface ICloudCapiTask {

FILE: redisinsight/api/src/modules/cloud/task/models/cloud-task.ts
  type CloudTaskStatus (line 3) | enum CloudTaskStatus {
  class CloudTask (line 11) | class CloudTask {

FILE: redisinsight/api/src/modules/cloud/task/providers/cloud-task.capi.provider.ts
  class CloudTaskCapiProvider (line 8) | class CloudTaskCapiProvider extends CloudCapiProvider {
    method getTask (line 14) | async getTask(

FILE: redisinsight/api/src/modules/cloud/user/cloud-user.api.service.ts
  class CloudUserApiService (line 17) | class CloudUserApiService {
    method constructor (line 20) | constructor(
    method getCurrentAccount (line 32) | static getCurrentAccount(user: CloudUser): CloudUserAccount {
    method ensureCsrf (line 41) | private async ensureCsrf(sessionMetadata: SessionMetadata): Promise<vo...
    method ensureAccessToken (line 70) | private async ensureAccessToken(
    method ensureLogin (line 102) | private async ensureLogin(
    method ensureCloudUser (line 162) | private async ensureCloudUser(
    method getCloudUser (line 216) | async getCloudUser(
    method me (line 236) | async me(
    method getUserSession (line 252) | async getUserSession(
    method invalidateApiSession (line 272) | async invalidateApiSession(sessionMetadata: SessionMetadata): Promise<...
    method setCurrentAccount (line 281) | async setCurrentAccount(
    method updateUser (line 314) | async updateUser(

FILE: redisinsight/api/src/modules/cloud/user/cloud-user.capi.service.ts
  class CloudUserCapiService (line 9) | class CloudUserCapiService {
    method constructor (line 12) | constructor(private readonly capi: CloudUserCapiProvider) {}
    method getCurrentAccount (line 18) | async getCurrentAccount(

FILE: redisinsight/api/src/modules/cloud/user/cloud-user.controller.ts
  class CloudUserController (line 25) | class CloudUserController {
    method constructor (line 26) | constructor(
    method me (line 37) | async me(
    method setCurrentAccount (line 51) | async setCurrentAccount(
    method logout (line 63) | async logout(

FILE: redisinsight/api/src/modules/cloud/user/cloud-user.module.ts
  class CloudUserModule (line 28) | class CloudUserModule {}

FILE: redisinsight/api/src/modules/cloud/user/models/api.interface.ts
  type ICloudApiUser (line 1) | interface ICloudApiUser {
  type ICloudApiAccount (line 10) | interface ICloudApiAccount {
  type ICloudApiCsrfToken (line 16) | interface ICloudApiCsrfToken {

FILE: redisinsight/api/src/modules/cloud/user/models/capi.interface.ts
  type ICloudCapiAccountOwner (line 1) | interface ICloudCapiAccountOwner {
  type ICloudCapiAccountKey (line 6) | interface ICloudCapiAccountKey {
  type ICloudCapiAccount (line 16) | interface ICloudCapiAccount {

FILE: redisinsight/api/src/modules/cloud/user/models/cloud-account-info.ts
  class CloudAccountInfo (line 3) | class CloudAccountInfo {

FILE: redisinsight/api/src/modules/cloud/user/models/cloud-user-account.ts
  class CloudUserAccount (line 4) | class CloudUserAccount {

FILE: redisinsight/api/src/modules/cloud/user/models/cloud-user.ts
  class CloudUser (line 6) | class CloudUser {

FILE: redisinsight/api/src/modules/cloud/user/providers/cloud-user.api.provider.ts
  class CloudUserApiProvider (line 12) | class CloudUserApiProvider extends CloudApiProvider {
    method getCsrfToken (line 19) | async getCsrfToken(credentials: ICloudApiCredentials): Promise<string> {
    method getApiSessionId (line 39) | async getApiSessionId(
    method getCurrentUser (line 67) | async getCurrentUser(
    method getAccounts (line 86) | async getAccounts(
    method setCurrentAccount (line 106) | async setCurrentAccount(

FILE: redisinsight/api/src/modules/cloud/user/providers/cloud-user.capi.provider.ts
  class CloudUserCapiProvider (line 9) | class CloudUserCapiProvider extends CloudCapiProvider {
    method getCurrentAccount (line 14) | async getCurrentAccount(

FILE: redisinsight/api/src/modules/cloud/user/repositories/in-session.cloud-user.repository.ts
  class InSessionCloudUserRepository (line 9) | class InSessionCloudUserRepository extends CloudUserRepository {
    method constructor (line 10) | constructor(private readonly sessionService: CloudSessionService) {
    method get (line 18) | async get(sessionId: string): Promise<CloudUser> {
    method update (line 33) | async update(

FILE: redisinsight/api/src/modules/cluster-monitor/cluster-monitor.controller.ts
  class ClusterMonitorController (line 11) | class ClusterMonitorController {
    method constructor (line 12) | constructor(private readonly clusterMonitorService: ClusterMonitorServ...
    method getClusterDetails (line 25) | async getClusterDetails(

FILE: redisinsight/api/src/modules/cluster-monitor/cluster-monitor.module.ts
  class ClusterMonitorModule (line 9) | class ClusterMonitorModule {}

FILE: redisinsight/api/src/modules/cluster-monitor/cluster-monitor.service.ts
  type ClusterInfoStrategies (line 17) | enum ClusterInfoStrategies {
  class ClusterMonitorService (line 23) | class ClusterMonitorService {
    method constructor (line 28) | constructor(private readonly databaseClientFactory: DatabaseClientFact...
    method getClusterDetails (line 43) | public async getClusterDetails(
    method getClusterInfoStrategy (line 80) | private getClusterInfoStrategy(version: string): IClusterInfo {

FILE: redisinsight/api/src/modules/cluster-monitor/models/cluster-details.ts
  class ClusterDetails (line 4) | class ClusterDetails {

FILE: redisinsight/api/src/modules/cluster-monitor/models/cluster-node-details.ts
  type NodeRole (line 3) | enum NodeRole {
  type HealthStatus (line 8) | enum HealthStatus {
  class ClusterNodeDetails (line 14) | class ClusterNodeDetails {

FILE: redisinsight/api/src/modules/cluster-monitor/strategies/abstract.info.strategy.ts
  method getClusterDetails (line 18) | async getClusterDetails(client: RedisClient): Promise<ClusterDetails> {
  method getClusterNodesInfo (line 42) | private async getClusterNodesInfo(
  method getClusterNodeInfo (line 75) | private async getClusterNodeInfo(
  method getClusterInfo (line 128) | static async getClusterInfo(
  method createClusterHierarchy (line 167) | static createClusterHierarchy(nodes): ClusterNodeDetails[] {
  method calculateCacheHitRatio (line 202) | static calculateCacheHitRatio(hits: number, misses: number): number {
  method calculateAdditionalClusterMetrics (line 218) | static calculateAdditionalClusterMetrics(

FILE: redisinsight/api/src/modules/cluster-monitor/strategies/cluster-nodes.info.strategy.ts
  class ClusterNodesInfoStrategy (line 9) | class ClusterNodesInfoStrategy extends AbstractInfoStrategy {
    method getClusterNodesFromRedis (line 10) | async getClusterNodesFromRedis(
    method determineNodeHealth (line 39) | static determineNodeHealth(flags: string): HealthStatus {

FILE: redisinsight/api/src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.ts
  class ClusterShardsInfoStrategy (line 10) | class ClusterShardsInfoStrategy extends AbstractInfoStrategy {
    method getClusterNodesFromRedis (line 11) | async getClusterNodesFromRedis(client: RedisClient) {
    method calculateSlots (line 25) | static calculateSlots(slots: number[]): string[] {
    method processShardNodes (line 35) | static processShardNodes(

FILE: redisinsight/api/src/modules/cluster-monitor/strategies/cluster.info.interface.ts
  type IClusterInfo (line 4) | interface IClusterInfo {

FILE: redisinsight/api/src/modules/commands/commands-json.provider.ts
  constant PATH_CONFIG (line 7) | const PATH_CONFIG = config.get('dir_path');
  class CommandsJsonProvider (line 10) | class CommandsJsonProvider {
    method constructor (line 17) | constructor(name, url) {
    method updateLatestJson (line 26) | async updateLatestJson() {
    method getCommands (line 50) | async getCommands() {
    method getDefaultCommands (line 73) | async getDefaultCommands() {

FILE: redisinsight/api/src/modules/commands/commands.controller.ts
  class CommandsController (line 7) | class CommandsController {
    method constructor (line 8) | constructor(private readonly commandsService: CommandsService) {}
    method getAll (line 11) | async getAll(): Promise<Record<string, any>> {

FILE: redisinsight/api/src/modules/commands/commands.module.ts
  constant COMMANDS_CONFIGS (line 7) | const COMMANDS_CONFIGS = config.get('commands');
  class CommandsModule (line 24) | class CommandsModule {}

FILE: redisinsight/api/src/modules/commands/commands.service.ts
  constant COMMANDS_TTL (line 6) | const COMMANDS_TTL = 300000;
  class CommandsService (line 9) | class CommandsService implements OnModuleInit {
    method constructor (line 16) | constructor(commandsProviders: CommandsJsonProvider[] = []) {
    method onModuleInit (line 23) | async onModuleInit() {
    method getAll (line 33) | async getAll(): Promise<any> {
    method getCommandsGroups (line 47) | async getCommandsGroups(): Promise<any> {

FILE: redisinsight/api/src/modules/constants/constants.module.ts
  class ConstantsModule (line 6) | class ConstantsModule {
    method register (line 7) | static register(

FILE: redisinsight/api/src/modules/constants/providers/local.constants.provider.ts
  class LocalConstantsProvider (line 9) | class LocalConstantsProvider extends ConstantsProvider {
    method getSystemSessionMetadata (line 13) | getSystemSessionMetadata(): SessionMetadata {
    method getAnonymousId (line 24) | getAnonymousId(sessionMetadata?: SessionMetadata): string {

FILE: redisinsight/api/src/modules/custom-tutorial/custom-tutorial.analytics.ts
  class CustomTutorialAnalytics (line 8) | class CustomTutorialAnalytics extends TelemetryBaseService {
    method constructor (line 9) | constructor(protected eventEmitter: EventEmitter2) {
    method sendImportSucceeded (line 13) | sendImportSucceeded(sessionMetadata: SessionMetadata, data: any = {}):...
    method sendImportFailed (line 23) | sendImportFailed(sessionMetadata: SessionMetadata, e: Error): void {

FILE: redisinsight/api/src/modules/custom-tutorial/custom-tutorial.controller.ts
  class CustomTutorialController (line 41) | class CustomTutorialController {
    method constructor (line 42) | constructor(private readonly service: CustomTutorialService) {}
    method create (line 57) | async create(
    method getGlobalManifest (line 74) | async getGlobalManifest(): Promise<RootCustomTutorialManifest> {
    method delete (line 83) | async delete(@Param('id') id: string): Promise<void> {

FILE: redisinsight/api/src/modules/custom-tutorial/custom-tutorial.module.ts
  class CustomTutorialModule (line 11) | class CustomTutorialModule {
    method register (line 12) | static register(

FILE: redisinsight/api/src/modules/custom-tutorial/custom-tutorial.service.ts
  class CustomTutorialService (line 32) | class CustomTutorialService {
    method constructor (line 39) | constructor(
    method validateManifestJson (line 46) | private async validateManifestJson(path: string): Promise<void> {
    method determineTutorialName (line 73) | private async determineTutorialName(path: string, link: string) {
    method create (line 90) | public async create(
    method getGlobalManifest (line 155) | public async getGlobalManifest(): Promise<RootCustomTutorialManifest> {
    method get (line 194) | public async get(id: string): Promise<CustomTutorial> {
    method delete (line 205) | public async delete(id: string): Promise<void> {

FILE: redisinsight/api/src/modules/custom-tutorial/dto/upload.custom-tutorial.dto.ts
  class UploadCustomTutorialDto (line 10) | class UploadCustomTutorialDto {

FILE: redisinsight/api/src/modules/custom-tutorial/entities/custom-tutorial.entity.ts
  class CustomTutorialEntity (line 10) | class CustomTutorialEntity {

FILE: redisinsight/api/src/modules/custom-tutorial/models/custom-tutorial.manifest.ts
  type CustomTutorialManifestType (line 14) | enum CustomTutorialManifestType {
  type ICustomTutorialManifest (line 20) | interface ICustomTutorialManifest {
  class CustomTutorialManifestArgs (line 30) | class CustomTutorialManifestArgs {
  class CustomTutorialManifest (line 51) | class CustomTutorialManifest {
  class RootCustomTutorialManifest (line 94) | class RootCustomTutorialManifest extends CustomTutorialManifest {

FILE: redisinsight/api/src/modules/custom-tutorial/models/custom-tutorial.ts
  constant PATH_CONFIG (line 5) | const PATH_CONFIG = config.get('dir_path');
  type CustomTutorialActions (line 7) | enum CustomTutorialActions {
  class CustomTutorial (line 13) | class CustomTutorial {
    method actions (line 29) | get actions(): CustomTutorialActions[] {
    method path (line 39) | get path(): string {
    method absolutePath (line 43) | get absolutePath(): string {

FILE: redisinsight/api/src/modules/custom-tutorial/providers/custom-tutorial.fs.provider.spec.ts
  constant PATH_CONFIG (line 24) | const PATH_CONFIG = config.get('dir_path');

FILE: redisinsight/api/src/modules/custom-tutorial/providers/custom-tutorial.fs.provider.ts
  constant PATH_CONFIG (line 17) | const PATH_CONFIG = config.get('dir_path');
  constant TMP_FOLDER (line 19) | const TMP_FOLDER = `${PATH_CONFIG.tmpDir}/RedisInsight/custom-tutorials`;
  constant UPLOAD_FROM_REMOTE_ORIGINS_WHITELIST (line 21) | const UPLOAD_FROM_REMOTE_ORIGINS_WHITELIST = [
  class CustomTutorialFsProvider (line 27) | class CustomTutorialFsProvider {
    method extractAll (line 40) | private async extractAll(
    method unzipToTmpFolder (line 63) | public async unzipToTmpFolder(zip: AdmZip): Promise<string> {
    method unzipFromMemoryStoredFile (line 81) | public async unzipFromMemoryStoredFile(
    method unzipFromExternalLink (line 91) | public async unzipFromExternalLink(link: string): Promise<string> {
    method moveFolder (line 126) | public async moveFolder(tmpPath: string, dest: string, force = false) {
    method removeFolder (line 144) | public async removeFolder(path: string) {
    method prepareTmpFolder (line 155) | static async prepareTmpFolder(): Promise<string> {
    method prepareTutorialFolder (line 168) | static async prepareTutorialFolder(path: string): Promise<string> {

FILE: redisinsight/api/src/modules/custom-tutorial/providers/custom-tutorial.manifest.provider.ts
  constant MANIFEST_FILE (line 14) | const MANIFEST_FILE = 'manifest.json';
  constant SYS_MANIFEST_FILE (line 15) | const SYS_MANIFEST_FILE = '_manifest.json';
  class CustomTutorialManifestProvider (line 18) | class CustomTutorialManifestProvider {
    method generateManifestFile (line 26) | private async generateManifestFile(
    method generateManifestEntry (line 56) | private async generateManifestEntry(
    method isOriginalManifestExists (line 100) | public async isOriginalManifestExists(path: string): Promise<boolean> {
    method getOriginalManifestJson (line 104) | public async getOriginalManifestJson(
    method getManifestJsonFile (line 116) | private async getManifestJsonFile(
    method getManifestJson (line 143) | public async getManifestJson(
    method generateTutorialManifest (line 167) | public async generateTutorialManifest(

FILE: redisinsight/api/src/modules/custom-tutorial/repositories/local.custom-tutorial.repository.ts
  class LocalCustomTutorialRepository (line 8) | class LocalCustomTutorialRepository extends CustomTutorialRepository {
    method constructor (line 9) | constructor(
    method create (line 19) | public async create(model: CustomTutorial): Promise<CustomTutorial> {
    method list (line 30) | public async list(): Promise<CustomTutorial[]> {
    method get (line 42) | public async get(id: string): Promise<CustomTutorial> {
    method delete (line 52) | public async delete(id: string): Promise<void> {

FILE: redisinsight/api/src/modules/database-analysis/database-analysis.controller.ts
  class DatabaseAnalysisController (line 34) | class DatabaseAnalysisController {
    method constructor (line 35) | constructor(private readonly service: DatabaseAnalysisService) {}
    method create (line 49) | async create(
    method get (line 68) | async get(@Param('id') id: string): Promise<DatabaseAnalysis> {
    method list (line 84) | async list(
    method modify (line 109) | async modify(

FILE: redisinsight/api/src/modules/database-analysis/database-analysis.module.ts
  class DatabaseAnalysisModule (line 21) | class DatabaseAnalysisModule {}

FILE: redisinsight/api/src/modules/database-analysis/database-analysis.service.ts
  class DatabaseAnalysisService (line 24) | class DatabaseAnalysisService {
    method constructor (line 27) | constructor(
    method create (line 41) | public async create(
    method get (line 136) | async get(id: string): Promise<DatabaseAnalysis> {
    method list (line 144) | async list(databaseId: string): Promise<ShortDatabaseAnalysis[]> {
    method vote (line 153) | async vote(

FILE: redisinsight/api/src/modules/database-analysis/dto/create-database-analysis.dto.ts
  class CreateDatabaseAnalysisDto (line 6) | class CreateDatabaseAnalysisDto {

FILE: redisinsight/api/src/modules/database-analysis/dto/recommendation-vote.dto.ts
  class RecommendationVoteDto (line 4) | class RecommendationVoteDto {

FILE: redisinsight/api/src/modules/database-analysis/entities/database-analysis.entity.ts
  class DatabaseAnalysisEntity (line 16) | class DatabaseAnalysisEntity {
    method constructor (line 153) | constructor(entity: Partial<DatabaseAnalysisEntity>) {

FILE: redisinsight/api/src/modules/database-analysis/models/analysis-progress.ts
  class AnalysisProgress (line 4) | class AnalysisProgress {

FILE: redisinsight/api/src/modules/database-analysis/models/database-analysis.ts
  class DatabaseAnalysis (line 12) | class DatabaseAnalysis {

FILE: redisinsight/api/src/modules/database-analysis/models/key.ts
  class Key (line 6) | class Key {

FILE: redisinsight/api/src/modules/database-analysis/models/nsp-summary.ts
  class NspSummary (line 7) | class NspSummary {

FILE: redisinsight/api/src/modules/database-analysis/models/nsp-type-summary.ts
  class NspTypeSummary (line 4) | class NspTypeSummary {

FILE: redisinsight/api/src/modules/database-analysis/models/recommendation.ts
  class Recommendation (line 4) | class Recommendation {

FILE: redisinsight/api/src/modules/database-analysis/models/scan-filter.ts
  class ScanFilter (line 6) | class ScanFilter {
    method getScanArgsArray (line 46) | getScanArgsArray(): Array<number | string> {
    method getCount (line 56) | getCount(): number {

FILE: redisinsight/api/src/modules/database-analysis/models/short-database-analysis.ts
  class ShortDatabaseAnalysis (line 4) | class ShortDatabaseAnalysis extends PartialType(

FILE: redisinsight/api/src/modules/database-analysis/models/simple-summary.ts
  class SimpleSummary (line 5) | class SimpleSummary {

FILE: redisinsight/api/src/modules/database-analysis/models/simple-type-summary.ts
  class SimpleTypeSummary (line 4) | class SimpleTypeSummary {

FILE: redisinsight/api/src/modules/database-analysis/models/sum-group.ts
  class SumGroup (line 4) | class SumGroup {

FILE: redisinsight/api/src/modules/database-analysis/providers/database-analysis.provider.ts
  constant DATABASE_ANALYSIS_CONFIG (line 17) | const DATABASE_ANALYSIS_CONFIG = config.get('database_analysis');
  class DatabaseAnalysisProvider (line 20) | class DatabaseAnalysisProvider {
    method constructor (line 36) | constructor(
    method create (line 47) | async create(analysis: Partial<DatabaseAnalysis>): Promise<DatabaseAna...
    method get (line 68) | async get(id: string): Promise<DatabaseAnalysis> {
    method recommendationVote (line 87) | async recommendationVote(
    method list (line 123) | async list(databaseId: string): Promise<ShortDatabaseAnalysis[]> {
    method cleanupDatabaseHistory (line 144) | async cleanupDatabaseHistory(databaseId: string): Promise<void> {
    method encryptEntity (line 171) | private async encryptEntity(
    method decryptEntity (line 205) | private async decryptEntity(
    method decryptField (line 232) | private async decryptField(

FILE: redisinsight/api/src/modules/database-analysis/providers/database-analyzer.ts
  constant TOP_KEYS_LIMIT (line 15) | const TOP_KEYS_LIMIT = 15;
  constant TOP_NSP_LIMIT (line 16) | const TOP_NSP_LIMIT = 15;
  class DatabaseAnalyzer (line 19) | class DatabaseAnalyzer {
    method analyze (line 20) | async analyze(
    method calculateSimpleSummary (line 43) | async calculateSimpleSummary(
    method calculateSimpleTypeSummary (line 78) | calculateSimpleTypeSummary(types: Map<string, any>): SimpleTypeSummary...
    method getNamespacesMap (line 90) | async getNamespacesMap(
    method getNamespace (line 132) | getNamespace(key: Buffer, delimiter = ':'): string {
    method calculateNspSummary (line 147) | async calculateNspSummary(
    method calculateNspTypeSummary (line 171) | calculateNspTypeSummary(
    method calculateTopKeys (line 189) | async calculateTopKeys(keysBatches: Key[][], field: string): Promise<K...
    method calculateExpirationTimeGroups (line 204) | async calculateExpirationTimeGroups(keys: Key[]): Promise<SumGroup[]> {

FILE: redisinsight/api/src/modules/database-analysis/scanner/key-info/key-info.provider.ts
  class KeyInfoProvider (line 18) | class KeyInfoProvider {
    method constructor (line 21) | constructor() {
    method getStrategy (line 34) | getStrategy(type: string): IKeyInfoStrategy {

FILE: redisinsight/api/src/modules/database-analysis/scanner/key-info/key-info.strategy.interface.ts
  type IKeyInfoStrategy (line 4) | interface IKeyInfoStrategy {

FILE: redisinsight/api/src/modules/database-analysis/scanner/key-info/strategies/abstract.info.strategy.ts
  method getLengthSafe (line 8) | async getLengthSafe(client: RedisClient, key: RedisString): Promise<numb...

FILE: redisinsight/api/src/modules/database-analysis/scanner/key-info/strategies/default-info.strategy.ts
  class DefaultInfoStrategy (line 3) | class DefaultInfoStrategy extends AbstractInfoStrategy {
    method getLength (line 4) | async getLength(): Promise<number> {

FILE: redisinsight/api/src/modules/database-analysis/scanner/key-info/strategies/graph-info.strategy.ts
  class GraphInfoStrategy (line 5) | class GraphInfoStrategy extends AbstractInfoStrategy {
    method getLength (line 6) | async getLength(client: RedisClient, key: RedisString): Promise<number> {

FILE: redisinsight/api/src/modules/database-analysis/scanner/key-info/strategies/hash-info.strategy.ts
  class HashInfoStrategy (line 5) | class HashInfoStrategy extends AbstractInfoStrategy {
    method getLength (line 6) | async getLength(client: RedisClient, key: RedisString): Promise<number> {

FILE: redisinsight/api/src/modules/database-analysis/scanner/key-info/strategies/json-info.strategy.ts
  class JsonInfoStrategy (line 5) | class JsonInfoStrategy extends AbstractInfoStrategy {
    method getLength (line 6) | async getLength(client: RedisClient, key: RedisString): Promise<number> {

FILE: redisinsight/api/src/modules/database-analysis/scanner/key-info/strategies/list-info.strategy.ts
  class ListInfoStrategy (line 5) | class ListInfoStrategy extends AbstractInfoStrategy {
    method getLength (line 6) | async getLength(client: RedisClient, key: RedisString): Promise<number> {

FILE: redisinsight/api/src/modules/database-analysis/scanner/key-info/strategies/set-info.strategy.ts
  class SetInfoStrategy (line 5) | class SetInfoStrategy extends AbstractInfoStrategy {
    method getLength (line 6) | as
Copy disabled (too large) Download .json
Condensed preview — 6242 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (20,510K chars).
[
  {
    "path": ".ai/README.md",
    "chars": 5588,
    "preview": "# RedisInsight AI Development Rules\n\nThis directory contains the **single source of truth** for AI-assisted development "
  },
  {
    "path": ".ai/commands/commit-message.md",
    "chars": 2089,
    "preview": "# Commit Message Generation\n\nGenerate concise, meaningful commit messages following RedisInsight conventions.\n\n## Format"
  },
  {
    "path": ".ai/commands/e2e-fix.md",
    "chars": 3877,
    "preview": "---\ndescription: Run E2E tests and fix any failures\nargument-hint: <test-pattern>\n---\n\n# Fix E2E Tests\n\nRun E2E tests ma"
  },
  {
    "path": ".ai/commands/e2e-generate.md",
    "chars": 4050,
    "preview": "---\ndescription: Explore a page using Playwright MCP and generate E2E tests for a Jira ticket\nargument-hint: <ticket-id "
  },
  {
    "path": ".ai/commands/generate-release-notes.md",
    "chars": 14615,
    "preview": "***\n\ndescription: Generate release notes from JIRA tickets for a specific version\nargument-hint: <version> \\[jira-filter"
  },
  {
    "path": ".ai/commands/pr-plan.md",
    "chars": 8496,
    "preview": "---\ndescription: Analyze a JIRA ticket and create a detailed implementation plan\nargument-hint: <ticket-id or ticket-url"
  },
  {
    "path": ".ai/commands/pull-request-review.md",
    "chars": 5520,
    "preview": "# PR Review Command\n\n## Purpose\n\nReviews code changes in the current branch against requirements, best practices, and pr"
  },
  {
    "path": ".ai/rules/backend.md",
    "chars": 6109,
    "preview": "---\ndescription: NestJS backend development patterns, module structure, services, controllers, DTOs, and error handling\n"
  },
  {
    "path": ".ai/rules/code-quality.md",
    "chars": 2621,
    "preview": "---\nalwaysApply: true\n---\n\n# Code Quality Standards\n\n## Critical Rules\n\n- **ALWAYS run linter** after code changes: `yar"
  },
  {
    "path": ".ai/rules/e2e-testing.md",
    "chars": 17022,
    "preview": "---\ndescription: Playwright E2E testing standards, page object models, test structure, fixtures, and navigation patterns"
  },
  {
    "path": ".ai/rules/frontend.md",
    "chars": 12288,
    "preview": "---\ndescription: React frontend development patterns, Redux, styled-components, UI components, and hooks\nglobs: redisins"
  },
  {
    "path": ".ai/rules/git-safety.md",
    "chars": 2150,
    "preview": "---\ndescription: Critical safety guardrails for protected branches - prevents direct commits, pushes, and force pushes t"
  },
  {
    "path": ".ai/rules/testing.md",
    "chars": 11848,
    "preview": "---\ndescription: Jest and Testing Library standards, test patterns, faker usage, renderComponent helper, and mocking\nglo"
  },
  {
    "path": ".ai/skills/branches/SKILL.md",
    "chars": 1820,
    "preview": "---\nname: branches\ndescription: >-\n  Create and name git branches following project conventions and GitHub Actions\n  enf"
  },
  {
    "path": ".ai/skills/commits/SKILL.md",
    "chars": 1802,
    "preview": "---\nname: commits\ndescription: >-\n  Generate commit messages following Conventional Commits format. Use when\n  creating "
  },
  {
    "path": ".ai/skills/pull-requests/SKILL.md",
    "chars": 1981,
    "preview": "---\nname: pull-requests\ndescription: >-\n  Create and review pull requests following project standards including title\n  "
  },
  {
    "path": ".cursor/agents/test-runner.md",
    "chars": 560,
    "preview": "---\nname: test-runner\nmodel: composer-1.5\ndescription: Test automation expert. Use proactively to run tests and fix fail"
  },
  {
    "path": ".cursorignore",
    "chars": 14,
    "preview": "!/node_modules"
  },
  {
    "path": ".dockerignore",
    "chars": 157,
    "preview": ".git\n.idea\n.vscode\n.docker\n\n**/node_modules\n\n**/dist\n**/coverage\n**/dll\n**/.issues\n**/.parcel-cache\n**/.temp_cache\n**/.n"
  },
  {
    "path": ".editorconfig",
    "chars": 240,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ni"
  },
  {
    "path": ".eslintignore",
    "chars": 1025,
    "preview": "tests/e2e\ntests/e2e-playwright\n\n# Logs\nlogs\n*.log\n\n# Tests coverage results\nredisinsight/api/test/test-runs/coverage\n\n# "
  },
  {
    "path": ".eslintrc.js",
    "chars": 12994,
    "preview": "const path = require('path');\n\nconst noUnusedVarsConfig = [\n  'error',\n  {\n    argsIgnorePattern: '^_',\n    varsIgnorePa"
  },
  {
    "path": ".gitattributes",
    "chars": 188,
    "preview": "*       text    eol=lf\n*.exe   binary\n*.png   binary\n*.jpg   binary\n*.jpeg  binary\n*.ico   binary\n*.icns  binary\n*.otf  "
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 181,
    "preview": "* krum.tyukenov@redis.com pavel.angelov@redis.com dijana.antovska@redis.com artem.horuzhenko@redis.com petar.dzhambazov@"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 631,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: '[Bug]:'\nlabels: bug\nassignees: ''\n---\n\n**Precondi"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 505,
    "preview": "---\nname: Feature request\nabout: Request a feature or submit an idea\ntitle: '[Feature Request]:'\nlabels: feature\nassigne"
  },
  {
    "path": ".github/actions/deploy-test-reports/action.yml",
    "chars": 1513,
    "preview": "name: Deploy Pages\ndescription: 'Download the artifact and deploy to GitHub Pages'\n\ninputs:\n  group:\n    description: Gr"
  },
  {
    "path": ".github/actions/get-current-date/action.yml",
    "chars": 302,
    "preview": "name: Get current date\n\noutputs:\n  date:\n    description: Current date\n    value: ${{ steps.date.outputs.date }}\n\nruns:\n"
  },
  {
    "path": ".github/actions/install-all-build-libs/action.yml",
    "chars": 2620,
    "preview": "name: Install all libraries action\ndescription: Install all libraries and dependencies\ninputs:\n  skip-system-deps:\n    d"
  },
  {
    "path": ".github/actions/install-apple-certs/action.yml",
    "chars": 1965,
    "preview": "name: Add certs to the keychain (macos)\n\ninputs:\n  CSC_P12_BASE64:\n    required: true\n  CSC_MAC_INSTALLER_P12_BASE64:\n  "
  },
  {
    "path": ".github/actions/install-deps/action.yml",
    "chars": 984,
    "preview": "name: Install Dependencies action\ndescription: Caches and installs dependencies for a given path\ninputs:\n  dir-path:\n   "
  },
  {
    "path": ".github/actions/install-windows-certs/action.yml",
    "chars": 350,
    "preview": "name: Install Windows certs\n\ninputs:\n  WIN_CSC_PFX_BASE64:\n    required: true\n\nruns:\n  using: 'composite'\n  steps:\n    -"
  },
  {
    "path": ".github/actions/remove-artifacts/action.yml",
    "chars": 580,
    "preview": "name: Remove all artifacts\n\nruns:\n  using: 'composite'\n  steps:\n    - name: Merge artifacts by pattern\n      id: merge-a"
  },
  {
    "path": ".github/actions/setup-e2e-playwright/action.yml",
    "chars": 2581,
    "preview": "name: 'Setup E2E Playwright'\ndescription: 'Setup Node.js, E2E dependencies, and Playwright browsers with caching'\n\ninput"
  },
  {
    "path": ".github/build/build.Dockerfile",
    "chars": 1149,
    "preview": "FROM node:22.12.0-alpine\n\n# runtime args and environment variables\nARG DIST=Redis-Insight.tar.gz\nARG NODE_ENV=production"
  },
  {
    "path": ".github/build/build.sh",
    "chars": 152,
    "preview": "#!/bin/bash\nset -e\n\n# install deps\nyarn\nyarn --cwd redisinsight/api\n\n# build\n\nyarn build:statics\nyarn build:ui\nyarn --cw"
  },
  {
    "path": ".github/build/build_modules.sh",
    "chars": 2932,
    "preview": "#!/bin/bash\nset -e\n\nPLATFORM=${PLATFORM:-'linux'}\nARCH=${ARCH:-'x64'}\nLIBC=${LIBC:-''}\n#FILENAME=\"Redis-Insight-$PLATFOR"
  },
  {
    "path": ".github/build/release-docker.sh",
    "chars": 1605,
    "preview": "#!/bin/bash\nset -e\n\nHELP=\"Args:\n-v - Semver (3.2.0)\n-d - Build image repository (Ex: -d redisinsight)\n-r - Target reposi"
  },
  {
    "path": ".github/build/sum_sha256.sh",
    "chars": 114,
    "preview": "#!/bin/bash\nset -e\n\nfind ./release -type f -name '*.tar.gz' -execdir sh -c 'sha256sum \"$1\" > \"$1.sha256\"' _ {} \\;\n"
  },
  {
    "path": ".github/codeql/config.yml",
    "chars": 139,
    "preview": "paths-ignore:\n  - 'tests/**'\n  - '**/*.test.ts'\n  - '**/*.spec.ts'\n  - '**/*.spec.tsx'\n  - '**/__mocks__/**'\n  - './redi"
  },
  {
    "path": ".github/copilot-instructions.md",
    "chars": 2910,
    "preview": "# GitHub Copilot Instructions for RedisInsight\n\n> **🎯 Start here: Read `AGENTS.md` at the repository root for essential "
  },
  {
    "path": ".github/deps-audit-report.js",
    "chars": 2363,
    "preview": "const fs = require('fs');\nconst { exec } = require('child_process');\n\nconst FILENAME = process.env.FILENAME;\nconst DEPS "
  },
  {
    "path": ".github/deps-licenses-report.js",
    "chars": 7859,
    "preview": "const fs = require('fs');\nconst { join } = require('path');\nconst { last, set } = require('lodash');\nconst { google } = "
  },
  {
    "path": ".github/e2e/test.app-image.sh",
    "chars": 1027,
    "preview": "#!/bin/bash\nset -e\n\npkill -f Redis*  || true\nrm -f apppath\n\nyarn --cwd tests/e2e install\n\n# mount app resources\nchmod +x"
  },
  {
    "path": ".github/e2e/test.app-image.sso.sh",
    "chars": 1615,
    "preview": "#!/bin/bash\nset -e\n\nyarn --cwd tests/e2e install\n\n# Create the ri-test directory if it doesn't exist\nmkdir -p ri-test\n\n#"
  },
  {
    "path": ".github/e2e-results.js",
    "chars": 1601,
    "preview": "const fs = require('fs');\n\nlet parallelNodeInfo = '';\n// const totalNodes = parseInt(process.env.NODE_TOTAL, 10);\nconst "
  },
  {
    "path": ".github/generate-build-summary.js",
    "chars": 3371,
    "preview": "const fs = require('fs');\nconst path = require('path');\n\nconst { appendFile } = fs.promises;\n\nconst {\n  AWS_DEFAULT_REGI"
  },
  {
    "path": ".github/generate-checksums-summary.js",
    "chars": 3197,
    "preview": "const fs = require('fs');\nconst path = require('path');\n\nconst { appendFile } = fs.promises;\n\nconst { GITHUB_STEP_SUMMAR"
  },
  {
    "path": ".github/itest-results.js",
    "chars": 1309,
    "preview": "const fs = require('fs');\n\nconst file = 'redisinsight/api/test/test-runs/coverage/test-run-result.json';\n\nconst results "
  },
  {
    "path": ".github/lint-report.js",
    "chars": 1554,
    "preview": "const fs = require('fs');\n\nconst FILENAME = process.env.FILENAME || 'lint.audit.json';\nconst WORKDIR = process.env.WORKD"
  },
  {
    "path": ".github/redisstack/app-image.repack.sh",
    "chars": 635,
    "preview": "#!/bin/bash\nset -e\n\nARCH=${ARCH:-x86_64}\nWORKING_DIRECTORY=$(pwd)\nSOURCE_APP=${SOURCE_APP:-\"Redis-Insight-linux-$ARCH.Ap"
  },
  {
    "path": ".github/redisstack/dmg.repack.sh",
    "chars": 579,
    "preview": "#!/bin/bash\nset -e\n\nARCH=${ARCH:-x64}\nWORKING_DIRECTORY=$(pwd)\nTAR_NAME=\"Redis-Insight-app-darwin.$ARCH.tar.gz\"\nRI_APP_F"
  },
  {
    "path": ".github/virustotal-report.js",
    "chars": 1076,
    "preview": "const fs = require('fs');\n\nconst fileName = process.env.FILE_NAME;\nconst buildName = process.env.BUILD_NAME;\nconst faile"
  },
  {
    "path": ".github/workflows/approval-dedupe.yml",
    "chars": 7516,
    "preview": "# Reusable workflow: Approval-based deduplication by PR head SHA\n#\n# Purpose\n# - Gate heavy CI jobs to run only on Appro"
  },
  {
    "path": ".github/workflows/aws-upload-dev.yml",
    "chars": 2288,
    "preview": "name: AWS Development\n\non:\n  workflow_call:\n    inputs:\n      pre-release:\n        type: boolean\n        default: false\n"
  },
  {
    "path": ".github/workflows/aws-upload-enterprise.yml",
    "chars": 3599,
    "preview": "name: AWS Upload Enterprise\n\non:\n  workflow_call:\n    inputs:\n      environment:\n        description: Environment for bu"
  },
  {
    "path": ".github/workflows/aws-upload-prod.yml",
    "chars": 7570,
    "preview": "name: AWS production\n\non:\n  workflow_call:\n\nenv:\n  AWS_BUCKET_NAME: ${{ secrets.AWS_BUCKET_NAME }}\n  AWS_DISTRIBUTION_ID"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 1683,
    "preview": "name: Build\n\non:\n  # Called for Release workflows\n  workflow_call:\n    inputs:\n      environment:\n        description: E"
  },
  {
    "path": ".github/workflows/clean-deployments.yml",
    "chars": 827,
    "preview": "name: Delete deployments\non:\n  workflow_call:\n\njobs:\n  clean:\n    name: Clean deployments\n    runs-on: ubuntu-latest\n   "
  },
  {
    "path": ".github/workflows/clean-s3-dev-builds.yml",
    "chars": 809,
    "preview": "name: Clean AWS S3 development builds\non:\n  workflow_call:\n\nenv:\n  AWS_BUCKET_NAME_TEST: ${{ secrets.AWS_BUCKET_NAME_TES"
  },
  {
    "path": ".github/workflows/code-coverage.yml",
    "chars": 5402,
    "preview": "name: 'Code Coverage'\non:\n  workflow_call:\n    inputs:\n      type:\n        description: Type of report (unit or integrat"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 2449,
    "preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
  },
  {
    "path": ".github/workflows/compress-images.yml",
    "chars": 1327,
    "preview": "name: Compress Images\non:\n  pull_request:\n    # Run Image Actions when JPG, JPEG, PNG or WebP files are added or changed"
  },
  {
    "path": ".github/workflows/enforce-branch-name-rules.yml",
    "chars": 1029,
    "preview": "name: Enforce Branch Name Rules\n\non:\n  pull_request:\n    branches:\n      - main\n\njobs:\n  enforce-branch-rules:\n    runs-"
  },
  {
    "path": ".github/workflows/licenses-check.yml",
    "chars": 1067,
    "preview": "name: Licenses check pipeline\non:\n  workflow_call:\n  workflow_dispatch:\n\njobs:\n  licenses-check:\n    name: Licenses chec"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 680,
    "preview": "name: Lint\n\non:\n  workflow_call:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n\njobs:\n  lint:\n    runs-on: ubu"
  },
  {
    "path": ".github/workflows/manual-build-enterprise.yml",
    "chars": 2592,
    "preview": "name: 🚀 Manual build - Enterprise\n\non:\n  # Manual trigger build\n  # No multi-select\n  # https://github.com/actions/runne"
  },
  {
    "path": ".github/workflows/manual-build.yml",
    "chars": 2635,
    "preview": "name: 🚀 Manual build\n\non:\n  # Manual trigger build\n  # No multi-select\n  # https://github.com/actions/runner/issues/2076"
  },
  {
    "path": ".github/workflows/nightly-virustotal-analyze.yml",
    "chars": 4994,
    "preview": "name: Nightly Virustotal Analyze\n\non:\n  workflow_dispatch:\n    inputs:\n      mode:\n        description: \"Choose 'single'"
  },
  {
    "path": ".github/workflows/pipeline-build-docker.yml",
    "chars": 4982,
    "preview": "name: Build docker pipeline\non:\n  workflow_call:\n    inputs:\n      environment:\n        description: Environment for bui"
  },
  {
    "path": ".github/workflows/pipeline-build-linux.yml",
    "chars": 4328,
    "preview": "name: Build linux pipeline\n\non:\n  workflow_call:\n    inputs:\n      environment:\n        description: Environment for bui"
  },
  {
    "path": ".github/workflows/pipeline-build-macos.yml",
    "chars": 5482,
    "preview": "name: Build macos pipeline\non:\n  workflow_call:\n    inputs:\n      environment:\n        description: Environment for buil"
  },
  {
    "path": ".github/workflows/pipeline-build-windows.yml",
    "chars": 3215,
    "preview": "name: Build windows pipeline\non:\n  workflow_call:\n    inputs:\n      environment:\n        description: Environment for bu"
  },
  {
    "path": ".github/workflows/publish-stores.yml",
    "chars": 2219,
    "preview": "name: Publish to stores\n\non:\n  workflow_call:\n\nenv:\n  AWS_BUCKET_NAME: ${{ secrets.AWS_BUCKET_NAME }}\n  AWS_DEFAULT_REGI"
  },
  {
    "path": ".github/workflows/release-prod.yml",
    "chars": 1181,
    "preview": "name: ❗ Release (prod)\n\non:\n  push:\n    branches:\n      - \"latest\"\n\njobs:\n  tests-prod:\n    name: Run all tests\n    uses"
  },
  {
    "path": ".github/workflows/release-stage.yml",
    "chars": 888,
    "preview": "name: 📖 Release (stage)\n\non:\n  push:\n    branches:\n      - \"release/**\"\n\njobs:\n  tests:\n    name: Release stage tests\n  "
  },
  {
    "path": ".github/workflows/tests-backend.yml",
    "chars": 2572,
    "preview": "name: Tests BE\non:\n  workflow_call:\n    inputs:\n      skip-electron-deps:\n        description: Skip install electron dep"
  },
  {
    "path": ".github/workflows/tests-e2e-appimage.yml",
    "chars": 4359,
    "preview": "name: Tests E2E AppImage\non:\n  workflow_call:\n    inputs:\n      report:\n        description: Send report to Slack\n      "
  },
  {
    "path": ".github/workflows/tests-e2e-docker-critical-path.yml",
    "chars": 4687,
    "preview": "name: \"E2E: Critical Path (Docker)\"\n\non:\n  workflow_call:\n    inputs:\n      report:\n        description: Send report to "
  },
  {
    "path": ".github/workflows/tests-e2e-docker-regression.yml",
    "chars": 4669,
    "preview": "name: \"E2E: Regression (Docker)\"\n\non:\n  workflow_call:\n    inputs:\n      report:\n        description: Send report to Sla"
  },
  {
    "path": ".github/workflows/tests-e2e-docker-smoke.yml",
    "chars": 4476,
    "preview": "name: \"E2E: Smoke (Docker)\"\n\non:\n  workflow_call:\n    inputs:\n      report:\n        description: Send report to Slack\n  "
  },
  {
    "path": ".github/workflows/tests-e2e-playwright-chromium.yml",
    "chars": 3136,
    "preview": "name: E2E Playwright - Chromium (Dev)\n\non:\n  workflow_call:\n    inputs:\n      environment:\n        description: 'Environ"
  },
  {
    "path": ".github/workflows/tests-e2e-playwright-docker.yml",
    "chars": 4231,
    "preview": "name: E2E Playwright - Docker\n\non:\n  workflow_call:\n    inputs:\n      environment:\n        description: 'Environment to "
  },
  {
    "path": ".github/workflows/tests-e2e-playwright-electron.yml",
    "chars": 6234,
    "preview": "name: E2E Playwright - Electron (Linux)\n\non:\n  workflow_call:\n    inputs:\n      environment:\n        description: 'Envir"
  },
  {
    "path": ".github/workflows/tests-e2e-playwright-lint.yml",
    "chars": 726,
    "preview": "name: E2E Playwright - Lint & Type Check\n\non:\n  workflow_call:\n\nenv:\n  E2E_DIR: './tests/e2e-playwright'\n\njobs:\n  lint:\n"
  },
  {
    "path": ".github/workflows/tests-e2e-playwright-v2.yml",
    "chars": 3471,
    "preview": "name: E2E Playwright Tests (v2)\n\non:\n  # Manual trigger\n  workflow_dispatch:\n    inputs:\n      environment:\n        desc"
  },
  {
    "path": ".github/workflows/tests-e2e-playwright.yml",
    "chars": 3308,
    "preview": "name: Playwright E2E Tests\non:\n  workflow_call:\n    inputs:\n      debug:\n        description: SSH Debug\n        default:"
  },
  {
    "path": ".github/workflows/tests-e2e.yml",
    "chars": 2453,
    "preview": "name: ✅ E2E Tests\n\non:\n  workflow_dispatch:\n    inputs:\n      debug:\n        description: Enable SSH Debug (IT and E2E)\n"
  },
  {
    "path": ".github/workflows/tests-frontend.yml",
    "chars": 2314,
    "preview": "name: Tests UI\non:\n  workflow_call:\n\nenv:\n  SLACK_AUDIT_REPORT_CHANNEL: ${{ secrets.SLACK_AUDIT_REPORT_CHANNEL }}\n  SLAC"
  },
  {
    "path": ".github/workflows/tests-integration.yml",
    "chars": 10488,
    "preview": "name: Integration tests\non:\n  workflow_call:\n    inputs:\n      build:\n        description: Backend build to run tests ov"
  },
  {
    "path": ".github/workflows/tests.yml",
    "chars": 5065,
    "preview": "name: ✅ Tests\n\non:\n  push:\n    branches:\n      - 'fe/**'\n      - 'be/**'\n      - 'fe-be/**'\n      - 'feature/**'\n      -"
  },
  {
    "path": ".github/workflows/virustotal.yml",
    "chars": 6354,
    "preview": "name: Virustotal Analyze\n\non:\n  workflow_call:\n    inputs:\n      skip_report:\n        description: Skip report\n        r"
  },
  {
    "path": ".github/workflows/weekly.yml",
    "chars": 151,
    "preview": "name: Weekly jobs\non:\n  schedule:\n    - cron: 0 0 * * 1\n\njobs:\n  licenses-check:\n    uses: ./.github/workflows/licenses-"
  },
  {
    "path": ".gitignore",
    "chars": 1360,
    "preview": "# compiled output\ndist\nnode_modules\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n"
  },
  {
    "path": ".jit/jit-config.yml",
    "chars": 296,
    "preview": "# Jit Security Plan Configuration\n# https://docs.jit.io/\n\nname: RedisInsight Security Plan\n\n# Exclusions from security s"
  },
  {
    "path": ".nvmrc",
    "chars": 3,
    "preview": "22\n"
  },
  {
    "path": ".prettierignore",
    "chars": 41,
    "preview": "tests/e2e\ntests/e2e-playwright\n**/*.scss\n"
  },
  {
    "path": ".prettierrc",
    "chars": 142,
    "preview": "{\n  \"semi\": true,\n  \"overrides\": [\n    {\n      \"files\": [\"**/*.ts\", \"**/*.tsx\"],\n      \"options\": {\n        \"semi\": fals"
  },
  {
    "path": ".storybook/RootStoryLayout.tsx",
    "chars": 849,
    "preview": "import React, { FC, PropsWithChildren } from 'react'\nimport { StoryContext } from '@storybook/react-vite'\n\nexport interf"
  },
  {
    "path": ".storybook/Story.context.ts",
    "chars": 531,
    "preview": "import { createContext, useContext } from 'react'\nimport { StoryContext } from '@storybook/react-vite'\n\nconst Context = "
  },
  {
    "path": ".storybook/ThemeContextBridge.tsx",
    "chars": 795,
    "preview": "import React from 'react'\nimport { useTheme } from '@redis-ui/styles'\nimport { ThemeContext } from 'uiSrc/contexts/theme"
  },
  {
    "path": ".storybook/helpers/styles.ts",
    "chars": 537,
    "preview": "import styled from 'styled-components'\nimport { Theme } from 'uiSrc/components/base/theme/types'\nimport PageBody from 'u"
  },
  {
    "path": ".storybook/main.ts",
    "chars": 710,
    "preview": "import type { StorybookConfig } from '@storybook/react-vite'\nimport { mergeConfig } from 'vite'\nimport vc from './vite.c"
  },
  {
    "path": ".storybook/manager.ts",
    "chars": 135,
    "preview": "import { addons } from 'storybook/manager-api'\nimport { themes } from 'storybook/theming'\n\naddons.setConfig({\n  theme: t"
  },
  {
    "path": ".storybook/preview-head.html",
    "chars": 1048,
    "preview": "<script>\n    window.global = window;\n</script>\n<style>\n    :root {\n        /*\n           Insert global variables here:\n "
  },
  {
    "path": ".storybook/preview.tsx",
    "chars": 2501,
    "preview": "import React from 'react'\nimport type { Parameters, Preview } from '@storybook/react-vite'\nimport { withThemeFromJSXProv"
  },
  {
    "path": ".storybook/redis-theme.ts",
    "chars": 406,
    "preview": "import { create } from '@storybook/theming/create';\n\nexport default create({\n  base: 'light',\n\n  brandTitle: 'Redis UI',"
  },
  {
    "path": ".storybook/tsconfig.json",
    "chars": 178,
    "preview": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"jsx\": \"react\",\n    \"types\": [\"node\", \"vite/client\"],\n    "
  },
  {
    "path": ".storybook/vite.config.ts",
    "chars": 3897,
    "preview": "import 'dotenv/config'\nimport { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\nimport svgr from 'vi"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 122,
    "preview": "{\n  \"recommendations\": [\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\",\n    \"ms-playwright.playwright\"\n  ]\n"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 903,
    "preview": "{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"type\": \"node\",\n      \"request\": \"launch\",\n      \"name\": \"Debu"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 306,
    "preview": "{\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n  \"[javascript]\": {\n    \"editor.defaultFormatter\": \"esbenp.pret"
  },
  {
    "path": ".yarnrc",
    "chars": 148,
    "preview": "# This will set the --ignore-scripts flag whenever running yarn add\n#--ignore-scripts true\n#--install.ignore-scripts tru"
  },
  {
    "path": "AGENTS.md",
    "chars": 3908,
    "preview": "# RedisInsight AI Agent Instructions\n\nThis file provides essential context and instructions for AI coding agents working"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 23,
    "preview": "# 0.0.0\n\n#### Features\n"
  },
  {
    "path": "CONDUCT",
    "chars": 5031,
    "preview": "Contributor Covenant Code of Conduct\nOur Pledge\nWe as members, contributors, and leaders pledge to make participation in"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2094,
    "preview": "# Contributing\n\nWelcome! This short guide explains how to contribute effectively and pass all required checks.\n\n## Submi"
  },
  {
    "path": "Dockerfile",
    "chars": 3025,
    "preview": "# this dockerfile has two stages, a build stage and the executable stage.\n# the build stage is responsible for building "
  },
  {
    "path": "LICENSE",
    "chars": 30425,
    "preview": "                     Server Side Public License\n                     VERSION 1, OCTOBER 16, 2018\n\n                    Co"
  },
  {
    "path": "README.md",
    "chars": 6472,
    "preview": "[![Release](https://img.shields.io/github/v/release/RedisInsight/RedisInsight.svg?sort=semver)](https://github.com/Redis"
  },
  {
    "path": "api-docker-entry.sh",
    "chars": 426,
    "preview": "#!/bin/sh\n\n# Initializing system's secret storage\neval \"$(dbus-launch --sh-syntax)\"\n\nmkdir -p ~/.cache\nmkdir -p ~/.local"
  },
  {
    "path": "babel.config.cjs",
    "chars": 629,
    "preview": "/* eslint global-require: off, import/no-extraneous-dependencies: off */\nconst developmentEnv = ['development', 'test'];"
  },
  {
    "path": "configs/.eslintrc",
    "chars": 114,
    "preview": "{\n  \"rules\": {\n    \"no-console\": \"off\",\n    \"global-require\": \"off\",\n    \"import/no-dynamic-require\": \"off\"\n  }\n}\n"
  },
  {
    "path": "configs/webpack.config.base.ts",
    "chars": 2311,
    "preview": "import webpack from 'webpack'\nimport TsconfigPathsPlugins from 'tsconfig-paths-webpack-plugin'\nimport webpackPaths from "
  },
  {
    "path": "configs/webpack.config.eslint.js",
    "chars": 185,
    "preview": "// eslint-disable-next-line import/no-self-import\n/* eslint import/no-unresolved: off, import/no-self-import: off */\n\nmo"
  },
  {
    "path": "configs/webpack.config.main.prod.ts",
    "chars": 4628,
    "preview": "import path from 'path'\nimport webpack from 'webpack'\nimport { merge } from 'webpack-merge'\nimport { toString } from 'lo"
  },
  {
    "path": "configs/webpack.config.main.stage.ts",
    "chars": 586,
    "preview": "import webpack from 'webpack'\nimport { merge } from 'webpack-merge'\nimport { BundleAnalyzerPlugin } from 'webpack-bundle"
  },
  {
    "path": "configs/webpack.config.preload.dev.ts",
    "chars": 1638,
    "preview": "import path from 'path'\nimport webpack from 'webpack'\nimport { merge } from 'webpack-merge'\nimport { BundleAnalyzerPlugi"
  },
  {
    "path": "configs/webpack.paths.ts",
    "chars": 1206,
    "preview": "const path = require('path')\n\nconst rootPath = path.join(__dirname, '..')\n\nconst riPath = path.join(rootPath, 'redisinsi"
  },
  {
    "path": "docker-entry.sh",
    "chars": 486,
    "preview": "#!/bin/sh\n# Entry point for distributable docker image\n# This script does some setup required for bootstrapping the cont"
  },
  {
    "path": "docs/azure-docker-setup.md",
    "chars": 4308,
    "preview": "# Azure Authentication in Docker\n\nThis guide covers using Azure Entra ID authentication with RedisInsight when running i"
  },
  {
    "path": "docs/azure-setup.md",
    "chars": 6015,
    "preview": "# Azure Cache for Redis Setup\n\n## Setup Instructions\n\nTo use the Azure integration, your Azure tenant administrator may "
  },
  {
    "path": "docs/plugins/development.md",
    "chars": 6470,
    "preview": "# Plugin development\n\nThis document describes the guides to develop your own plugin for the Redis Insight Workbench.\n\n##"
  },
  {
    "path": "docs/plugins/installation.md",
    "chars": 1163,
    "preview": "# Plugin installation & Usage\n\nThis document describes the guides to add `plugins` for the Workbench to Redis Insight.\n\n"
  },
  {
    "path": "docs/plugins/introduction.md",
    "chars": 901,
    "preview": "# Introduction to plugins for the Workbench\n\n## Introduction\n\nRedis can hold a range of different data types. Visualizin"
  },
  {
    "path": "docs/release-notes/RELEASE_NOTES_TEMPLATE.md",
    "chars": 450,
    "preview": "# [VERSION] ([MONTH] [YEAR])\n\n[Release description based on content - will be auto-generated]\n\n### Headlines\n\n* [Top 3-5"
  },
  {
    "path": "electron-builder-mas.js",
    "chars": 164,
    "preview": "const electronBuilder = require('./electron-builder.json');\n\nconst config = {\n  ...electronBuilder,\n  appId: 'com.redis."
  },
  {
    "path": "electron-builder.json",
    "chars": 5767,
    "preview": "{\n  \"productName\": \"Redis Insight\",\n  \"appId\": \"org.RedisLabs.RedisInsight-V2\",\n  \"copyright\": \"Copyright © 2026 Redis L"
  },
  {
    "path": "env.mcp.example",
    "chars": 1086,
    "preview": "# This is Atlassian MCP configuration defined in mcp.json\n\n# Setup:\n# 1. First, copy this file as .env.mcp \n# cp env.mcp"
  },
  {
    "path": "jest-resolver.js",
    "chars": 288,
    "preview": "const url = require('url');\n\nmodule.exports = (request, options) => {\n  // Remove any query parameters in the request pa"
  },
  {
    "path": "jest.config.cjs",
    "chars": 3146,
    "preview": "require('dotenv').config({ path: './redisinsight/ui/.env.test' });\n\n/** @type {import('ts-jest/dist/types').InitialOptio"
  },
  {
    "path": "mcp.json",
    "chars": 1635,
    "preview": "{\n  \"$schema\": \"https://modelcontextprotocol.io/schema/mcp.json\",\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"np"
  },
  {
    "path": "package.json",
    "chars": 13519,
    "preview": "{\n  \"name\": \"redisinsight\",\n  \"productName\": \"Redis Insight\",\n  \"description\": \"Redis Insight\",\n  \"license\": \"SSPL\",\n  \""
  },
  {
    "path": "patches/@elastic+eui+34.6.0.patch",
    "chars": 25504,
    "preview": "diff --git a/node_modules/@elastic/eui/es/components/.DS_Store b/node_modules/@elastic/eui/es/components/.DS_Store\nnew f"
  },
  {
    "path": "patches/monaco-yaml+5.1.1.patch",
    "chars": 708,
    "preview": "diff --git a/node_modules/monaco-yaml/yaml.worker.js b/node_modules/monaco-yaml/yaml.worker.js\nindex c4e3806..7140210 10"
  },
  {
    "path": "patches/react-vtree+3.0.0-beta.3.patch",
    "chars": 1906,
    "preview": "diff --git a/node_modules/react-vtree/dist/cjs/Tree.js b/node_modules/react-vtree/dist/cjs/Tree.js\nindex c46ce3e..879f0a"
  },
  {
    "path": "pull_request_template.md",
    "chars": 274,
    "preview": "# What\n<!-- Briefly explain what have you changed in the code and any tech decisions that were made. -->\n\n# Testing\n<!--"
  },
  {
    "path": "redisinsight/__mocks__/brotli-dec-wasm.js",
    "chars": 40,
    "preview": "export default () => Promise.resolve();\n"
  },
  {
    "path": "redisinsight/__mocks__/fileMock.js",
    "chars": 33,
    "preview": "export default 'test-file-stub';\n"
  },
  {
    "path": "redisinsight/__mocks__/monacoMock.js",
    "chars": 2646,
    "preview": "import React, { useEffect } from 'react';\n\nconst editor = {\n  addCommand: jest.fn(),\n  getContribution: jest.fn(),\n  onK"
  },
  {
    "path": "redisinsight/__mocks__/monacoYamlMock.js",
    "chars": 69,
    "preview": "export const configureMonacoYaml = () => ({\n  update: jest.fn(),\n});\n"
  },
  {
    "path": "redisinsight/__mocks__/rawproto.js",
    "chars": 32,
    "preview": "export const visit = jest.fn();\n"
  },
  {
    "path": "redisinsight/__mocks__/react-children-utilities.js",
    "chars": 35,
    "preview": "export const onlyText = jest.fn();\n"
  },
  {
    "path": "redisinsight/__mocks__/react-resizable-panels.js",
    "chars": 901,
    "preview": "export const Panel = ({ children }) => children;\nexport const PanelGroup = ({ children }) => children;\nexport const Pane"
  },
  {
    "path": "redisinsight/__mocks__/rehypeStringify.js",
    "chars": 26,
    "preview": "export default jest.fn();\n"
  },
  {
    "path": "redisinsight/__mocks__/remarkGfm.js",
    "chars": 26,
    "preview": "export default jest.fn();\n"
  },
  {
    "path": "redisinsight/__mocks__/remarkParse.js",
    "chars": 26,
    "preview": "export default jest.fn();\n"
  },
  {
    "path": "redisinsight/__mocks__/remarkRehype.js",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "redisinsight/__mocks__/scssRaw.js",
    "chars": 43,
    "preview": "const styles = '';\n\nexport default styles;\n"
  },
  {
    "path": "redisinsight/__mocks__/svg.js",
    "chars": 243,
    "preview": "import React from 'react';\n\n// Mock SVG component for Jest tests\nconst SvgMock = React.forwardRef((props, ref) => <svg r"
  },
  {
    "path": "redisinsight/__mocks__/unified.js",
    "chars": 34,
    "preview": "export const unified = jest.fn();\n"
  },
  {
    "path": "redisinsight/__mocks__/unistUtilsVisit.js",
    "chars": 32,
    "preview": "export const visit = jest.fn();\n"
  },
  {
    "path": "redisinsight/api/.dockerignore",
    "chars": 83,
    "preview": ".git\n.idea\n.vscode\n\n.nyc_output\ncoverage\nnode_modules\ndist\n\ntest/test-runs/results\n"
  },
  {
    "path": "redisinsight/api/.eslintignore",
    "chars": 33,
    "preview": "node_modules\ndist\ntest\nmigration\n"
  },
  {
    "path": "redisinsight/api/.gitignore",
    "chars": 453,
    "preview": "# compiled output\n/dist\n/node_modules\n/static\n/defaults\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log"
  },
  {
    "path": "redisinsight/api/.jest.setup.ts",
    "chars": 273,
    "preview": "import 'reflect-metadata';\n// Workaround for @Type test coverage\njest.mock('class-transformer', () => {\n  return {\n    ."
  },
  {
    "path": "redisinsight/api/.prettierignore",
    "chars": 14,
    "preview": "# Tests\n/test\n"
  },
  {
    "path": "redisinsight/api/.prettierrc",
    "chars": 52,
    "preview": "{\n  \"singleQuote\": true,\n  \"trailingComma\": \"all\"\n}\n"
  },
  {
    "path": "redisinsight/api/.yarnclean.prod",
    "chars": 16,
    "preview": "*.md\n*.ts\n*.map\n"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Create/Create Query (invalid).bru",
    "chars": 388,
    "preview": "meta {\n  name: Create Query (invalid)\n  type: http\n  seq: 2\n}\n\npost {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/qu"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Create/Create Query.bru",
    "chars": 425,
    "preview": "meta {\n  name: Create Query\n  type: http\n  seq: 1\n}\n\npost {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/query-librar"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Create/folder.bru",
    "chars": 59,
    "preview": "meta {\n  name: Create\n  seq: 3\n}\n\nauth {\n  mode: inherit\n}\n"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Delete/Delete Query (invalid).bru",
    "chars": 327,
    "preview": "meta {\n  name: Delete Query (invalid)\n  type: http\n  seq: 2\n}\n\ndelete {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Delete/Delete Query.bru",
    "chars": 221,
    "preview": "meta {\n  name: Delete Query\n  type: http\n  seq: 1\n}\n\ndelete {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/query-libr"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Delete/folder.bru",
    "chars": 59,
    "preview": "meta {\n  name: Delete\n  seq: 6\n}\n\nauth {\n  mode: inherit\n}\n"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Get/Get Query (invalid).bru",
    "chars": 308,
    "preview": "meta {\n  name: Get Query (invalid)\n  type: http\n  seq: 2\n}\n\nget {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/query-"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Get/Get Query.bru",
    "chars": 202,
    "preview": "meta {\n  name: Get Query\n  type: http\n  seq: 1\n}\n\nget {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/query-library/{{"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Get/folder.bru",
    "chars": 56,
    "preview": "meta {\n  name: Get\n  seq: 4\n}\n\nauth {\n  mode: inherit\n}\n"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Get Queries/Get Queries.bru",
    "chars": 233,
    "preview": "meta {\n  name: Get Queries\n  type: http\n  seq: 1\n}\n\nget {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/query-library\n"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Get Queries/Search Queries.bru",
    "chars": 265,
    "preview": "meta {\n  name: Search Queries\n  type: http\n  seq: 2\n}\n\nget {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/query-libra"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Get Queries/folder.bru",
    "chars": 64,
    "preview": "meta {\n  name: Get Queries\n  seq: 2\n}\n\nauth {\n  mode: inherit\n}\n"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Seed/Seed Queries.bru",
    "chars": 715,
    "preview": "meta {\n  name: Seed Queries\n  type: http\n  seq: 1\n}\n\npost {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/query-librar"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Seed/folder.bru",
    "chars": 57,
    "preview": "meta {\n  name: Seed\n  seq: 1\n}\n\nauth {\n  mode: inherit\n}\n"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Update/Update Query (invalid).bru",
    "chars": 464,
    "preview": "meta {\n  name: Update Query (invalid)\n  type: http\n  seq: 2\n}\n\npatch {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/q"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Update/Update Query.bru",
    "chars": 359,
    "preview": "meta {\n  name: Update Query\n  type: http\n  seq: 1\n}\n\npatch {\n  url: {{API_URL}}/databases/{{DB_INSTANCE_ID}}/query-libra"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/Update/folder.bru",
    "chars": 59,
    "preview": "meta {\n  name: Update\n  seq: 5\n}\n\nauth {\n  mode: inherit\n}\n"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/Query Library/folder.bru",
    "chars": 66,
    "preview": "meta {\n  name: Query Library\n  seq: 1\n}\n\nauth {\n  mode: inherit\n}\n"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/bruno.json",
    "chars": 120,
    "preview": "{\n  \"version\": \"1\",\n  \"name\": \"RedisInsight\",\n  \"type\": \"collection\",\n  \"ignore\": [\n    \"node_modules\",\n    \".git\"\n  ]\n}"
  },
  {
    "path": "redisinsight/api/bruno/RedisInsight/environments/Local.bru",
    "chars": 131,
    "preview": "vars {\n  API_URL: http://localhost:5540/api\n  RQE_INDEX_NAME: idx:bikes_vss\n}\nvars:secret [\n  DB_INSTANCE_ID,\n  QUERY_LI"
  },
  {
    "path": "redisinsight/api/config/default.ts",
    "chars": 17012,
    "preview": "import { join, posix } from 'path';\nimport * as os from 'os';\nimport { trim } from 'lodash';\nimport { version } from '.."
  },
  {
    "path": "redisinsight/api/config/development.ts",
    "chars": 653,
    "preview": "export default {\n  server: {\n    env: 'development',\n  },\n  sockets: {\n    cors: {\n      enabled: true,\n    },\n  },\n  db"
  },
  {
    "path": "redisinsight/api/config/features-config.json",
    "chars": 2870,
    "preview": "{\n  \"version\": 3.5,\n  \"features\": {\n    \"redisDataIntegration\": {\n      \"flag\": true,\n      \"perc\": [[0, 100]],\n      \"f"
  },
  {
    "path": "redisinsight/api/config/logger.ts",
    "chars": 2307,
    "preview": "import { transports, format } from 'winston';\nimport 'winston-daily-rotate-file';\nimport {\n  utilities as nestWinstonMod"
  },
  {
    "path": "redisinsight/api/config/ormconfig.ts",
    "chars": 3337,
    "preview": "import { TypeOrmModuleOptions } from '@nestjs/typeorm';\nimport { ServerEntity } from 'src/modules/server/entities/server"
  },
  {
    "path": "redisinsight/api/config/production.ts",
    "chars": 1811,
    "preview": "import { join } from 'path';\nimport * as os from 'os';\n\nconst homedir =\n  process.env.RI_APP_FOLDER_ABSOLUTE_PATH ||\n  j"
  },
  {
    "path": "redisinsight/api/config/stack.ts",
    "chars": 383,
    "preview": "import { RequestMethod } from '@nestjs/common';\n\nexport default {\n  server: {\n    excludeRoutes: [\n      'redis-enterpri"
  },
  {
    "path": "redisinsight/api/config/staging.ts",
    "chars": 1599,
    "preview": "import { join } from 'path';\nimport * as os from 'os';\n\nconst homedir =\n  process.env.RI_APP_FOLDER_ABSOLUTE_PATH ||\n  j"
  },
  {
    "path": "redisinsight/api/config/swagger.ts",
    "chars": 295,
    "preview": "import { OpenAPIObject } from '@nestjs/swagger';\n\nconst SWAGGER_CONFIG: Omit<OpenAPIObject, 'paths'> = {\n  openapi: '3.0"
  },
  {
    "path": "redisinsight/api/config/test.ts",
    "chars": 2798,
    "preview": "export default {\n  dir_path: {\n    dataDir: process.env.RI_DATA_DIR || '.test_run/data',\n  },\n  server: {\n    env: 'test"
  },
  {
    "path": "redisinsight/api/data/common",
    "chars": 4914,
    "preview": "LPUSH sample_jobQueue:waitingList \"sample_jobQueue:ticket:101\"\nLPUSH sample_jobQueue:waitingList \"sample_jobQueue:ticket"
  }
]

// ... and 6042 more files (download for full content)

About this extraction

This page contains the full source code of the redis/RedisInsight GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 6242 files (18.1 MB), approximately 5.2M tokens, and a symbol index with 7959 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!