gitextract_872b8gvq/ ├── .gitattributes ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report_form.yml │ │ ├── config.yml │ │ ├── documentation_request.yml │ │ └── feature_request_form.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── copy-pr-bot.yaml │ ├── scripts/ │ │ ├── check_copyright_headers.py │ │ └── trigger-downstream-pipeline.sh │ └── workflows/ │ └── ci.yml ├── .pre-commit-config.yaml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── LICENSE-3rd-party.txt ├── LICENSE.DATA ├── README.md ├── SECURITY.md ├── agent/ │ ├── .gitattributes │ ├── .pre-commit-config.yaml │ ├── AGENTS.md │ ├── LICENSE-3rd-party.txt │ ├── LICENSE.md │ ├── README.md │ ├── docker/ │ │ ├── Dockerfile │ │ ├── cleanup_vulnerabilities.py │ │ └── verify_ffmpeg_tarball.py │ ├── pyproject.toml │ ├── src/ │ │ ├── sitecustomize.py │ │ └── vss_agents/ │ │ ├── __init__.py │ │ ├── agents/ │ │ │ ├── __init__.py │ │ │ ├── critic_agent.py │ │ │ ├── data_models.py │ │ │ ├── multi_report_agent.py │ │ │ ├── postprocessing/ │ │ │ │ ├── __init__.py │ │ │ │ ├── data_models.py │ │ │ │ ├── postprocessing_node.py │ │ │ │ └── validators/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base.py │ │ │ │ ├── llm_based_rule_validator.py │ │ │ │ ├── non_empty_response_validator.py │ │ │ │ └── url_validator.py │ │ │ ├── register.py │ │ │ ├── report_agent.py │ │ │ ├── search_agent.py │ │ │ └── top_agent.py │ │ ├── api/ │ │ │ ├── __init__.py │ │ │ ├── custom_fastapi_worker.py │ │ │ ├── health_endpoint.py │ │ │ ├── register.py │ │ │ ├── rtsp_stream_api.py │ │ │ ├── video_delete.py │ │ │ ├── video_search_ingest.py │ │ │ └── video_upload_url.py │ │ ├── data_models/ │ │ │ ├── __init__.py │ │ │ └── vss.py │ │ ├── embed/ │ │ │ ├── __init__.py │ │ │ ├── cosmos_embed.py │ │ │ ├── embed.py │ │ │ └── rtvi_cv_embed.py │ │ ├── evaluators/ │ │ │ ├── __init__.py │ │ │ ├── customized_qa_evaluator/ │ │ │ │ ├── __init__.py │ │ │ │ ├── evaluate.py │ │ │ │ └── register.py │ │ │ ├── customized_trajectory_evaluator/ │ │ │ │ ├── __init__.py │ │ │ │ ├── evaluate.py │ │ │ │ └── register.py │ │ │ ├── evaluate_patch.py │ │ │ ├── register.py │ │ │ ├── report_evaluator/ │ │ │ │ ├── __init__.py │ │ │ │ ├── data_models.py │ │ │ │ ├── eval_config_models.py │ │ │ │ ├── evaluate.py │ │ │ │ ├── field_evaluators/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── base.py │ │ │ │ │ ├── common.py │ │ │ │ │ └── llm_judge.py │ │ │ │ └── register.py │ │ │ └── utils.py │ │ ├── prompt.py │ │ ├── py.typed │ │ ├── tools/ │ │ │ ├── __init__.py │ │ │ ├── attribute_search.py │ │ │ ├── chart_generator.py │ │ │ ├── code_executor/ │ │ │ │ ├── __init__.py │ │ │ │ ├── docker_backend/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── docker_executor.py │ │ │ │ │ └── image_builder.py │ │ │ │ └── python_executor.py │ │ │ ├── embed_search.py │ │ │ ├── evaluation_compressor.py │ │ │ ├── fov_counts_with_chart.py │ │ │ ├── geolocation.py │ │ │ ├── incidents.py │ │ │ ├── lvs_video_understanding.py │ │ │ ├── multi_incident_formatter.py │ │ │ ├── prompt_gen.py │ │ │ ├── register.py │ │ │ ├── report_gen.py │ │ │ ├── rtvi_vlm_alert.py │ │ │ ├── s3_picture_url.py │ │ │ ├── search.py │ │ │ ├── template_report_gen.py │ │ │ ├── video_caption.py │ │ │ ├── video_detailed_caption.py │ │ │ ├── video_frame_timestamp.py │ │ │ ├── video_report_gen.py │ │ │ ├── video_skim_caption.py │ │ │ ├── video_understanding.py │ │ │ ├── vss_summarize.py │ │ │ ├── vst/ │ │ │ │ ├── __init__.py │ │ │ │ ├── duration.py │ │ │ │ ├── register.py │ │ │ │ ├── sensor_list.py │ │ │ │ ├── snapshot.py │ │ │ │ ├── timeline.py │ │ │ │ ├── utils.py │ │ │ │ ├── video_clip.py │ │ │ │ └── video_list.py │ │ │ ├── vst_download.py │ │ │ └── vst_files.py │ │ ├── utils/ │ │ │ ├── asyncmixin.py │ │ │ ├── file_mapping.py │ │ │ ├── frame_select.py │ │ │ ├── markdown_parser.py │ │ │ ├── parser.py │ │ │ ├── reasoning_parsing.py │ │ │ ├── reasoning_utils.py │ │ │ ├── retry.py │ │ │ ├── time_convert.py │ │ │ ├── time_measure.py │ │ │ ├── url_translation.py │ │ │ └── video_file.py │ │ └── video_analytics/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── embeddings.py │ │ ├── es_client.py │ │ ├── interface.py │ │ ├── nvschema.py │ │ ├── query_builders.py │ │ ├── tools.py │ │ └── utils.py │ ├── stubs/ │ │ └── nat/ │ │ ├── __init__.pyi │ │ └── data_models/ │ │ ├── __init__.pyi │ │ ├── common.pyi │ │ ├── evaluator.pyi │ │ └── function.pyi │ └── tests/ │ └── unit_test/ │ ├── __init__.py │ ├── agents/ │ │ ├── __init__.py │ │ ├── postprocessing/ │ │ │ ├── __init__.py │ │ │ ├── test_llm_based_rule_validator.py │ │ │ ├── test_non_empty_response_validator.py │ │ │ ├── test_postprocessing_node.py │ │ │ └── test_url_validator.py │ │ ├── test_data_models.py │ │ ├── test_multi_report_agent.py │ │ ├── test_report_agent.py │ │ ├── test_search_agent.py │ │ └── test_top_agent.py │ ├── api/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── test_health_endpoint_coverage.py │ │ ├── test_rtsp_stream_api.py │ │ ├── test_video_search_ingest.py │ │ ├── test_video_upload_url.py │ │ ├── test_video_upload_url_converters.py │ │ ├── test_video_upload_url_coverage.py │ │ └── test_video_upload_url_inner.py │ ├── conftest.py │ ├── data_models/ │ │ ├── __init__.py │ │ └── test_vss.py │ ├── embed/ │ │ └── test_cosmos_embed.py │ ├── evaluators/ │ │ ├── __init__.py │ │ ├── test_custom_qa.py │ │ ├── test_custom_trajectory.py │ │ ├── test_data_models.py │ │ ├── test_eval_config_models.py │ │ ├── test_evaluate.py │ │ ├── test_evaluate_patch.py │ │ ├── test_field_evaluators.py │ │ ├── test_llm_judge.py │ │ ├── test_llm_judge_coverage.py │ │ ├── test_llm_judge_field_discovery.py │ │ ├── test_register_coverage.py │ │ ├── test_report_evaluator.py │ │ └── test_utils.py │ ├── test_prompt.py │ ├── test_sitecustomize.py │ ├── tools/ │ │ ├── __init__.py │ │ ├── test_build_vst_url.py │ │ ├── test_chart_generator.py │ │ ├── test_chart_generator_converters.py │ │ ├── test_chart_generator_coverage.py │ │ ├── test_chart_generator_inner.py │ │ ├── test_code_executor.py │ │ ├── test_embed_search.py │ │ ├── test_embed_search_coverage.py │ │ ├── test_embed_search_edge_cases.py │ │ ├── test_embed_search_inner.py │ │ ├── test_evaluation_compressor.py │ │ ├── test_fov_counts.py │ │ ├── test_geolocation.py │ │ ├── test_incidents.py │ │ ├── test_lvs_video_understanding.py │ │ ├── test_multi_incident_formatter.py │ │ ├── test_prompt_gen.py │ │ ├── test_prompt_gen_coverage.py │ │ ├── test_prompt_gen_inner.py │ │ ├── test_python_executor.py │ │ ├── test_python_executor_coverage.py │ │ ├── test_report_gen.py │ │ ├── test_rtvi_vlm_alert.py │ │ ├── test_rtvi_vlm_alert_inner.py │ │ ├── test_s3_picture_url.py │ │ ├── test_search.py │ │ ├── test_search_converters.py │ │ ├── test_search_coverage.py │ │ ├── test_search_inner.py │ │ ├── test_search_more_edge_cases.py │ │ ├── test_template_report_gen.py │ │ ├── test_video_caption.py │ │ ├── test_video_caption_coverage.py │ │ ├── test_video_caption_inner.py │ │ ├── test_video_caption_vss_inner.py │ │ ├── test_video_detailed_caption.py │ │ ├── test_video_detailed_caption_coverage.py │ │ ├── test_video_frame_timestamp.py │ │ ├── test_video_frame_timestamp_coverage.py │ │ ├── test_video_report_gen.py │ │ ├── test_video_skim_caption.py │ │ ├── test_video_skim_caption_coverage.py │ │ ├── test_video_understanding.py │ │ ├── test_video_upload_url.py │ │ ├── test_vss_summarize.py │ │ ├── test_vss_summarize_coverage.py │ │ ├── test_vss_summarize_inner.py │ │ ├── test_vst_tools.py │ │ └── vst/ │ │ ├── __init__.py │ │ ├── test_bounding_box.py │ │ ├── test_duration_coverage.py │ │ ├── test_sensor_list.py │ │ ├── test_snapshot.py │ │ ├── test_snapshot_coverage.py │ │ ├── test_snapshot_inner.py │ │ ├── test_stream_list.py │ │ ├── test_timeline.py │ │ ├── test_utils.py │ │ ├── test_video_clip.py │ │ ├── test_video_clip_coverage.py │ │ ├── test_video_clip_inner.py │ │ └── test_video_list_coverage.py │ ├── utils/ │ │ ├── __init__.py │ │ ├── test_asyncmixin.py │ │ ├── test_file_mapping.py │ │ ├── test_frame_select.py │ │ ├── test_markdown_parser.py │ │ ├── test_parser.py │ │ ├── test_reasoning_parsing.py │ │ ├── test_reasoning_utils.py │ │ ├── test_retry.py │ │ ├── test_rewrite_url_host.py │ │ ├── test_screenshot.py │ │ ├── test_time_measure.py │ │ ├── test_url_translation.py │ │ └── test_video_file.py │ └── video_analytics/ │ ├── __init__.py │ ├── test_embeddings.py │ ├── test_es_client.py │ ├── test_interface.py │ ├── test_nvschema.py │ ├── test_query_builders.py │ ├── test_tools.py │ ├── test_tools_deep_coverage.py │ ├── test_tools_edge_cases.py │ ├── test_tools_functions.py │ ├── test_tools_inner.py │ ├── test_tools_inner_fns.py │ ├── test_tools_integration.py │ └── test_utils.py ├── deployments/ │ ├── LICENSE-3rd-party.txt │ ├── MANIFEST │ ├── NOTICE.md │ ├── README.md │ ├── agents/ │ │ ├── agent_ui/ │ │ │ └── compose.yml │ │ ├── compose.yml │ │ └── vss-agent/ │ │ └── vss-agent-docker-compose.yml │ ├── compose.yml │ ├── developer-workflow/ │ │ ├── compose.yml │ │ ├── dev-profile-alerts/ │ │ │ ├── Dockerfiles/ │ │ │ │ ├── EDGE-perception.Dockerfile │ │ │ │ ├── kibana-dashboard.Dockerfile │ │ │ │ └── perception.Dockerfile │ │ │ ├── compose.yml │ │ │ ├── deepstream/ │ │ │ │ ├── EDGE-configs/ │ │ │ │ │ ├── cfg_kafka.txt │ │ │ │ │ ├── coco_classmap.txt │ │ │ │ │ ├── config_triton_nvinferserver_gdino.txt │ │ │ │ │ ├── rtdetr-960x544-labels.txt │ │ │ │ │ ├── rtdetr-960x544.txt │ │ │ │ │ └── run_config-api-rtdetr-protobuf.txt │ │ │ │ ├── configs/ │ │ │ │ │ ├── cfg_kafka.txt │ │ │ │ │ ├── coco_classmap.txt │ │ │ │ │ ├── config_triton_nvinferserver_gdino.txt │ │ │ │ │ ├── rtdetr-960x544-labels.txt │ │ │ │ │ ├── rtdetr-960x544.txt │ │ │ │ │ └── run_config-api-rtdetr-protobuf.txt │ │ │ │ └── init-scripts/ │ │ │ │ └── ds-start.sh │ │ │ ├── kibana-dashboard/ │ │ │ │ ├── init-scripts/ │ │ │ │ │ └── kibana-import-dashboard.sh │ │ │ │ └── its-kibana-objects.ndjson │ │ │ ├── nvstreamer/ │ │ │ │ └── configs/ │ │ │ │ ├── vst-config.json │ │ │ │ └── vst-storage.json │ │ │ ├── sdr/ │ │ │ │ └── docker_cluster_config.json │ │ │ ├── vlm-as-verifier/ │ │ │ │ └── configs/ │ │ │ │ ├── EDGE-LOCAL-VLM-config.yml │ │ │ │ ├── alert_type_config.json │ │ │ │ └── config.yml │ │ │ ├── vss-agent/ │ │ │ │ └── configs/ │ │ │ │ ├── config.yml │ │ │ │ └── va_mcp_server_config.yml │ │ │ ├── vss-behavior-analytics/ │ │ │ │ └── configs/ │ │ │ │ ├── vss-behavior-analytics-kafka-config.json │ │ │ │ └── vss-behavior-analytics-redis-config.json │ │ │ └── vss-video-analytics-api/ │ │ │ └── configs/ │ │ │ ├── video-analytics-api-kafka-config.json │ │ │ └── video-analytics-api-redis-config.json │ │ ├── dev-profile-base/ │ │ │ ├── compose.yml │ │ │ └── vss-agent/ │ │ │ └── configs/ │ │ │ └── config.yml │ │ ├── dev-profile-lvs/ │ │ │ ├── Dockerfiles/ │ │ │ │ └── kibana-dashboard.Dockerfile │ │ │ ├── compose.yml │ │ │ ├── kibana-dashboard/ │ │ │ │ ├── init-scripts/ │ │ │ │ │ └── kibana-import-dashboard.sh │ │ │ │ └── lvs-kibana-objects.ndjson │ │ │ └── vss-agent/ │ │ │ └── configs/ │ │ │ └── config.yml │ │ └── dev-profile-search/ │ │ ├── Dockerfiles/ │ │ │ └── kibana-dashboard.Dockerfile │ │ ├── compose.yml │ │ ├── kibana-dashboard/ │ │ │ ├── init-scripts/ │ │ │ │ └── kibana-import-dashboard.sh │ │ │ └── search-kibana-objects.ndjson │ │ ├── video-analytics-2d-app/ │ │ │ ├── Dockerfiles/ │ │ │ │ └── perception-cnn.Dockerfile │ │ │ ├── compose.yml │ │ │ ├── deepstream/ │ │ │ │ ├── configs/ │ │ │ │ │ ├── cnn-models/ │ │ │ │ │ │ ├── ds-detector-labels.txt │ │ │ │ │ │ ├── ds-kafka-config.txt │ │ │ │ │ │ ├── ds-main-config.txt │ │ │ │ │ │ ├── ds-main-redis-config.txt │ │ │ │ │ │ ├── ds-nvdcf-accuracy-tracker-config.yml │ │ │ │ │ │ ├── ds-ppl-analytics-pgie-config.yml │ │ │ │ │ │ └── ds-redis-config.txt │ │ │ │ │ └── config.csv │ │ │ │ └── init-scripts/ │ │ │ │ └── ds-start.sh │ │ │ ├── nvstreamer/ │ │ │ │ └── configs/ │ │ │ │ ├── vst-config.json │ │ │ │ └── vst-storage.json │ │ │ ├── sdr/ │ │ │ │ └── docker_cluster_config.json │ │ │ └── vss-search-analytics/ │ │ │ └── configs/ │ │ │ ├── vss-search-analytics-kafka-config.json │ │ │ └── vss-search-analytics-redis-config.json │ │ └── vss-agent/ │ │ └── configs/ │ │ └── config.yml │ ├── foundational/ │ │ ├── 3rdParty_Licenses │ │ ├── Dockerfiles/ │ │ │ ├── elastic-init.Dockerfile │ │ │ ├── elasticsearch-gpu.Dockerfile │ │ │ ├── elasticsearch.Dockerfile │ │ │ ├── kafka-health-check.Dockerfile │ │ │ └── redis-health-check.Dockerfile │ │ ├── broker-health-check/ │ │ │ └── scripts/ │ │ │ ├── check-kafka-health.sh │ │ │ └── check-redis-health.sh │ │ ├── elk/ │ │ │ ├── configs/ │ │ │ │ ├── elasticsearch.yml │ │ │ │ ├── kibana.yml │ │ │ │ ├── logstash.yml │ │ │ │ ├── mdx-kafka-logstash.conf │ │ │ │ └── mdx-redis-logstash.conf │ │ │ ├── gems/ │ │ │ │ └── logstash-input-redis_stream-3.1.0-java.gem │ │ │ ├── init-scripts/ │ │ │ │ ├── elasticsearch-ilm-policy-creation.sh │ │ │ │ ├── elasticsearch-ingest-pipeline-creation.sh │ │ │ │ └── elasticsearch-template-creation.sh │ │ │ └── pb_definitions/ │ │ │ ├── descriptors/ │ │ │ │ ├── ext.desc │ │ │ │ └── schema.desc │ │ │ └── ruby/ │ │ │ ├── ext_pb.rb │ │ │ └── schema_pb.rb │ │ ├── kafka/ │ │ │ └── init-scripts/ │ │ │ └── create-kafka-topics.sh │ │ ├── kafka-entrypoint.sh │ │ ├── mdx-foundational.yml │ │ └── redis/ │ │ └── configs/ │ │ └── redis.conf │ ├── lvs/ │ │ ├── README.md │ │ ├── compose.yml │ │ └── configs/ │ │ └── config.yaml │ ├── nim/ │ │ ├── compose.yml │ │ ├── cosmos-reason1-7b/ │ │ │ ├── compose.yml │ │ │ ├── hw-H100-shared.env │ │ │ ├── hw-H100.env │ │ │ ├── hw-L40S.env │ │ │ ├── hw-OTHER-shared.env │ │ │ ├── hw-OTHER.env │ │ │ ├── hw-RTXPRO6000BW-shared.env │ │ │ └── hw-RTXPRO6000BW.env │ │ ├── cosmos-reason2-8b/ │ │ │ ├── compose.yml │ │ │ ├── hw-DGX-SPARK-shared.env │ │ │ ├── hw-DGX-SPARK.env │ │ │ ├── hw-H100-shared.env │ │ │ ├── hw-H100.env │ │ │ ├── hw-L40S.env │ │ │ ├── hw-OTHER-shared.env │ │ │ ├── hw-OTHER.env │ │ │ ├── hw-RTXPRO6000BW-shared.env │ │ │ └── hw-RTXPRO6000BW.env │ │ ├── fallback-override.env │ │ ├── gpt-oss-20b/ │ │ │ ├── compose.yml │ │ │ ├── hw-H100-shared.env │ │ │ ├── hw-H100.env │ │ │ ├── hw-OTHER-shared.env │ │ │ ├── hw-OTHER.env │ │ │ ├── hw-RTXPRO6000BW-shared.env │ │ │ └── hw-RTXPRO6000BW.env │ │ ├── llama-3.3-nemotron-super-49b-v1.5/ │ │ │ ├── compose.yml │ │ │ ├── hw-H100-shared.env │ │ │ ├── hw-H100.env │ │ │ ├── hw-OTHER-shared.env │ │ │ ├── hw-OTHER.env │ │ │ ├── hw-RTXPRO6000BW-shared.env │ │ │ └── hw-RTXPRO6000BW.env │ │ ├── nemotron-3-nano/ │ │ │ ├── compose.yml │ │ │ ├── hw-H100-shared.env │ │ │ ├── hw-H100.env │ │ │ ├── hw-OTHER-shared.env │ │ │ ├── hw-OTHER.env │ │ │ ├── hw-RTXPRO6000BW-shared.env │ │ │ └── hw-RTXPRO6000BW.env │ │ ├── nvidia-nemotron-nano-9b-v2/ │ │ │ ├── compose.yml │ │ │ ├── hw-H100-shared.env │ │ │ ├── hw-H100.env │ │ │ ├── hw-L40S.env │ │ │ ├── hw-OTHER-shared.env │ │ │ ├── hw-OTHER.env │ │ │ ├── hw-RTXPRO6000BW-shared.env │ │ │ └── hw-RTXPRO6000BW.env │ │ ├── nvidia-nemotron-nano-9b-v2-fp8/ │ │ │ ├── compose.yml │ │ │ ├── hw-AGX-THOR-shared.env │ │ │ ├── hw-AGX-THOR.env │ │ │ ├── hw-DGX-SPARK-shared.env │ │ │ ├── hw-DGX-SPARK.env │ │ │ ├── hw-IGX-THOR-shared.env │ │ │ ├── hw-IGX-THOR.env │ │ │ ├── hw-OTHER-shared.env │ │ │ └── hw-OTHER.env │ │ └── qwen3-vl-8b-instruct/ │ │ ├── compose.yml │ │ ├── hw-H100-shared.env │ │ ├── hw-H100.env │ │ ├── hw-OTHER-shared.env │ │ ├── hw-OTHER.env │ │ ├── hw-RTXPRO6000BW-shared.env │ │ └── hw-RTXPRO6000BW.env │ ├── proxy/ │ │ ├── compose.yml │ │ └── nginx.conf.template │ ├── rtvi/ │ │ ├── compose.yml │ │ ├── rtvi-embed/ │ │ │ └── rtvi-embed-docker-compose.yml │ │ └── rtvi-vlm/ │ │ └── rtvi-vlm-docker-compose.yml │ ├── vlm-as-verifier/ │ │ ├── README.md │ │ ├── compose.yml │ │ └── scripts/ │ │ └── env-substitute.py │ └── vst/ │ ├── developer/ │ │ └── vst/ │ │ ├── configs/ │ │ │ ├── adaptor_config.json │ │ │ ├── nginx-mms.conf │ │ │ ├── nginx-mms.conf.template │ │ │ ├── nginx-vst.conf │ │ │ ├── nginx-vst.conf.template │ │ │ ├── postgresql.conf │ │ │ ├── rtsp_streams.json │ │ │ ├── vst_config.json │ │ │ ├── vst_config_kafka.json │ │ │ ├── vst_config_redis.json │ │ │ └── vst_storage.json │ │ ├── docker-compose.yaml │ │ └── sdr-streamprocessing/ │ │ ├── envoy.yaml │ │ ├── sdr-compose.yaml │ │ └── sdr-config/ │ │ ├── data_wl.yaml │ │ └── docker_cluster_config.json │ └── scripts/ │ └── user_additional_install.sh ├── scripts/ │ ├── LICENSE-3rd-party-dev-profile.txt │ ├── deploy_vss_launchable.ipynb │ └── dev-profile.sh └── ui/ ├── .dockerignore ├── .eslintrc.js ├── .gitignore ├── CODE-OF-CONDUCT.md ├── CONTRIBUTING.md ├── DOCKER-README.md ├── Dockerfile ├── LICENSE ├── LICENSE-3rd-party.txt ├── README.md ├── SECURITY.md ├── apps/ │ ├── nemo-agent-toolkit-ui/ │ │ ├── .gitignore │ │ ├── __mocks__/ │ │ │ ├── next-i18next.js │ │ │ ├── react-markdown.js │ │ │ └── websocket.ts │ │ ├── __tests__/ │ │ │ ├── api/ │ │ │ │ └── httpEndpoints.test.ts │ │ │ ├── components/ │ │ │ │ ├── Chat.conversation-state.test.tsx │ │ │ │ ├── Chat.error-recovery.test.tsx │ │ │ │ ├── Chat.human-interaction.test.tsx │ │ │ │ ├── Chat.streaming-edge-cases.test.tsx │ │ │ │ ├── Chat.ui-behavior.test.tsx │ │ │ │ ├── Chat.websocket-reliability.test.tsx │ │ │ │ └── Chat.websocket.test.tsx │ │ │ ├── types/ │ │ │ │ └── websocket.test.ts │ │ │ └── utils/ │ │ │ ├── app/ │ │ │ │ └── importExports.test.ts │ │ │ └── chatTransform.test.ts │ │ ├── docs/ │ │ │ └── ui/ │ │ │ ├── README.md │ │ │ ├── button-reference.md │ │ │ ├── chat/ │ │ │ │ └── chat-interface.md │ │ │ ├── settings/ │ │ │ │ └── configuration-management.md │ │ │ └── sidebar/ │ │ │ └── conversation-management.md │ │ ├── next-env.d.ts │ │ ├── next-i18next.config.js │ │ ├── next.config.js │ │ ├── package.json │ │ ├── pages/ │ │ │ ├── _app.tsx │ │ │ ├── _document.tsx │ │ │ ├── api/ │ │ │ │ └── chat.ts │ │ │ └── index.tsx │ │ ├── public/ │ │ │ └── locales/ │ │ │ └── en/ │ │ │ └── common.json │ │ └── tsconfig.json │ └── nv-metropolis-bp-vss-ui/ │ ├── .gitignore │ ├── README.md │ ├── components/ │ │ ├── Home.tsx │ │ ├── ModeControlsSection.tsx │ │ └── TabWithChatSidebarLayout.tsx │ ├── constants/ │ │ └── constants.tsx │ ├── hooks/ │ │ ├── useTabChatSidebarResize.ts │ │ ├── useTabChatSidebars.ts │ │ └── useTheme.ts │ ├── next-env.d.ts │ ├── next-i18next.config.js │ ├── next.config.js │ ├── package.json │ ├── pages/ │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── api/ │ │ │ └── chat.ts │ │ └── index.tsx │ ├── postcss.config.js │ ├── public/ │ │ └── locales/ │ │ └── en/ │ │ └── common.json │ ├── styles/ │ │ ├── globals.css │ │ └── rsuite-custom.css │ ├── tailwind.config.js │ ├── tsconfig.json │ └── utils/ │ ├── index.ts │ ├── searchTabChatEnv.ts │ ├── tabChatEnv.ts │ └── tabChatSidebarConfig.ts ├── custom-server.js ├── package.json ├── packages/ │ ├── nemo-agent-toolkit-ui/ │ │ ├── .dockerignore │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── .swcrc │ │ ├── README.md │ │ ├── TESTING.md │ │ ├── __mocks__/ │ │ │ ├── next-i18next.js │ │ │ ├── react-markdown.js │ │ │ └── websocket.ts │ │ ├── __tests__/ │ │ │ ├── api/ │ │ │ │ └── routes.test.ts │ │ │ ├── components/ │ │ │ │ ├── Chat.conversation-state.test.tsx │ │ │ │ ├── Chat.streaming-edge-cases.test.tsx │ │ │ │ ├── Chat.ui-behavior.test.tsx │ │ │ │ ├── Chat.websocket.test.tsx │ │ │ │ └── InteractionModal.test.tsx │ │ │ ├── proxy/ │ │ │ │ └── proxy-integration.test.js │ │ │ ├── security/ │ │ │ │ ├── json-import-validation.test.ts │ │ │ │ └── url-validation.test.ts │ │ │ ├── types/ │ │ │ │ └── websocket.test.ts │ │ │ └── utils/ │ │ │ ├── app/ │ │ │ │ └── importExports.test.ts │ │ │ └── chatTransform.test.ts │ │ ├── components/ │ │ │ ├── Avatar/ │ │ │ │ ├── AgentAvatar.tsx │ │ │ │ ├── BotAvatar.tsx │ │ │ │ ├── SystemAvatar.tsx │ │ │ │ └── UserAvatar.tsx │ │ │ ├── Buttons/ │ │ │ │ └── SidebarActionButton/ │ │ │ │ ├── SidebarActionButton.tsx │ │ │ │ └── index.ts │ │ │ ├── Chat/ │ │ │ │ ├── Chat.tsx │ │ │ │ ├── ChatFileUpload.tsx │ │ │ │ ├── ChatHeader.tsx │ │ │ │ ├── ChatInput.tsx │ │ │ │ ├── ChatInteractionMessage.tsx │ │ │ │ ├── ChatLoader.tsx │ │ │ │ ├── ChatMessage.tsx │ │ │ │ ├── CustomAgentParams.tsx │ │ │ │ ├── ErrorMessageDiv.tsx │ │ │ │ ├── MemoizedChatMessage.tsx │ │ │ │ ├── README.md │ │ │ │ └── Regenerate.tsx │ │ │ ├── Chatbar/ │ │ │ │ ├── Chatbar.context.tsx │ │ │ │ ├── Chatbar.state.tsx │ │ │ │ ├── Chatbar.tsx │ │ │ │ ├── README.md │ │ │ │ └── components/ │ │ │ │ ├── ChatFolders.tsx │ │ │ │ ├── ChatSidebarContent.tsx │ │ │ │ ├── ChatbarSettings.tsx │ │ │ │ ├── ClearConversations.tsx │ │ │ │ ├── Conversation.tsx │ │ │ │ └── Conversations.tsx │ │ │ ├── Folder/ │ │ │ │ ├── Folder.tsx │ │ │ │ ├── README.md │ │ │ │ └── index.ts │ │ │ ├── Markdown/ │ │ │ │ ├── AgentThink.tsx │ │ │ │ ├── Chart.tsx │ │ │ │ ├── CodeBlock.tsx │ │ │ │ ├── CustomComponents.tsx │ │ │ │ ├── CustomDetails.tsx │ │ │ │ ├── CustomIncidents.tsx │ │ │ │ ├── CustomSummary.tsx │ │ │ │ ├── Image.tsx │ │ │ │ ├── Loading.tsx │ │ │ │ ├── MemoizedReactMarkdown.tsx │ │ │ │ ├── Video.tsx │ │ │ │ └── VideoModal.tsx │ │ │ ├── Mobile/ │ │ │ │ └── Navbar.tsx │ │ │ ├── Search/ │ │ │ │ ├── Search.tsx │ │ │ │ └── index.ts │ │ │ ├── Settings/ │ │ │ │ ├── Import.tsx │ │ │ │ └── SettingDialog.tsx │ │ │ ├── Sidebar/ │ │ │ │ ├── README.md │ │ │ │ ├── Sidebar.tsx │ │ │ │ ├── SidebarButton.tsx │ │ │ │ ├── SidebarInner.tsx │ │ │ │ ├── components/ │ │ │ │ │ └── OpenCloseButton.tsx │ │ │ │ └── index.ts │ │ │ └── Spinner/ │ │ │ ├── Spinner.tsx │ │ │ └── index.ts │ │ ├── config.json │ │ ├── constants/ │ │ │ ├── constants.tsx │ │ │ └── index.ts │ │ ├── hooks/ │ │ │ ├── useConversationOperations.ts │ │ │ ├── useCreateReducer.ts │ │ │ └── useFolderOperations.ts │ │ ├── jest.config.js │ │ ├── jest.setup.js │ │ ├── lib-src/ │ │ │ ├── app.ts │ │ │ ├── contexts/ │ │ │ │ └── RuntimeConfigContext.tsx │ │ │ ├── index.d.ts │ │ │ ├── index.ts │ │ │ ├── server.d.ts │ │ │ └── server.ts │ │ ├── middleware.ts │ │ ├── next-env.d.ts │ │ ├── next-i18next.config.js │ │ ├── next.config.js │ │ ├── package.json │ │ ├── pages/ │ │ │ ├── _app.tsx │ │ │ ├── _document.tsx │ │ │ ├── api/ │ │ │ │ ├── chat.ts │ │ │ │ └── home/ │ │ │ │ ├── home.context.tsx │ │ │ │ ├── home.server.tsx │ │ │ │ ├── home.state.tsx │ │ │ │ ├── home.tsx │ │ │ │ └── index.ts │ │ │ └── index.tsx │ │ ├── postcss.config.js │ │ ├── prettier.config.js │ │ ├── proxy/ │ │ │ ├── request-transformers.js │ │ │ └── response-processors.js │ │ ├── public/ │ │ │ └── locales/ │ │ │ └── en/ │ │ │ ├── common.json │ │ │ └── sidebar.json │ │ ├── styles/ │ │ │ └── globals.css │ │ ├── tailwind.config.js │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.typecheck.json │ │ ├── types/ │ │ │ ├── chat.ts │ │ │ ├── data.ts │ │ │ ├── env.ts │ │ │ ├── error.ts │ │ │ ├── export.ts │ │ │ ├── folder.ts │ │ │ ├── index.ts │ │ │ ├── prompt.ts │ │ │ ├── settings.ts │ │ │ ├── storage.ts │ │ │ └── websocket.ts │ │ ├── utils/ │ │ │ ├── app/ │ │ │ │ ├── api.ts │ │ │ │ ├── clean.ts │ │ │ │ ├── codeblock.ts │ │ │ │ ├── const.ts │ │ │ │ ├── conversation.ts │ │ │ │ ├── folders.ts │ │ │ │ ├── helper.ts │ │ │ │ ├── importExport.ts │ │ │ │ ├── prompts.ts │ │ │ │ └── settings.ts │ │ │ ├── chatTransform.ts │ │ │ ├── data/ │ │ │ │ └── throttle.ts │ │ │ ├── media/ │ │ │ │ └── validation.ts │ │ │ ├── security/ │ │ │ │ ├── import-validation.ts │ │ │ │ ├── oauth-validation.ts │ │ │ │ └── url-validation.js │ │ │ ├── server/ │ │ │ │ ├── apiWrapper.ts │ │ │ │ └── chatApiHandler.ts │ │ │ └── shared/ │ │ │ ├── clipboard.ts │ │ │ ├── formatters.ts │ │ │ └── videoUpload.ts │ │ └── vitest.config.ts │ └── nv-metropolis-bp-vss-ui/ │ ├── README.md │ ├── alerts/ │ │ ├── .gitignore │ │ ├── .swcrc │ │ ├── README.md │ │ ├── __mocks__/ │ │ │ └── @nemo-agent-toolkit-ui.js │ │ ├── __tests__/ │ │ │ ├── components/ │ │ │ │ ├── AlertsComponent.test.tsx │ │ │ │ ├── CustomTimeInput.test.tsx │ │ │ │ ├── FilterControls.test.tsx │ │ │ │ └── FilterTag.test.tsx │ │ │ ├── hooks/ │ │ │ │ ├── useAlerts.test.ts │ │ │ │ ├── useAutoRefresh.test.ts │ │ │ │ ├── useFilters.test.ts │ │ │ │ ├── useTimeWindow.test.ts │ │ │ │ └── useVideoModal.test.ts │ │ │ └── utils/ │ │ │ └── timeUtils.test.ts │ │ ├── jest.config.js │ │ ├── jest.setup.js │ │ ├── lib-src/ │ │ │ ├── AlertsComponent.tsx │ │ │ ├── components/ │ │ │ │ ├── AlertsSidebarControls.tsx │ │ │ │ ├── AlertsTable.tsx │ │ │ │ ├── AutoRefreshControl.tsx │ │ │ │ ├── CustomTimeInput.tsx │ │ │ │ ├── FilterControls.tsx │ │ │ │ ├── FilterTag.tsx │ │ │ │ ├── MetadataSection.tsx │ │ │ │ ├── ThumbnailButton.tsx │ │ │ │ └── TimeFormatSwitch.tsx │ │ │ ├── hooks/ │ │ │ │ ├── useAlerts.ts │ │ │ │ ├── useAutoRefresh.ts │ │ │ │ ├── useFilters.ts │ │ │ │ ├── useTimeWindow.ts │ │ │ │ └── useVideoModal.ts │ │ │ ├── index.ts │ │ │ ├── server.d.ts │ │ │ ├── server.ts │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ └── timeUtils.ts │ │ ├── package.json │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── all/ │ │ ├── .gitignore │ │ ├── .swcrc │ │ ├── README.md │ │ ├── lib-src/ │ │ │ ├── index.d.ts │ │ │ ├── index.ts │ │ │ ├── server.d.ts │ │ │ └── server.ts │ │ ├── package.json │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── dashboard/ │ │ ├── .gitignore │ │ ├── .swcrc │ │ ├── README.md │ │ ├── lib-src/ │ │ │ ├── DashboardComponent.tsx │ │ │ ├── components/ │ │ │ │ └── DashboardSidebarControls.tsx │ │ │ ├── index.ts │ │ │ ├── server.d.ts │ │ │ └── server.ts │ │ ├── package.json │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── map/ │ │ ├── .swcrc │ │ ├── README.md │ │ ├── lib-src/ │ │ │ ├── MapComponent.tsx │ │ │ ├── components/ │ │ │ │ └── MapSidebarControls.tsx │ │ │ ├── index.ts │ │ │ ├── server.d.ts │ │ │ └── server.ts │ │ ├── package.json │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── search/ │ │ ├── .gitignore │ │ ├── .swcrc │ │ ├── README.md │ │ ├── __mocks__/ │ │ │ └── @nemo-agent-toolkit-ui.js │ │ ├── __tests__/ │ │ │ ├── components/ │ │ │ │ ├── FilterPopover.test.tsx │ │ │ │ ├── SearchComponent.test.tsx │ │ │ │ ├── SearchHeader.test.tsx │ │ │ │ └── VideoSearchList.test.tsx │ │ │ ├── hooks/ │ │ │ │ ├── useFilter.test.ts │ │ │ │ ├── useSearch.test.ts │ │ │ │ └── useVideoModal.test.ts │ │ │ └── utils/ │ │ │ ├── Formatter.test.ts │ │ │ └── agentResponseParser.test.ts │ │ ├── jest.config.js │ │ ├── jest.setup.js │ │ ├── lib-src/ │ │ │ ├── SearchComponent.tsx │ │ │ ├── components/ │ │ │ │ ├── FilterPopover.tsx │ │ │ │ ├── SearchHeader.tsx │ │ │ │ ├── SearchSidebarControls.tsx │ │ │ │ └── VideoSearchList.tsx │ │ │ ├── hooks/ │ │ │ │ ├── useFilter.ts │ │ │ │ ├── useSearch.ts │ │ │ │ └── useVideoModal.ts │ │ │ ├── index.ts │ │ │ ├── server.d.ts │ │ │ ├── server.ts │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ ├── Formatter.ts │ │ │ └── agentResponseParser.ts │ │ ├── package.json │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ └── video-management/ │ ├── .swcrc │ ├── __mocks__/ │ │ └── @nemo-agent-toolkit-ui.js │ ├── __tests__/ │ │ ├── components/ │ │ │ └── StreamsGrid.test.tsx │ │ └── utils/ │ │ └── filterStreams.test.ts │ ├── jest.config.js │ ├── jest.setup.js │ ├── lib-src/ │ │ ├── VideoManagementComponent.tsx │ │ ├── api.ts │ │ ├── components/ │ │ │ ├── AddRtspDialog.tsx │ │ │ ├── AgentUploadDialog.tsx │ │ │ ├── EmptyState.tsx │ │ │ ├── LoadingState.tsx │ │ │ ├── StreamCard.tsx │ │ │ ├── StreamsGrid.tsx │ │ │ ├── Toolbar.tsx │ │ │ ├── UploadProgressPanel.tsx │ │ │ ├── VideoManagementSidebarControls.tsx │ │ │ └── index.ts │ │ ├── constants.ts │ │ ├── hooks/ │ │ │ ├── index.ts │ │ │ ├── useStorageTimelines.ts │ │ │ └── useStreams.ts │ │ ├── index.ts │ │ ├── rtspStream.ts │ │ ├── server.ts │ │ ├── types.ts │ │ ├── utils.ts │ │ └── videoDelete.ts │ ├── package.json │ ├── tsconfig.json │ └── tsconfig.lib.json └── turbo.json