├── .git-hooks ├── init └── pre-commit ├── .github └── workflows │ ├── backend-lint-test.yml │ ├── buf.yml │ ├── frontend-verify.yml │ └── repository-dispatch.yml ├── .gitignore ├── .taskversion ├── CHANGELOG.md ├── CONTRIBUTING.md ├── README.md ├── SECURITY.md ├── Taskfile.yaml ├── backend ├── .gitignore ├── .golangci.yaml ├── cmd │ └── api │ │ └── main.go ├── go.mod ├── go.sum └── pkg │ ├── api │ ├── api.go │ ├── api_integration_test.go │ ├── connect │ │ ├── errors │ │ │ ├── bad_request.go │ │ │ ├── common_errors.go │ │ │ ├── domain.go │ │ │ ├── errors.go │ │ │ ├── google_rpc.go │ │ │ ├── help.go │ │ │ ├── http.go │ │ │ ├── kafka.go │ │ │ ├── redpanda.go │ │ │ ├── redpanda_test.go │ │ │ ├── writer.go │ │ │ └── writer_test.go │ │ ├── integration │ │ │ ├── acl_v1_test.go │ │ │ ├── acl_v1alpha2_test.go │ │ │ ├── api_suite_test.go │ │ │ ├── cluster_status_test.go │ │ │ ├── kafkaconnect_v1_test.go │ │ │ ├── kafkaconnect_v1alpha2_test.go │ │ │ ├── license_test.go │ │ │ ├── topic_v1_test.go │ │ │ ├── topic_v1alpha2_test.go │ │ │ ├── transform_v1_test.go │ │ │ ├── transform_v1alpha2_test.go │ │ │ ├── user_v1_test.go │ │ │ ├── user_v1alpha2_test.go │ │ │ ├── util_test.go │ │ │ └── wasm-binary │ │ │ │ └── integration-test.wasm │ │ ├── interceptor │ │ │ ├── endpoint_check.go │ │ │ ├── error_log.go │ │ │ ├── update_test.go │ │ │ └── validation.go │ │ └── service │ │ │ ├── acl │ │ │ ├── v1 │ │ │ │ ├── defaulter.go │ │ │ │ ├── defaulter_test.go │ │ │ │ ├── mapper.go │ │ │ │ ├── mapper_enums.go │ │ │ │ ├── mapper_test.go │ │ │ │ └── service.go │ │ │ ├── v1alpha1 │ │ │ │ ├── defaulter.go │ │ │ │ ├── defaulter_test.go │ │ │ │ ├── mapper.go │ │ │ │ └── service.go │ │ │ └── v1alpha2 │ │ │ │ ├── defaulter.go │ │ │ │ ├── defaulter_test.go │ │ │ │ ├── mapper.go │ │ │ │ ├── mapper_enums.go │ │ │ │ ├── mapper_test.go │ │ │ │ └── service.go │ │ │ ├── clusterstatus │ │ │ ├── kafka.go │ │ │ ├── redpanda.go │ │ │ ├── service.go │ │ │ └── util.go │ │ │ ├── common │ │ │ ├── v1 │ │ │ │ └── mapper.go │ │ │ └── v1alpha2 │ │ │ │ └── mapper.go │ │ │ ├── console │ │ │ ├── mapper.go │ │ │ ├── service.go │ │ │ └── stream_progress_reporter.go │ │ │ ├── kafkaconnect │ │ │ ├── v1 │ │ │ │ ├── defaulter.go │ │ │ │ ├── mapper.go │ │ │ │ └── service.go │ │ │ ├── v1alpha1 │ │ │ │ ├── defaulter.go │ │ │ │ ├── mapper.go │ │ │ │ └── service.go │ │ │ └── v1alpha2 │ │ │ │ ├── defaulter.go │ │ │ │ ├── mapper.go │ │ │ │ └── service.go │ │ │ ├── license │ │ │ ├── mapper.go │ │ │ └── service.go │ │ │ ├── topic │ │ │ ├── v1 │ │ │ │ ├── defaulter.go │ │ │ │ ├── mapper.go │ │ │ │ ├── mapper_test.go │ │ │ │ ├── service.go │ │ │ │ └── util.go │ │ │ ├── v1alpha1 │ │ │ │ ├── defaulter.go │ │ │ │ ├── mapper.go │ │ │ │ └── service.go │ │ │ └── v1alpha2 │ │ │ │ ├── defaulter.go │ │ │ │ ├── mapper.go │ │ │ │ ├── mapper_test.go │ │ │ │ ├── service.go │ │ │ │ └── util.go │ │ │ ├── transform │ │ │ ├── v1 │ │ │ │ ├── console.go │ │ │ │ ├── defaulter.go │ │ │ │ ├── handle_transforms.go │ │ │ │ ├── mapper.go │ │ │ │ ├── service.go │ │ │ │ ├── util.go │ │ │ │ └── util_test.go │ │ │ ├── v1alpha1 │ │ │ │ ├── defaulter.go │ │ │ │ ├── handle_transforms.go │ │ │ │ ├── mapper.go │ │ │ │ └── service.go │ │ │ └── v1alpha2 │ │ │ │ ├── defaulter.go │ │ │ │ ├── handle_transforms.go │ │ │ │ ├── mapper.go │ │ │ │ ├── service.go │ │ │ │ ├── util.go │ │ │ │ └── util_test.go │ │ │ └── user │ │ │ ├── v1 │ │ │ ├── defaulter.go │ │ │ ├── mapper.go │ │ │ └── service.go │ │ │ ├── v1alpha1 │ │ │ ├── defaulter.go │ │ │ ├── mapper.go │ │ │ └── service.go │ │ │ └── v1alpha2 │ │ │ ├── defaulter.go │ │ │ ├── mapper.go │ │ │ └── service.go │ ├── grpc_gateway.go │ ├── handle_acls.go │ ├── handle_api_versions.go │ ├── handle_brokers.go │ ├── handle_console.go │ ├── handle_consumer_group.go │ ├── handle_describe_cluster.go │ ├── handle_frontend.go │ ├── handle_kafka_connect.go │ ├── handle_kafka_connect_integration_test.go │ ├── handle_operations.go │ ├── handle_probes.go │ ├── handle_quotas.go │ ├── handle_schema_registry.go │ ├── handle_schema_registry_integration_test.go │ ├── handle_schema_registry_test.go │ ├── handle_topic_create.go │ ├── handle_topic_create_integration_test.go │ ├── handle_topic_documentation.go │ ├── handle_topic_messages_integration_test.go │ ├── handle_topic_publish_records.go │ ├── handle_topics.go │ ├── handle_topics_integration_test.go │ ├── handle_users.go │ ├── hooks.go │ ├── hooks │ │ └── hooks.go │ ├── httptypes │ │ └── types.go │ ├── middlewares.go │ ├── option.go │ ├── routes.go │ ├── util_cors.go │ ├── validator.go │ └── validator_test.go │ ├── backoff │ ├── backoff.go │ └── backoff_test.go │ ├── config │ ├── cbor.go │ ├── config.go │ ├── console.go │ ├── console_api.go │ ├── console_topic_documentation.go │ ├── filesystem.go │ ├── git.go │ ├── git_auth_basic.go │ ├── git_auth_ssh.go │ ├── git_repository.go │ ├── http_authentication.go │ ├── http_basic_auth.go │ ├── jsonpath │ │ ├── jsonpath.go │ │ └── jsonpath_test.go │ ├── kafka.go │ ├── kafka_connect.go │ ├── kafka_connect_cluster.go │ ├── kafka_sasl.go │ ├── kafka_sasl_aws_iam.go │ ├── kafka_sasl_gssapi.go │ ├── kafka_sasl_oauth.go │ ├── logging.go │ ├── msgpack.go │ ├── proto.go │ ├── proto_topic_mapping.go │ ├── redpanda.go │ ├── redpanda_admin_api.go │ ├── regexp.go │ ├── schema.go │ ├── serde.go │ ├── server.go │ ├── startup.go │ ├── tls.go │ └── util_regex.go │ ├── connect │ ├── connect.go │ ├── create_connector.go │ ├── delete_connector.go │ ├── enabled_features_types.go │ ├── errors.go │ ├── get_cluster_info.go │ ├── get_connector_config.go │ ├── get_connectors.go │ ├── get_connectors_test.go │ ├── pause_connector.go │ ├── put_connector_config.go │ ├── restart_connector.go │ ├── restart_task.go │ ├── resume_connector.go │ ├── service.go │ ├── stop_connector.go │ ├── topics.go │ ├── util.go │ └── validate_connector.go │ ├── connector │ ├── guide │ │ ├── bigquery_sink.go │ │ ├── common.go │ │ ├── debezium_mysql_source.go │ │ ├── debezium_postgres_source.go │ │ ├── debezium_sqlserver_source.go │ │ ├── default.go │ │ ├── default_test.go │ │ ├── guide.go │ │ ├── http_source.go │ │ ├── iceberg_sink.go │ │ ├── jdbc_sink.go │ │ ├── jdbc_source.go │ │ ├── mirror_checkpoint.go │ │ ├── mirror_heartbeat.go │ │ ├── mirror_source.go │ │ ├── mongo_sink.go │ │ ├── mongo_source.go │ │ ├── options.go │ │ ├── redpanda_gcs_sink.go │ │ ├── redpanda_s3_sink.go │ │ ├── snowflake_sink.go │ │ ├── wizard.go │ │ └── wizard_test.go │ ├── interceptor │ │ ├── avro_codec_hook.go │ │ ├── avro_codec_hook_test.go │ │ ├── bigquery_hook.go │ │ ├── bigquery_hook_test.go │ │ ├── cloudevents_converter_hook.go │ │ ├── cloudevents_converter_hook_test.go │ │ ├── debezium_mysql_source_hook.go │ │ ├── debezium_postgres_source_hook.go │ │ ├── debezium_sqlserver_source_hook.go │ │ ├── http_source_hook.go │ │ ├── iceberg_sink_hook.go │ │ ├── interceptor.go │ │ ├── json_schema_hook.go │ │ ├── json_schema_hook_test.go │ │ ├── mirror_hook.go │ │ ├── mirror_hook_test.go │ │ ├── mongo_hook.go │ │ ├── mongo_hook_test.go │ │ ├── options.go │ │ ├── snowflake_hook.go │ │ ├── snowflake_hook_test.go │ │ └── topic_creation_hook.go │ ├── model │ │ ├── config_definition.go │ │ ├── config_definition_key.go │ │ ├── config_definition_metadata.go │ │ ├── config_definition_types.go │ │ ├── json.go │ │ ├── model.go │ │ └── validation_response.go │ └── patch │ │ ├── all.go │ │ ├── all_test.go │ │ ├── bigquery_sink.go │ │ ├── common.go │ │ ├── debezium_mysql_source.go │ │ ├── debezium_postgres_source.go │ │ ├── debezium_sqlserver_source.go │ │ ├── http_source.go │ │ ├── iceberg_sink.go │ │ ├── jdbc_sink.go │ │ ├── jdbc_source.go │ │ ├── lower_importance.go │ │ ├── lower_importance_test.go │ │ ├── mirror.go │ │ ├── mirror_heartbeat.go │ │ ├── mongo.go │ │ ├── patch.go │ │ ├── redpanda_gcs_sink.go │ │ ├── redpanda_s3_sink.go │ │ ├── snowflake_sink.go │ │ ├── upper_importance.go │ │ ├── upper_importance_test.go │ │ └── util.go │ ├── console │ ├── alter_configs.go │ ├── api_versions.go │ ├── broker_config.go │ ├── brokers.go │ ├── cluster_info.go │ ├── cluster_info_integration_test.go │ ├── common.go │ ├── config_extensions.go │ ├── console.go │ ├── console_integration_test.go │ ├── consumer_group_delete.go │ ├── consumer_group_offsets.go │ ├── consumer_group_overview.go │ ├── create_acl.go │ ├── create_topic.go │ ├── delete_acls.go │ ├── delete_consumer_group_offsets.go │ ├── delete_topic.go │ ├── delete_topic_records.go │ ├── describe_configs.go │ ├── describe_quotas.go │ ├── edit_consumer_group_offsets.go │ ├── endpoint_compatibility.go │ ├── errors.go │ ├── errors_test.go │ ├── get_metadata.go │ ├── incremental_alter_topic_configs.go │ ├── kafka_error.go │ ├── list_acls.go │ ├── list_acls_integration_test.go │ ├── list_messages.go │ ├── list_messages_integration_test.go │ ├── list_messages_mocks_test.go │ ├── list_messages_test.go │ ├── list_offsets.go │ ├── log_dir_broker.go │ ├── log_dir_topic.go │ ├── log_dir_topic_test.go │ ├── partition_reassignments.go │ ├── produce_records.go │ ├── push_down_filter_interpreter.go │ ├── redpanda_cluster_version.go │ ├── redpanda_feature.go │ ├── schema_registry.go │ ├── service.go │ ├── servicer.go │ ├── testdata │ │ ├── proto │ │ │ ├── buf.gen.yaml │ │ │ ├── buf.lock │ │ │ ├── buf.yaml │ │ │ ├── common │ │ │ │ └── common.proto │ │ │ ├── index │ │ │ │ └── v1 │ │ │ │ │ └── data.proto │ │ │ └── shop │ │ │ │ ├── v1 │ │ │ │ └── order.proto │ │ │ │ └── v2 │ │ │ │ ├── address.proto │ │ │ │ ├── customer.proto │ │ │ │ └── order.proto │ │ └── proto_update │ │ │ ├── buf.gen.yaml │ │ │ ├── buf.yaml │ │ │ ├── msgbin │ │ │ └── main.go │ │ │ └── shop │ │ │ └── v1 │ │ │ └── order.proto │ ├── topic_config.go │ ├── topic_config_integration_test.go │ ├── topic_consumers.go │ ├── topic_documentation.go │ ├── topic_overview.go │ ├── topic_partitions.go │ └── util.go │ ├── embed │ ├── embed.go │ ├── frontend.go │ ├── frontend │ │ └── .gitignore │ ├── kafka │ │ ├── apache_kafka_configs.json │ │ └── redpanda_configs.json │ └── kafka_config_extensions.go │ ├── factory │ ├── kafka │ │ ├── client_hooks.go │ │ └── kafka.go │ ├── redpanda │ │ ├── disabled.go │ │ ├── redpanda.go │ │ └── single_client.go │ └── schema │ │ ├── disabled.go │ │ └── schema.go │ ├── filesystem │ ├── file.go │ ├── filesystem.go │ ├── service.go │ ├── util.go │ ├── util_unix.go │ ├── util_unix_test.go │ ├── util_windows.go │ └── util_windows_test.go │ ├── git │ ├── git.go │ ├── service.go │ ├── util.go │ └── util_test.go │ ├── interpreter │ ├── find_function.go │ └── interpreter.go │ ├── kafka │ └── testdata │ │ ├── proto │ │ └── gen │ │ │ ├── common │ │ │ └── common.pb.go │ │ │ ├── index │ │ │ └── v1 │ │ │ │ └── data.pb.go │ │ │ └── shop │ │ │ ├── v1 │ │ │ └── order.pb.go │ │ │ └── v2 │ │ │ ├── address.pb.go │ │ │ ├── customer.pb.go │ │ │ └── order.pb.go │ │ └── proto_update │ │ └── gen │ │ └── shop │ │ └── v1 │ │ └── order.pb.go │ ├── license │ ├── license.go │ ├── license_source.go │ └── license_type.go │ ├── logging │ ├── context.go │ ├── filter_level.go │ └── logger.go │ ├── msgpack │ └── service.go │ ├── proto │ ├── embed │ │ ├── embed.go │ │ └── protobuf │ │ │ ├── confluent │ │ │ ├── meta.proto │ │ │ └── types │ │ │ │ └── decimal.proto │ │ │ └── google │ │ │ └── type │ │ │ ├── README.md │ │ │ ├── calendar_period.proto │ │ │ ├── color.proto │ │ │ ├── date.proto │ │ │ ├── datetime.proto │ │ │ ├── dayofweek.proto │ │ │ ├── decimal.proto │ │ │ ├── expr.proto │ │ │ ├── fraction.proto │ │ │ ├── interval.proto │ │ │ ├── latlng.proto │ │ │ ├── localized_text.proto │ │ │ ├── money.proto │ │ │ ├── month.proto │ │ │ ├── phone_number.proto │ │ │ ├── postal_address.proto │ │ │ ├── quaternion.proto │ │ │ └── timeofday.proto │ ├── proto.go │ ├── service.go │ └── service_test.go │ ├── protocmp │ └── compare.go │ ├── protogen │ ├── common │ │ └── common.pb.go │ ├── index │ │ └── v1 │ │ │ └── data.pb.go │ ├── redpanda │ │ └── api │ │ │ ├── auth │ │ │ └── v1 │ │ │ │ └── authorization.pb.go │ │ │ ├── common │ │ │ ├── v1 │ │ │ │ ├── errordetails.pb.go │ │ │ │ └── linthint.pb.go │ │ │ └── v1alpha1 │ │ │ │ ├── common.pb.go │ │ │ │ ├── money.pb.go │ │ │ │ ├── options.pb.go │ │ │ │ └── pagination.pb.go │ │ │ ├── console │ │ │ └── v1alpha1 │ │ │ │ ├── authentication.pb.go │ │ │ │ ├── authentication.pb.gw.go │ │ │ │ ├── authentication_grpc.pb.go │ │ │ │ ├── cluster_status.pb.go │ │ │ │ ├── cluster_status.pb.gw.go │ │ │ │ ├── cluster_status_grpc.pb.go │ │ │ │ ├── common.pb.go │ │ │ │ ├── console_service.pb.go │ │ │ │ ├── console_service.pb.gw.go │ │ │ │ ├── console_service_grpc.pb.go │ │ │ │ ├── consolev1alpha1connect │ │ │ │ ├── authentication.connect.go │ │ │ │ ├── authentication.connect.gw.go │ │ │ │ ├── cluster_status.connect.go │ │ │ │ ├── cluster_status.connect.gw.go │ │ │ │ ├── console_service.connect.go │ │ │ │ ├── console_service.connect.gw.go │ │ │ │ ├── debug_bundle.connect.go │ │ │ │ ├── debug_bundle.connect.gw.go │ │ │ │ ├── license.connect.go │ │ │ │ ├── license.connect.gw.go │ │ │ │ ├── pipeline.connect.go │ │ │ │ ├── pipeline.connect.gw.go │ │ │ │ ├── secret.connect.go │ │ │ │ ├── secret.connect.gw.go │ │ │ │ ├── security.connect.go │ │ │ │ ├── security.connect.gw.go │ │ │ │ ├── transform.connect.go │ │ │ │ └── transform.connect.gw.go │ │ │ │ ├── debug_bundle.pb.go │ │ │ │ ├── debug_bundle.pb.gw.go │ │ │ │ ├── debug_bundle_grpc.pb.go │ │ │ │ ├── license.pb.go │ │ │ │ ├── license.pb.gw.go │ │ │ │ ├── license_grpc.pb.go │ │ │ │ ├── list_messages.pb.go │ │ │ │ ├── pipeline.pb.go │ │ │ │ ├── pipeline.pb.gw.go │ │ │ │ ├── pipeline_grpc.pb.go │ │ │ │ ├── publish_messages.pb.go │ │ │ │ ├── secret.pb.go │ │ │ │ ├── secret.pb.gw.go │ │ │ │ ├── secret_grpc.pb.go │ │ │ │ ├── security.pb.go │ │ │ │ ├── security.pb.gw.go │ │ │ │ ├── security_grpc.pb.go │ │ │ │ ├── transform.pb.go │ │ │ │ ├── transform.pb.gw.go │ │ │ │ └── transform_grpc.pb.go │ │ │ └── dataplane │ │ │ ├── v1 │ │ │ ├── acl.pb.go │ │ │ ├── acl.pb.gw.go │ │ │ ├── acl_grpc.pb.go │ │ │ ├── cloud_storage.pb.go │ │ │ ├── cloud_storage.pb.gw.go │ │ │ ├── cloud_storage_grpc.pb.go │ │ │ ├── common.pb.go │ │ │ ├── dataplanev1connect │ │ │ │ ├── acl.connect.go │ │ │ │ ├── acl.connect.gw.go │ │ │ │ ├── cloud_storage.connect.go │ │ │ │ ├── cloud_storage.connect.gw.go │ │ │ │ ├── dummy.connect.go │ │ │ │ ├── dummy.connect.gw.go │ │ │ │ ├── kafka_connect.connect.go │ │ │ │ ├── kafka_connect.connect.gw.go │ │ │ │ ├── pipeline.connect.go │ │ │ │ ├── pipeline.connect.gw.go │ │ │ │ ├── secret.connect.go │ │ │ │ ├── secret.connect.gw.go │ │ │ │ ├── security.connect.go │ │ │ │ ├── security.connect.gw.go │ │ │ │ ├── topic.connect.go │ │ │ │ ├── topic.connect.gw.go │ │ │ │ ├── transform.connect.go │ │ │ │ ├── transform.connect.gw.go │ │ │ │ ├── user.connect.go │ │ │ │ └── user.connect.gw.go │ │ │ ├── dummy.pb.go │ │ │ ├── dummy.pb.gw.go │ │ │ ├── dummy_grpc.pb.go │ │ │ ├── error.pb.go │ │ │ ├── kafka_connect.pb.go │ │ │ ├── kafka_connect.pb.gw.go │ │ │ ├── kafka_connect_grpc.pb.go │ │ │ ├── pipeline.pb.go │ │ │ ├── pipeline.pb.gw.go │ │ │ ├── pipeline_grpc.pb.go │ │ │ ├── secret.pb.go │ │ │ ├── secret.pb.gw.go │ │ │ ├── secret_grpc.pb.go │ │ │ ├── security.pb.go │ │ │ ├── security.pb.gw.go │ │ │ ├── security_grpc.pb.go │ │ │ ├── swagger.pb.go │ │ │ ├── topic.pb.go │ │ │ ├── topic.pb.gw.go │ │ │ ├── topic_grpc.pb.go │ │ │ ├── transform.pb.go │ │ │ ├── transform.pb.gw.go │ │ │ ├── transform_grpc.pb.go │ │ │ ├── user.pb.go │ │ │ ├── user.pb.gw.go │ │ │ └── user_grpc.pb.go │ │ │ ├── v1alpha1 │ │ │ ├── acl.pb.go │ │ │ ├── acl.pb.gw.go │ │ │ ├── acl_grpc.pb.go │ │ │ ├── common.pb.go │ │ │ ├── dataplanev1alpha1connect │ │ │ │ ├── acl.connect.go │ │ │ │ ├── acl.connect.gw.go │ │ │ │ ├── dummy.connect.go │ │ │ │ ├── dummy.connect.gw.go │ │ │ │ ├── kafka_connect.connect.go │ │ │ │ ├── kafka_connect.connect.gw.go │ │ │ │ ├── secret.connect.go │ │ │ │ ├── secret.connect.gw.go │ │ │ │ ├── topic.connect.go │ │ │ │ ├── topic.connect.gw.go │ │ │ │ ├── transform.connect.go │ │ │ │ ├── transform.connect.gw.go │ │ │ │ ├── user.connect.go │ │ │ │ └── user.connect.gw.go │ │ │ ├── dummy.pb.go │ │ │ ├── dummy.pb.gw.go │ │ │ ├── dummy_grpc.pb.go │ │ │ ├── error.pb.go │ │ │ ├── kafka_connect.pb.go │ │ │ ├── kafka_connect.pb.gw.go │ │ │ ├── kafka_connect_grpc.pb.go │ │ │ ├── secret.pb.go │ │ │ ├── secret.pb.gw.go │ │ │ ├── secret_grpc.pb.go │ │ │ ├── swagger.pb.go │ │ │ ├── topic.pb.go │ │ │ ├── topic.pb.gw.go │ │ │ ├── topic_grpc.pb.go │ │ │ ├── transform.pb.go │ │ │ ├── transform.pb.gw.go │ │ │ ├── transform_grpc.pb.go │ │ │ ├── user.pb.go │ │ │ ├── user.pb.gw.go │ │ │ └── user_grpc.pb.go │ │ │ └── v1alpha2 │ │ │ ├── acl.pb.go │ │ │ ├── acl.pb.gw.go │ │ │ ├── acl_grpc.pb.go │ │ │ ├── cloud_storage.pb.go │ │ │ ├── cloud_storage.pb.gw.go │ │ │ ├── cloud_storage_grpc.pb.go │ │ │ ├── common.pb.go │ │ │ ├── dataplanev1alpha2connect │ │ │ ├── acl.connect.go │ │ │ ├── acl.connect.gw.go │ │ │ ├── cloud_storage.connect.go │ │ │ ├── cloud_storage.connect.gw.go │ │ │ ├── dummy.connect.go │ │ │ ├── dummy.connect.gw.go │ │ │ ├── kafka_connect.connect.go │ │ │ ├── kafka_connect.connect.gw.go │ │ │ ├── pipeline.connect.go │ │ │ ├── pipeline.connect.gw.go │ │ │ ├── secret.connect.go │ │ │ ├── secret.connect.gw.go │ │ │ ├── topic.connect.go │ │ │ ├── topic.connect.gw.go │ │ │ ├── transform.connect.go │ │ │ ├── transform.connect.gw.go │ │ │ ├── user.connect.go │ │ │ └── user.connect.gw.go │ │ │ ├── dummy.pb.go │ │ │ ├── dummy.pb.gw.go │ │ │ ├── dummy_grpc.pb.go │ │ │ ├── error.pb.go │ │ │ ├── kafka_connect.pb.go │ │ │ ├── kafka_connect.pb.gw.go │ │ │ ├── kafka_connect_grpc.pb.go │ │ │ ├── pipeline.pb.go │ │ │ ├── pipeline.pb.gw.go │ │ │ ├── pipeline_grpc.pb.go │ │ │ ├── secret.pb.go │ │ │ ├── secret.pb.gw.go │ │ │ ├── secret_grpc.pb.go │ │ │ ├── swagger.pb.go │ │ │ ├── topic.pb.go │ │ │ ├── topic.pb.gw.go │ │ │ ├── topic_grpc.pb.go │ │ │ ├── transform.pb.go │ │ │ ├── transform.pb.gw.go │ │ │ ├── transform_grpc.pb.go │ │ │ ├── user.pb.go │ │ │ ├── user.pb.gw.go │ │ │ └── user_grpc.pb.go │ ├── shop │ │ ├── v1 │ │ │ └── order.pb.go │ │ └── v2 │ │ │ ├── address.pb.go │ │ │ ├── customer.pb.go │ │ │ └── order.pb.go │ └── things │ │ └── v1 │ │ ├── item.pb.go │ │ └── widget.pb.go │ ├── random │ ├── int.go │ └── string.go │ ├── rpconnect │ ├── data │ │ └── schema.json │ ├── lint.go │ └── schema.go │ ├── schema │ └── client.go │ ├── serde │ ├── avro.go │ ├── avro_test.go │ ├── binary.go │ ├── cbor.go │ ├── cbor_test.go │ ├── consumer_offsets.go │ ├── consumer_offsets_test.go │ ├── headers.go │ ├── headers_test.go │ ├── json.go │ ├── json_schema.go │ ├── json_schema_test.go │ ├── json_test.go │ ├── msgpack.go │ ├── msgpack_test.go │ ├── null.go │ ├── null_test.go │ ├── protobuf.go │ ├── protobuf_schema.go │ ├── protobuf_schema_test.go │ ├── protobuf_test.go │ ├── record.go │ ├── serde.go │ ├── service.go │ ├── service_integration_test.go │ ├── smile.go │ ├── smile_test.go │ ├── testdata │ │ ├── cbor │ │ │ └── example.cbor.bin │ │ ├── msgpack │ │ │ └── example.msgpack.bin │ │ ├── proto │ │ │ ├── buf.gen.yaml │ │ │ ├── buf.lock │ │ │ ├── buf.yaml │ │ │ ├── common │ │ │ │ └── common.proto │ │ │ ├── gen │ │ │ │ ├── common │ │ │ │ │ └── common.pb.go │ │ │ │ ├── index │ │ │ │ │ └── v1 │ │ │ │ │ │ └── data.pb.go │ │ │ │ └── shop │ │ │ │ │ ├── v1 │ │ │ │ │ └── order.pb.go │ │ │ │ │ └── v2 │ │ │ │ │ ├── address.pb.go │ │ │ │ │ ├── customer.pb.go │ │ │ │ │ └── order.pb.go │ │ │ ├── index │ │ │ │ └── v1 │ │ │ │ │ └── data.proto │ │ │ └── shop │ │ │ │ ├── v1 │ │ │ │ └── order.proto │ │ │ │ └── v2 │ │ │ │ ├── address.proto │ │ │ │ ├── customer.proto │ │ │ │ └── order.proto │ │ ├── proto_update │ │ │ ├── buf.gen.yaml │ │ │ ├── buf.yaml │ │ │ ├── gen │ │ │ │ └── shop │ │ │ │ │ └── v1 │ │ │ │ │ └── order.pb.go │ │ │ ├── msgbin │ │ │ │ └── main.go │ │ │ └── shop │ │ │ │ └── v1 │ │ │ │ └── order.proto │ │ └── test2.smile │ ├── text.go │ ├── text_test.go │ ├── types.go │ ├── uint.go │ ├── uint_test.go │ ├── utf.go │ ├── utf_test.go │ ├── xml.go │ └── xml_test.go │ ├── testutil │ ├── httpbin.go │ ├── kafka.go │ ├── kafkaconnect.go │ ├── logconsumer.go │ ├── order.go │ └── testdata │ │ └── proto │ │ ├── buf.gen.yaml │ │ ├── buf.yaml │ │ ├── gen │ │ └── things │ │ │ └── v1 │ │ │ ├── item.pb.go │ │ │ └── widget.pb.go │ │ └── things │ │ └── v1 │ │ ├── item.proto │ │ └── widget.proto │ ├── tls │ ├── ca.go │ ├── ca_test.go │ ├── keypair.go │ ├── keypair_test.go │ ├── tls.go │ └── tls_test_utils.go │ ├── tools │ ├── openapi-generator │ │ ├── v1 │ │ │ └── main.go │ │ └── v1alpha2 │ │ │ └── main.go │ └── tools.go │ ├── validator │ ├── hostname.go │ └── validator.go │ └── version │ └── info.go ├── biome.json ├── buf.gen.openapi.yaml ├── buf.gen.yaml ├── buf.lock ├── buf.yaml ├── docs ├── README.md ├── assets │ ├── preview.mp4 │ ├── social-preview.png │ └── topic-documentation.png ├── config │ └── console.yaml ├── features │ ├── hosting.md │ ├── kafka-connect.md │ ├── protobuf.md │ └── topic-documentation.md ├── installation.md ├── local │ └── docker-compose.yaml └── menu.md ├── frontend ├── .editorconfig ├── .gitignore ├── .npmrc ├── .nvmrc ├── .sample.env ├── bun.lock ├── bunfig.toml ├── components.json ├── module-federation.js ├── package.json ├── playwright.config.ts ├── playwright.enterprise.config.ts ├── postcss.config.mjs ├── public │ ├── favicon-32.png │ ├── index.html │ └── robots.txt ├── rsbuild.config.ts ├── scripts │ └── serve.mjs ├── src │ ├── App.tsx │ ├── EmbeddedApp.tsx │ ├── assets │ │ ├── agent-illustration-http.png │ │ ├── circle-stop.svg │ │ ├── connectors │ │ │ ├── amazon-s3.png │ │ │ ├── apache.svg │ │ │ ├── cassandra.png │ │ │ ├── confluent.png │ │ │ ├── db2.png │ │ │ ├── debezium.png │ │ │ ├── elastic.svg │ │ │ ├── google-bigquery.svg │ │ │ ├── google-cloud-storage.png │ │ │ ├── google-pub-sub.svg │ │ │ ├── hdfs.png │ │ │ ├── ibm-mq.svg │ │ │ ├── iceberg.png │ │ │ ├── jdbc.png │ │ │ ├── mongodb.png │ │ │ ├── mssql.png │ │ │ ├── mysql.svg │ │ │ ├── neo4j.svg │ │ │ ├── postgres.png │ │ │ ├── redpanda.svg │ │ │ ├── salesforce.png │ │ │ ├── servicenow.png │ │ │ ├── snowflake.png │ │ │ └── twitter.svg │ │ ├── elasticsearch.json │ │ ├── explorer-panda-with-map.svg │ │ ├── fonts │ │ │ ├── inter.css │ │ │ ├── inter │ │ │ │ ├── inter-v12-latin-300.woff │ │ │ │ ├── inter-v12-latin-300.woff2 │ │ │ │ ├── inter-v12-latin-500.woff │ │ │ │ ├── inter-v12-latin-500.woff2 │ │ │ │ ├── inter-v12-latin-600.woff │ │ │ │ ├── inter-v12-latin-600.woff2 │ │ │ │ ├── inter-v12-latin-700.woff │ │ │ │ ├── inter-v12-latin-700.woff2 │ │ │ │ ├── inter-v12-latin-800.woff │ │ │ │ ├── inter-v12-latin-800.woff2 │ │ │ │ ├── inter-v12-latin-regular.woff │ │ │ │ └── inter-v12-latin-regular.woff2 │ │ │ ├── kumbh-sans.css │ │ │ ├── kumbh-sans │ │ │ │ ├── kumbh-sans-v11-latin-regular.eot │ │ │ │ ├── kumbh-sans-v11-latin-regular.svg │ │ │ │ ├── kumbh-sans-v11-latin-regular.ttf │ │ │ │ ├── kumbh-sans-v11-latin-regular.woff │ │ │ │ └── kumbh-sans-v11-latin-regular.woff2 │ │ │ ├── open-sans.css │ │ │ ├── open-sans │ │ │ │ ├── open-sans-v20-latin-ext_latin-600.eot │ │ │ │ ├── open-sans-v20-latin-ext_latin-600.svg │ │ │ │ ├── open-sans-v20-latin-ext_latin-600.ttf │ │ │ │ ├── open-sans-v20-latin-ext_latin-600.woff │ │ │ │ ├── open-sans-v20-latin-ext_latin-600.woff2 │ │ │ │ ├── open-sans-v20-latin-ext_latin-700.eot │ │ │ │ ├── open-sans-v20-latin-ext_latin-700.svg │ │ │ │ ├── open-sans-v20-latin-ext_latin-700.ttf │ │ │ │ ├── open-sans-v20-latin-ext_latin-700.woff │ │ │ │ ├── open-sans-v20-latin-ext_latin-700.woff2 │ │ │ │ ├── open-sans-v20-latin-ext_latin-regular.eot │ │ │ │ ├── open-sans-v20-latin-ext_latin-regular.svg │ │ │ │ ├── open-sans-v20-latin-ext_latin-regular.ttf │ │ │ │ ├── open-sans-v20-latin-ext_latin-regular.woff │ │ │ │ └── open-sans-v20-latin-ext_latin-regular.woff2 │ │ │ ├── poppins.css │ │ │ ├── poppins │ │ │ │ ├── poppins-v15-latin-ext_latin-300.eot │ │ │ │ ├── poppins-v15-latin-ext_latin-300.svg │ │ │ │ ├── poppins-v15-latin-ext_latin-300.ttf │ │ │ │ ├── poppins-v15-latin-ext_latin-300.woff │ │ │ │ ├── poppins-v15-latin-ext_latin-300.woff2 │ │ │ │ ├── poppins-v15-latin-ext_latin-500.eot │ │ │ │ ├── poppins-v15-latin-ext_latin-500.svg │ │ │ │ ├── poppins-v15-latin-ext_latin-500.ttf │ │ │ │ ├── poppins-v15-latin-ext_latin-500.woff │ │ │ │ ├── poppins-v15-latin-ext_latin-500.woff2 │ │ │ │ ├── poppins-v15-latin-ext_latin-600.eot │ │ │ │ ├── poppins-v15-latin-ext_latin-600.svg │ │ │ │ ├── poppins-v15-latin-ext_latin-600.ttf │ │ │ │ ├── poppins-v15-latin-ext_latin-600.woff │ │ │ │ ├── poppins-v15-latin-ext_latin-600.woff2 │ │ │ │ ├── poppins-v15-latin-ext_latin-700.eot │ │ │ │ ├── poppins-v15-latin-ext_latin-700.svg │ │ │ │ ├── poppins-v15-latin-ext_latin-700.ttf │ │ │ │ ├── poppins-v15-latin-ext_latin-700.woff │ │ │ │ ├── poppins-v15-latin-ext_latin-700.woff2 │ │ │ │ ├── poppins-v15-latin-ext_latin-regular.eot │ │ │ │ ├── poppins-v15-latin-ext_latin-regular.svg │ │ │ │ ├── poppins-v15-latin-ext_latin-regular.ttf │ │ │ │ ├── poppins-v15-latin-ext_latin-regular.woff │ │ │ │ └── poppins-v15-latin-ext_latin-regular.woff2 │ │ │ ├── quicksand.css │ │ │ └── quicksand │ │ │ │ ├── quicksand-v24-latin-ext_latin-500.eot │ │ │ │ ├── quicksand-v24-latin-ext_latin-500.svg │ │ │ │ ├── quicksand-v24-latin-ext_latin-500.ttf │ │ │ │ ├── quicksand-v24-latin-ext_latin-500.woff │ │ │ │ ├── quicksand-v24-latin-ext_latin-500.woff2 │ │ │ │ ├── quicksand-v24-latin-ext_latin-600.eot │ │ │ │ ├── quicksand-v24-latin-ext_latin-600.svg │ │ │ │ ├── quicksand-v24-latin-ext_latin-600.ttf │ │ │ │ ├── quicksand-v24-latin-ext_latin-600.woff │ │ │ │ ├── quicksand-v24-latin-ext_latin-600.woff2 │ │ │ │ ├── quicksand-v24-latin-ext_latin-700.eot │ │ │ │ ├── quicksand-v24-latin-ext_latin-700.svg │ │ │ │ ├── quicksand-v24-latin-ext_latin-700.ttf │ │ │ │ ├── quicksand-v24-latin-ext_latin-700.woff │ │ │ │ ├── quicksand-v24-latin-ext_latin-700.woff2 │ │ │ │ ├── quicksand-v24-latin-ext_latin-regular.eot │ │ │ │ ├── quicksand-v24-latin-ext_latin-regular.svg │ │ │ │ ├── quicksand-v24-latin-ext_latin-regular.ttf │ │ │ │ ├── quicksand-v24-latin-ext_latin-regular.woff │ │ │ │ └── quicksand-v24-latin-ext_latin-regular.woff2 │ │ ├── globExample.png │ │ ├── login_wave.svg │ │ ├── logo.svg │ │ ├── logo2.png │ │ ├── logos │ │ │ ├── redpanda-icon-black.svg │ │ │ ├── redpanda-icon-color.svg │ │ │ ├── redpanda-icon-white.svg │ │ │ ├── redpanda-text-black.svg │ │ │ ├── redpanda-text-color.svg │ │ │ └── redpanda-text-white.svg │ │ ├── news.json │ │ ├── pattern3.png │ │ ├── postgres.json │ │ ├── redpanda │ │ │ ├── BabyYoda.png │ │ │ ├── BabyYoda.svg │ │ │ ├── EmptyConnectors.svg │ │ │ ├── ErrorBananaSlip.svg │ │ │ ├── PandaBot.png │ │ │ ├── PandaFaceClosed.png │ │ │ ├── PandaFaceClosed.svg │ │ │ ├── PandaFaceOpen.png │ │ │ ├── PandaFaceOpen.svg │ │ │ ├── PandaPouncing.png │ │ │ ├── PandaPouncing.svg │ │ │ ├── RedpandaSkater.png │ │ │ ├── RedpandaSkater.svg │ │ │ ├── Redpanda_horizontal.png │ │ │ ├── Redpanda_horizontal.svg │ │ │ ├── Redpanda_horizontal_black_background.png │ │ │ ├── Redpanda_horizontal_black_background.svg │ │ │ ├── RocketPanda.png │ │ │ ├── RocketPanda.svg │ │ │ ├── SittingPanda.png │ │ │ ├── SittingPanda.svg │ │ │ ├── icon-blk.svg │ │ │ ├── icon-color.svg │ │ │ ├── redpanda-blk.svg │ │ │ ├── redpanda-color.png │ │ │ ├── redpanda-color.svg │ │ │ ├── redpanda.png │ │ │ ├── redpanda.svg │ │ │ ├── redpandaConsole.svg │ │ │ ├── redpanda_black_background.png │ │ │ ├── redpanda_black_background.svg │ │ │ ├── redpanda_vertical.png │ │ │ ├── redpanda_vertical.svg │ │ │ ├── redpanda_vertical_black_background.png │ │ │ ├── redpanda_vertical_black_background.svg │ │ │ ├── redpanda_vertical_inverse.svg │ │ │ ├── rp-connect.svg │ │ │ ├── v_symbol.png │ │ │ ├── v_symbol.svg │ │ │ ├── v_symbol_black_background.png │ │ │ └── v_symbol_black_background.svg │ │ ├── redpanda_console_horizontal.svg │ │ ├── rp-connect-schema.json │ │ └── twitter.json │ ├── bootstrap.tsx │ ├── colors.ts │ ├── components │ │ ├── RequireAuth.tsx │ │ ├── constants.ts │ │ ├── debugBundle │ │ │ └── DebugBundleLink.tsx │ │ ├── form │ │ │ ├── checkbox │ │ │ │ └── checkbox-field.tsx │ │ │ ├── error-info │ │ │ │ └── error-info-field.tsx │ │ │ ├── form-hook-contexts.ts │ │ │ ├── form.ts │ │ │ ├── key-value │ │ │ │ └── key-value-field.tsx │ │ │ ├── number │ │ │ │ └── number-field.tsx │ │ │ ├── password │ │ │ │ └── password-field.tsx │ │ │ ├── radio │ │ │ │ ├── radio-card.tsx │ │ │ │ └── radio-group-field.tsx │ │ │ ├── select │ │ │ │ └── single-select-field.tsx │ │ │ ├── subscribe │ │ │ │ └── subscribe-button.tsx │ │ │ ├── text-area │ │ │ │ └── text-area-field.tsx │ │ │ └── text │ │ │ │ └── text-field.tsx │ │ ├── layout │ │ │ ├── Content.tsx │ │ │ ├── Footer.tsx │ │ │ └── Header.tsx │ │ ├── license │ │ │ ├── FeatureLicenseNotification.tsx │ │ │ ├── LicenseNotification.tsx │ │ │ ├── OverviewLicenseNotification.tsx │ │ │ ├── licenseUtils.spec.tsx │ │ │ └── licenseUtils.tsx │ │ ├── misc │ │ │ ├── BoxCard.module.scss │ │ │ ├── BoxCard.tsx │ │ │ ├── BrokerList.tsx │ │ │ ├── ConfigList.module.scss │ │ │ ├── ConfigList.tsx │ │ │ ├── Error401Page.tsx │ │ │ ├── ErrorBoundary.tsx │ │ │ ├── ErrorDisplay.tsx │ │ │ ├── ErrorModal.tsx │ │ │ ├── ErrorResult.tsx │ │ │ ├── ExpandableText.tsx │ │ │ ├── HiddenRadioList.module.scss │ │ │ ├── HiddenRadioList.tsx │ │ │ ├── HistorySetter.tsx │ │ │ ├── KowlEditor.tsx │ │ │ ├── KowlJsonView.module.scss │ │ │ ├── KowlJsonView.tsx │ │ │ ├── KowlTable.tsx │ │ │ ├── KowlTimePicker.tsx │ │ │ ├── NoClipboardPopover.tsx │ │ │ ├── NullFallbackBoundary.tsx │ │ │ ├── PageContent.tsx │ │ │ ├── PipelinesYamlEditor.tsx │ │ │ ├── RemovableFilter.tsx │ │ │ ├── SearchBar.tsx │ │ │ ├── Section.tsx │ │ │ ├── Select.tsx │ │ │ ├── ShortNum.tsx │ │ │ ├── SmallStat.tsx │ │ │ ├── Statistic.tsx │ │ │ ├── UserButton.tsx │ │ │ ├── UserPreferences.tsx │ │ │ ├── Wizard.module.scss │ │ │ ├── Wizard.tsx │ │ │ ├── buttons │ │ │ │ └── data-refresh │ │ │ │ │ └── Component.tsx │ │ │ ├── common.tsx │ │ │ ├── login-complete.tsx │ │ │ ├── login.tsx │ │ │ ├── not-found-page.tsx │ │ │ ├── resource-in-use-alert.tsx │ │ │ ├── sidebar-item-badge.tsx │ │ │ └── tabs │ │ │ │ ├── Tabs.module.scss │ │ │ │ ├── Tabs.test.tsx │ │ │ │ └── Tabs.tsx │ │ ├── pages │ │ │ ├── Page.ts │ │ │ ├── UrlTestPage.tsx │ │ │ ├── acls │ │ │ │ ├── Acl.List.tsx │ │ │ │ ├── DeleteRoleConfirmModal.tsx │ │ │ │ ├── DeleteUserConfirmModal.tsx │ │ │ │ ├── Models.ts │ │ │ │ ├── Operation.tsx │ │ │ │ ├── PrincipalGroupEditor.tsx │ │ │ │ ├── RoleCreate.tsx │ │ │ │ ├── RoleDetails.tsx │ │ │ │ ├── RoleEditPage.tsx │ │ │ │ ├── RoleForm.tsx │ │ │ │ ├── UserCreate.tsx │ │ │ │ ├── UserDetails.tsx │ │ │ │ ├── UserEditModals.tsx │ │ │ │ └── UserPermissionAssignments.tsx │ │ │ ├── admin │ │ │ │ ├── Admin.DebugBundle.tsx │ │ │ │ ├── Admin.DebugBundleProgress.tsx │ │ │ │ ├── Admin.RoleBindings.tsx │ │ │ │ ├── Admin.Roles.tsx │ │ │ │ ├── Admin.Users.tsx │ │ │ │ ├── DebugBundleOverview.tsx │ │ │ │ ├── LicenseExpiredPage.tsx │ │ │ │ └── UploadLicensePage.tsx │ │ │ ├── agents │ │ │ │ ├── agent-list-page.tsx │ │ │ │ ├── create │ │ │ │ │ ├── create-agent-card.tsx │ │ │ │ │ ├── create-agent-page.tsx │ │ │ │ │ └── templates │ │ │ │ │ │ └── http │ │ │ │ │ │ ├── agent-details-form.tsx │ │ │ │ │ │ ├── create-agent-http-schema.tsx │ │ │ │ │ │ ├── create-agent-http.tsx │ │ │ │ │ │ ├── external-dependencies-form.tsx │ │ │ │ │ │ ├── git-details-form.tsx │ │ │ │ │ │ ├── parse-yaml-template-secrets.test.tsx │ │ │ │ │ │ ├── parse-yaml-template-secrets.tsx │ │ │ │ │ │ ├── rag-chat.yaml │ │ │ │ │ │ ├── rag-git-private.yaml │ │ │ │ │ │ ├── rag-git.yaml │ │ │ │ │ │ ├── rag-indexing.yaml │ │ │ │ │ │ └── redpanda-user-and-permissions-form.tsx │ │ │ │ ├── delete-agent-modal.test.tsx │ │ │ │ ├── delete-agent-modal.tsx │ │ │ │ ├── details │ │ │ │ │ ├── agent-details-page.tsx │ │ │ │ │ ├── agent-pipeline-tab-logs.tsx │ │ │ │ │ ├── agent-pipeline-tab.tsx │ │ │ │ │ ├── agent-state-display-value.tsx │ │ │ │ │ ├── chat │ │ │ │ │ │ ├── agent-chat-blank-state.tsx │ │ │ │ │ │ ├── agent-chat-notification.tsx │ │ │ │ │ │ ├── agent-chat-tab.tsx │ │ │ │ │ │ ├── chat-clear-button.tsx │ │ │ │ │ │ ├── chat-code-block.tsx │ │ │ │ │ │ ├── chat-input.tsx │ │ │ │ │ │ ├── chat-loading-indicator.tsx │ │ │ │ │ │ ├── chat-markdown.tsx │ │ │ │ │ │ ├── chat-message-container.tsx │ │ │ │ │ │ ├── chat-message-view.tsx │ │ │ │ │ │ ├── chat-typing-indicator.tsx │ │ │ │ │ │ ├── night-owl-theme.ts │ │ │ │ │ │ ├── send-message-button.tsx │ │ │ │ │ │ └── send-message-to-api.tsx │ │ │ │ │ ├── toggle-pipeline-state-button.test.tsx │ │ │ │ │ ├── toggle-pipeline-state-button.tsx │ │ │ │ │ ├── update-pipeline-modal.tsx │ │ │ │ │ └── view-pipeline-modal.tsx │ │ │ │ ├── hubspot-modal.scss │ │ │ │ ├── hubspot-modal.tsx │ │ │ │ ├── hubspot-styles.ts │ │ │ │ └── hubspot.helper.ts │ │ │ ├── connect │ │ │ │ ├── Cluster.Details.tsx │ │ │ │ ├── Connector.Details.tsx │ │ │ │ ├── ConnectorBoxCard.module.scss │ │ │ │ ├── ConnectorBoxCard.tsx │ │ │ │ ├── CreateConnector.module.scss │ │ │ │ ├── CreateConnector.tsx │ │ │ │ ├── Overview.tsx │ │ │ │ ├── dynamic-ui │ │ │ │ │ ├── ConnectorStep.tsx │ │ │ │ │ ├── DebugEditor.tsx │ │ │ │ │ ├── List.tsx │ │ │ │ │ ├── PropertyComponent.tsx │ │ │ │ │ ├── PropertyGroup.tsx │ │ │ │ │ ├── components.tsx │ │ │ │ │ └── forms │ │ │ │ │ │ ├── ErrorWrapper.tsx │ │ │ │ │ │ ├── SecretInput.tsx │ │ │ │ │ │ └── TopicInput.tsx │ │ │ │ └── helper.tsx │ │ │ ├── consumers │ │ │ │ ├── Group.Details.tsx │ │ │ │ ├── Group.List.tsx │ │ │ │ └── Modals.tsx │ │ │ ├── overview │ │ │ │ ├── Broker.Details.tsx │ │ │ │ ├── ClusterHealthOverview.tsx │ │ │ │ ├── Overview.scss │ │ │ │ └── Overview.tsx │ │ │ ├── quotas │ │ │ │ └── Quotas.List.tsx │ │ │ ├── reassign-partitions │ │ │ │ ├── ReassignPartitions.tsx │ │ │ │ ├── Step1.Partitions.tsx │ │ │ │ ├── Step2.Brokers.tsx │ │ │ │ ├── Step3.Review.tsx │ │ │ │ ├── components │ │ │ │ │ ├── ActiveReassignments.tsx │ │ │ │ │ ├── BandwidthSlider.tsx │ │ │ │ │ ├── IndeterminateCheckbox.tsx │ │ │ │ │ └── StatisticsBar.tsx │ │ │ │ └── logic │ │ │ │ │ ├── reassignLogic.ts │ │ │ │ │ ├── reassignmentTracker.ts │ │ │ │ │ └── utils.ts │ │ │ ├── rp-connect │ │ │ │ ├── Pipelines.Create.tsx │ │ │ │ ├── Pipelines.Details.tsx │ │ │ │ ├── Pipelines.Edit.tsx │ │ │ │ ├── Pipelines.List.tsx │ │ │ │ ├── RedpandaConnectIntro.tsx │ │ │ │ ├── errors.tsx │ │ │ │ ├── modals.tsx │ │ │ │ ├── secrets │ │ │ │ │ ├── Secrets.Create.tsx │ │ │ │ │ ├── Secrets.List.tsx │ │ │ │ │ ├── Secrets.QuickAdd.tsx │ │ │ │ │ └── Secrets.Update.tsx │ │ │ │ └── tasks.tsx │ │ │ ├── schemas │ │ │ │ ├── EditCompatibility.tsx │ │ │ │ ├── Schema.Create.tsx │ │ │ │ ├── Schema.Details.tsx │ │ │ │ ├── Schema.List.scss │ │ │ │ ├── Schema.List.tsx │ │ │ │ └── modals.tsx │ │ │ ├── secrets │ │ │ │ ├── create-secret-modal.test.tsx │ │ │ │ ├── create-secret-modal.tsx │ │ │ │ ├── delete-secret-modal.test.tsx │ │ │ │ ├── delete-secret-modal.tsx │ │ │ │ ├── form │ │ │ │ │ ├── delete-secret-schema.ts │ │ │ │ │ └── secret-schema.ts │ │ │ │ ├── secrets-store-page.tsx │ │ │ │ ├── update-secret-modal.test.tsx │ │ │ │ └── update-secret-modal.tsx │ │ │ ├── topics │ │ │ │ ├── CreateTopicModal │ │ │ │ │ ├── CreateTopicModal.scss │ │ │ │ │ └── CreateTopicModal.tsx │ │ │ │ ├── DeleteRecordsModal │ │ │ │ │ ├── DeleteRecordsModal.module.scss │ │ │ │ │ ├── DeleteRecordsModal.test.tsx │ │ │ │ │ └── DeleteRecordsModal.tsx │ │ │ │ ├── PublishMessagesModal │ │ │ │ │ ├── Headers.tsx │ │ │ │ │ └── headersEditor.scss │ │ │ │ ├── QuickInfo.tsx │ │ │ │ ├── Tab.Acl │ │ │ │ │ ├── AclList.test.tsx │ │ │ │ │ └── AclList.tsx │ │ │ │ ├── Tab.Config.tsx │ │ │ │ ├── Tab.Consumers.tsx │ │ │ │ ├── Tab.Docu.tsx │ │ │ │ ├── Tab.Messages │ │ │ │ │ ├── Editor.tsx │ │ │ │ │ ├── JavascriptFilterModal.tsx │ │ │ │ │ ├── PreviewSettings.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Tab.Partitions.tsx │ │ │ │ ├── Topic.Details.tsx │ │ │ │ ├── Topic.List.tsx │ │ │ │ ├── Topic.Produce.tsx │ │ │ │ ├── TopicConfiguration.scss │ │ │ │ ├── TopicConfiguration.tsx │ │ │ │ ├── create-topic-modal.tsx │ │ │ │ └── types.ts │ │ │ ├── transforms │ │ │ │ ├── Transform.Details.tsx │ │ │ │ ├── Transforms.List.tsx │ │ │ │ ├── Transforms.Setup.tsx │ │ │ │ └── modals.tsx │ │ │ └── users │ │ │ │ ├── create-user-confirmation-modal.tsx │ │ │ │ └── create-user-with-secret-password-modal.tsx │ │ └── routes.tsx │ ├── config.ts │ ├── custom-feature-flag-provider.tsx │ ├── database │ │ └── chat-db.ts │ ├── env.d.ts │ ├── globals.css │ ├── globals.scss │ ├── hooks │ │ ├── use-developer-view.ts │ │ ├── usePaginationParams.test.ts │ │ └── usePaginationParams.ts │ ├── index-cloud-integration.scss │ ├── index.scss │ ├── index.tsx │ ├── injectApp.tsx │ ├── protobuf-registry.ts │ ├── protogen │ │ ├── buf │ │ │ └── validate │ │ │ │ └── validate_pb.ts │ │ ├── common │ │ │ └── common_pb.ts │ │ ├── google │ │ │ ├── api │ │ │ │ ├── annotations_pb.ts │ │ │ │ ├── field_behavior_pb.ts │ │ │ │ ├── http_pb.ts │ │ │ │ └── resource_pb.ts │ │ │ ├── rpc │ │ │ │ ├── code_pb.ts │ │ │ │ ├── error_details_pb.ts │ │ │ │ └── status_pb.ts │ │ │ └── type │ │ │ │ ├── color_pb.ts │ │ │ │ ├── dayofweek_pb.ts │ │ │ │ ├── decimal_pb.ts │ │ │ │ ├── fraction_pb.ts │ │ │ │ ├── latlng_pb.ts │ │ │ │ ├── money_pb.ts │ │ │ │ ├── month_pb.ts │ │ │ │ └── phone_number_pb.ts │ │ ├── index │ │ │ └── v1 │ │ │ │ └── data_pb.ts │ │ ├── protoc-gen-openapiv2 │ │ │ └── options │ │ │ │ ├── annotations_pb.ts │ │ │ │ └── openapiv2_pb.ts │ │ ├── redpanda │ │ │ └── api │ │ │ │ ├── auth │ │ │ │ └── v1 │ │ │ │ │ └── authorization_pb.ts │ │ │ │ ├── common │ │ │ │ ├── v1 │ │ │ │ │ ├── errordetails_pb.ts │ │ │ │ │ └── linthint_pb.ts │ │ │ │ └── v1alpha1 │ │ │ │ │ ├── common_pb.ts │ │ │ │ │ ├── money_pb.ts │ │ │ │ │ ├── options_pb.ts │ │ │ │ │ └── pagination_pb.ts │ │ │ │ ├── console │ │ │ │ └── v1alpha1 │ │ │ │ │ ├── authentication-AuthenticationService_connectquery.ts │ │ │ │ │ ├── authentication_pb.ts │ │ │ │ │ ├── cluster_status-ClusterStatusService_connectquery.ts │ │ │ │ │ ├── cluster_status_pb.ts │ │ │ │ │ ├── common_pb.ts │ │ │ │ │ ├── console_service-ConsoleService_connectquery.ts │ │ │ │ │ ├── console_service_pb.ts │ │ │ │ │ ├── debug_bundle-DebugBundleService_connectquery.ts │ │ │ │ │ ├── debug_bundle_pb.ts │ │ │ │ │ ├── license-LicenseService_connectquery.ts │ │ │ │ │ ├── license_pb.ts │ │ │ │ │ ├── list_messages_pb.ts │ │ │ │ │ ├── pipeline-PipelineService_connectquery.ts │ │ │ │ │ ├── pipeline_pb.ts │ │ │ │ │ ├── publish_messages_pb.ts │ │ │ │ │ ├── secret-SecretService_connectquery.ts │ │ │ │ │ ├── secret_pb.ts │ │ │ │ │ ├── security-SecurityService_connectquery.ts │ │ │ │ │ ├── security_pb.ts │ │ │ │ │ ├── transform-TransformService_connectquery.ts │ │ │ │ │ └── transform_pb.ts │ │ │ │ └── dataplane │ │ │ │ ├── v1 │ │ │ │ ├── acl-ACLService_connectquery.ts │ │ │ │ ├── acl_pb.ts │ │ │ │ ├── cloud_storage-CloudStorageService_connectquery.ts │ │ │ │ ├── cloud_storage_pb.ts │ │ │ │ ├── common_pb.ts │ │ │ │ ├── dummy-DummyService_connectquery.ts │ │ │ │ ├── dummy_pb.ts │ │ │ │ ├── error_pb.ts │ │ │ │ ├── kafka_connect-KafkaConnectService_connectquery.ts │ │ │ │ ├── kafka_connect_pb.ts │ │ │ │ ├── pipeline-PipelineService_connectquery.ts │ │ │ │ ├── pipeline_pb.ts │ │ │ │ ├── secret-SecretService_connectquery.ts │ │ │ │ ├── secret_pb.ts │ │ │ │ ├── security-SecurityService_connectquery.ts │ │ │ │ ├── security_pb.ts │ │ │ │ ├── swagger_pb.ts │ │ │ │ ├── topic-TopicService_connectquery.ts │ │ │ │ ├── topic_pb.ts │ │ │ │ ├── transform-TransformService_connectquery.ts │ │ │ │ ├── transform_pb.ts │ │ │ │ ├── user-UserService_connectquery.ts │ │ │ │ └── user_pb.ts │ │ │ │ ├── v1alpha1 │ │ │ │ ├── acl-ACLService_connectquery.ts │ │ │ │ ├── acl_pb.ts │ │ │ │ ├── common_pb.ts │ │ │ │ ├── dummy-DummyService_connectquery.ts │ │ │ │ ├── dummy_pb.ts │ │ │ │ ├── error_pb.ts │ │ │ │ ├── kafka_connect-KafkaConnectService_connectquery.ts │ │ │ │ ├── kafka_connect_pb.ts │ │ │ │ ├── secret-SecretService_connectquery.ts │ │ │ │ ├── secret_pb.ts │ │ │ │ ├── swagger_pb.ts │ │ │ │ ├── topic-TopicService_connectquery.ts │ │ │ │ ├── topic_pb.ts │ │ │ │ ├── transform-TransformService_connectquery.ts │ │ │ │ ├── transform_pb.ts │ │ │ │ ├── user-UserService_connectquery.ts │ │ │ │ └── user_pb.ts │ │ │ │ └── v1alpha2 │ │ │ │ ├── acl-ACLService_connectquery.ts │ │ │ │ ├── acl_pb.ts │ │ │ │ ├── cloud_storage-CloudStorageService_connectquery.ts │ │ │ │ ├── cloud_storage_pb.ts │ │ │ │ ├── common_pb.ts │ │ │ │ ├── dummy-DummyService_connectquery.ts │ │ │ │ ├── dummy_pb.ts │ │ │ │ ├── error_pb.ts │ │ │ │ ├── kafka_connect-KafkaConnectService_connectquery.ts │ │ │ │ ├── kafka_connect_pb.ts │ │ │ │ ├── pipeline-PipelineService_connectquery.ts │ │ │ │ ├── pipeline_pb.ts │ │ │ │ ├── secret-SecretService_connectquery.ts │ │ │ │ ├── secret_pb.ts │ │ │ │ ├── swagger_pb.ts │ │ │ │ ├── topic-TopicService_connectquery.ts │ │ │ │ ├── topic_pb.ts │ │ │ │ ├── transform-TransformService_connectquery.ts │ │ │ │ ├── transform_pb.ts │ │ │ │ ├── user-UserService_connectquery.ts │ │ │ │ └── user_pb.ts │ │ ├── shop │ │ │ ├── v1 │ │ │ │ └── order_pb.ts │ │ │ └── v2 │ │ │ │ ├── address_pb.ts │ │ │ │ ├── customer_pb.ts │ │ │ │ └── order_pb.ts │ │ └── things │ │ │ └── v1 │ │ │ ├── item_pb.ts │ │ │ └── widget_pb.ts │ ├── queryClient.ts │ ├── react-query │ │ ├── api │ │ │ ├── acl.tsx │ │ │ ├── agent.test.tsx │ │ │ ├── agent.tsx │ │ │ ├── authentication.tsx │ │ │ ├── cluster-status.tsx │ │ │ ├── console.tsx │ │ │ ├── debug-bundle.tsx │ │ │ ├── license.tsx │ │ │ ├── pipeline.tsx │ │ │ ├── secret.tsx │ │ │ ├── security.tsx │ │ │ ├── topic.tsx │ │ │ ├── transform.tsx │ │ │ └── user.tsx │ │ ├── get-infinite-query-states.ts │ │ ├── react-query.utils.ts │ │ └── use-infinite-query-with-all-pages.ts │ ├── state │ │ ├── appGlobal.ts │ │ ├── backendApi.ts │ │ ├── connect │ │ │ └── state.ts │ │ ├── restInterfaces.ts │ │ ├── supportedFeatures.ts │ │ ├── typeExperiments.ts │ │ ├── ui.ts │ │ └── uiState.ts │ ├── test-utils.tsx │ ├── types │ │ └── index.d.ts │ ├── utils │ │ ├── LazyMap.ts │ │ ├── ModalContainer.tsx │ │ ├── animationProps.tsx │ │ ├── arrayExtensions.ts │ │ ├── createAutoModal.tsx │ │ ├── env.ts │ │ ├── extensions.ts │ │ ├── featureDetection.ts │ │ ├── fetchWithTimeout.ts │ │ ├── filterHelper.ts │ │ ├── filterableDataSource.ts │ │ ├── formatters │ │ │ └── ConfigValueFormatter.ts │ │ ├── interpreter │ │ │ ├── findFunction.ts │ │ │ ├── global.ts │ │ │ ├── helpers.ts │ │ │ └── tsconfig.json │ │ ├── jsonUtils.ts │ │ ├── numberExtensions.ts │ │ ├── pagination.ts │ │ ├── queryHelper.ts │ │ ├── svg │ │ │ ├── AzureADLogo.tsx │ │ │ └── OktaLogo.tsx │ │ ├── toast.utils.tsx │ │ ├── tsxUtils.tsx │ │ ├── utils.test.ts │ │ ├── utils.ts │ │ └── uuid.utils.ts │ └── variables.scss ├── tests │ ├── auth.setup.ts │ ├── config │ │ ├── conf │ │ │ └── .bootstrap.yaml │ │ ├── console.config.yaml │ │ ├── console.enterprise.config.yaml │ │ └── docker-compose.yaml │ ├── connector.utils.ts │ ├── console-enterprise │ │ ├── license.spec.ts │ │ ├── roles.spec.ts │ │ └── users.spec.ts │ ├── console │ │ ├── connector.spec.ts │ │ ├── core.spec.ts │ │ ├── schema.spec.ts │ │ ├── topic.spec.ts │ │ └── transforms.spec.ts │ ├── mock-document.ts │ ├── mock-react-select.tsx │ ├── roles.utils.ts │ └── users.utils.ts ├── tsconfig.base.json ├── tsconfig.json ├── vitest.config.mts ├── vitest.setup.ts └── yarn.lock ├── licenses ├── README.md ├── bsl_header.txt ├── third_party_go.csv └── third_party_js.csv ├── proto ├── gen │ └── openapi │ │ ├── openapi.json │ │ ├── openapi.v1alpha2.json │ │ ├── openapi.v1alpha2.yaml │ │ └── openapi.yaml └── redpanda │ └── api │ ├── auth │ └── v1 │ │ └── authorization.proto │ ├── console │ └── v1alpha1 │ │ ├── authentication.proto │ │ ├── cluster_status.proto │ │ ├── common.proto │ │ ├── console_service.proto │ │ ├── debug_bundle.proto │ │ ├── license.proto │ │ ├── list_messages.proto │ │ ├── pipeline.proto │ │ ├── publish_messages.proto │ │ ├── secret.proto │ │ ├── security.proto │ │ └── transform.proto │ └── dataplane │ ├── v1 │ ├── acl.proto │ ├── cloud_storage.proto │ ├── common.proto │ ├── dummy.proto │ ├── error.proto │ ├── kafka_connect.proto │ ├── pipeline.proto │ ├── secret.proto │ ├── security.proto │ ├── swagger.proto │ ├── topic.proto │ ├── transform.proto │ └── user.proto │ ├── v1alpha1 │ ├── acl.proto │ ├── common.proto │ ├── dummy.proto │ ├── error.proto │ ├── kafka_connect.proto │ ├── secret.proto │ ├── swagger.proto │ ├── topic.proto │ ├── transform.proto │ └── user.proto │ └── v1alpha2 │ ├── acl.proto │ ├── cloud_storage.proto │ ├── common.proto │ ├── dummy.proto │ ├── error.proto │ ├── kafka_connect.proto │ ├── pipeline.proto │ ├── secret.proto │ ├── swagger.proto │ ├── topic.proto │ ├── transform.proto │ └── user.proto ├── taskfiles ├── backend.yaml ├── connect.yaml └── proto.yaml └── taskw /.git-hooks/init: -------------------------------------------------------------------------------- 1 | 2 | #!/bin/bash 3 | 4 | git config core.hooksPath ./git-hooks 5 | -------------------------------------------------------------------------------- /.git-hooks/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # FRONTEND ESLINT CHECK 4 | ########################### 5 | FRONTEND_STAGED_FILES=("$(git diff --diff-filter=d --cached --name-only ./frontend | grep -E '^.*src\/.*\.(js|jsx|tsx|ts)$')") 6 | 7 | 8 | if [[ "$FRONTEND_STAGED_FILES" = "" ]]; then 9 | exit 0 10 | fi 11 | 12 | PASS=true 13 | 14 | # Check for node 15 | which node &> /dev/null 16 | if [[ "$?" == 1 ]]; then 17 | echo "\t\033[41mPlease install node\033[0m" 18 | exit 1 19 | fi 20 | 21 | echo $FRONTEND_STAGED_FILES 22 | for FILE in $FRONTEND_STAGED_FILES 23 | do 24 | 25 | pattern="frontend/" 26 | 27 | bun run linter --prefix ./frontend -- "${FILE/$pattern/}" 28 | 29 | if [[ "$?" == 0 ]]; then 30 | echo "\033[32mESLint Passed: $FILE\033[0m" 31 | else 32 | echo "\033[41mESLint Failed: $FILE\033[0m" 33 | PASS=false 34 | fi 35 | done 36 | 37 | 38 | echo "\nESLint validation completed!\n" 39 | 40 | if ! $PASS; then 41 | echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass ESLint but do not. Please fix the ESLint errors and try again.\n" 42 | exit 1 43 | else 44 | echo "\033[42mCOMMIT SUCCEEDED\033[0m\n" 45 | fi 46 | 47 | exit $? 48 | 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Misc 2 | .DS_Store 3 | notes.md 4 | fixname.sh 5 | 6 | # IDEs 7 | **/.vscode 8 | **/.idea 9 | **/*.code-workspace 10 | 11 | # Helper Scripts 12 | run-docker.sh 13 | run-backend.sh 14 | requests.txt 15 | 16 | # Local Formatting 17 | .prettierrc 18 | 19 | # Local build tools installed via Taskfiles 20 | build -------------------------------------------------------------------------------- /.taskversion: -------------------------------------------------------------------------------- 1 | v3.34.1 2 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Redpanda Console Security and Disclosure Information 2 | 3 | As with any complex system, it is certain that bugs will be found, some of them security-relevant. 4 | If you find a _security bug_ please report it privately via email to security@redpanda.com. We will fix the issue as soon 5 | as possible and coordinate a release date with you. You will be able to choose if you want public acknowledgement of 6 | your effort and if you want to be mentioned by name. 7 | 8 | ## Public Disclosure Timing 9 | 10 | The public disclosure date is agreed between the Redpanda Console Team and the bug submitter. 11 | We prefer to fully disclose the bug as soon as possible, but only after a mitigation or fix is available. 12 | We will ask for delay if the bug or the fix is not yet fully understood or the solution is not tested to our standards 13 | yet. While there is no fixed time frame for fix & disclosure, we will try our best to be quick and do not expect to need 14 | the usual 90 days most companies ask or. For a vulnerability with a straightforward mitigation, we expect report date to 15 | disclosure date to be on the order of 7 days. 16 | -------------------------------------------------------------------------------- /Taskfile.yaml: -------------------------------------------------------------------------------- 1 | version: 3 2 | 3 | vars: 4 | GO_VERSION: 1.24.2 5 | BUILD_ROOT: "{{ .ROOT_DIR }}/build" 6 | GO_BUILD_ROOT: '{{.BUILD_ROOT}}/go/{{.GO_VERSION}}' 7 | PATH_PREFIX: PATH={{.BUILD_ROOT}}/bin:{{.GO_BUILD_ROOT}}/bin:{{.BUILD_ROOT}}/bin/go:$PATH GOBIN={{ .BUILD_ROOT }}/bin/go GOROOT= 8 | BACKEND_ROOT: "{{ .ROOT_DIR }}/backend" 9 | FRONTEND_ROOT: "{{ .ROOT_DIR }}/frontend" 10 | BRANCH_SLUG: 11 | sh: git rev-parse --abbrev-ref HEAD | sed -e 's/[^[:alnum:]]/-/g' | tr -s '-' | tr A-Z a-z 12 | 13 | includes: 14 | backend: taskfiles/backend.yaml 15 | proto: taskfiles/proto.yaml 16 | connect: taskfiles/connect.yaml 17 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | __debug_bin 14 | 15 | # IDEs 16 | .idea 17 | .vscode 18 | 19 | # Local configs 20 | config.yaml 21 | configs 22 | config-*.yaml 23 | 24 | *.pem -------------------------------------------------------------------------------- /backend/cmd/api/main.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package main 11 | 12 | import ( 13 | "go.uber.org/zap" 14 | 15 | "github.com/redpanda-data/console/backend/pkg/api" 16 | "github.com/redpanda-data/console/backend/pkg/config" 17 | ) 18 | 19 | func main() { 20 | startupLogger := zap.NewExample() 21 | 22 | cfg, err := config.LoadConfig(startupLogger) 23 | if err != nil { 24 | startupLogger.Fatal("failed to load config", zap.Error(err)) 25 | } 26 | err = cfg.Validate() 27 | if err != nil { 28 | startupLogger.Fatal("failed to validate config", zap.Error(err)) 29 | } 30 | 31 | a := api.New(&cfg) 32 | a.Start() 33 | } 34 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/errors/bad_request.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package errors 11 | 12 | import "google.golang.org/genproto/googleapis/rpc/errdetails" 13 | 14 | // NewBadRequest is a constructor for creating bad request 15 | func NewBadRequest(fieldValidations ...*errdetails.BadRequest_FieldViolation) *errdetails.BadRequest { 16 | return &errdetails.BadRequest{FieldViolations: fieldValidations} 17 | } 18 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/errors/domain.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package errors 11 | 12 | const ( 13 | // DomainDataplane defines the string for the proto error domain "dataplane". 14 | DomainDataplane = "redpanda.com/dataplane" 15 | ) 16 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/errors/help.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package errors 11 | 12 | import "google.golang.org/genproto/googleapis/rpc/errdetails" 13 | 14 | // NewHelp constructs a new errdetails.Help with one or more provided errdetails.Help_Link. 15 | func NewHelp(links ...*errdetails.Help_Link) *errdetails.Help { 16 | return &errdetails.Help{Links: links} 17 | } 18 | 19 | // NewHelpLinkConsoleReferenceConfig returns a Help link to the Redpanda Console reference configuration. 20 | func NewHelpLinkConsoleReferenceConfig() *errdetails.Help_Link { 21 | return &errdetails.Help_Link{ 22 | Description: "Redpanda Console Configuration Reference", 23 | Url: "https://docs.redpanda.com/current/reference/console/config/", 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/integration/util_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | //go:build integration 11 | 12 | // Package integration includes integration tests for the dataplane API. 13 | package integration 14 | 15 | import ( 16 | "context" 17 | 18 | "github.com/twmb/franz-go/pkg/kadm" 19 | ) 20 | 21 | func createKafkaTopic(ctx context.Context, k *kadm.Client, topic string, partitionCount int) error { 22 | _, err := k.CreateTopic(ctx, int32(partitionCount), int16(1), map[string]*string{}, topic) 23 | return err 24 | } 25 | 26 | func deleteKafkaTopic(ctx context.Context, k *kadm.Client, topic string) error { 27 | _, err := k.DeleteTopics(ctx, topic) 28 | return err 29 | } 30 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/integration/wasm-binary/integration-test.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/backend/pkg/api/connect/integration/wasm-binary/integration-test.wasm -------------------------------------------------------------------------------- /backend/pkg/api/connect/interceptor/update_test.go: -------------------------------------------------------------------------------- 1 | package interceptor 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/require" 7 | "google.golang.org/protobuf/types/known/fieldmaskpb" 8 | 9 | dataplanev1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1" 10 | ) 11 | 12 | func TestResource(t *testing.T) { 13 | assert := require.New(t) 14 | i := dataplanev1.UpdatePipelineRequest{ 15 | UpdateMask: &fieldmaskpb.FieldMask{Paths: []string{"tags"}}, 16 | Pipeline: &dataplanev1.PipelineUpdate{ 17 | Tags: map[string]string{ 18 | "a": "b", 19 | }, 20 | }, 21 | } 22 | 23 | rn, ok := findResourceName(&i) 24 | assert.True(ok) 25 | assert.Equal("pipeline", rn) 26 | } 27 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/clusterstatus/util.go: -------------------------------------------------------------------------------- 1 | // Copyright 2025 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package clusterstatus 11 | 12 | import consolev1alpha1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/console/v1alpha1" 13 | 14 | func setStatus(s *consolev1alpha1.ComponentStatus, status consolev1alpha1.StatusType, reason string) { 15 | if status > s.Status { 16 | s.Status = status 17 | s.StatusReason = reason 18 | } 19 | } 20 | 21 | // intSliceToInt32Slice converts a slice of int to a slice of int32. 22 | func intSliceToInt32Slice(in []int) []int32 { 23 | out := make([]int32, len(in)) 24 | for i, v := range in { 25 | out[i] = int32(v) 26 | } 27 | return out 28 | } 29 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/kafkaconnect/v1/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package kafkaconnect 11 | 12 | import v1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1" 13 | 14 | // Defaulter updates a given kafkaconnect request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListConnectorsRequest(req *v1.ListConnectorsRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/kafkaconnect/v1alpha1/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package kafkaconnect 11 | 12 | import v1alpha1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1" 13 | 14 | // Defaulter updates a given kafkaconnect request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListConnectorsRequest(req *v1alpha1.ListConnectorsRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/kafkaconnect/v1alpha2/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package kafkaconnect 11 | 12 | import v1alpha2 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha2" 13 | 14 | // Defaulter updates a given kafkaconnect request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListConnectorsRequest(req *v1alpha2.ListConnectorsRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/topic/v1/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package topic 11 | 12 | import v1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1" 13 | 14 | // Defaulter updates a given Topic input request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListTopicsRequest(req *v1.ListTopicsRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/topic/v1alpha1/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package topic 11 | 12 | import v1alpha1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1" 13 | 14 | // Defaulter updates a given Topic input request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListTopicsRequest(req *v1alpha1.ListTopicsRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/topic/v1alpha2/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package topic 11 | 12 | import v1alpha2 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha2" 13 | 14 | // Defaulter updates a given Topic input request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListTopicsRequest(req *v1alpha2.ListTopicsRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/transform/v1/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package transform 11 | 12 | import v1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1" 13 | 14 | // Defaulter updates a given transforms request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListTransformsRequest(req *v1.ListTransformsRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/transform/v1alpha1/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package transform 11 | 12 | import v1alpha1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1" 13 | 14 | // Defaulter updates a given transforms request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListTransformsRequest(req *v1alpha1.ListTransformsRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/transform/v1alpha1/handle_transforms.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package transform 11 | 12 | import ( 13 | "net/http" 14 | ) 15 | 16 | // HandleDeployTransform is the HTTP handler for deploying WASM transforms in Redpanda. 17 | // Because we use multipart/form-data for uploading the binary file (up to 50mb), we did 18 | // not use gRPC/protobuf for this. 19 | func (s *Service) HandleDeployTransform() http.HandlerFunc { 20 | return s.targetImpl.HandleDeployTransform() 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/transform/v1alpha2/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package transform 11 | 12 | import v1alpha2 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha2" 13 | 14 | // Defaulter updates a given transforms request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListTransformsRequest(req *v1alpha2.ListTransformsRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/user/v1/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package user 11 | 12 | import v1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1" 13 | 14 | // Defaulter updates a given user request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListUsersRequest(req *v1.ListUsersRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/user/v1alpha1/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package user 11 | 12 | import v1alpha1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1" 13 | 14 | // Defaulter updates a given user request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListUsersRequest(req *v1alpha1.ListUsersRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/connect/service/user/v1alpha2/defaulter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package user 11 | 12 | import v1alpha2 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha2" 13 | 14 | // Defaulter updates a given user request with defaults. 15 | type defaulter struct{} 16 | 17 | func (*defaulter) applyListUsersRequest(req *v1alpha2.ListUsersRequest) { 18 | if req.GetPageSize() == 0 { 19 | req.PageSize = 100 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/api/handle_probes.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package api 11 | 12 | import ( 13 | "net/http" 14 | 15 | "github.com/cloudhut/common/rest" 16 | ) 17 | 18 | func (api *API) handleLivenessProbe() http.HandlerFunc { 19 | type response struct { 20 | IsHTTPOk bool `json:"isHttpOk"` 21 | } 22 | 23 | return func(w http.ResponseWriter, r *http.Request) { 24 | res := &response{ 25 | IsHTTPOk: true, 26 | } 27 | 28 | rest.SendResponse(w, r, api.Logger, http.StatusOK, res) 29 | } 30 | } 31 | 32 | func (api *API) handleStartupProbe() http.HandlerFunc { 33 | type response struct { 34 | IsHTTPOk bool `json:"isHttpOk"` 35 | } 36 | 37 | return func(w http.ResponseWriter, r *http.Request) { 38 | res := &response{ 39 | IsHTTPOk: true, 40 | } 41 | 42 | rest.SendResponse(w, r, api.Logger, http.StatusOK, res) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /backend/pkg/api/handle_quotas.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package api 11 | 12 | import ( 13 | "net/http" 14 | 15 | "github.com/cloudhut/common/rest" 16 | ) 17 | 18 | func (api *API) handleGetQuotas() http.HandlerFunc { 19 | return func(w http.ResponseWriter, r *http.Request) { 20 | quotas := api.ConsoleSvc.DescribeQuotas(r.Context()) 21 | 22 | rest.SendResponse(w, r, api.Logger, http.StatusOK, quotas) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /backend/pkg/api/validator.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package api 11 | 12 | import "regexp" 13 | 14 | var isValidKafkaTopicName = regexp.MustCompile(`^[\w.-]+$`).MatchString 15 | -------------------------------------------------------------------------------- /backend/pkg/config/cbor.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package config 11 | 12 | // Cbor represents the CBOR config. 13 | type Cbor struct { 14 | Enabled bool `yaml:"enabled"` 15 | 16 | // TopicName is a name of the topic that should be considered for cbor decoding. This supports regex 17 | // This defaults to `/.*/` 18 | TopicName RegexpOrLiteral `yaml:"topicName"` 19 | } 20 | 21 | // Validate cbor configuration. 22 | func (*Cbor) Validate() error { 23 | return nil 24 | } 25 | 26 | // SetDefaults for the cbor configuration. 27 | func (*Cbor) SetDefaults() {} 28 | -------------------------------------------------------------------------------- /backend/pkg/config/git_auth_basic.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package config 11 | 12 | import "flag" 13 | 14 | // GitAuthBasicAuth provides the configuration options for authenticating against Git with HTTP basic auth. 15 | type GitAuthBasicAuth struct { 16 | Enabled bool `yaml:"enabled"` 17 | Username string `yaml:"username"` 18 | Password string `yaml:"password"` 19 | } 20 | 21 | // RegisterFlagsWithPrefix for sensitive Basic Auth configs 22 | func (c *GitAuthBasicAuth) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { 23 | f.StringVar(&c.Password, prefix+"git.basic-auth.password", "", "Basic Auth password") 24 | } 25 | -------------------------------------------------------------------------------- /backend/pkg/config/git_repository.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package config 11 | 12 | import "errors" 13 | 14 | // GitRepository is the configuration options that determine what Git repository, branch and 15 | // directory shall be used. 16 | type GitRepository struct { 17 | URL string `yaml:"url"` 18 | Branch string `yaml:"branch"` 19 | BaseDirectory string `yaml:"baseDirectory"` 20 | MaxDepth int `yaml:"maxDepth"` 21 | } 22 | 23 | // Validate given input for config properties 24 | func (c *GitRepository) Validate() error { 25 | if c.URL == "" { 26 | return errors.New("you must set a repository url") 27 | } 28 | 29 | return nil 30 | } 31 | 32 | // SetDefaults for Git repository configurations. 33 | func (c *GitRepository) SetDefaults() { 34 | c.BaseDirectory = "." 35 | c.MaxDepth = 15 36 | } 37 | -------------------------------------------------------------------------------- /backend/pkg/config/http_basic_auth.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package config 11 | 12 | import "flag" 13 | 14 | // HTTPBasicAuth defines the configuration for HTTP basic authentication. 15 | type HTTPBasicAuth struct { 16 | Username string `yaml:"username"` 17 | Password string `yaml:"password"` 18 | } 19 | 20 | // RegisterFlagsWithPrefix for all sensitive HTTPBasicAuth configs. 21 | func (c *HTTPBasicAuth) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { 22 | f.StringVar(&c.Password, prefix+"password", "", "HTTP basic auth password") 23 | } 24 | -------------------------------------------------------------------------------- /backend/pkg/config/proto_topic_mapping.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package config 11 | 12 | // ProtoTopicMapping is the configuration that defines what prototypes shall be used 13 | // for what topics (either key or value), so that we can decode these. This is only relevant 14 | // if the topics have been serialized without the schema registry being involved in the 15 | // serialization. 16 | type ProtoTopicMapping struct { 17 | // TopicName is the name of the topic to apply these proto files. This supports regex. 18 | TopicName RegexpOrLiteral `yaml:"topicName"` 19 | 20 | // KeyProtoType is the proto's fully qualified name that shall be used for a Kafka record's key 21 | KeyProtoType string `yaml:"keyProtoType"` 22 | 23 | // ValueProtoType is the proto's fully qualified name that shall be used for a Kafka record's value 24 | ValueProtoType string `yaml:"valueProtoType"` 25 | } 26 | -------------------------------------------------------------------------------- /backend/pkg/config/redpanda.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package config 11 | 12 | import ( 13 | "flag" 14 | "fmt" 15 | ) 16 | 17 | // Redpanda is the config object for all Redpanda specific options. 18 | type Redpanda struct { 19 | AdminAPI RedpandaAdminAPI `yaml:"adminApi"` 20 | } 21 | 22 | // RegisterFlags for all sensitive, Redpanda specific configurations. 23 | func (c *Redpanda) RegisterFlags(flags *flag.FlagSet) { 24 | c.AdminAPI.RegisterFlags(flags) 25 | } 26 | 27 | // SetDefaults for all Redpanda specific configurations. 28 | func (c *Redpanda) SetDefaults() { 29 | c.AdminAPI.SetDefaults() 30 | } 31 | 32 | // Validate all Redpanda specific configurations. 33 | func (c *Redpanda) Validate() error { 34 | err := c.AdminAPI.Validate() 35 | if err != nil { 36 | return fmt.Errorf("failed to validate admin api config: %w", err) 37 | } 38 | return nil 39 | } 40 | -------------------------------------------------------------------------------- /backend/pkg/connect/connect.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package connect provides the interface for interacting with Kafka Connect clusters. 11 | // This includes a Kafka connect HTTP client, as well as a Redpanda Console specific 12 | // abstraction - namely the Connect service. 13 | package connect 14 | -------------------------------------------------------------------------------- /backend/pkg/connector/interceptor/avro_codec_hook.go: -------------------------------------------------------------------------------- 1 | package interceptor 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/redpanda-data/console/backend/pkg/connector/model" 7 | ) 8 | 9 | // KafkaConnectToConsoleAvroCodecHook makes 'avro.codec' property visible if avro output format is selected 10 | // and hidden if other format type is selected 11 | func KafkaConnectToConsoleAvroCodecHook(response model.ValidationResponse, config map[string]any) model.ValidationResponse { 12 | indexOfAvroCodec := getIndexOfProperty(response, "avro.codec") 13 | if indexOfAvroCodec > -1 { 14 | isAvroOutputFormat := fmt.Sprintf("%v", config["format.output.type"]) == "avro" 15 | response.Configs[indexOfAvroCodec].Value.Visible = isAvroOutputFormat 16 | } 17 | return response 18 | } 19 | 20 | func getIndexOfProperty(response model.ValidationResponse, name string) int { 21 | for i := range response.Configs { 22 | if response.Configs[i].Value.Name == name { 23 | return i 24 | } 25 | } 26 | return -1 27 | } 28 | -------------------------------------------------------------------------------- /backend/pkg/connector/interceptor/bigquery_hook.go: -------------------------------------------------------------------------------- 1 | package interceptor 2 | 3 | // ConsoleToKafkaConnectBigQueryHook sets the keySource property to JSON explicitly, making JSON the only way of 4 | // providing the Google key in the wizard, and sets bigQueryPartitionDecorator explicitly to false, to allow using 5 | // various table partitioning types on the BigQuery side 6 | func ConsoleToKafkaConnectBigQueryHook(config map[string]any) map[string]any { 7 | _, exists := config["keySource"] 8 | if !exists { 9 | config["keySource"] = "JSON" 10 | } 11 | 12 | _, exists = config["bigQueryPartitionDecorator"] 13 | if !exists { 14 | config["bigQueryPartitionDecorator"] = "false" 15 | } 16 | 17 | return config 18 | } 19 | -------------------------------------------------------------------------------- /backend/pkg/connector/interceptor/snowflake_hook.go: -------------------------------------------------------------------------------- 1 | package interceptor 2 | 3 | import ( 4 | "github.com/redpanda-data/console/backend/pkg/connector/model" 5 | ) 6 | 7 | // KafkaConnectToConsoleSnowflakeHook adds Snowflake sink specific config options 8 | // missing in Validate Kafka Connect response 9 | func KafkaConnectToConsoleSnowflakeHook(response model.ValidationResponse, _ map[string]any) model.ValidationResponse { 10 | ingestion := getConfig(&response, "snowflake.ingestion.method") 11 | if ingestion == nil { 12 | return response 13 | } 14 | 15 | converter := getConfig(&response, "value.converter") 16 | if converter == nil { 17 | return response 18 | } 19 | 20 | return response 21 | } 22 | 23 | func getConfig(response *model.ValidationResponse, name string) *model.ConfigDefinition { 24 | for i := range response.Configs { 25 | if response.Configs[i].Value.Name == name { 26 | return &response.Configs[i] 27 | } 28 | } 29 | return nil 30 | } 31 | -------------------------------------------------------------------------------- /backend/pkg/connector/model/json.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package model 11 | 12 | import "encoding/json" 13 | 14 | // toJSONMapStringAny is a helper function that converts a struct instance to a map[string]any 15 | // by first marshalling that struct to JSON and afterwards unmarshalling it into the map. 16 | // Thus, it's important to note that this only considers JSON properties. 17 | func toJSONMapStringAny(t any) map[string]any { 18 | var response map[string]any 19 | data, _ := json.Marshal(t) 20 | _ = json.Unmarshal(data, &response) 21 | 22 | return response 23 | } 24 | -------------------------------------------------------------------------------- /backend/pkg/connector/model/model.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package model defines all connector specific types that are specific to Console. 11 | // For example the Console frontend expects a different validation result than the 12 | // one that is returned by Kafka connect. 13 | package model 14 | -------------------------------------------------------------------------------- /backend/pkg/console/common.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package console 11 | 12 | import "github.com/twmb/franz-go/pkg/kgo" 13 | 14 | // BrokerRequestError is a helper struct that is used to wrap an error with the respective 15 | // broker metadata that returned this error. 16 | type BrokerRequestError struct { 17 | BrokerMeta kgo.BrokerMetadata `json:"brokerMetadata"` 18 | Error error `json:"error"` 19 | } 20 | -------------------------------------------------------------------------------- /backend/pkg/console/console.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package console is in charge of constructing the responses for our REST API. 11 | // It's common that a single invocation requires multiple upstream requests against Kafka 12 | // so that we can merge the data and provide the most valuable information for the users. 13 | // While the kafka package is the abstraction for communicating with Kafka, this package 14 | // processes incoming requests from the REST API by: 15 | // 1. Sending upstream requests (concurrently) against Kafka 16 | // 2. Merge the responses as needed 17 | // 3. Convert the data so that it is handy to use in the frontend 18 | package console 19 | -------------------------------------------------------------------------------- /backend/pkg/console/consumer_group_delete.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package console 11 | 12 | import ( 13 | "context" 14 | "fmt" 15 | ) 16 | 17 | // DeleteConsumerGroup deletes a Kafka consumer group. 18 | func (s *Service) DeleteConsumerGroup(ctx context.Context, groupID string) error { 19 | _, adminCl, err := s.kafkaClientFactory.GetKafkaClient(ctx) 20 | if err != nil { 21 | return err 22 | } 23 | 24 | res, err := adminCl.DeleteGroup(ctx, groupID) 25 | if err != nil { 26 | return fmt.Errorf("failed to delete group: %w", err) 27 | } 28 | if res.Err != nil { 29 | return fmt.Errorf("failed to delete group: %w", err) 30 | } 31 | 32 | return nil 33 | } 34 | -------------------------------------------------------------------------------- /backend/pkg/console/describe_configs.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package console 11 | 12 | import ( 13 | "context" 14 | 15 | "github.com/twmb/franz-go/pkg/kmsg" 16 | ) 17 | 18 | // DescribeConfigs proxies the request to describe Topic or Broker configs to the Kafka client. 19 | func (s *Service) DescribeConfigs(ctx context.Context, req *kmsg.DescribeConfigsRequest) (*kmsg.DescribeConfigsResponse, error) { 20 | cl, _, err := s.kafkaClientFactory.GetKafkaClient(ctx) 21 | if err != nil { 22 | return nil, err 23 | } 24 | 25 | return req.RequestWith(ctx, cl) 26 | } 27 | -------------------------------------------------------------------------------- /backend/pkg/console/get_metadata.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package console 11 | 12 | import ( 13 | "context" 14 | 15 | "github.com/twmb/franz-go/pkg/kmsg" 16 | ) 17 | 18 | // GetMetadata proxies the get metadata Kafka request/response. 19 | func (s *Service) GetMetadata(ctx context.Context, kafkaReq *kmsg.MetadataRequest) (*kmsg.MetadataResponse, error) { 20 | cl, _, err := s.kafkaClientFactory.GetKafkaClient(ctx) 21 | if err != nil { 22 | return nil, err 23 | } 24 | 25 | return kafkaReq.RequestWith(ctx, cl) 26 | } 27 | -------------------------------------------------------------------------------- /backend/pkg/console/kafka_error.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package console 11 | 12 | import ( 13 | "fmt" 14 | 15 | "github.com/twmb/franz-go/pkg/kerr" 16 | ) 17 | 18 | // KafkaError is an error reported via the Kafka API. 19 | type KafkaError struct { 20 | Code int16 `json:"code"` 21 | Message string `json:"message"` 22 | Description string `json:"description"` 23 | } 24 | 25 | func (e *KafkaError) Error() string { 26 | return fmt.Sprintf("%s: %s", e.Message, e.Description) 27 | } 28 | 29 | func newKafkaError(errCode int16) *KafkaError { 30 | typedError := kerr.TypedErrorForCode(errCode) 31 | if typedError == nil { 32 | return nil 33 | } 34 | 35 | return &KafkaError{ 36 | Code: typedError.Code, 37 | Message: typedError.Message, 38 | Description: typedError.Description, 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto/buf.gen.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | plugins: 3 | - plugin: buf.build/protocolbuffers/go:v1.31.0 4 | out: backend/pkg/kafka/testdata/proto/gen 5 | opt: paths=source_relative 6 | -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto/buf.lock: -------------------------------------------------------------------------------- 1 | # Generated by buf. DO NOT EDIT. 2 | version: v1 3 | deps: 4 | - remote: buf.build 5 | owner: googleapis 6 | repository: googleapis 7 | commit: 28151c0d0a1641bf938a7672c500e01d 8 | digest: shake256:49215edf8ef57f7863004539deff8834cfb2195113f0b890dd1f67815d9353e28e668019165b9d872395871eeafcbab3ccfdb2b5f11734d3cca95be9e8d139de 9 | -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto/buf.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | deps: 3 | - buf.build/googleapis/googleapis 4 | breaking: 5 | use: 6 | - FILE 7 | lint: 8 | use: 9 | - DEFAULT -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto/index/v1/data.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package index.v1; 4 | 5 | option go_package = "github.com/redpanda-data/console/backend/pkg/kafka/testdata/proto/gen/index/v1"; 6 | 7 | message Widget { 8 | string id = 1; 9 | } 10 | 11 | message Item { 12 | enum ItemType { 13 | ITEM_TYPE_UNSPECIFIED = 0; 14 | ITEM_TYPE_PERSONAL = 1; 15 | ITEM_TYPE_BUSINESS = 2; 16 | } 17 | ItemType item_type = 8; 18 | 19 | string name = 1; 20 | } 21 | 22 | message Gadget { 23 | message Gizmo { 24 | int32 size = 1; 25 | Item item = 2; 26 | } 27 | 28 | string identity = 1; 29 | Gizmo gizmo = 2; 30 | repeated Widget widgets = 3; 31 | } 32 | -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto/shop/v1/order.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "github.com/redpanda-data/console/backend/pkg/kafka/testdata/proto/gen/shop/v1"; 8 | 9 | message Order { 10 | string id = 2; 11 | google.protobuf.Timestamp created_at = 3; 12 | } 13 | -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto/shop/v2/address.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v2; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "github.com/redpanda-data/console/backend/pkg/kafka/testdata/proto/gen/shop/v2"; 8 | 9 | message Address { 10 | int32 version = 1; 11 | string id = 2; 12 | message Customer { 13 | string customer_id = 1; 14 | string customer_type = 2; 15 | } 16 | Customer customer = 3; 17 | string type = 4; 18 | string first_name = 5; 19 | string last_name = 6; 20 | string state = 7; 21 | string house_number = 8; 22 | string city = 9; 23 | string zip = 10; 24 | float latitude = 11; 25 | float longitude = 12; 26 | string phone = 13; 27 | string additional_address_info = 14; 28 | google.protobuf.Timestamp created_at = 15; 29 | int32 revision = 16; 30 | } 31 | -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto/shop/v2/customer.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v2; 4 | 5 | option go_package = "github.com/redpanda-data/console/backend/pkg/kafka/testdata/proto/gen/shop/v2"; 6 | 7 | message Customer { 8 | int32 version = 1; 9 | string id = 2; 10 | string first_name = 3; 11 | string last_name = 4; 12 | string gender = 5; 13 | string company_name = 6; 14 | string email = 7; 15 | enum CustomerType { 16 | CUSTOMER_TYPE_UNSPECIFIED = 0; 17 | CUSTOMER_TYPE_PERSONAL = 1; 18 | CUSTOMER_TYPE_BUSINESS = 2; 19 | } 20 | CustomerType customer_type = 8; 21 | int32 revision = 9; 22 | } 23 | -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto/shop/v2/order.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v2; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | import "shop/v2/address.proto"; 7 | import "shop/v2/customer.proto"; 8 | 9 | option go_package = "github.com/redpanda-data/console/backend/pkg/kafka/testdata/proto/gen/shop/v2"; 10 | 11 | message Order { 12 | int32 version = 1; 13 | string id = 2; 14 | google.protobuf.Timestamp created_at = 3; 15 | google.protobuf.Timestamp last_updated_at = 4; 16 | google.protobuf.Timestamp delivered_at = 5; 17 | google.protobuf.Timestamp completed_at = 6; 18 | 19 | Customer customer = 7; 20 | int32 order_value = 8; 21 | 22 | message LineItem { 23 | string article_id = 1; 24 | string name = 2; 25 | int32 quantity = 3; 26 | string quantity_unit = 4; 27 | int32 unit_price = 5; 28 | int32 total_price = 6; 29 | } 30 | repeated LineItem line_items = 9; 31 | 32 | message Payment { 33 | string payment_id = 1; 34 | string method = 2; 35 | } 36 | 37 | Payment payment = 10; 38 | Address delivery_address = 11; 39 | int32 revision = 12; 40 | } 41 | -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto_update/buf.gen.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | plugins: 3 | - plugin: buf.build/protocolbuffers/go:v1.31.0 4 | out: backend/pkg/kafka/testdata/proto_update/gen 5 | opt: paths=source_relative 6 | -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto_update/buf.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | breaking: 3 | use: 4 | - FILE 5 | lint: 6 | use: 7 | - DEFAULT -------------------------------------------------------------------------------- /backend/pkg/console/testdata/proto_update/shop/v1/order.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "github.com/redpanda-data/console/backend/pkg/kafka/testdata/proto_update/gen/shop/v1_2;v1_2"; 8 | 9 | message Order { 10 | int32 version = 1; 11 | string id = 2; 12 | google.protobuf.Timestamp created_at = 3; 13 | int32 order_value = 4; 14 | } 15 | -------------------------------------------------------------------------------- /backend/pkg/console/topic_documentation.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package console 11 | 12 | // TopicDocumentation holds the Markdown with potential metadata (e. g. editor, last edited at etc). 13 | type TopicDocumentation struct { 14 | IsEnabled bool `json:"isEnabled"` 15 | Markdown []byte `json:"markdown"` 16 | } 17 | 18 | // GetTopicDocumentation returns the documentation for the given topic if available. 19 | func (s *Service) GetTopicDocumentation(topicName string) *TopicDocumentation { 20 | if s.gitSvc == nil { 21 | return &TopicDocumentation{ 22 | IsEnabled: false, 23 | Markdown: nil, 24 | } 25 | } 26 | 27 | markdown := s.gitSvc.GetFileByFilename(topicName) 28 | 29 | return &TopicDocumentation{ 30 | IsEnabled: true, 31 | Markdown: markdown.Payload, 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /backend/pkg/console/util.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package console 11 | 12 | const ( 13 | // TimestampLatest is the enum that represents a request for the offsets with the most recent timestamp. 14 | TimestampLatest = -1 15 | // TimestampEarliest is the enum that represents a request for the offsets with the earliest timestamp. 16 | TimestampEarliest = -2 17 | ) 18 | 19 | func derefString(s *string) string { 20 | if s != nil { 21 | return *s 22 | } 23 | 24 | return "" 25 | } 26 | 27 | func errorToString(err error) string { 28 | if err == nil { 29 | return "" 30 | } 31 | return err.Error() 32 | } 33 | -------------------------------------------------------------------------------- /backend/pkg/embed/embed.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package embed provides all static resources that shall be served from the compiled 11 | // binary. This is mainly used to provide the compiled React frontend, so that we 12 | // can have a single binary that serves Redpanda Console, rather than a Go backend 13 | // and some frontend assets that must be loaded by the Go binary. 14 | package embed 15 | -------------------------------------------------------------------------------- /backend/pkg/embed/frontend.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package embed 11 | 12 | import "embed" 13 | 14 | // FrontendFiles is a directory with all compiled Frontend assets so that they can be served 15 | // by the Go binary via HTTP. 16 | // 17 | //go:embed all:frontend 18 | var FrontendFiles embed.FS 19 | -------------------------------------------------------------------------------- /backend/pkg/embed/frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Only frontend builds are supposed to go into this directory so that they can be 2 | # embedded into the Go binary. This folder must be existent in order to compile 3 | # the app at all, but it can be empty if you want to serve the frontend from 4 | # the React server during development. 5 | * -------------------------------------------------------------------------------- /backend/pkg/factory/redpanda/disabled.go: -------------------------------------------------------------------------------- 1 | // Copyright 2025 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package redpanda 11 | 12 | import ( 13 | "context" 14 | 15 | apierrors "github.com/redpanda-data/console/backend/pkg/api/connect/errors" 16 | ) 17 | 18 | // Ensure CachedClientProvider implements ClientFactory interface 19 | var _ ClientFactory = (*DisabledClientProvider)(nil) 20 | 21 | // DisabledClientProvider is the provider ClientFactory implementation if the admin 22 | // api is not configured. 23 | type DisabledClientProvider struct{} 24 | 25 | // GetRedpandaAPIClient returns a not configured error when invoked. 26 | func (*DisabledClientProvider) GetRedpandaAPIClient(context.Context, ...ClientOption) (AdminAPIClient, error) { 27 | return nil, apierrors.NewRedpandaAdminAPINotConfiguredError() 28 | } 29 | -------------------------------------------------------------------------------- /backend/pkg/factory/schema/disabled.go: -------------------------------------------------------------------------------- 1 | // Copyright 2025 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package schema 11 | 12 | import ( 13 | "context" 14 | 15 | "github.com/twmb/franz-go/pkg/sr" 16 | 17 | apierrors "github.com/redpanda-data/console/backend/pkg/api/connect/errors" 18 | ) 19 | 20 | // Ensure CachedClientProvider implements ClientFactory interface 21 | var _ ClientFactory = (*DisabledClientProvider)(nil) 22 | 23 | // DisabledClientProvider is the provider ClientFactory implementation if the schema registry 24 | // api is not configured. 25 | type DisabledClientProvider struct{} 26 | 27 | // GetSchemaRegistryClient returns a standard error for an unconfigured schema registry when invoked. 28 | func (*DisabledClientProvider) GetSchemaRegistryClient(context.Context) (*sr.Client, error) { 29 | return nil, apierrors.NewSchemaRegistryNotConfiguredError() 30 | } 31 | -------------------------------------------------------------------------------- /backend/pkg/filesystem/file.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package filesystem 11 | 12 | // File is a file with its metadata and payload. 13 | type File struct { 14 | Path string 15 | Filename string 16 | 17 | // TrimmedFilename is the filename without the recognized file extension 18 | TrimmedFilename string 19 | 20 | Payload []byte 21 | } 22 | -------------------------------------------------------------------------------- /backend/pkg/filesystem/filesystem.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package filesystem provides the interface to load files from the filesystem into 11 | // memory as well as serving these files from memory for faster read-access. 12 | package filesystem 13 | -------------------------------------------------------------------------------- /backend/pkg/filesystem/util_unix.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | //go:build !windows 11 | 12 | package filesystem 13 | 14 | import ( 15 | "path/filepath" 16 | "strings" 17 | ) 18 | 19 | // isHidden returns true if the path refers to a file that is hidden, i.e. 20 | // - either the file belongs to a hidden folder 21 | // - or the file itself is a hidden file 22 | func isHidden(path string) bool { 23 | return strings.HasPrefix(filepath.Base(path), ".") 24 | } 25 | -------------------------------------------------------------------------------- /backend/pkg/git/git.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package git provides functions to clone and pull a Git repository and keep 11 | // the contents in-memory for faster data access. 12 | package git 13 | -------------------------------------------------------------------------------- /backend/pkg/interpreter/interpreter.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package interpreter provides additional JavaScript functions that shall be made 11 | // available to the JavaScript interpreter that we are using for message search filters. 12 | // These additional JavaScript functions are available to users that write search 13 | // filters. 14 | package interpreter 15 | -------------------------------------------------------------------------------- /backend/pkg/license/license_source.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package license 11 | 12 | // Source describes whether this license information belongs to Redpanda Console 13 | // or the Redpanda cluster we are connected to. Each of these components load their own 14 | // license so that they are independent in terms of availability. 15 | type Source string 16 | 17 | const ( 18 | // SourceConsole represents a license set in Redpanda Console. 19 | SourceConsole Source = "console" 20 | 21 | // SourceRedpanda represents a license set in a Redpanda cluster. 22 | SourceRedpanda Source = "cluster" 23 | ) 24 | -------------------------------------------------------------------------------- /backend/pkg/license/license_type.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package license 11 | 12 | // Type is a string enum that determines the type of the used license. 13 | type Type string 14 | 15 | const ( 16 | // TypeFreeTrial represents a free trial license. 17 | TypeFreeTrial Type = "free_trial" 18 | 19 | // TypeEnterprise represents the Redpanda Enterprise license. 20 | TypeEnterprise Type = "enterprise" 21 | 22 | // TypeOpenSource represents the default - the open source license. 23 | TypeOpenSource Type = "open_source" 24 | ) 25 | -------------------------------------------------------------------------------- /backend/pkg/proto/embed/protobuf/confluent/meta.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package confluent; 3 | 4 | import "google/protobuf/descriptor.proto"; 5 | 6 | option go_package="../confluent"; 7 | 8 | message Meta { 9 | string doc = 1; 10 | map params = 2; 11 | } 12 | 13 | extend google.protobuf.FileOptions { 14 | Meta file_meta = 1088; 15 | } 16 | extend google.protobuf.MessageOptions { 17 | Meta message_meta = 1088; 18 | } 19 | extend google.protobuf.FieldOptions { 20 | Meta field_meta = 1088; 21 | } 22 | extend google.protobuf.EnumOptions { 23 | Meta enum_meta = 1088; 24 | } 25 | extend google.protobuf.EnumValueOptions { 26 | Meta enum_value_meta = 1088; 27 | } 28 | -------------------------------------------------------------------------------- /backend/pkg/proto/embed/protobuf/confluent/types/decimal.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package confluent.type; 4 | 5 | option go_package="../types"; 6 | 7 | message Decimal { 8 | 9 | // The two's-complement representation of the unscaled integer value in big-endian byte order 10 | bytes value = 1; 11 | 12 | // The precision 13 | uint32 precision = 2; 14 | 15 | // The scale 16 | int32 scale = 3; 17 | } -------------------------------------------------------------------------------- /backend/pkg/proto/embed/protobuf/google/type/README.md: -------------------------------------------------------------------------------- 1 | # Google Common Types 2 | 3 | This package contains definitions of common types for Google APIs. 4 | All types defined in this package are suitable for different APIs to 5 | exchange data, and will never break binary compatibility. They should 6 | have design quality comparable to major programming languages like 7 | Java and C#. 8 | 9 | NOTE: Some common types are defined in the package `google.protobuf` 10 | as they are directly supported by Protocol Buffers compiler and 11 | runtime. Those types are called Well-Known Types. 12 | 13 | ## Java Utilities 14 | 15 | A set of Java utilities for the Common Types are provided in the 16 | `//java/com/google/type/util/` package. -------------------------------------------------------------------------------- /backend/pkg/proto/proto.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package proto provides the deserialization logic for Protobuf encoded messages. 11 | package proto 12 | -------------------------------------------------------------------------------- /backend/pkg/protocmp/compare.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package protocmp provides test utilities for comparing protobuf types. 11 | package protocmp 12 | 13 | import ( 14 | "testing" 15 | 16 | "github.com/google/go-cmp/cmp" 17 | "google.golang.org/protobuf/proto" 18 | "google.golang.org/protobuf/testing/protocmp" 19 | ) 20 | 21 | // AssertProtoEqual compares two protos. Comparison is based on the content of 22 | // the fields. Internal/unexported fields specific to the go implementation of 23 | // protobuf are ignored. 24 | func AssertProtoEqual(t *testing.T, want, got proto.Message) { 25 | t.Helper() 26 | if proto.Equal(want, got) { 27 | return 28 | } 29 | 30 | if diff := cmp.Diff(want, got, protocmp.Transform()); diff != "" { 31 | t.Fatalf("not equal (-want +got):\n%s", diff) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /backend/pkg/random/int.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package random 11 | 12 | import ( 13 | "crypto/rand" 14 | "math/big" 15 | ) 16 | 17 | // IntInRange returns a random number in the range between lo and hi. 18 | func IntInRange(low, hi int) int { 19 | // Generate 20 random numbers with exclusive max of 100. 20 | // ... So max value returned is 99. 21 | // All values returned are 0 or greater as well. 22 | result, _ := rand.Int(rand.Reader, big.NewInt(int64(hi-low))) 23 | 24 | return int(result.Int64()) 25 | } 26 | -------------------------------------------------------------------------------- /backend/pkg/rpconnect/schema.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package rpconnect provides functionality used in endpoints for Redpanda Connect. 11 | package rpconnect 12 | 13 | import ( 14 | _ "embed" 15 | ) 16 | 17 | // This schema is generated with the command: 18 | // benthos list --format json-full-scrubbed > ./data/schema.json 19 | // 20 | //go:embed data/schema.json 21 | var schemaBytes []byte 22 | 23 | // GetConfigSchema returns the static config schema for Redpanda Connect. 24 | func GetConfigSchema() []byte { 25 | return schemaBytes 26 | } 27 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/cbor/example.cbor.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/backend/pkg/serde/testdata/cbor/example.cbor.bin -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/msgpack/example.msgpack.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/backend/pkg/serde/testdata/msgpack/example.msgpack.bin -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto/buf.gen.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | plugins: 3 | - plugin: buf.build/protocolbuffers/go:v1.31.0 4 | out: backend/pkg/serde/testdata/proto/gen 5 | opt: paths=source_relative 6 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto/buf.lock: -------------------------------------------------------------------------------- 1 | # Generated by buf. DO NOT EDIT. 2 | version: v1 3 | deps: 4 | - remote: buf.build 5 | owner: googleapis 6 | repository: googleapis 7 | commit: 28151c0d0a1641bf938a7672c500e01d 8 | digest: shake256:49215edf8ef57f7863004539deff8834cfb2195113f0b890dd1f67815d9353e28e668019165b9d872395871eeafcbab3ccfdb2b5f11734d3cca95be9e8d139de 9 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto/buf.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | deps: 3 | - buf.build/googleapis/googleapis 4 | breaking: 5 | use: 6 | - FILE 7 | lint: 8 | use: 9 | - DEFAULT -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto/index/v1/data.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package index.v1; 4 | 5 | option go_package = "github.com/redpanda-data/console/backend/pkg/serde/testdata/proto/gen/index/v1"; 6 | 7 | message Widget { 8 | string id = 1; 9 | } 10 | 11 | message Item { 12 | enum ItemType { 13 | ITEM_TYPE_UNSPECIFIED = 0; 14 | ITEM_TYPE_PERSONAL = 1; 15 | ITEM_TYPE_BUSINESS = 2; 16 | } 17 | ItemType item_type = 8; 18 | 19 | string name = 1; 20 | } 21 | 22 | message Gadget { 23 | message Gizmo { 24 | int32 size = 1; 25 | Item item = 2; 26 | } 27 | 28 | string identity = 1; 29 | Gizmo gizmo = 2; 30 | repeated Widget widgets = 3; 31 | } 32 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto/shop/v1/order.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "github.com/redpanda-data/console/backend/pkg/serde/testdata/proto/gen/shop/v1"; 8 | 9 | message Order { 10 | string id = 2; 11 | google.protobuf.Timestamp created_at = 3; 12 | } 13 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto/shop/v2/address.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v2; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "github.com/redpanda-data/console/backend/pkg/serde/testdata/proto/gen/shop/v2"; 8 | 9 | message Address { 10 | int32 version = 1; 11 | string id = 2; 12 | message Customer { 13 | string customer_id = 1; 14 | string customer_type = 2; 15 | } 16 | Customer customer = 3; 17 | string type = 4; 18 | string first_name = 5; 19 | string last_name = 6; 20 | string state = 7; 21 | string house_number = 8; 22 | string city = 9; 23 | string zip = 10; 24 | float latitude = 11; 25 | float longitude = 12; 26 | string phone = 13; 27 | string additional_address_info = 14; 28 | google.protobuf.Timestamp created_at = 15; 29 | int32 revision = 16; 30 | } 31 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto/shop/v2/customer.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v2; 4 | 5 | option go_package = "github.com/redpanda-data/console/backend/pkg/serde/testdata/proto/gen/shop/v2"; 6 | 7 | message Customer { 8 | int32 version = 1; 9 | string id = 2; 10 | string first_name = 3; 11 | string last_name = 4; 12 | string gender = 5; 13 | string company_name = 6; 14 | string email = 7; 15 | enum CustomerType { 16 | CUSTOMER_TYPE_UNSPECIFIED = 0; 17 | CUSTOMER_TYPE_PERSONAL = 1; 18 | CUSTOMER_TYPE_BUSINESS = 2; 19 | } 20 | CustomerType customer_type = 8; 21 | int32 revision = 9; 22 | } 23 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto/shop/v2/order.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v2; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | import "shop/v2/address.proto"; 7 | import "shop/v2/customer.proto"; 8 | 9 | option go_package = "github.com/redpanda-data/console/backend/pkg/serde/testdata/proto/gen/shop/v2"; 10 | 11 | message Order { 12 | int32 version = 1; 13 | string id = 2; 14 | google.protobuf.Timestamp created_at = 3; 15 | google.protobuf.Timestamp last_updated_at = 4; 16 | google.protobuf.Timestamp delivered_at = 5; 17 | google.protobuf.Timestamp completed_at = 6; 18 | 19 | Customer customer = 7; 20 | int32 order_value = 8; 21 | 22 | message LineItem { 23 | string article_id = 1; 24 | string name = 2; 25 | int32 quantity = 3; 26 | string quantity_unit = 4; 27 | int32 unit_price = 5; 28 | int32 total_price = 6; 29 | } 30 | repeated LineItem line_items = 9; 31 | 32 | message Payment { 33 | string payment_id = 1; 34 | string method = 2; 35 | } 36 | 37 | Payment payment = 10; 38 | Address delivery_address = 11; 39 | int32 revision = 12; 40 | } 41 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto_update/buf.gen.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | plugins: 3 | - plugin: buf.build/protocolbuffers/go:v1.31.0 4 | out: backend/pkg/serde/testdata/proto_update/gen 5 | opt: paths=source_relative 6 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto_update/buf.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | breaking: 3 | use: 4 | - FILE 5 | lint: 6 | use: 7 | - DEFAULT -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/proto_update/shop/v1/order.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package shop.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "github.com/redpanda-data/console/backend/pkg/console/testdata/proto_update/gen/shop/v1_2;v1_2"; 8 | 9 | message Order { 10 | int32 version = 1; 11 | string id = 2; 12 | google.protobuf.Timestamp created_at = 3; 13 | int32 order_value = 4; 14 | } 15 | -------------------------------------------------------------------------------- /backend/pkg/serde/testdata/test2.smile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/backend/pkg/serde/testdata/test2.smile -------------------------------------------------------------------------------- /backend/pkg/testutil/logconsumer.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package testutil 11 | 12 | import ( 13 | "fmt" 14 | 15 | "github.com/testcontainers/testcontainers-go" 16 | ) 17 | 18 | // TestContainersLogger is a logger that implements the testcontainers 19 | // logger interface. 20 | type TestContainersLogger struct { 21 | // LogPrefix is a string that is prefixed for every individual log line. 22 | LogPrefix string 23 | } 24 | 25 | // Accept prints the log to stdout 26 | func (lc TestContainersLogger) Accept(l testcontainers.Log) { 27 | fmt.Print(lc.LogPrefix + string(l.Content)) 28 | } 29 | -------------------------------------------------------------------------------- /backend/pkg/testutil/order.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | package testutil 11 | 12 | // Order represents an order record for testing purpoces 13 | type Order struct { 14 | ID string 15 | } 16 | -------------------------------------------------------------------------------- /backend/pkg/testutil/testdata/proto/buf.gen.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | plugins: 3 | - plugin: buf.build/protocolbuffers/go:v1.31.0 4 | out: backend/pkg/testutil/testdata/proto/gen 5 | opt: paths=source_relative 6 | -------------------------------------------------------------------------------- /backend/pkg/testutil/testdata/proto/buf.yaml: -------------------------------------------------------------------------------- 1 | version: v1 2 | breaking: 3 | use: 4 | - FILE 5 | lint: 6 | use: 7 | - DEFAULT -------------------------------------------------------------------------------- /backend/pkg/testutil/testdata/proto/things/v1/item.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package testutil.things.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "github.com/redpanda-data/console/backend/pkg/testutil/testdata/proto/gen/things/v1"; 8 | 9 | message Item { 10 | string id = 1; 11 | string name = 2; 12 | int32 version = 3; 13 | google.protobuf.Timestamp created_at = 4; 14 | } 15 | -------------------------------------------------------------------------------- /backend/pkg/testutil/testdata/proto/things/v1/widget.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package testutil.things.v1; 4 | 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "github.com/redpanda-data/console/backend/pkg/testutil/testdata/proto/gen/things/v1"; 8 | 9 | message Widget { 10 | string id = 1; 11 | google.protobuf.Timestamp created_at = 2; 12 | } 13 | -------------------------------------------------------------------------------- /backend/pkg/tools/tools.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package tools contains imports required for additional tooling 11 | package tools 12 | 13 | import _ "go.uber.org/mock/mockgen/model" // blank import to add mock mockgen module to go mod 14 | -------------------------------------------------------------------------------- /backend/pkg/validator/validator.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file licenses/BSL.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package validator provides functions which help validating user input. 11 | package validator 12 | -------------------------------------------------------------------------------- /backend/pkg/version/info.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Redpanda Data, Inc. 2 | // 3 | // Use of this software is governed by the Business Source License 4 | // included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | // 6 | // As of the Change Date specified in that file, in accordance with 7 | // the Business Source License, use of this software will be governed 8 | // by the Apache License, Version 2.0 9 | 10 | // Package version provides the binary's version information that is injected via build flags. 11 | package version 12 | 13 | var ( 14 | // ------------------------------------------------------------------------ 15 | // Below parameters are set at build time using ldflags. 16 | // ------------------------------------------------------------------------ 17 | 18 | // Version is Console's SemVer version (for example: v1.0.0). If this binary 19 | // does not have a SemVer release it will show the latest git sha. Examples: 20 | // - v1.0.0 21 | // - master-f97e56e 22 | // - development 23 | Version = "development" 24 | // BuiltAt is a timestamp in UNIX epoch format that indicates when the 25 | // binary was built. 26 | BuiltAt = "" 27 | ) 28 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", 3 | "vcs": { 4 | "enabled": false, 5 | "clientKind": "git", 6 | "useIgnoreFile": false 7 | }, 8 | "files": { 9 | "ignoreUnknown": false, 10 | "ignore": ["protogen"] 11 | }, 12 | "formatter": { 13 | "enabled": true, 14 | "indentStyle": "space", 15 | "lineWidth": 120 16 | }, 17 | "organizeImports": { 18 | "enabled": true 19 | }, 20 | "linter": { 21 | "enabled": true, 22 | "rules": { 23 | "recommended": true, 24 | "suspicious": { 25 | "noExplicitAny": "off", 26 | "noArrayIndexKey": "off", 27 | "noAssignInExpressions": "off" 28 | }, 29 | "a11y": { 30 | "useKeyWithClickEvents": "off", 31 | "useSemanticElements": "off" 32 | }, 33 | "style": { 34 | "useNodejsImportProtocol": "off", 35 | "noParameterAssign": "off" 36 | }, 37 | "complexity": { 38 | "noBannedTypes": "off" 39 | } 40 | } 41 | }, 42 | "javascript": { 43 | "formatter": { 44 | "quoteStyle": "single" 45 | }, 46 | "jsxRuntime": "reactClassic" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /buf.gen.openapi.yaml: -------------------------------------------------------------------------------- 1 | version: v2 2 | managed: 3 | enabled: true 4 | disable: 5 | - file_option: go_package 6 | module: buf.build/googleapis/googleapis 7 | - file_option: go_package 8 | module: buf.build/bufbuild/protovalidate 9 | override: 10 | - file_option: go_package_prefix 11 | value: github.com/redpanda-data/console/backend/pkg/protogen 12 | plugins: 13 | - remote: buf.build/grpc-ecosystem/openapiv2:v2.19.1 14 | out: proto/gen/openapi 15 | opt: 16 | - logtostderr=true 17 | - allow_merge=true 18 | - output_format=json 19 | - disable_service_tags=false 20 | - omit_enum_default_value=true 21 | - json_names_for_fields=false 22 | - use_go_templates=true 23 | - proto3_optional_nullable=true 24 | - openapi_naming_strategy=simple 25 | - disable_default_responses=true 26 | -------------------------------------------------------------------------------- /buf.lock: -------------------------------------------------------------------------------- 1 | # Generated by buf. DO NOT EDIT. 2 | version: v2 3 | deps: 4 | - name: buf.build/bufbuild/protovalidate 5 | commit: 8976f5be98c146529b1cc15cd2012b60 6 | digest: b5:5d513af91a439d9e78cacac0c9455c7cb885a8737d30405d0b91974fe05276d19c07a876a51a107213a3d01b83ecc912996cdad4cddf7231f91379079cf7488d 7 | - name: buf.build/googleapis/googleapis 8 | commit: 61b203b9a9164be9a834f58c37be6f62 9 | digest: b5:7811a98b35bd2e4ae5c3ac73c8b3d9ae429f3a790da15de188dc98fc2b77d6bb10e45711f14903af9553fa9821dff256054f2e4b7795789265bc476bec2f088c 10 | - name: buf.build/grpc-ecosystem/grpc-gateway 11 | commit: a48fcebcf8f140dd9d09359b9bb185a4 12 | digest: b5:330af8a71b579ab96c4f3ee26929d1a68a5a9e986c7cfe0a898591fc514216bb6e723dc04c74d90fdee3f3f14f9100a54b4f079eb273e6e7213f0d5baca36ff8 13 | - name: buf.build/redpandadata/common 14 | commit: 40b63a8114364b4f85781339bc5d720f 15 | digest: b5:8621362abd215ab647692a67d2dc77b09d0911ee333b899790ad263c2f06e5e0ca62ea55051a082433862a40e5c01db262b18472c2cf8ef59323c48185e5140d 16 | -------------------------------------------------------------------------------- /buf.yaml: -------------------------------------------------------------------------------- 1 | version: v2 2 | 3 | modules: 4 | - path: proto 5 | name: buf.build/redpandadata/dataplane 6 | 7 | deps: 8 | - buf.build/bufbuild/protovalidate 9 | - buf.build/googleapis/googleapis 10 | - buf.build/grpc-ecosystem/grpc-gateway:v2.24.0 11 | - buf.build/redpandadata/common 12 | lint: 13 | use: 14 | - STANDARD 15 | except: 16 | - FIELD_NOT_REQUIRED 17 | - PACKAGE_NO_IMPORT_CYCLE 18 | rpc_allow_google_protobuf_empty_responses: true 19 | breaking: 20 | use: 21 | - FILE 22 | - WIRE 23 | - WIRE_JSON 24 | except: 25 | - EXTENSION_NO_DELETE 26 | - FIELD_SAME_DEFAULT 27 | ignore: 28 | - redpanda/api/console/v1alpha1 29 | - redpanda/api/dataplane/v1alpha1 30 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Documentation 3 | path: /docs 4 | --- 5 | 6 | # Documentation 7 | 8 | In this folder you'll find documentation about how to configure Redpanda Console. 9 | If there are still open questions after reading this documentation don't hesitate to submit an issue. 10 | 11 | - Getting started 12 | - [Installation](./installation.md) 13 | - [Helm Chart](https://github.com/redpanda-data/helm-charts) 14 | - [Terraform Module](https://github.com/cloudhut/terraform-modules) 15 | - Features 16 | - [Hosting](./features/hosting.md) 17 | - [Kafka Connect](./features/kafka-connect.md) 18 | - [Topic Documentation](./features/topic-documentation.md) 19 | - [Protobuf](./features/protobuf.md) 20 | - Reference Config 21 | - [console.yaml](./config/console.yaml) 22 | -------------------------------------------------------------------------------- /docs/assets/preview.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/docs/assets/preview.mp4 -------------------------------------------------------------------------------- /docs/assets/social-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/docs/assets/social-preview.png -------------------------------------------------------------------------------- /docs/assets/topic-documentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/docs/assets/topic-documentation.png -------------------------------------------------------------------------------- /docs/menu.md: -------------------------------------------------------------------------------- 1 | - **Getting Started** 2 | - [Overview](./README.md) 3 | - [Installation](./installation.md) 4 | - **Features** 5 | - [Hosting](./features/hosting.md) 6 | - [Kafka Connect](./features/kafka-connect.md) 7 | - [Topic Documentation](./features/topic-documentation.md) 8 | - [Protobuf](./features/protobuf.md) 9 | -------------------------------------------------------------------------------- /frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | 4 | [*] 5 | end_of_line = lf 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | indent_style = space 10 | indent_size = 2 11 | max_line_length = off 12 | 13 | [*.{ts,tsx}] 14 | indent_style = space 15 | indent_size = 2 16 | 17 | [*.{diff,md}] 18 | trim_trailing_whitespace = false 19 | -------------------------------------------------------------------------------- /frontend/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true -------------------------------------------------------------------------------- /frontend/.nvmrc: -------------------------------------------------------------------------------- 1 | v22 2 | -------------------------------------------------------------------------------- /frontend/.sample.env: -------------------------------------------------------------------------------- 1 | # dont open browser on bun run start 2 | BROWSER=none 3 | 4 | # react dev-server port 5 | PORT=3000 6 | # needed for webpack issue: https://github.com/webpack/webpack/issues/14532 7 | NODE_OPTIONS=--openssl-legacy-provider 8 | 9 | # forces ui to assume its in dev mode 10 | # - websocket will always connect to "localhost:9090" 11 | # - enables some additional debug logging 12 | REACT_APP_DEV_HINT=true # for debugging, since we can't override NODE_ENV 13 | 14 | # Don't fail compilation in dev because of eslint 15 | DISABLE_ESLINT_PLUGIN=true 16 | 17 | ESLINT_NO_DEV_ERRORS=true 18 | 19 | # fake build-info 20 | # REACT_APP_CONSOLE_GIT_SHA=abc123 21 | # REACT_APP_CONSOLE_GIT_REF=dev-local 22 | # REACT_APP_CONSOLE_GIT_REF=dev-local # 'master' or 'v1.2.3' 23 | # REACT_APP_BUILD_TIMESTAMP=32503680000 24 | # REACT_APP_BUILT_FROM_PUSH=false # was built by 'image-on-push'? 25 | 26 | # Enable all features while developing locally 27 | REACT_APP_ENABLED_FEATURES=SINGLE_SIGN_ON,REASSIGN_PARTITIONS 28 | REACT_APP_ENABLED_FEATURES=SINGLE_SIGN_ON,REASSIGN_PARTITIONS # for debugging, used to set/override enabled features while developing 29 | -------------------------------------------------------------------------------- /frontend/bunfig.toml: -------------------------------------------------------------------------------- 1 | [install] 2 | save = true 3 | saveTextLockfile = true 4 | print = "yarn" 5 | -------------------------------------------------------------------------------- /frontend/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "", 8 | "css": "src/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "components", 15 | "utils": "lib/utils", 16 | "ui": "components/ui", 17 | "lib": "lib", 18 | "hooks": "hooks" 19 | }, 20 | "iconLibrary": "lucide" 21 | } 22 | -------------------------------------------------------------------------------- /frontend/module-federation.js: -------------------------------------------------------------------------------- 1 | const deps = require('./package.json').dependencies; 2 | module.exports = { 3 | filename: 'embedded.js', 4 | name: 'rp_console', 5 | 6 | exposes: { 7 | './EmbeddedApp': './src/EmbeddedApp.tsx', 8 | './injectApp': './src/injectApp.tsx', 9 | './config': './src/config.ts', 10 | }, 11 | 12 | shared: { 13 | react: { 14 | singleton: true, 15 | requiredVersion: deps.react, 16 | }, 17 | 'react-dom': { 18 | singleton: true, 19 | requiredVersion: deps['react-dom'], 20 | }, 21 | '@redpanda-data/ui': { 22 | import: '@redpanda-data/ui', 23 | }, 24 | }, 25 | }; 26 | -------------------------------------------------------------------------------- /frontend/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | '@tailwindcss/postcss': {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /frontend/public/favicon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/public/favicon-32.png -------------------------------------------------------------------------------- /frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: / -------------------------------------------------------------------------------- /frontend/src/assets/agent-illustration-http.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/agent-illustration-http.png -------------------------------------------------------------------------------- /frontend/src/assets/circle-stop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/assets/connectors/amazon-s3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/amazon-s3.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/cassandra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/cassandra.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/confluent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/confluent.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/db2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/db2.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/debezium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/debezium.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/google-cloud-storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/google-cloud-storage.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/google-pub-sub.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/connectors/hdfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/hdfs.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/ibm-mq.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/connectors/iceberg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/iceberg.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/jdbc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/jdbc.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/mongodb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/mongodb.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/mssql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/mssql.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/postgres.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/postgres.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/redpanda.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/src/assets/connectors/salesforce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/salesforce.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/servicenow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/servicenow.png -------------------------------------------------------------------------------- /frontend/src/assets/connectors/snowflake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/connectors/snowflake.png -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-300.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-300.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-500.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-500.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-600.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-600.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-700.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-700.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-800.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-800.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-regular.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/inter/inter-v12-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/inter/inter-v12-latin-regular.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/kumbh-sans.css: -------------------------------------------------------------------------------- 1 | /* kumbh-sans-regular - latin */ 2 | @font-face { 3 | font-family: "Kumbh Sans"; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url("./kumbh-sans/kumbh-sans-v11-latin-regular.eot"); 7 | /* IE9 Compat Modes */ 8 | src: local(""), url("./kumbh-sans/kumbh-sans-v11-latin-regular.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ 9 | url("./kumbh-sans/kumbh-sans-v11-latin-regular.woff2") format("woff2"), /* Super Modern Browsers */ 10 | url("./kumbh-sans/kumbh-sans-v11-latin-regular.woff") format("woff"), /* Modern Browsers */ 11 | url("./kumbh-sans/kumbh-sans-v11-latin-regular.ttf") format("truetype"), /* Safari, Android, iOS */ 12 | url("./kumbh-sans/kumbh-sans-v11-latin-regular.svg#KumbhSans") format("svg"); 13 | /* Legacy iOS */ 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/assets/fonts/kumbh-sans/kumbh-sans-v11-latin-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/kumbh-sans/kumbh-sans-v11-latin-regular.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/kumbh-sans/kumbh-sans-v11-latin-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/kumbh-sans/kumbh-sans-v11-latin-regular.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/kumbh-sans/kumbh-sans-v11-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/kumbh-sans/kumbh-sans-v11-latin-regular.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/kumbh-sans/kumbh-sans-v11-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/kumbh-sans/kumbh-sans-v11-latin-regular.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-600.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-600.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-600.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-600.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-600.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-600.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-700.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-700.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-700.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-700.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-regular.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-regular.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-regular.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/open-sans/open-sans-v20-latin-ext_latin-regular.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-300.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-300.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-300.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-300.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-300.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-300.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-500.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-500.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-500.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-500.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-500.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-500.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-600.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-600.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-600.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-600.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-600.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-600.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-700.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-700.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-700.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-700.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-regular.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-regular.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-regular.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/poppins/poppins-v15-latin-ext_latin-regular.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-500.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-500.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-500.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-500.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-500.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-500.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-600.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-600.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-600.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-600.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-600.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-600.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-700.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-700.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-700.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-700.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-regular.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-regular.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-regular.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/fonts/quicksand/quicksand-v24-latin-ext_latin-regular.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/globExample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/globExample.png -------------------------------------------------------------------------------- /frontend/src/assets/login_wave.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/logo2.png -------------------------------------------------------------------------------- /frontend/src/assets/logos/redpanda-icon-color.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/src/assets/logos/redpanda-icon-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/src/assets/news.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "title": "Simplify development of Kafka applications with Redpanda and Testcontainers", 4 | "url": "https://google.com", 5 | "intendedAudience": "all", 6 | "badge": "new" 7 | }, 8 | { 9 | "title": "Some new feature announcement here", 10 | "url": "https://google.com", 11 | "intendedAudience": "all", 12 | "badge": "new" 13 | }, 14 | { 15 | "title": "Another entry here, but this one doesn't have the \"NEW\" badge", 16 | "url": "https://google.com", 17 | "intendedAudience": "all" 18 | } 19 | ] 20 | -------------------------------------------------------------------------------- /frontend/src/assets/pattern3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/pattern3.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/BabyYoda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/BabyYoda.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/PandaBot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/PandaBot.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/PandaFaceClosed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/PandaFaceClosed.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/PandaFaceOpen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/PandaFaceOpen.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/PandaPouncing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/PandaPouncing.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/RedpandaSkater.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/RedpandaSkater.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/Redpanda_horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/Redpanda_horizontal.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/Redpanda_horizontal_black_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/Redpanda_horizontal_black_background.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/RocketPanda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/RocketPanda.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/SittingPanda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/SittingPanda.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/icon-color.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/redpanda-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/redpanda-color.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/redpanda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/redpanda.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/redpanda_black_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/redpanda_black_background.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/redpanda_vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/redpanda_vertical.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/redpanda_vertical_black_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/redpanda_vertical_black_background.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/v_symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/v_symbol.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/v_symbol.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/v_symbol_black_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redpanda-data/console/d73334129354f8a0ba75835218a7921d72096f1b/frontend/src/assets/redpanda/v_symbol_black_background.png -------------------------------------------------------------------------------- /frontend/src/assets/redpanda/v_symbol_black_background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /frontend/src/bootstrap.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | import { createRoot } from 'react-dom/client'; 12 | import App from './App'; 13 | 14 | const rootElement = document.getElementById('root'); 15 | // biome-ignore lint/style/noNonNullAssertion: bootstrapping the app 16 | const root = createRoot(rootElement!); 17 | root.render(); 18 | -------------------------------------------------------------------------------- /frontend/src/colors.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | const colors = { 13 | green: '#25B864', // chosen to make it really obvious when changing the theme-color works. 14 | debugRed: '#FF0000', 15 | 16 | brandBlack: '#101828', 17 | brandOrange: '#E14226', 18 | brandOrange2: '#EE6237', 19 | brandError: '#CF3131', 20 | brandWarning: '#FFBE00', 21 | brandSuccess: '#64C97B', 22 | brandInfo: '#02A6C5', 23 | 24 | brandLightOrange: '#FFF5F5', 25 | brandBlue: '#2584C6', 26 | brandBlue2: '#165B96', 27 | brandGray: '#667085', 28 | brandLightGray: '#F9FAFB', 29 | brandBackground: '#F0F2F5', 30 | brandLightBackground: '#F6F6F6', 31 | }; 32 | 33 | export default colors; 34 | -------------------------------------------------------------------------------- /frontend/src/components/constants.ts: -------------------------------------------------------------------------------- 1 | export const DEFAULT_TABLE_PAGE_SIZE = 50; 2 | export const DEFAULT_API_BASE = './api' as const; 3 | 4 | // By default, most feature flags will be false when there's no embedded mode on. 5 | export const FEATURE_FLAGS = { 6 | enableAiAgentsInConsoleUi: false, 7 | enableAiAgentsInConsoleUiPreview: false, 8 | }; 9 | -------------------------------------------------------------------------------- /frontend/src/components/form/form-hook-contexts.ts: -------------------------------------------------------------------------------- 1 | import { createFormHookContexts } from '@tanstack/react-form'; 2 | 3 | export const { useFieldContext, useFormContext, formContext, fieldContext } = createFormHookContexts(); 4 | -------------------------------------------------------------------------------- /frontend/src/components/form/form.ts: -------------------------------------------------------------------------------- 1 | import { createFormHook } from '@tanstack/react-form'; 2 | import { CheckboxField } from './checkbox/checkbox-field'; 3 | import { fieldContext, formContext } from './form-hook-contexts'; 4 | import { KeyValueField } from './key-value/key-value-field'; 5 | import { NumberField } from './number/number-field'; 6 | import { PasswordField } from './password/password-field'; 7 | import { RadioGroupField } from './radio/radio-group-field'; 8 | import { SingleSelectField } from './select/single-select-field'; 9 | import { SubscribeButton } from './subscribe/subscribe-button'; 10 | import { TextAreaField } from './text-area/text-area-field'; 11 | import { TextField } from './text/text-field'; 12 | 13 | export const { useAppForm, withForm } = createFormHook({ 14 | fieldContext, 15 | formContext, 16 | fieldComponents: { 17 | TextField, 18 | PasswordField, 19 | KeyValueField, 20 | RadioGroupField, 21 | SingleSelectField, 22 | CheckboxField, 23 | NumberField, 24 | TextAreaField, 25 | }, 26 | formComponents: { 27 | SubscribeButton, 28 | }, 29 | }); 30 | -------------------------------------------------------------------------------- /frontend/src/components/misc/BoxCard.module.scss: -------------------------------------------------------------------------------- 1 | @use "sass:color"; 2 | 3 | /** 4 | * Copyright 2022 Redpanda Data, Inc. 5 | * 6 | * Use of this software is governed by the Business Source License 7 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 8 | * 9 | * As of the Change Date specified in that file, in accordance with 10 | * the Business Source License, use of this software will be governed 11 | * by the Apache License, Version 2.0 12 | */ 13 | 14 | .boxCard { 15 | border: solid 1px #DDDDDD; 16 | padding: 16px; 17 | border-radius: 8px; 18 | box-sizing: border-box; 19 | } 20 | 21 | .dashed { 22 | border-style: dashed; 23 | } 24 | 25 | .hoverable:hover { 26 | $color: #418fd8; 27 | @debug color.adjust($color, $lightness: 25%); 28 | border-color: $color; 29 | } 30 | 31 | .active, 32 | .active:hover { 33 | border-color: #418fd8; 34 | } 35 | 36 | .hoverable:hover, 37 | .active, 38 | .medium { 39 | border-width: 2px; 40 | padding: 15px; 41 | } 42 | -------------------------------------------------------------------------------- /frontend/src/components/misc/HiddenRadioList.module.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | .radioCardGroup { 13 | list-style: none; 14 | margin: 1rem 0; 15 | padding: 0; 16 | 17 | display: grid; 18 | grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); 19 | grid-gap: 1rem; 20 | 21 | & > li, 22 | & > li > label { 23 | display: contents; 24 | } 25 | 26 | & > li > label { 27 | cursor: pointer; 28 | } 29 | 30 | & > li > label > input { 31 | display: none; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /frontend/src/components/misc/HistorySetter.tsx: -------------------------------------------------------------------------------- 1 | import { observer } from 'mobx-react'; 2 | import { useLocation, useNavigate } from 'react-router-dom'; 3 | 4 | import { appGlobal } from '../../state/appGlobal'; 5 | 6 | const HistorySetter = () => { 7 | const navigate = useNavigate(); 8 | const location = useLocation(); 9 | appGlobal.navigate = navigate; 10 | appGlobal.location = location; 11 | return <>; 12 | }; 13 | 14 | export default observer(HistorySetter); 15 | -------------------------------------------------------------------------------- /frontend/src/components/misc/KowlJsonView.module.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | .copyHint { 13 | position: absolute; 14 | top: 1px; 15 | right: 1px; 16 | padding: 0.4em 1em; 17 | 18 | background: rgba(0, 0, 0, 0.66); 19 | border-radius: 3px; 20 | 21 | color: #fff; 22 | font-family: 'Open Sans'; 23 | font-size: 12px; 24 | 25 | cursor: default; 26 | user-select: none; 27 | } 28 | -------------------------------------------------------------------------------- /frontend/src/components/misc/NullFallbackBoundary.tsx: -------------------------------------------------------------------------------- 1 | import React, { type ReactNode, type ErrorInfo } from 'react'; 2 | 3 | interface ErrorBoundaryProps { 4 | children: ReactNode; 5 | } 6 | 7 | interface ErrorBoundaryState { 8 | hasError: boolean; 9 | } 10 | 11 | class NullFallbackBoundary extends React.Component { 12 | constructor(props: ErrorBoundaryProps) { 13 | super(props); 14 | this.state = { hasError: false }; 15 | } 16 | 17 | static getDerivedStateFromError(_: Error): ErrorBoundaryState { 18 | // Update state to indicate an error has occurred 19 | return { hasError: true }; 20 | } 21 | 22 | componentDidCatch(error: Error, errorInfo: ErrorInfo): void { 23 | // Log the error to an error reporting service, if needed 24 | console.error('NullFallbackBoundary caught an error', error, errorInfo); 25 | } 26 | 27 | render(): ReactNode { 28 | if (this.state.hasError) { 29 | // Render nothing in case of an error 30 | return null; 31 | } 32 | 33 | return this.props.children; 34 | } 35 | } 36 | 37 | export { NullFallbackBoundary }; 38 | -------------------------------------------------------------------------------- /frontend/src/components/misc/PageContent.tsx: -------------------------------------------------------------------------------- 1 | import { Stack } from '@redpanda-data/ui'; 2 | import { motion } from 'framer-motion'; 3 | import type { ReactNode } from 'react'; 4 | import { animProps } from '../../utils/animationProps'; 5 | 6 | export type PageContentProps = { 7 | children: ReactNode; 8 | className?: string; 9 | }; 10 | 11 | function PageContent(props: PageContentProps) { 12 | return ( 13 | 14 | {props.children} 15 | 16 | ); 17 | } 18 | 19 | export default PageContent; 20 | -------------------------------------------------------------------------------- /frontend/src/components/misc/RemovableFilter.tsx: -------------------------------------------------------------------------------- 1 | import { Flex, IconButton } from '@redpanda-data/ui'; 2 | import type { FC, ReactElement } from 'react'; 3 | import { MdClose } from 'react-icons/md'; 4 | 5 | const RemovableFilter: FC<{ children: ReactElement; onRemove: () => void }> = ({ children, onRemove }) => { 6 | return ( 7 | 8 | {children} 9 | } 11 | onClick={() => onRemove()} 12 | variant="unstyled" 13 | aria-label="Remove filter" 14 | /> 15 | 16 | ); 17 | }; 18 | 19 | export default RemovableFilter; 20 | -------------------------------------------------------------------------------- /frontend/src/components/misc/Section.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | import { type ChakraProps, Section as ChakraSection } from '@redpanda-data/ui'; 13 | import type { ReactNode } from 'react'; 14 | 15 | // Note: this component is intended to be temporary until all components are migrated @redpanda-data/ui 16 | function Section(props: { children: ReactNode; id?: string } & ChakraProps) { 17 | return ( 18 | 26 | ); 27 | } 28 | 29 | export default Section; 30 | -------------------------------------------------------------------------------- /frontend/src/components/misc/SmallStat.tsx: -------------------------------------------------------------------------------- 1 | import { Text } from '@redpanda-data/ui'; 2 | import { Flex } from '@redpanda-data/ui'; 3 | 4 | export function SmallStat(p: { 5 | title: JSX.Element | string; 6 | children: JSX.Element | number | string; 7 | }) { 8 | return ( 9 | 10 | {p.title}: 11 | {p.children} 12 | 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/components/misc/Statistic.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Flex, type SpaceProps, Stat, StatLabel, StatNumber, Tooltip } from '@redpanda-data/ui'; 2 | import { MdInfoOutline } from 'react-icons/md'; 3 | 4 | export function Statistic( 5 | p: { 6 | key?: string | number; 7 | title: React.ReactNode; 8 | value: React.ReactNode; 9 | hint?: string; 10 | className?: string; 11 | } & SpaceProps, 12 | ) { 13 | const { key, title, value, className, hint, ...rest } = p; 14 | 15 | return ( 16 | 17 | {value} 18 | 19 | 20 | {title} 21 | {hint && ( 22 | 23 | 24 | 25 | 26 | 27 | )} 28 | 29 | 30 | 31 | ); 32 | } 33 | -------------------------------------------------------------------------------- /frontend/src/components/misc/not-found-page.tsx: -------------------------------------------------------------------------------- 1 | import { Center, Heading, Image, Stack, Text } from '@redpanda-data/ui'; 2 | import { useNavigate } from 'react-router-dom'; 3 | import errorBananaSlip from '../../assets/redpanda/ErrorBananaSlip.svg'; 4 | 5 | export const NotFoundPage = () => { 6 | const navigate = useNavigate(); 7 | 8 | return ( 9 |
10 | 11 | Error 12 | 13 | Resource not found. 14 | 15 | { 19 | navigate(-1); 20 | }} 21 | data-testid="return-to-home" 22 | > 23 | Go back 24 | 25 | 26 |
27 | ); 28 | }; 29 | -------------------------------------------------------------------------------- /frontend/src/components/pages/agents/details/chat/agent-chat-notification.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactNode } from 'react'; 2 | 3 | interface AgentChatNotificationProps { 4 | notification: ReactNode; 5 | } 6 | 7 | export const AgentChatNotification = ({ notification }: AgentChatNotificationProps) => { 8 | return ( 9 |
10 |
11 |
12 |
{notification}
13 |
14 |
15 |
16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /frontend/src/components/pages/agents/details/chat/chat-clear-button.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '@redpanda-data/ui'; 2 | 3 | interface ChatClearButtonProps { 4 | onClear: () => void; 5 | } 6 | 7 | export const ChatClearButton = ({ onClear }: ChatClearButtonProps) => ( 8 |
9 | 12 |
13 | ); 14 | -------------------------------------------------------------------------------- /frontend/src/components/pages/agents/details/chat/chat-loading-indicator.tsx: -------------------------------------------------------------------------------- 1 | export const ChatLoadingIndicator = () => { 2 | return ( 3 |
4 |
Loading messages...
5 |
6 | ); 7 | }; 8 | -------------------------------------------------------------------------------- /frontend/src/components/pages/agents/details/chat/chat-message-container.tsx: -------------------------------------------------------------------------------- 1 | import type { ChatMessage } from 'database/chat-db'; 2 | import { ChatMessageView } from './chat-message-view'; 3 | import { ChatTypingIndicator } from './chat-typing-indicator'; 4 | 5 | interface ChatMessageContainerProps { 6 | messages: ChatMessage[]; 7 | isTyping: boolean; 8 | messagesEndRef: React.RefObject; 9 | } 10 | 11 | export const ChatMessageContainer = ({ messages, isTyping, messagesEndRef }: ChatMessageContainerProps) => { 12 | return ( 13 |
14 |
15 | {messages.map((message: ChatMessage) => ( 16 | 17 | ))} 18 | 19 | {isTyping && } 20 | 21 |
22 |
23 |
24 | ); 25 | }; 26 | -------------------------------------------------------------------------------- /frontend/src/components/pages/agents/details/chat/chat-message-view.tsx: -------------------------------------------------------------------------------- 1 | import type { ChatMessage } from 'database/chat-db'; 2 | import { ChatMarkdown } from './chat-markdown'; 3 | 4 | interface ChatMessageViewProps { 5 | message: ChatMessage; 6 | } 7 | 8 | export const ChatMessageView = ({ message }: ChatMessageViewProps) => { 9 | return ( 10 |
11 |
18 |
19 | 20 |
21 |

22 | {message.timestamp.toLocaleTimeString()} 23 |

24 |
25 |
26 | ); 27 | }; 28 | -------------------------------------------------------------------------------- /frontend/src/components/pages/agents/details/chat/chat-typing-indicator.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactNode } from 'react'; 2 | 3 | interface ChatTypingIndicatorProps { 4 | text: ReactNode; 5 | } 6 | 7 | export const ChatTypingIndicator = ({ text }: ChatTypingIndicatorProps) => ( 8 |
9 |
10 |
11 |
12 |
13 |
14 | {text} 15 |
16 |
17 |
18 | ); 19 | -------------------------------------------------------------------------------- /frontend/src/components/pages/agents/hubspot-modal.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Box, 3 | Modal, 4 | ModalBody, 5 | ModalCloseButton, 6 | ModalContent, 7 | ModalHeader, 8 | ModalOverlay, 9 | Stack, 10 | Text, 11 | } from '@redpanda-data/ui'; 12 | 13 | import './hubspot-modal.scss'; 14 | import { AI_AGENTS_SUMMARY } from './agent-list-page'; 15 | 16 | interface HubspotModalProps { 17 | isOpen: boolean; 18 | isSubmitted: boolean; 19 | onClose: () => void; 20 | } 21 | 22 | const HubspotModal = ({ isOpen, isSubmitted, onClose }: HubspotModalProps) => { 23 | return ( 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | Try Redpanda AI Agents for free 32 | 33 | {!isSubmitted && {AI_AGENTS_SUMMARY}} 34 | 35 | 36 | 37 | 38 | 39 | ); 40 | }; 41 | 42 | export default HubspotModal; 43 | -------------------------------------------------------------------------------- /frontend/src/components/pages/connect/ConnectorBoxCard.module.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | .radioCardContent { 13 | display: flex; 14 | align-items: center; 15 | } 16 | 17 | .radioCardLogo { 18 | width: 32px; 19 | height: 32px; 20 | margin-right: 16px; 21 | flex-grow: 0; 22 | flex-shrink: 0; 23 | } 24 | 25 | .radioCardInfo { 26 | flex-basis: 100%; 27 | 28 | & > strong { 29 | font-size: 14px; 30 | line-height: 22px; 31 | font-weight: normal; 32 | } 33 | } 34 | 35 | .pluginType, 36 | .pluginMeta { 37 | color: lighten(black, 55%); 38 | } 39 | 40 | .pluginMeta { 41 | margin-bottom: 0; 42 | } 43 | -------------------------------------------------------------------------------- /frontend/src/components/pages/connect/CreateConnector.module.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | .wizardView { 13 | padding-top: 40px; 14 | 15 | h2 { 16 | margin-top: 35px; 17 | } 18 | } 19 | 20 | .motionContainer { 21 | margin: 0 1rem; 22 | } 23 | 24 | .connectorBoxCard { 25 | margin-bottom: 35px; 26 | max-width: 744px; 27 | } 28 | -------------------------------------------------------------------------------- /frontend/src/components/pages/connect/dynamic-ui/DebugEditor.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | import { observer } from 'mobx-react'; 13 | 14 | import KowlEditor from '../../../misc/KowlEditor'; 15 | 16 | export const DebugEditor = observer((p: { observable: { jsonText: string } }) => { 17 | const obs = p.observable; 18 | 19 | return ( 20 |
21 |

Debug Editor

22 | { 26 | if (v) { 27 | if (!obs.jsonText && !v) return; // dont replace undefiend with empty (which would trigger our 'autorun') 28 | obs.jsonText = v; 29 | } 30 | }} 31 | height="300px" 32 | /> 33 |
34 | ); 35 | }); 36 | -------------------------------------------------------------------------------- /frontend/src/components/pages/reassign-partitions/components/IndeterminateCheckbox.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | import { observer } from 'mobx-react'; 13 | import React, { Component } from 'react'; 14 | 15 | @observer 16 | export class IndeterminateCheckbox extends Component<{ 17 | originalCheckbox: React.ReactNode; 18 | getCheckState: () => { checked: boolean; indeterminate: boolean }; 19 | }> { 20 | render() { 21 | const state = this.props.getCheckState(); 22 | 23 | // console.log(`checkbox${index} props: ${(originNode as any).props?.indeterminate}`) 24 | const clone = React.cloneElement(this.props.originalCheckbox as any, { 25 | checked: state.checked, 26 | indeterminate: state.indeterminate, 27 | }); 28 | return clone; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /frontend/src/components/pages/rp-connect/tasks.tsx: -------------------------------------------------------------------------------- 1 | export const MIN_TASKS = 1, 2 | MAX_TASKS = 90; 3 | 4 | const milliValueRegex = /^(\d+(\.\d+)?)(m?)$/; 5 | 6 | export function cpuToTasks(cpu: string | undefined): number | undefined { 7 | if (!cpu) { 8 | return undefined; 9 | } 10 | const match = cpu.match(milliValueRegex); 11 | if (!match) { 12 | return undefined; 13 | } 14 | 15 | const value = Number.parseFloat(match[1]); 16 | const isMilli = match[3] === 'm'; 17 | const cpuMilli = isMilli ? value : value * 1000; 18 | return cpuMilli / 100; 19 | } 20 | 21 | export function tasksToCPU(tasks: number | undefined): string | undefined { 22 | if (!tasks) { 23 | return undefined; 24 | } 25 | return `${tasks * 100}m`; 26 | } 27 | -------------------------------------------------------------------------------- /frontend/src/components/pages/schemas/Schema.List.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | .SchemaList__error-card:empty { 13 | display: none; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /frontend/src/components/pages/secrets/form/delete-secret-schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const deleteSecretSchema = (secretId: string) => 4 | z.object({ 5 | confirmationText: z.string().refine((text) => text.toUpperCase() === secretId.toUpperCase(), { 6 | message: `Text must match "${secretId}"`, 7 | }), 8 | }); 9 | -------------------------------------------------------------------------------- /frontend/src/components/pages/secrets/form/secret-schema.ts: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | export const secretSchema = (customValueSchema?: z.ZodTypeAny) => 4 | z.object({ 5 | id: z 6 | .string() 7 | .min(1, 'ID is required') 8 | .regex( 9 | /^[A-Z][A-Z0-9_]*$/, 10 | 'ID must use uppercase letters, numbers, and underscores only, starting with a letter', 11 | ), 12 | value: customValueSchema ? customValueSchema : z.string().min(1, 'Value is required'), 13 | labels: z 14 | .array( 15 | z.object({ 16 | key: z.string(), 17 | value: z.string(), 18 | }), 19 | ) 20 | .optional() 21 | .default([]) 22 | .refine((labels) => { 23 | // Only validate non-empty labels - if both key and value are empty, that's fine 24 | return labels.every((label) => { 25 | return (label.key === '' && label.value === '') || (label.key !== '' && label.value !== ''); 26 | }); 27 | }, 'Both key and value must be provided for a label'), 28 | scopes: z.array(z.number()).min(1, 'At least one scope is required'), 29 | }); 30 | -------------------------------------------------------------------------------- /frontend/src/components/pages/topics/CreateTopicModal/CreateTopicModal.scss: -------------------------------------------------------------------------------- 1 | .keyValuePairEditor { 2 | display: flex; 3 | flex-direction: column; 4 | gap: 12px; 5 | 6 | 7 | .deleteButton { 8 | padding: 4px 12px; 9 | } 10 | 11 | .addButton { 12 | align-self: flex-start; 13 | 14 | display: flex; 15 | align-items: center; 16 | gap: 5px; 17 | padding: 0px 16px; 18 | 19 | svg { 20 | opacity: 0.75; 21 | font-size: 15px; 22 | transform: translateY(1px); 23 | height: 1em; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /frontend/src/components/pages/topics/DeleteRecordsModal/DeleteRecordsModal.module.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | .slider { 13 | flex-grow: 1; 14 | } 15 | 16 | .partitionSelect { 17 | margin-top: 1em; 18 | } 19 | 20 | .twoCol { 21 | display: grid; 22 | grid-template-columns: 66px 1fr; 23 | gap: 30px; 24 | margin-bottom: 25px; 25 | } 26 | -------------------------------------------------------------------------------- /frontend/src/components/pages/topics/types.ts: -------------------------------------------------------------------------------- 1 | export type CleanupPolicyType = 'compact' | 'delete' | 'compact,delete'; 2 | -------------------------------------------------------------------------------- /frontend/src/env.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.yaml' { 2 | const content: Record; 3 | export default content; 4 | } 5 | -------------------------------------------------------------------------------- /frontend/src/globals.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | 13 | /* Use this file to start scoping out global css styles */ 14 | 15 | body { 16 | margin: 0; 17 | font-family: "Inter", "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; 18 | -webkit-font-smoothing: antialiased; 19 | -moz-osx-font-smoothing: grayscale; 20 | list-style-type: none; 21 | // background: #f0f2f5; 22 | } 23 | 24 | code { 25 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; 26 | } 27 | 28 | h2 { 29 | font-size: 1.4em; 30 | } 31 | 32 | b { 33 | font-weight: 600; 34 | } 35 | -------------------------------------------------------------------------------- /frontend/src/hooks/use-developer-view.ts: -------------------------------------------------------------------------------- 1 | import { useKey, useLocalStorage } from '@redpanda-data/ui'; 2 | 3 | const useDeveloperView = (): boolean => { 4 | const [developerView, setDeveloperView] = useLocalStorage('dv', false); 5 | useKey('?', () => { 6 | if (process.env.NODE_ENV !== 'production') { 7 | setDeveloperView(!developerView); 8 | } 9 | }); 10 | return developerView; 11 | }; 12 | 13 | // non-hook version 14 | export const runDeveloperView = (): boolean => { 15 | let developerView = false; 16 | 17 | try { 18 | const storedViewSetting = window.localStorage.getItem('dv'); 19 | developerView = storedViewSetting ? JSON.parse(storedViewSetting) : false; 20 | } catch (error) { 21 | console.error(error); 22 | } 23 | 24 | const onDown = (event: KeyboardEvent) => { 25 | if (event.key.toLowerCase() === '?') { 26 | if (process.env.NODE_ENV !== 'production') { 27 | window.localStorage.setItem('dv', JSON.stringify(!developerView)); 28 | } 29 | } 30 | }; 31 | 32 | window.addEventListener('keydown', onDown); 33 | 34 | return developerView; 35 | }; 36 | 37 | export default useDeveloperView; 38 | -------------------------------------------------------------------------------- /frontend/src/index-cloud-integration.scss: -------------------------------------------------------------------------------- 1 | // Dan's overrides for console integration 2 | // - this file is intended to be TEMPORARY 3 | // - these rules can be removed when ant design is removed 4 | 5 | // Background color 6 | #mainLayout { 7 | background: transparent !important; 8 | } 9 | 10 | #mainLayout > div { 11 | margin: 0 !important; 12 | } 13 | 14 | body.chakra-ui-dark { 15 | .statisticsBar { 16 | background: linear-gradient(to right, transparent, var(--chakra-colors-gray-800)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/index.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | export {}; 13 | 14 | import('react'); 15 | import('react-dom'); 16 | 17 | import('./bootstrap'); 18 | -------------------------------------------------------------------------------- /frontend/src/injectApp.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | import { createRoot } from 'react-dom/client'; 13 | import EmbeddedApp, { type EmbeddedProps } from './EmbeddedApp'; 14 | 15 | const injector = async (parentElementId: string, props: EmbeddedProps) => { 16 | const container = document.getElementById(parentElementId); 17 | // biome-ignore lint/style/noNonNullAssertion: bootstrapping the app for embedded mode 18 | const root = createRoot(container!); 19 | root.render(); 20 | return root; 21 | }; 22 | 23 | export default injector; 24 | -------------------------------------------------------------------------------- /frontend/src/protobuf-registry.ts: -------------------------------------------------------------------------------- 1 | import { createRegistry } from '@bufbuild/protobuf'; 2 | 3 | // you have to pass a explicit list of protobuf types so the registry 4 | // contains the messages you want to decode from/to 5 | export const protobufRegistry = createRegistry(); 6 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/console/v1alpha1/console_service-ConsoleService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/console/v1alpha1/console_service.proto (package redpanda.api.console.v1alpha1, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { ConsoleService } from "./console_service_pb"; 6 | 7 | /** 8 | * PublishMessage publishes message. 9 | * 10 | * @generated from rpc redpanda.api.console.v1alpha1.ConsoleService.PublishMessage 11 | */ 12 | export const publishMessage = ConsoleService.method.publishMessage; 13 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/console/v1alpha1/transform-TransformService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/console/v1alpha1/transform.proto (package redpanda.api.console.v1alpha1, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { TransformService } from "./transform_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.console.v1alpha1.TransformService.ListTransforms 9 | */ 10 | export const listTransforms = TransformService.method.listTransforms; 11 | 12 | /** 13 | * @generated from rpc redpanda.api.console.v1alpha1.TransformService.GetTransform 14 | */ 15 | export const getTransform = TransformService.method.getTransform; 16 | 17 | /** 18 | * @generated from rpc redpanda.api.console.v1alpha1.TransformService.DeleteTransform 19 | */ 20 | export const deleteTransform = TransformService.method.deleteTransform; 21 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1/acl-ACLService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/dataplane/v1/acl.proto (package redpanda.api.dataplane.v1, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { ACLService } from "./acl_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.dataplane.v1.ACLService.ListACLs 9 | */ 10 | export const listACLs = ACLService.method.listACLs; 11 | 12 | /** 13 | * @generated from rpc redpanda.api.dataplane.v1.ACLService.CreateACL 14 | */ 15 | export const createACL = ACLService.method.createACL; 16 | 17 | /** 18 | * @generated from rpc redpanda.api.dataplane.v1.ACLService.DeleteACLs 19 | */ 20 | export const deleteACLs = ACLService.method.deleteACLs; 21 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1/dummy-DummyService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // This file is a trick to force protoc-gen-openapiv2 into including the types used here into the openapi spec. They are not normally included, because they are not explicitly referenced in any proto (as protobuf ANY is used in errordetails). 2 | 3 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 4 | // @generated from file redpanda/api/dataplane/v1/dummy.proto (package redpanda.api.dataplane.v1, syntax proto3) 5 | /* eslint-disable */ 6 | 7 | import { DummyService } from "./dummy_pb"; 8 | 9 | /** 10 | * buf:lint:ignore RPC_REQUEST_STANDARD_NAME 11 | * buf:lint:ignore RPC_RESPONSE_STANDARD_NAME 12 | * buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE 13 | * 14 | * @generated from rpc redpanda.api.dataplane.v1.DummyService.DummyMethod 15 | */ 16 | export const dummyMethod = DummyService.method.dummyMethod; 17 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1/transform-TransformService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/dataplane/v1/transform.proto (package redpanda.api.dataplane.v1, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { TransformService } from "./transform_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.dataplane.v1.TransformService.ListTransforms 9 | */ 10 | export const listTransforms = TransformService.method.listTransforms; 11 | 12 | /** 13 | * @generated from rpc redpanda.api.dataplane.v1.TransformService.GetTransform 14 | */ 15 | export const getTransform = TransformService.method.getTransform; 16 | 17 | /** 18 | * @generated from rpc redpanda.api.dataplane.v1.TransformService.DeleteTransform 19 | */ 20 | export const deleteTransform = TransformService.method.deleteTransform; 21 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1/user-UserService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/dataplane/v1/user.proto (package redpanda.api.dataplane.v1, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { UserService } from "./user_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.dataplane.v1.UserService.CreateUser 9 | */ 10 | export const createUser = UserService.method.createUser; 11 | 12 | /** 13 | * @generated from rpc redpanda.api.dataplane.v1.UserService.UpdateUser 14 | */ 15 | export const updateUser = UserService.method.updateUser; 16 | 17 | /** 18 | * @generated from rpc redpanda.api.dataplane.v1.UserService.ListUsers 19 | */ 20 | export const listUsers = UserService.method.listUsers; 21 | 22 | /** 23 | * @generated from rpc redpanda.api.dataplane.v1.UserService.DeleteUser 24 | */ 25 | export const deleteUser = UserService.method.deleteUser; 26 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1alpha1/acl-ACLService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/dataplane/v1alpha1/acl.proto (package redpanda.api.dataplane.v1alpha1, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { ACLService } from "./acl_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.dataplane.v1alpha1.ACLService.ListACLs 9 | * @deprecated 10 | */ 11 | export const listACLs = ACLService.method.listACLs; 12 | 13 | /** 14 | * @generated from rpc redpanda.api.dataplane.v1alpha1.ACLService.CreateACL 15 | * @deprecated 16 | */ 17 | export const createACL = ACLService.method.createACL; 18 | 19 | /** 20 | * @generated from rpc redpanda.api.dataplane.v1alpha1.ACLService.DeleteACLs 21 | * @deprecated 22 | */ 23 | export const deleteACLs = ACLService.method.deleteACLs; 24 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1alpha1/dummy-DummyService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // This file is a trick to force protoc-gen-openapiv2 into including the types used here into the openapi spec. They are not normally included, because they are not explicitly referenced in any proto (as protobuf ANY is used in errordetails). 2 | 3 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 4 | // @generated from file redpanda/api/dataplane/v1alpha1/dummy.proto (package redpanda.api.dataplane.v1alpha1, syntax proto3) 5 | /* eslint-disable */ 6 | 7 | import { DummyService } from "./dummy_pb"; 8 | 9 | /** 10 | * buf:lint:ignore RPC_REQUEST_STANDARD_NAME 11 | * buf:lint:ignore RPC_RESPONSE_STANDARD_NAME 12 | * buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE 13 | * 14 | * @generated from rpc redpanda.api.dataplane.v1alpha1.DummyService.DummyMethod 15 | */ 16 | export const dummyMethod = DummyService.method.dummyMethod; 17 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1alpha1/transform-TransformService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/dataplane/v1alpha1/transform.proto (package redpanda.api.dataplane.v1alpha1, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { TransformService } from "./transform_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.dataplane.v1alpha1.TransformService.ListTransforms 9 | * @deprecated 10 | */ 11 | export const listTransforms = TransformService.method.listTransforms; 12 | 13 | /** 14 | * @generated from rpc redpanda.api.dataplane.v1alpha1.TransformService.GetTransform 15 | * @deprecated 16 | */ 17 | export const getTransform = TransformService.method.getTransform; 18 | 19 | /** 20 | * @generated from rpc redpanda.api.dataplane.v1alpha1.TransformService.DeleteTransform 21 | * @deprecated 22 | */ 23 | export const deleteTransform = TransformService.method.deleteTransform; 24 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1alpha1/user-UserService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/dataplane/v1alpha1/user.proto (package redpanda.api.dataplane.v1alpha1, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { UserService } from "./user_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.dataplane.v1alpha1.UserService.CreateUser 9 | * @deprecated 10 | */ 11 | export const createUser = UserService.method.createUser; 12 | 13 | /** 14 | * @generated from rpc redpanda.api.dataplane.v1alpha1.UserService.UpdateUser 15 | * @deprecated 16 | */ 17 | export const updateUser = UserService.method.updateUser; 18 | 19 | /** 20 | * @generated from rpc redpanda.api.dataplane.v1alpha1.UserService.ListUsers 21 | * @deprecated 22 | */ 23 | export const listUsers = UserService.method.listUsers; 24 | 25 | /** 26 | * @generated from rpc redpanda.api.dataplane.v1alpha1.UserService.DeleteUser 27 | * @deprecated 28 | */ 29 | export const deleteUser = UserService.method.deleteUser; 30 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1alpha2/acl-ACLService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/dataplane/v1alpha2/acl.proto (package redpanda.api.dataplane.v1alpha2, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { ACLService } from "./acl_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.dataplane.v1alpha2.ACLService.ListACLs 9 | */ 10 | export const listACLs = ACLService.method.listACLs; 11 | 12 | /** 13 | * @generated from rpc redpanda.api.dataplane.v1alpha2.ACLService.CreateACL 14 | */ 15 | export const createACL = ACLService.method.createACL; 16 | 17 | /** 18 | * @generated from rpc redpanda.api.dataplane.v1alpha2.ACLService.DeleteACLs 19 | */ 20 | export const deleteACLs = ACLService.method.deleteACLs; 21 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1alpha2/dummy-DummyService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // This file is a trick to force protoc-gen-openapiv2 into including the types used here into the openapi spec. They are not normally included, because they are not explicitly referenced in any proto (as protobuf ANY is used in errordetails). 2 | 3 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 4 | // @generated from file redpanda/api/dataplane/v1alpha2/dummy.proto (package redpanda.api.dataplane.v1alpha2, syntax proto3) 5 | /* eslint-disable */ 6 | 7 | import { DummyService } from "./dummy_pb"; 8 | 9 | /** 10 | * buf:lint:ignore RPC_REQUEST_STANDARD_NAME 11 | * buf:lint:ignore RPC_RESPONSE_STANDARD_NAME 12 | * buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE 13 | * 14 | * @generated from rpc redpanda.api.dataplane.v1alpha2.DummyService.DummyMethod 15 | */ 16 | export const dummyMethod = DummyService.method.dummyMethod; 17 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1alpha2/transform-TransformService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/dataplane/v1alpha2/transform.proto (package redpanda.api.dataplane.v1alpha2, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { TransformService } from "./transform_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.dataplane.v1alpha2.TransformService.ListTransforms 9 | */ 10 | export const listTransforms = TransformService.method.listTransforms; 11 | 12 | /** 13 | * @generated from rpc redpanda.api.dataplane.v1alpha2.TransformService.GetTransform 14 | */ 15 | export const getTransform = TransformService.method.getTransform; 16 | 17 | /** 18 | * @generated from rpc redpanda.api.dataplane.v1alpha2.TransformService.DeleteTransform 19 | */ 20 | export const deleteTransform = TransformService.method.deleteTransform; 21 | -------------------------------------------------------------------------------- /frontend/src/protogen/redpanda/api/dataplane/v1alpha2/user-UserService_connectquery.ts: -------------------------------------------------------------------------------- 1 | // @generated by protoc-gen-connect-query v2.0.1 with parameter "target=ts,js_import_style=legacy_commonjs" 2 | // @generated from file redpanda/api/dataplane/v1alpha2/user.proto (package redpanda.api.dataplane.v1alpha2, syntax proto3) 3 | /* eslint-disable */ 4 | 5 | import { UserService } from "./user_pb"; 6 | 7 | /** 8 | * @generated from rpc redpanda.api.dataplane.v1alpha2.UserService.CreateUser 9 | */ 10 | export const createUser = UserService.method.createUser; 11 | 12 | /** 13 | * @generated from rpc redpanda.api.dataplane.v1alpha2.UserService.UpdateUser 14 | */ 15 | export const updateUser = UserService.method.updateUser; 16 | 17 | /** 18 | * @generated from rpc redpanda.api.dataplane.v1alpha2.UserService.ListUsers 19 | */ 20 | export const listUsers = UserService.method.listUsers; 21 | 22 | /** 23 | * @generated from rpc redpanda.api.dataplane.v1alpha2.UserService.DeleteUser 24 | */ 25 | export const deleteUser = UserService.method.deleteUser; 26 | -------------------------------------------------------------------------------- /frontend/src/queryClient.ts: -------------------------------------------------------------------------------- 1 | import { Code } from '@connectrpc/connect'; 2 | import { ConnectError } from '@connectrpc/connect'; 3 | import { QueryClient } from '@tanstack/react-query'; 4 | 5 | function isConnectError(error: Error | ConnectError): error is ConnectError { 6 | return error instanceof ConnectError; 7 | } 8 | 9 | const queryClient = new QueryClient({ 10 | defaultOptions: { 11 | queries: { 12 | staleTime: 3 * 1000, // 3 seconds 13 | retry: (failureCount, error) => { 14 | if (failureCount > 3) return false; 15 | 16 | if (isConnectError(error)) { 17 | // Retry only gRPC errors that map to 5xx HTTP error codes 18 | return error.code === Code.Internal || error.code === Code.Unknown; 19 | } 20 | 21 | return false; 22 | }, 23 | }, 24 | }, 25 | }); 26 | 27 | export default queryClient; 28 | -------------------------------------------------------------------------------- /frontend/src/types/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.module.scss'; 2 | declare module '*.module.sass'; 3 | declare module '*.module.less'; 4 | declare module '*.module.css'; 5 | 6 | declare module '*.svg'; 7 | declare module '*.png'; 8 | declare module '*.jpg'; 9 | -------------------------------------------------------------------------------- /frontend/src/utils/extensions.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | export {}; 13 | 14 | declare global { 15 | interface String { 16 | removePrefix(this: string, prefix: string): string; 17 | removeSuffix(this: string, suffix: string): string; 18 | } 19 | } 20 | 21 | String.prototype.removePrefix = function (this: string, prefix: string) { 22 | if (prefix.length === 0) return this; 23 | 24 | if (this.toLowerCase().startsWith(prefix.toLowerCase())) return this.slice(prefix.length); 25 | return this; 26 | }; 27 | 28 | String.prototype.removeSuffix = function (this: string, suffix: string) { 29 | if (suffix.length === 0) return this; 30 | 31 | if (this.toLowerCase().endsWith(suffix.toLowerCase())) return this.slice(0, this.length - suffix.length); 32 | return this; 33 | }; 34 | -------------------------------------------------------------------------------- /frontend/src/utils/featureDetection.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | export const isClipboardAvailable = Boolean(navigator?.clipboard); 13 | -------------------------------------------------------------------------------- /frontend/src/utils/filterHelper.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | 12 | export function wrapFilterFragment(filterFragment: string) { 13 | if (!filterFragment.includes('return ')) filterFragment = `return ${filterFragment}`; 14 | return filterFragment; 15 | } 16 | 17 | export function sanitizeString(input: string) { 18 | return input 19 | .split('') 20 | .map((char: string) => { 21 | const code = char.charCodeAt(0); 22 | if (code > 0 && code < 128) { 23 | return char; 24 | } 25 | if (code >= 128 && code <= 255) { 26 | //Hex escape encoding 27 | return `/x${code.toString(16)}`.replace('/', '\\'); 28 | } 29 | return ''; 30 | }) 31 | .join(''); 32 | } 33 | -------------------------------------------------------------------------------- /frontend/src/utils/interpreter/global.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2022 Redpanda Data, Inc. 3 | * 4 | * Use of this software is governed by the Business Source License 5 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 6 | * 7 | * As of the Change Date specified in that file, in accordance with 8 | * the Business Source License, use of this software will be governed 9 | * by the Apache License, Version 2.0 10 | */ 11 | declare namespace NodeJS { 12 | interface Global { 13 | value: any; 14 | } 15 | } 16 | 17 | global.value = {}; 18 | -------------------------------------------------------------------------------- /frontend/src/utils/interpreter/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES5", 4 | "lib": [], 5 | "moduleResolution": "node", 6 | "module": "commonjs", 7 | "allowJs": false, 8 | "skipLibCheck": true, 9 | "esModuleInterop": true, 10 | "allowSyntheticDefaultImports": true, 11 | "strict": false, 12 | "isolatedModules": false, 13 | "strictPropertyInitialization": false, 14 | "outDir": "compiled", 15 | "removeComments": true, 16 | "noEmitHelpers": true, 17 | "noEmitOnError": true, 18 | "noImplicitUseStrict": true 19 | }, 20 | "include": ["findFunction.ts"] 21 | } 22 | -------------------------------------------------------------------------------- /frontend/src/utils/pagination.ts: -------------------------------------------------------------------------------- 1 | import type { PaginationState, Updater } from '@redpanda-data/ui'; 2 | 3 | export const onPaginationChange = 4 | (state: PaginationState, callBack?: (args: { pageSize: number; pageIndex: number }) => void) => 5 | (x: Updater) => { 6 | const newState = typeof x === 'function' ? x(state) : x; 7 | callBack?.(newState); 8 | }; 9 | -------------------------------------------------------------------------------- /frontend/src/utils/uuid.utils.ts: -------------------------------------------------------------------------------- 1 | const UUIDV4_REGEX = new RegExp(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i); 2 | 3 | /** 4 | * Determines whether a given string is a valid UUIDv4. 5 | * 6 | * @param string - The string to test. 7 | * @returns `true` if the string is a valid UUIDv4; otherwise, `false`. 8 | */ 9 | export const isUuid = (string: string) => UUIDV4_REGEX.test(string); 10 | -------------------------------------------------------------------------------- /frontend/src/variables.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Copyright 2022 Redpanda Data, Inc. 4 | * 5 | * Use of this software is governed by the Business Source License 6 | * included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 7 | * 8 | * As of the Change Date specified in that file, in accordance with 9 | * the Business Source License, use of this software will be governed 10 | * by the Apache License, Version 2.0 11 | */ 12 | 13 | /* 14 | In index.tsx we use ConfigProvider to define theme color(s), 15 | from which a whole pallete of css-variables become defined. 16 | 17 | --ant-primary-color 18 | --ant-primary-color-disabled 19 | --ant-primary-color-hover 20 | ... (20 more) 21 | 22 | Full list of variables: 23 | node_modules/antd/dist/antd.variable.css 24 | 25 | In our own components we want to use the same colors that ant-design uses. 26 | So we define our own css variables and copy the antd values. 27 | */ 28 | $color-brand-secondary: rgb(225, 66, 38); 29 | $color-brand-secondary-hover: #ed6b4e; 30 | 31 | $color-reload-spinner: #e14226; 32 | $color-reload-spinner-bg: #fff5f0; 33 | 34 | $color-light-background: #F6F6F6; 35 | 36 | -------------------------------------------------------------------------------- /frontend/tests/auth.setup.ts: -------------------------------------------------------------------------------- 1 | import { test as setup, expect } from '@playwright/test'; 2 | 3 | const authFile = 'playwright/.auth/user.json'; 4 | 5 | setup('authenticate', async ({ page }) => { 6 | await page.goto('/'); 7 | 8 | // check if there is an error modal, closed it if needed 9 | // const errorOKButton = page.getByTestId('login-error__ok-button') 10 | // if(errorOKButton) { 11 | // await errorOKButton.click() 12 | // } 13 | 14 | await page.getByTestId('auth-username-input').fill('e2euser'); 15 | await page.getByTestId('auth-password-input').fill('very-secret'); 16 | await page.getByTestId('auth-submit').click(); 17 | 18 | await expect(page.getByTestId('versionTitle')).toBeVisible(); 19 | 20 | // End of authentication steps. 21 | await page.context().storageState({path: authFile}); 22 | }); 23 | -------------------------------------------------------------------------------- /frontend/tests/config/conf/.bootstrap.yaml: -------------------------------------------------------------------------------- 1 | superusers: ["e2euser"] 2 | enable_sasl: true 3 | sasl_mechanisms: ["SCRAM", "OAUTHBEARER"] 4 | -------------------------------------------------------------------------------- /frontend/tests/config/console.config.yaml: -------------------------------------------------------------------------------- 1 | serveFrontend: false 2 | 3 | kafka: 4 | brokers: ["localhost:19092"] 5 | sasl: 6 | enabled: true 7 | mechanism: SCRAM-SHA-256 8 | username: e2euser 9 | password: very-secret 10 | impersonateUser: false 11 | 12 | schemaRegistry: 13 | enabled: true 14 | urls: ["http://localhost:18081"] 15 | 16 | redpanda: 17 | adminApi: 18 | enabled: true 19 | urls: ["http://localhost:19644"] 20 | 21 | kafkaConnect: 22 | enabled: true 23 | clusters: 24 | - name: local-connect-cluster 25 | url: http://localhost:18083 26 | - name: local-connect-cluster2 27 | url: http://localhost:18083 28 | 29 | server: 30 | listenPort: 9090 31 | allowedOrigins: ["http://localhost:3000", "http://localhost:3001"] 32 | -------------------------------------------------------------------------------- /frontend/tests/config/console.enterprise.config.yaml: -------------------------------------------------------------------------------- 1 | serveFrontend: false 2 | 3 | kafka: 4 | brokers: ["localhost:19092"] 5 | sasl: 6 | enabled: true 7 | mechanism: SCRAM-SHA-256 8 | username: e2euser 9 | password: very-secret 10 | impersonateUser: true 11 | 12 | authentication: 13 | jwtSigningKey: vazxnT+ZHtxKslK6QlDGovcYnSjTk/lKMmZ+mHrBVE+YdVDkLgSuP6AszAKe9999 14 | useSecureCookies: false 15 | basic: 16 | enabled: true 17 | 18 | redpanda: 19 | adminApi: 20 | enabled: true 21 | urls: ["http://localhost:19644"] 22 | 23 | schemaRegistry: 24 | enabled: true 25 | urls: ["http://localhost:18081"] 26 | 27 | kafkaConnect: 28 | enabled: true 29 | clusters: 30 | - name: local-connect-cluster 31 | url: http://localhost:18083 32 | - name: local-connect-cluster2 33 | url: http://localhost:18083 34 | server: 35 | listenPort: 9090 36 | allowedOrigins: ["http://localhost:3000", "http://localhost:3001"] 37 | 38 | licenseFilepath: ../../frontend/tests/config/redpanda.license 39 | 40 | authorization: 41 | roleBindings: 42 | - roleName: admin 43 | users: 44 | - loginType: basic 45 | name: e2euser 46 | -------------------------------------------------------------------------------- /frontend/tests/console/core.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from '@playwright/test'; 2 | 3 | // Basic tests to help us setup a CI pipeline 4 | test.describe('Core', () => { 5 | test('has title', async ({ page }) => { 6 | await page.goto('/'); 7 | 8 | await expect(page).toHaveTitle(/Redpanda/); 9 | }); 10 | 11 | test('has version title', async ({ page }) => { 12 | await page.goto('/'); 13 | 14 | await expect(page.getByTestId('versionTitle')).toBeVisible(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /frontend/tests/mock-document.ts: -------------------------------------------------------------------------------- 1 | Object.defineProperty(window.document, 'getAnimations', { 2 | writable: false, 3 | value: () => [], 4 | }); 5 | 6 | export {}; 7 | -------------------------------------------------------------------------------- /frontend/tests/mock-react-select.tsx: -------------------------------------------------------------------------------- 1 | import type { ChangeEvent } from 'react'; 2 | import { vi } from 'vitest'; 3 | 4 | interface ChakraEvent { 5 | label: string; 6 | value: string; 7 | } 8 | 9 | interface MockedReactSelectProps { 10 | options: Array; 11 | value: string; 12 | onChange: (event?: ChakraEvent) => void; 13 | } 14 | 15 | const MockedReactSelect = ({ options, value, onChange }: MockedReactSelectProps) => { 16 | function handleChange(event: ChangeEvent) { 17 | const matchingOption = options.find((option) => option.value === event.target.value); 18 | onChange(matchingOption); 19 | } 20 | return ( 21 | <> 22 | 29 |
select is required
30 | 31 | ); 32 | }; 33 | 34 | vi.mock('react-select', () => ({ 35 | default: MockedReactSelect, 36 | })); 37 | -------------------------------------------------------------------------------- /frontend/tests/users.utils.ts: -------------------------------------------------------------------------------- 1 | import { Page } from '@playwright/test'; 2 | 3 | export const createUser = async(page: Page, { username }: {username: string}) => { 4 | await page.goto('/security/users'); 5 | 6 | await page.getByTestId('create-user-button').click(); 7 | 8 | await page.waitForURL('/security/users/create') 9 | await page.getByLabel('Username').fill(username); 10 | return await page.getByRole('button').getByText('Create').click({ 11 | force: true 12 | }) 13 | } 14 | 15 | export const deleteUser = async(page: Page, { username }: {username: string}) => { 16 | await page.goto(`/security/users/${username}/details`) 17 | await page.getByRole('button').getByText('Delete').click() 18 | await page.getByPlaceholder(`Type "${username}" to confirm`).fill(username); 19 | return await page.getByTestId('test-delete-item').click({ 20 | force: true 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "exclude": ["node_modules"] 4 | } 5 | -------------------------------------------------------------------------------- /frontend/vitest.setup.ts: -------------------------------------------------------------------------------- 1 | import { vi } from 'vitest'; 2 | import '@testing-library/jest-dom/vitest'; 3 | import './tests/mock-document'; 4 | import './tests/mock-react-select'; 5 | 6 | window.scrollTo = vi.fn(); 7 | 8 | beforeEach(() => { 9 | Object.defineProperty(window, 'matchMedia', { 10 | writable: true, 11 | value: vi.fn().mockImplementation((query) => ({ 12 | matches: false, 13 | media: query, 14 | onchange: null, 15 | addListener: vi.fn(), // Deprecated 16 | removeListener: vi.fn(), // Deprecated 17 | addEventListener: vi.fn(), 18 | removeEventListener: vi.fn(), 19 | dispatchEvent: vi.fn(), 20 | })), 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /licenses/bsl_header.txt: -------------------------------------------------------------------------------- 1 | Copyright 2022 Redpanda Data, Inc. 2 | 3 | Use of this software is governed by the Business Source License 4 | included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md 5 | 6 | As of the Change Date specified in that file, in accordance with 7 | the Business Source License, use of this software will be governed 8 | by the Apache License, Version 2.0 9 | -------------------------------------------------------------------------------- /proto/redpanda/api/console/v1alpha1/console_service.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.console.v1alpha1; 4 | 5 | import "redpanda/api/auth/v1/authorization.proto"; 6 | import "redpanda/api/console/v1alpha1/list_messages.proto"; 7 | import "redpanda/api/console/v1alpha1/publish_messages.proto"; 8 | 9 | // ConsoleService represents the Console API service. 10 | service ConsoleService { 11 | // ListMessages lists the messages according to the requested query. 12 | rpc ListMessages(ListMessagesRequest) returns (stream ListMessagesResponse) { 13 | option (redpanda.api.auth.v1.authorization) = { 14 | required_permission: PERMISSION_VIEW 15 | api: API_KAFKA 16 | }; 17 | } 18 | 19 | // PublishMessage publishes message. 20 | rpc PublishMessage(PublishMessageRequest) returns (PublishMessageResponse) { 21 | option (redpanda.api.auth.v1.authorization) = { 22 | required_permission: PERMISSION_EDIT 23 | api: API_KAFKA 24 | }; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1/common.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.dataplane.v1; 4 | 5 | enum ConfigSource { 6 | CONFIG_SOURCE_UNSPECIFIED = 0; 7 | CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG = 1; 8 | CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG = 2; 9 | CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG = 3; 10 | CONFIG_SOURCE_STATIC_BROKER_CONFIG = 4; 11 | CONFIG_SOURCE_DEFAULT_CONFIG = 5; 12 | CONFIG_SOURCE_DYNAMIC_BROKER_LOGGER_CONFIG = 6; 13 | } 14 | 15 | enum ConfigType { 16 | CONFIG_TYPE_UNSPECIFIED = 0; 17 | CONFIG_TYPE_BOOLEAN = 1; 18 | CONFIG_TYPE_STRING = 2; 19 | CONFIG_TYPE_INT = 3; 20 | CONFIG_TYPE_SHORT = 4; 21 | CONFIG_TYPE_LONG = 5; 22 | CONFIG_TYPE_DOUBLE = 6; 23 | CONFIG_TYPE_LIST = 7; 24 | CONFIG_TYPE_CLASS = 8; 25 | CONFIG_TYPE_PASSWORD = 9; 26 | } 27 | 28 | message ConfigSynonym { 29 | string name = 1; 30 | optional string value = 2; 31 | ConfigSource source = 3; 32 | } 33 | 34 | enum ConfigAlterOperation { 35 | CONFIG_ALTER_OPERATION_UNSPECIFIED = 0; 36 | CONFIG_ALTER_OPERATION_SET = 1; 37 | CONFIG_ALTER_OPERATION_DELETE = 2; 38 | CONFIG_ALTER_OPERATION_APPEND = 3; 39 | CONFIG_ALTER_OPERATION_SUBTRACT = 4; 40 | } 41 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1/dummy.proto: -------------------------------------------------------------------------------- 1 | // This file is a trick to force protoc-gen-openapiv2 into including the types used here into the openapi spec. They are not normally included, because they are not explicitly referenced in any proto (as protobuf ANY is used in errordetails). 2 | syntax = "proto3"; 3 | 4 | package redpanda.api.dataplane.v1; 5 | 6 | import "google/protobuf/empty.proto"; 7 | import "google/rpc/error_details.proto"; 8 | import "redpanda/api/dataplane/v1/transform.proto"; 9 | 10 | message DummyMethodResponse { 11 | google.rpc.BadRequest bad_request = 1; 12 | google.rpc.ErrorInfo error_info = 2; 13 | google.rpc.QuotaFailure quota_failure = 3; 14 | google.rpc.Help help = 4; 15 | DeployTransformRequest deploy_transform_request = 5; 16 | } 17 | 18 | service DummyService { 19 | // buf:lint:ignore RPC_REQUEST_STANDARD_NAME 20 | // buf:lint:ignore RPC_RESPONSE_STANDARD_NAME 21 | // buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE 22 | rpc DummyMethod(google.protobuf.Empty) returns (DummyMethodResponse); 23 | } 24 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1/error.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.dataplane.v1; 4 | 5 | enum Reason { 6 | REASON_UNSPECIFIED = 0; 7 | 8 | // The feature is not configured. 9 | REASON_FEATURE_NOT_CONFIGURED = 1; 10 | 11 | // Internal Redpanda Console or data plane error. 12 | REASON_CONSOLE_ERROR = 2; 13 | 14 | // Redpanda Admin API returned an error. 15 | REASON_REDPANDA_ADMIN_API_ERROR = 3; 16 | 17 | // Redpanda or Kafka protocol error. 18 | REASON_KAFKA_API_ERROR = 4; 19 | 20 | // Kafka Connect API error. 21 | REASON_KAFKA_CONNECT_API_ERROR = 5; 22 | 23 | // Type mapping error translating internal or external types to API types. 24 | REASON_TYPE_MAPPING_ERROR = 6; 25 | 26 | // Cloud provider's secret store manager error. 27 | REASON_SECRET_STORE_ERROR = 7; 28 | 29 | // Invalid pipeline configuration. 30 | REASON_CONNECT_INVALID_PIPELINE_CONFIGURATION = 8; 31 | 32 | // The Redpanda enterprise license has expired and is no longer valid. 33 | REASON_ENTERPRISE_LICENSE_EXPIRED = 9; 34 | } 35 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1/swagger.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.dataplane.v1; 4 | 5 | import "protoc-gen-openapiv2/options/annotations.proto"; 6 | 7 | option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { 8 | responses: { 9 | key: "401" 10 | value: { 11 | description: "Unauthenticated." 12 | schema: { 13 | json_schema: {ref: ".google.rpc.Status"} 14 | } 15 | } 16 | } 17 | responses: { 18 | key: "500" 19 | value: { 20 | description: "Internal Server Error. Reach out to support." 21 | schema: { 22 | json_schema: {ref: ".google.rpc.Status"} 23 | } 24 | } 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1alpha1/common.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.dataplane.v1alpha1; 4 | 5 | enum ConfigSource { 6 | CONFIG_SOURCE_UNSPECIFIED = 0; 7 | CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG = 1; 8 | CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG = 2; 9 | CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG = 3; 10 | CONFIG_SOURCE_STATIC_BROKER_CONFIG = 4; 11 | CONFIG_SOURCE_DEFAULT_CONFIG = 5; 12 | CONFIG_SOURCE_DYNAMIC_BROKER_LOGGER_CONFIG = 6; 13 | } 14 | 15 | enum ConfigType { 16 | CONFIG_TYPE_UNSPECIFIED = 0; 17 | CONFIG_TYPE_BOOLEAN = 1; 18 | CONFIG_TYPE_STRING = 2; 19 | CONFIG_TYPE_INT = 3; 20 | CONFIG_TYPE_SHORT = 4; 21 | CONFIG_TYPE_LONG = 5; 22 | CONFIG_TYPE_DOUBLE = 6; 23 | CONFIG_TYPE_LIST = 7; 24 | CONFIG_TYPE_CLASS = 8; 25 | CONFIG_TYPE_PASSWORD = 9; 26 | } 27 | 28 | message ConfigSynonym { 29 | string name = 1; 30 | optional string value = 2; 31 | ConfigSource source = 3; 32 | } 33 | 34 | enum ConfigAlterOperation { 35 | CONFIG_ALTER_OPERATION_UNSPECIFIED = 0; 36 | CONFIG_ALTER_OPERATION_SET = 1; 37 | CONFIG_ALTER_OPERATION_DELETE = 2; 38 | CONFIG_ALTER_OPERATION_APPEND = 3; 39 | CONFIG_ALTER_OPERATION_SUBTRACT = 4; 40 | } 41 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1alpha1/dummy.proto: -------------------------------------------------------------------------------- 1 | // This file is a trick to force protoc-gen-openapiv2 into including the types used here into the openapi spec. They are not normally included, because they are not explicitly referenced in any proto (as protobuf ANY is used in errordetails). 2 | syntax = "proto3"; 3 | 4 | package redpanda.api.dataplane.v1alpha1; 5 | 6 | import "google/protobuf/empty.proto"; 7 | import "google/rpc/error_details.proto"; 8 | import "redpanda/api/dataplane/v1alpha1/transform.proto"; 9 | 10 | message DummyMethodResponse { 11 | google.rpc.BadRequest bad_request = 1; 12 | google.rpc.ErrorInfo error_info = 2; 13 | google.rpc.QuotaFailure quota_failure = 3; 14 | google.rpc.Help help = 4; 15 | DeployTransformRequest deploy_transform_request = 5; 16 | } 17 | 18 | service DummyService { 19 | // buf:lint:ignore RPC_REQUEST_STANDARD_NAME 20 | // buf:lint:ignore RPC_RESPONSE_STANDARD_NAME 21 | // buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE 22 | rpc DummyMethod(google.protobuf.Empty) returns (DummyMethodResponse); 23 | } 24 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1alpha1/error.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.dataplane.v1alpha1; 4 | 5 | enum Reason { 6 | REASON_UNSPECIFIED = 0; 7 | 8 | // The feature is not configured. 9 | REASON_FEATURE_NOT_CONFIGURED = 1; 10 | 11 | // Internal Redpanda Console or data plane error. 12 | REASON_CONSOLE_ERROR = 2; 13 | 14 | // Redpanda Admin API returned an error. 15 | REASON_REDPANDA_ADMIN_API_ERROR = 3; 16 | 17 | // Redpanda or Kafka protocol error. 18 | REASON_KAFKA_API_ERROR = 4; 19 | 20 | // Kafka Connect API error. 21 | REASON_KAFKA_CONNECT_API_ERROR = 5; 22 | 23 | // Type mapping error translating internal or external types to API types. 24 | REASON_TYPE_MAPPING_ERROR = 6; 25 | 26 | // Cloud provider's secret store manager error. 27 | REASON_SECRET_STORE_ERROR = 7; 28 | } 29 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1alpha1/swagger.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.dataplane.v1alpha1; 4 | 5 | import "protoc-gen-openapiv2/options/annotations.proto"; 6 | 7 | option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { 8 | responses: { 9 | key: "401" 10 | value: { 11 | description: "Unauthenticated." 12 | schema: { 13 | json_schema: {ref: ".google.rpc.Status"} 14 | } 15 | } 16 | } 17 | responses: { 18 | key: "500" 19 | value: { 20 | description: "Internal Server Error. Reach out to support." 21 | schema: { 22 | json_schema: {ref: ".google.rpc.Status"} 23 | } 24 | } 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1alpha2/common.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.dataplane.v1alpha2; 4 | 5 | enum ConfigSource { 6 | CONFIG_SOURCE_UNSPECIFIED = 0; 7 | CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG = 1; 8 | CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG = 2; 9 | CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG = 3; 10 | CONFIG_SOURCE_STATIC_BROKER_CONFIG = 4; 11 | CONFIG_SOURCE_DEFAULT_CONFIG = 5; 12 | CONFIG_SOURCE_DYNAMIC_BROKER_LOGGER_CONFIG = 6; 13 | } 14 | 15 | enum ConfigType { 16 | CONFIG_TYPE_UNSPECIFIED = 0; 17 | CONFIG_TYPE_BOOLEAN = 1; 18 | CONFIG_TYPE_STRING = 2; 19 | CONFIG_TYPE_INT = 3; 20 | CONFIG_TYPE_SHORT = 4; 21 | CONFIG_TYPE_LONG = 5; 22 | CONFIG_TYPE_DOUBLE = 6; 23 | CONFIG_TYPE_LIST = 7; 24 | CONFIG_TYPE_CLASS = 8; 25 | CONFIG_TYPE_PASSWORD = 9; 26 | } 27 | 28 | message ConfigSynonym { 29 | string name = 1; 30 | optional string value = 2; 31 | ConfigSource source = 3; 32 | } 33 | 34 | enum ConfigAlterOperation { 35 | CONFIG_ALTER_OPERATION_UNSPECIFIED = 0; 36 | CONFIG_ALTER_OPERATION_SET = 1; 37 | CONFIG_ALTER_OPERATION_DELETE = 2; 38 | CONFIG_ALTER_OPERATION_APPEND = 3; 39 | CONFIG_ALTER_OPERATION_SUBTRACT = 4; 40 | } 41 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1alpha2/dummy.proto: -------------------------------------------------------------------------------- 1 | // This file is a trick to force protoc-gen-openapiv2 into including the types used here into the openapi spec. They are not normally included, because they are not explicitly referenced in any proto (as protobuf ANY is used in errordetails). 2 | syntax = "proto3"; 3 | 4 | package redpanda.api.dataplane.v1alpha2; 5 | 6 | import "google/protobuf/empty.proto"; 7 | import "google/rpc/error_details.proto"; 8 | import "redpanda/api/dataplane/v1alpha2/transform.proto"; 9 | 10 | message DummyMethodResponse { 11 | google.rpc.BadRequest bad_request = 1; 12 | google.rpc.ErrorInfo error_info = 2; 13 | google.rpc.QuotaFailure quota_failure = 3; 14 | google.rpc.Help help = 4; 15 | DeployTransformRequest deploy_transform_request = 5; 16 | } 17 | 18 | service DummyService { 19 | // buf:lint:ignore RPC_REQUEST_STANDARD_NAME 20 | // buf:lint:ignore RPC_RESPONSE_STANDARD_NAME 21 | // buf:lint:ignore RPC_REQUEST_RESPONSE_UNIQUE 22 | rpc DummyMethod(google.protobuf.Empty) returns (DummyMethodResponse); 23 | } 24 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1alpha2/error.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.dataplane.v1alpha2; 4 | 5 | enum Reason { 6 | REASON_UNSPECIFIED = 0; 7 | 8 | // The feature is not configured. 9 | REASON_FEATURE_NOT_CONFIGURED = 1; 10 | 11 | // Internal Redpanda Console or data plane error. 12 | REASON_CONSOLE_ERROR = 2; 13 | 14 | // Redpanda Admin API returned an error. 15 | REASON_REDPANDA_ADMIN_API_ERROR = 3; 16 | 17 | // Redpanda or Kafka protocol error. 18 | REASON_KAFKA_API_ERROR = 4; 19 | 20 | // Kafka Connect API error. 21 | REASON_KAFKA_CONNECT_API_ERROR = 5; 22 | 23 | // Type mapping error translating internal or external types to API types. 24 | REASON_TYPE_MAPPING_ERROR = 6; 25 | 26 | // Cloud provider's secret store manager error. 27 | REASON_SECRET_STORE_ERROR = 7; 28 | 29 | // Invalid pipeline configuration. 30 | REASON_CONNECT_INVALID_PIPELINE_CONFIGURATION = 8; 31 | 32 | // The Redpanda enterprise license has expired and is no longer valid. 33 | REASON_ENTERPRISE_LICENSE_EXPIRED = 9; 34 | } 35 | -------------------------------------------------------------------------------- /proto/redpanda/api/dataplane/v1alpha2/swagger.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package redpanda.api.dataplane.v1alpha2; 4 | 5 | import "protoc-gen-openapiv2/options/annotations.proto"; 6 | 7 | option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { 8 | responses: { 9 | key: "401" 10 | value: { 11 | description: "Unauthenticated." 12 | schema: { 13 | json_schema: {ref: ".google.rpc.Status"} 14 | } 15 | } 16 | } 17 | responses: { 18 | key: "500" 19 | value: { 20 | description: "Internal Server Error. Reach out to support." 21 | schema: { 22 | json_schema: {ref: ".google.rpc.Status"} 23 | } 24 | } 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /taskfiles/connect.yaml: -------------------------------------------------------------------------------- 1 | version: 3 2 | tasks: 3 | ai-schema:generate: 4 | desc: generates the JSON schema for the AI version of connect 5 | cmds: 6 | # we use jsonschema format since frontend uses JSON Schema structured reprenentation of the config schem 7 | - docker run redpandadata/connect:4.34.0-ai -- list --format jsonschema > {{.FRONTEND_ROOT}}/src/assets/rp-connect-schema.json -------------------------------------------------------------------------------- /taskw: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -eu 3 | 4 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"; 5 | 6 | test -f "${SCRIPT_DIR}/.taskversion" 7 | 8 | VERSION=$(cat "${SCRIPT_DIR}/.taskversion") 9 | TASK_DIR="${SCRIPT_DIR}/build/bin" 10 | TASK="${TASK_DIR}/task" 11 | 12 | mkdir -p "$TASK_DIR" 13 | 14 | if [[ ! -x $TASK ]] || [[ $($TASK --version | awk '{print $3}') != "${VERSION}" ]]; then 15 | echo "--- updating task to ${VERSION}" 16 | sh -c "$(curl --retry 5 --retry-delay 0 --retry-max-time 60 --location https://raw.githubusercontent.com/go-task/task/${VERSION}/docs/static/install.sh)" -- -d -b "${TASK_DIR}" "${VERSION}" 17 | fi 18 | 19 | if ! command -v realpath &>/dev/null; then 20 | echo "--- realpath command not found. Please install 'coreutils' package for your OS to continue. Exiting" 21 | exit 1 22 | fi 23 | 24 | $TASK -d "$SCRIPT_DIR" "$@" 25 | --------------------------------------------------------------------------------