ttnn-visualizer 0.44.1__py3-none-any.whl → 0.46.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. ttnn_visualizer/csv_queries.py +1 -54
  2. ttnn_visualizer/decorators.py +3 -3
  3. ttnn_visualizer/exceptions.py +7 -1
  4. ttnn_visualizer/models.py +1 -0
  5. ttnn_visualizer/remote_sqlite_setup.py +6 -82
  6. ttnn_visualizer/sftp_operations.py +34 -106
  7. ttnn_visualizer/ssh_client.py +352 -0
  8. ttnn_visualizer/static/assets/allPaths-esBqnTg5.js +1 -0
  9. ttnn_visualizer/static/assets/allPathsLoader-KPOKJ-lr.js +2 -0
  10. ttnn_visualizer/static/assets/index-03c8d4Gh.js +1 -0
  11. ttnn_visualizer/static/assets/{index-B2fHW2_O.js → index-BANm1CMY.js} +383 -383
  12. ttnn_visualizer/static/assets/index-BuHal8Ii.css +7 -0
  13. ttnn_visualizer/static/assets/index-PKNBViIU.js +1 -0
  14. ttnn_visualizer/static/assets/splitPathsBySizeLoader-DYuDhweD.js +1 -0
  15. ttnn_visualizer/static/index.html +2 -2
  16. ttnn_visualizer/views.py +80 -181
  17. {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/METADATA +7 -3
  18. ttnn_visualizer-0.46.0.dist-info/RECORD +43 -0
  19. {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/licenses/LICENSE +6 -0
  20. ttnn_visualizer/static/assets/allPaths-CFKU23gh.js +0 -1
  21. ttnn_visualizer/static/assets/allPathsLoader-CpaihUCo.js +0 -2
  22. ttnn_visualizer/static/assets/index-B-fsa5Ru.js +0 -1
  23. ttnn_visualizer/static/assets/index-BueCaPcI.css +0 -7
  24. ttnn_visualizer/static/assets/index-DLOviMB1.js +0 -1
  25. ttnn_visualizer/static/assets/splitPathsBySizeLoader-BEb-7YZm.js +0 -1
  26. ttnn_visualizer-0.44.1.dist-info/RECORD +0 -42
  27. {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/WHEEL +0 -0
  28. {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/entry_points.txt +0 -0
  29. {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/licenses/LICENSE_understanding.txt +0 -0
  30. {ttnn_visualizer-0.44.1.dist-info → ttnn_visualizer-0.46.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1 @@
1
+ import{p as r,I as s,_ as a}from"./index-BANm1CMY.js";const n=async(o,_)=>{const i=r(o);let t;return _===s.STANDARD?t=await a(()=>import("./index-03c8d4Gh.js").then(e=>e.I),[]):t=await a(()=>import("./index-PKNBViIU.js").then(e=>e.I),[]),t[i]};export{n as splitPathsBySizeLoader};
@@ -34,8 +34,8 @@
34
34
  /* SERVER_CONFIG */
35
35
  </script>
36
36
 
37
- <script type="module" crossorigin src="/static/assets/index-B2fHW2_O.js"></script>
38
- <link rel="stylesheet" crossorigin href="/static/assets/index-BueCaPcI.css">
37
+ <script type="module" crossorigin src="/static/assets/index-BANm1CMY.js"></script>
38
+ <link rel="stylesheet" crossorigin href="/static/assets/index-BuHal8Ii.css">
39
39
  </head>
40
40
  <body>
41
41
 
ttnn_visualizer/views.py CHANGED
@@ -7,7 +7,6 @@ import json
7
7
  import logging
8
8
  import re
9
9
  import shutil
10
- import subprocess
11
10
  import time
12
11
  from http import HTTPStatus
13
12
  from pathlib import Path
@@ -67,6 +66,7 @@ from ttnn_visualizer.sftp_operations import (
67
66
  sync_remote_performance_folders,
68
67
  sync_remote_profiler_folders,
69
68
  )
69
+ from ttnn_visualizer.ssh_client import SSHClient
70
70
  from ttnn_visualizer.utils import (
71
71
  get_cluster_descriptor_path,
72
72
  read_last_synced_file,
@@ -74,123 +74,10 @@ from ttnn_visualizer.utils import (
74
74
  )
75
75
 
76
76
 
77
- def handle_ssh_subprocess_error(e: subprocess.CalledProcessError, remote_connection):
78
- """
79
- Convert subprocess SSH errors to appropriate SSH exceptions.
80
-
81
- :param e: The subprocess.CalledProcessError
82
- :param remote_connection: The RemoteConnection object for context
83
- :raises: SSHException, AuthenticationException, or NoValidConnectionsError
84
- """
85
- stderr = e.stderr.lower() if e.stderr else ""
86
-
87
- # Check for authentication failures
88
- if any(
89
- auth_err in stderr
90
- for auth_err in [
91
- "permission denied",
92
- "authentication failed",
93
- "publickey",
94
- "password",
95
- "host key verification failed",
96
- ]
97
- ):
98
- raise AuthenticationException(
99
- f"SSH authentication failed: {remote_connection.username}@{remote_connection.host}: Permission denied (publickey,password)"
100
- )
101
-
102
- # Check for connection failures
103
- elif any(
104
- conn_err in stderr
105
- for conn_err in [
106
- "connection refused",
107
- "network is unreachable",
108
- "no route to host",
109
- "name or service not known",
110
- "connection timed out",
111
- ]
112
- ):
113
- raise NoValidConnectionsError(f"SSH connection failed: {e.stderr}")
114
-
115
- # Check for general SSH protocol errors
116
- elif "ssh:" in stderr or "protocol" in stderr:
117
- raise SSHException(f"SSH protocol error: {e.stderr}")
118
-
119
- # Default to generic SSH exception
120
- else:
121
- raise SSHException(f"SSH command failed: {e.stderr}")
122
-
123
-
124
77
  def test_ssh_connection(connection) -> bool:
125
78
  """Test SSH connection by running a simple command."""
126
- ssh_cmd = ["ssh", "-o", "PasswordAuthentication=no"]
127
-
128
- # Handle non-standard SSH port
129
- if connection.port != 22:
130
- ssh_cmd.extend(["-p", str(connection.port)])
131
-
132
- ssh_cmd.extend(
133
- [f"{connection.username}@{connection.host}", "echo 'SSH connection test'"]
134
- )
135
-
136
- try:
137
- result = subprocess.run(
138
- ssh_cmd, capture_output=True, text=True, check=True, timeout=10
139
- )
140
- return True
141
- except subprocess.CalledProcessError as e:
142
- if e.returncode == 255: # SSH protocol errors
143
- try:
144
- handle_ssh_subprocess_error(e, connection)
145
- except AuthenticationException:
146
- # Convert to AuthenticationFailedException for proper HTTP 422 response
147
- user_message = (
148
- "SSH authentication failed. This application requires SSH key-based authentication. "
149
- "Please ensure your SSH public key is added to the authorized_keys file on the remote server. "
150
- "Password authentication is not supported."
151
- )
152
- logger.info(
153
- f"SSH authentication failed for {connection.username}@{connection.host}: {user_message}"
154
- )
155
- raise AuthenticationFailedException(message=user_message)
156
- except NoValidConnectionsError as ssh_err:
157
- user_message = (
158
- f"Unable to establish SSH connection to {connection.host}. "
159
- "Please check the hostname, port, and network connectivity. "
160
- "Ensure SSH key-based authentication is properly configured."
161
- )
162
- logger.warning(
163
- f"SSH connection failed for {connection.username}@{connection.host}: {user_message}"
164
- )
165
- raise RemoteConnectionException(
166
- message=user_message, status=ConnectionTestStates.FAILED
167
- )
168
- except SSHException as ssh_err:
169
- user_message = f"SSH connection error to {connection.host}: {str(ssh_err)}. Ensure SSH key-based authentication is properly configured."
170
- logger.warning(
171
- f"SSH error for {connection.username}@{connection.host}: {user_message}"
172
- )
173
- raise RemoteConnectionException(
174
- message=user_message, status=ConnectionTestStates.FAILED
175
- )
176
- else:
177
- error_message = f"SSH connection test failed: {e.stderr}"
178
- logger.error(
179
- f"SSH test failed for {connection.username}@{connection.host}: {error_message}"
180
- )
181
- raise RemoteConnectionException(
182
- message=error_message, status=ConnectionTestStates.FAILED
183
- )
184
- return False
185
- except subprocess.TimeoutExpired:
186
- timeout_message = "SSH connection test timed out"
187
- logger.warning(
188
- f"SSH timeout for {connection.username}@{connection.host}: {timeout_message}"
189
- )
190
- raise RemoteConnectionException(
191
- message=timeout_message, status=ConnectionTestStates.FAILED
192
- )
193
- return False
79
+ ssh_client = SSHClient(connection)
80
+ return ssh_client.test_connection()
194
81
 
195
82
 
196
83
  logger = logging.getLogger(__name__)
@@ -643,9 +530,11 @@ def get_performance_data_list(instance: Instance):
643
530
  / connection.host
644
531
  / current_app.config["PERFORMANCE_DIRECTORY_NAME"]
645
532
  )
646
- directory_names = [
647
- directory.name for directory in path.iterdir() if directory.is_dir()
648
- ]
533
+ directory_names = (
534
+ [directory.name for directory in path.iterdir() if directory.is_dir()]
535
+ if path.exists()
536
+ else []
537
+ )
649
538
 
650
539
  valid_dirs = []
651
540
 
@@ -670,7 +559,12 @@ def get_performance_data_list(instance: Instance):
670
559
  if not any(file.name.startswith("ops_perf_results") for file in files):
671
560
  continue
672
561
 
673
- valid_dirs.append({"path": dir_path.name, "reportName": dir_path.name})
562
+ valid_dirs.append(
563
+ {
564
+ "path": dir_path.name,
565
+ "reportName": dir_path.name,
566
+ }
567
+ )
674
568
 
675
569
  return jsonify(valid_dirs)
676
570
 
@@ -761,7 +655,10 @@ def get_performance_results_data_raw(instance: Instance):
761
655
  @with_instance
762
656
  def get_performance_results_report(instance: Instance):
763
657
  if not instance.performance_path:
764
- return Response(status=HTTPStatus.NOT_FOUND)
658
+ return Response(
659
+ status=HTTPStatus.BAD_REQUEST,
660
+ response="No performance data found for instance.",
661
+ )
765
662
 
766
663
  name = request.args.get("name", None)
767
664
 
@@ -1101,8 +998,8 @@ def test_remote_folder():
1101
998
  connection = RemoteConnection.model_validate(connection_data)
1102
999
  statuses = []
1103
1000
 
1104
- def add_status(status, message):
1105
- statuses.append(StatusMessage(status=status, message=message))
1001
+ def add_status(status, message, detail=None):
1002
+ statuses.append(StatusMessage(status=status, message=message, detail=detail))
1106
1003
 
1107
1004
  def has_failures():
1108
1005
  return any(
@@ -1115,21 +1012,29 @@ def test_remote_folder():
1115
1012
  add_status(ConnectionTestStates.OK.value, "SSH connection established")
1116
1013
  except AuthenticationFailedException as e:
1117
1014
  # Return 422 for authentication failures
1118
- add_status(ConnectionTestStates.FAILED.value, e.message)
1015
+ add_status(
1016
+ ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
1017
+ )
1119
1018
  return [status.model_dump() for status in statuses], e.http_status
1120
1019
  except RemoteConnectionException as e:
1121
- add_status(ConnectionTestStates.FAILED.value, e.message)
1020
+ add_status(
1021
+ ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
1022
+ )
1122
1023
 
1123
1024
  # Test Directory Configuration
1124
- if not has_failures():
1025
+ if not has_failures() and connection.profilerPath:
1125
1026
  try:
1126
1027
  check_remote_path_exists(connection, "profilerPath")
1127
1028
  add_status(ConnectionTestStates.OK.value, "Memory folder path exists")
1128
1029
  except AuthenticationFailedException as e:
1129
- add_status(ConnectionTestStates.FAILED.value, e.message)
1030
+ add_status(
1031
+ ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
1032
+ )
1130
1033
  return [status.model_dump() for status in statuses], e.http_status
1131
1034
  except RemoteConnectionException as e:
1132
- add_status(ConnectionTestStates.FAILED.value, e.message)
1035
+ add_status(
1036
+ ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
1037
+ )
1133
1038
 
1134
1039
  # Test Directory Configuration (perf)
1135
1040
  if not has_failures() and connection.performancePath:
@@ -1137,20 +1042,28 @@ def test_remote_folder():
1137
1042
  check_remote_path_exists(connection, "performancePath")
1138
1043
  add_status(ConnectionTestStates.OK.value, "Performance folder path exists")
1139
1044
  except AuthenticationFailedException as e:
1140
- add_status(ConnectionTestStates.FAILED.value, e.message)
1045
+ add_status(
1046
+ ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
1047
+ )
1141
1048
  return [status.model_dump() for status in statuses], e.http_status
1142
1049
  except RemoteConnectionException as e:
1143
- add_status(ConnectionTestStates.FAILED.value, e.message)
1050
+ add_status(
1051
+ ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
1052
+ )
1144
1053
 
1145
1054
  # Check for Project Configurations
1146
1055
  if not has_failures():
1147
1056
  try:
1148
1057
  check_remote_path_for_reports(connection)
1149
1058
  except AuthenticationFailedException as e:
1150
- add_status(ConnectionTestStates.FAILED.value, e.message)
1059
+ add_status(
1060
+ ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
1061
+ )
1151
1062
  return [status.model_dump() for status in statuses], e.http_status
1152
1063
  except RemoteConnectionException as e:
1153
- add_status(ConnectionTestStates.FAILED.value, e.message)
1064
+ add_status(
1065
+ ConnectionTestStates.FAILED.value, e.message, getattr(e, "detail", None)
1066
+ )
1154
1067
 
1155
1068
  return [status.model_dump() for status in statuses]
1156
1069
 
@@ -1159,7 +1072,8 @@ def test_remote_folder():
1159
1072
  def read_remote_folder():
1160
1073
  connection = RemoteConnection.model_validate(request.json, strict=False)
1161
1074
  try:
1162
- content = read_remote_file(connection, remote_path=connection.path)
1075
+ # Only profilerPath is relevant here as we're reading the stack trace file
1076
+ content = read_remote_file(connection, remote_path=connection.profilerPath)
1163
1077
  except RemoteConnectionException as e:
1164
1078
  return Response(status=e.http_status, response=e.message)
1165
1079
  return Response(status=200, response=content)
@@ -1174,33 +1088,37 @@ def sync_remote_folder():
1174
1088
  if not request_body or not isinstance(request_body, dict):
1175
1089
  return jsonify({"error": "Invalid or missing JSON data"}), 400
1176
1090
 
1177
- folder = request_body.get("folder")
1178
- profile = request_body.get("profile", None)
1091
+ profiler = request_body.get("profiler")
1092
+ performance = request_body.get("performance", None)
1179
1093
  instance_id = request.args.get("instanceId", None)
1180
1094
  connection = RemoteConnection.model_validate(
1181
1095
  request_body.get("connection"), strict=False
1182
1096
  )
1183
1097
 
1184
- if profile:
1185
- profile_folder = RemoteReportFolder.model_validate(profile, strict=False)
1098
+ if performance:
1099
+ performance_folder = RemoteReportFolder.model_validate(
1100
+ performance, strict=False
1101
+ )
1186
1102
  try:
1187
1103
  sync_remote_performance_folders(
1188
1104
  connection,
1189
1105
  remote_dir,
1190
- profile=profile_folder,
1106
+ performance=performance_folder,
1191
1107
  exclude_patterns=[r"/tensors(/|$)"],
1192
1108
  sid=instance_id,
1193
1109
  )
1194
1110
 
1195
- profile_folder.lastSynced = int(time.time())
1111
+ performance_folder.lastSynced = int(time.time())
1196
1112
 
1197
- return profile_folder.model_dump()
1113
+ return performance_folder.model_dump()
1198
1114
 
1199
1115
  except RemoteConnectionException as e:
1200
1116
  return Response(status=e.http_status, response=e.message)
1201
1117
 
1202
1118
  try:
1203
- remote_profiler_folder = RemoteReportFolder.model_validate(folder, strict=False)
1119
+ remote_profiler_folder = RemoteReportFolder.model_validate(
1120
+ profiler, strict=False
1121
+ )
1204
1122
 
1205
1123
  sync_remote_profiler_folders(
1206
1124
  connection,
@@ -1247,55 +1165,36 @@ def detect_sqlite_path():
1247
1165
  def use_remote_folder():
1248
1166
  data = request.get_json(force=True)
1249
1167
  connection = data.get("connection", None)
1250
- folder = data.get("folder", None)
1251
- profile = data.get("profile", None)
1168
+ profiler = data.get("profiler", None)
1169
+ performance = data.get("performance", None)
1252
1170
 
1253
- if not connection or not folder:
1171
+ if not connection or not (profiler or performance):
1254
1172
  return Response(status=HTTPStatus.BAD_REQUEST)
1255
1173
 
1256
1174
  connection = RemoteConnection.model_validate(connection, strict=False)
1257
- folder = RemoteReportFolder.model_validate(folder, strict=False)
1258
- performance_name = None
1259
- remote_performance_folder = None
1260
1175
 
1261
- if profile:
1262
- remote_performance_folder = RemoteReportFolder.model_validate(
1263
- profile, strict=False
1264
- )
1265
- performance_name = remote_performance_folder.reportName
1266
-
1267
- data_directory = current_app.config["REMOTE_DATA_DIRECTORY"]
1268
- profiler_name = folder.remotePath.split("/")[-1]
1269
- folder_name = folder.remotePath.split("/")[-1]
1270
-
1271
- connection_directory = Path(
1272
- data_directory,
1273
- connection.host,
1274
- current_app.config["PROFILER_DIRECTORY_NAME"],
1275
- folder_name,
1276
- )
1176
+ kwargs = {
1177
+ "instance_id": request.args.get("instanceId"),
1178
+ "remote_connection": connection,
1179
+ }
1277
1180
 
1278
- if not connection_directory.exists():
1279
- return Response(
1280
- status=HTTPStatus.INTERNAL_SERVER_ERROR,
1281
- response=f"{connection_directory} does not exist.",
1181
+ if profiler:
1182
+ remote_profiler_folder = RemoteReportFolder.model_validate(
1183
+ profiler,
1184
+ strict=False,
1282
1185
  )
1186
+ kwargs["remote_profiler_folder"] = remote_profiler_folder
1187
+ kwargs["profiler_name"] = remote_profiler_folder.remotePath.split("/")[-1]
1283
1188
 
1284
- remote_path = (
1285
- f"{Path(data_directory).name}/{connection.host}/{connection_directory.name}"
1286
- )
1287
-
1288
- instance_id = request.args.get("instanceId")
1289
- current_app.logger.info(f"Setting active reports for {instance_id} - {remote_path}")
1189
+ if performance:
1190
+ remote_performance_folder = RemoteReportFolder.model_validate(
1191
+ performance,
1192
+ strict=False,
1193
+ )
1194
+ kwargs["remote_performance_folder"] = remote_performance_folder
1195
+ kwargs["performance_name"] = remote_performance_folder.reportName
1290
1196
 
1291
- update_instance(
1292
- instance_id=instance_id,
1293
- profiler_name=profiler_name,
1294
- performance_name=performance_name,
1295
- remote_connection=connection,
1296
- remote_profiler_folder=folder,
1297
- remote_performance_folder=remote_performance_folder,
1298
- )
1197
+ update_instance(**kwargs)
1299
1198
 
1300
1199
  return Response(status=HTTPStatus.OK)
1301
1200
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ttnn_visualizer
3
- Version: 0.44.1
3
+ Version: 0.46.0
4
4
  Summary: TT-NN Visualizer
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -18,8 +18,8 @@ Requires-Dist: Flask==3.1.1
18
18
  Requires-Dist: gevent==24.10.2
19
19
  Requires-Dist: gunicorn~=23.0.0
20
20
  Requires-Dist: pandas==2.2.3
21
- Requires-Dist: pydantic_core==2.18.4
22
- Requires-Dist: pydantic==2.7.3
21
+ Requires-Dist: pydantic_core==2.27.1
22
+ Requires-Dist: pydantic==2.10.3
23
23
  Requires-Dist: python-dotenv==1.0.1
24
24
  Requires-Dist: PyYAML==6.0.2
25
25
  Requires-Dist: tt-perf-report==1.0.7
@@ -29,6 +29,7 @@ Provides-Extra: dev
29
29
  Requires-Dist: black==25.1.0; extra == "dev"
30
30
  Requires-Dist: isort==6.0.1; extra == "dev"
31
31
  Requires-Dist: mypy; extra == "dev"
32
+ Requires-Dist: playwright==1.48.0; extra == "dev"
32
33
  Requires-Dist: pytest==8.4.1; extra == "dev"
33
34
  Dynamic: license-file
34
35
 
@@ -137,6 +138,9 @@ Unzip the files into their own directories and select them with the local folder
137
138
  **Llama mlp**
138
139
  [memory + performance report](https://github.com/user-attachments/files/18770763/llama_attn_32l_10iter_30jan.zip)
139
140
 
141
+ **N300 llama**
142
+ [memory + performance report with NPE data + cluster description](https://github.com/user-attachments/files/21496609/n300.zip)
143
+
140
144
  ### NPE report
141
145
 
142
146
  **T3K synthetic**
@@ -0,0 +1,43 @@
1
+ ttnn_visualizer/__init__.py,sha256=FCQeTWnXsf-Wx-fay53-lQsm0y5-GcPMUmzhE5upDx0,93
2
+ ttnn_visualizer/app.py,sha256=q5Tb_69HawKdiw2uKe6_cOmYfvU5as40DoREvLfb_38,7281
3
+ ttnn_visualizer/csv_queries.py,sha256=lSqjDiZiCVhTkxgkixRJjxvvHLPzzm6Lx8jZ8x4BoIA,15086
4
+ ttnn_visualizer/decorators.py,sha256=8k73rTiGPSpPP5CHxzLxTQPxoQTAlhMQNcEbplQL3Ek,5805
5
+ ttnn_visualizer/enums.py,sha256=SEIqp1tlc_zw2vQ8nHH9YTaV0m3Cb8fjn_goqz5wurE,203
6
+ ttnn_visualizer/exceptions.py,sha256=XwTIykJpdvZV8nqrd9JZdHIYL0EBFBhTbE9H09VZluA,2273
7
+ ttnn_visualizer/extensions.py,sha256=6OIRJ8-_ccfjOaXSruRXiS29jEbxp4Pyk-0JlD8IHBQ,379
8
+ ttnn_visualizer/file_uploads.py,sha256=05FzYjZZy1RHuGgFeJiAjtrpzYd6KcrZzpvIjBCUZss,5011
9
+ ttnn_visualizer/instances.py,sha256=XctQgQXdlwtuXWFXFletRoX1m1lGUZdiW3TwIIjY0uw,11564
10
+ ttnn_visualizer/models.py,sha256=oxZVvWjtBDP0X6GqoYaH4wDa5PqJF_vG_I3Q_YWHMmo,7814
11
+ ttnn_visualizer/queries.py,sha256=3Nv0jXIDNVH-qKx9xc9zSINy4FdmDidu-1I6f-VYV48,9603
12
+ ttnn_visualizer/remote_sqlite_setup.py,sha256=VdJk5LfkaJo1XPC-yxy909I0AOgJF1GUjryj0Oe0O14,3498
13
+ ttnn_visualizer/serializers.py,sha256=LmjHIrFg8BLx1JKVFh9Nd_TcA7nyy1MwY2BOGnX1MKw,8029
14
+ ttnn_visualizer/settings.py,sha256=k2EEjbQNR8khbl5IrOetBPhbqgLlqXvuhm0E2z9ImCM,4607
15
+ ttnn_visualizer/sftp_operations.py,sha256=9HwbPJPSO1UUQ98d5zeWAkEwR0zFPryUakcI68GqkVw,30181
16
+ ttnn_visualizer/sockets.py,sha256=W5pK0QmlsU58EH_Qnra6HlcswLS7vsw5C_pk4avVYvs,3706
17
+ ttnn_visualizer/ssh_client.py,sha256=-GS2_1tdlUqVoLfRS02i3_o1fQaM39UQN-jtAnPBmzQ,13511
18
+ ttnn_visualizer/utils.py,sha256=MYCpvP9z8yoIVwI2Sa3iUahajZMLDxRmtRWrrUyB4_8,6223
19
+ ttnn_visualizer/views.py,sha256=b1ayDuH7zTVr5Pi5KGkpLZMnUvX2pDjljFWDkumcCq0,43224
20
+ ttnn_visualizer/static/index.html,sha256=RDJv0bYnRGaMh0KzFqsdaZd8OmO05JRyI-z2L1KSchE,1135
21
+ ttnn_visualizer/static/assets/allPaths-esBqnTg5.js,sha256=pdwKU_Qg1xSwaKMha-qO5SOzutgGME6EvbxnWSe3PgI,255
22
+ ttnn_visualizer/static/assets/allPathsLoader-KPOKJ-lr.js,sha256=f2t5H20m8LuOmh5qygz1a-sSLhHuLWXiGxTF9FargnM,477
23
+ ttnn_visualizer/static/assets/index-03c8d4Gh.js,sha256=k0jIi5q-lzXcPCqAD7K091vBMOkJHmx_fYcYKh-fOnM,285602
24
+ ttnn_visualizer/static/assets/index-BANm1CMY.js,sha256=uXWWiSs-Cs1MWW_pldHWmFOigc5b6WNH6lR_HC0pUGA,7880800
25
+ ttnn_visualizer/static/assets/index-BuHal8Ii.css,sha256=YCXZxX68jwt682YZ5gMTPzmXN9r2NjHfItOsrCQqRXk,622571
26
+ ttnn_visualizer/static/assets/index-PKNBViIU.js,sha256=dUuCyAPr_QvvTY0Xula4q4rgOm1J7xgdbppL67off4k,294225
27
+ ttnn_visualizer/static/assets/site-BTBrvHC5.webmanifest,sha256=Uy_XmnGuYFVf-OZuma2NvgEPdrCrevb3HZvaxSIHoA0,456
28
+ ttnn_visualizer/static/assets/splitPathsBySizeLoader-DYuDhweD.js,sha256=MWFWsPb9LjIyB4wpVSbMlOp3pN0673afNlKBfTZg-Dg,281
29
+ ttnn_visualizer/static/favicon/android-chrome-192x192.png,sha256=BZWA09Zxaa3fXbaeS6nhWo2e-DUSjm9ElzNQ_xTB5XU,6220
30
+ ttnn_visualizer/static/favicon/android-chrome-512x512.png,sha256=HBiJSZyguB3o8fMJuqIGcpeBy_9JOdImme3wD02UYCw,62626
31
+ ttnn_visualizer/static/favicon/favicon-32x32.png,sha256=Zw201qUsczQv1UvoQvJf5smQ2ss10xaTeWxmQNYCGtY,480
32
+ ttnn_visualizer/static/favicon/favicon.svg,sha256=wDPY3VrekJ_DE1TnJ2vUy602K3S4Xe9TgrdZ7jXK9c8,633
33
+ ttnn_visualizer/static/sample-data/cluster-desc.yaml,sha256=LMxOmsRUXtVVU5ogzYkXUozB3dg2IzqIRJQpV_O5qMU,29618
34
+ ttnn_visualizer/tests/__init__.py,sha256=FCQeTWnXsf-Wx-fay53-lQsm0y5-GcPMUmzhE5upDx0,93
35
+ ttnn_visualizer/tests/test_queries.py,sha256=HqaDXwudZpXiigJdHkdJP8oiUc-PtHASbpLnQQpbD7A,13792
36
+ ttnn_visualizer/tests/test_serializers.py,sha256=AF6m6tvewnZ_OSQMgMTUhsOI26GdJHPajvnRGIa9P4U,18492
37
+ ttnn_visualizer-0.46.0.dist-info/licenses/LICENSE,sha256=WBbTfgMRePWa_1qrAP1iLhxywPnoSIbTAipSk1eeN6U,15301
38
+ ttnn_visualizer-0.46.0.dist-info/licenses/LICENSE_understanding.txt,sha256=pymi-yb_RvYM9p2ZA4iSNsImcvhDBBxlGuJCY9dTq7M,233
39
+ ttnn_visualizer-0.46.0.dist-info/METADATA,sha256=T7YviW1Jmjd5ymxtEbIdAhDCEV_9feKk61HHFYBOzKc,7751
40
+ ttnn_visualizer-0.46.0.dist-info/WHEEL,sha256=lTU6B6eIfYoiQJTZNc-fyaR6BpL6ehTzU3xGYxn2n8k,91
41
+ ttnn_visualizer-0.46.0.dist-info/entry_points.txt,sha256=QpuUpkmQ_mEHJTMqOBdU0MH2Z4WF_9iFsGACeyyAO1E,61
42
+ ttnn_visualizer-0.46.0.dist-info/top_level.txt,sha256=M1EGkvDOuIfbhDbcUdz2-TSdmCtDoQ2Uyag9k5JLDSY,16
43
+ ttnn_visualizer-0.46.0.dist-info/RECORD,,
@@ -82,13 +82,18 @@ The following separate and independent dependencies are utilized by this project
82
82
  - @blueprintjs/icons – Apache-2.0 – https://github.com/palantir/blueprint/blob/develop/packages/icons/LICENSE
83
83
  - @blueprintjs/select – Apache-2.0 – https://github.com/palantir/blueprint/blob/develop/packages/select/LICENSE
84
84
  - @blueprintjs/table – Apache-2.0 – https://github.com/palantir/blueprint/blob/develop/packages/table/LICENSE
85
+ - @eslint/eslintrc – MIT – https://github.com/eslint/eslintrc/blob/main/LICENSE
86
+ - @eslint/js – MIT – https://github.com/eslint/eslint/blob/main/LICENSE
87
+ - @eslint/rewrite – Apache-2.0 – https://github.com/eslint/rewrite/blob/main/LICENSE
85
88
  - @tanstack/react-virtual – MIT – https://github.com/TanStack/virtual/blob/main/LICENSE
86
89
  - @types/tinycolor2 – MIT – https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/tinycolor2/LICENSE
87
90
  - axios – MIT – https://github.com/axios/axios/blob/v1.x/LICENSE
88
91
  - css-select – BSD‑2-Clause – https://github.com/fb55/css-select/blob/master/LICENSE
89
92
  - dom-serializer – MIT – https://github.com/cheeriojs/dom-serializer/blob/master/LICENSE
93
+ - globals – MIT – https://github.com/sindresorhus/globals/blob/main/license
90
94
  - immutable – MIT – https://github.com/immutable-js/immutable-js/blob/master/LICENSE
91
95
  - jotai – MIT – https://github.com/pmndrs/jotai/blob/main/LICENSE
96
+ - jsdom - MIT - https://github.com/jsdom/jsdom/blob/main/LICENSE.txt
92
97
  - mini-svg-data-uri – MIT – https://github.com/tigt/mini-svg-data-uri/blob/master/LICENSE
93
98
  - normalize.css – MIT – https://github.com/necolas/normalize.css/blob/master/LICENSE.md
94
99
  - papaparse – MIT – https://github.com/mholt/PapaParse/blob/master/LICENSE
@@ -122,5 +127,6 @@ The following separate and independent dependencies are utilized by this project
122
127
  - build – MIT https://opensource.org/license/mit
123
128
  - tt-perf-report – MIT https://opensource.org/license/mit
124
129
  - zstd (python-zstandard) – BSD‑3‑Clause – https://github.com/indygreg/python-zstandard/blob/main/LICENSE
130
+ - playwright – Apache-2.0 – https://github.com/microsoft/playwright-python/blob/main/LICENSE
125
131
 
126
132
  - Upload Release Assets - GitHub Action - MIT - https://github.com/AButler/upload-release-assets/blob/master/LICENSE
@@ -1 +0,0 @@
1
- import{I as n}from"./index-DLOviMB1.js";import{I as e}from"./index-B-fsa5Ru.js";import{p as r,I as s}from"./index-B2fHW2_O.js";function I(o,t){var a=r(o);return t===s.STANDARD?n[a]:e[a]}function p(o){return r(o)}export{n as IconSvgPaths16,e as IconSvgPaths20,I as getIconPaths,p as iconNameToPathsRecordKey};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/allPaths-CFKU23gh.js","assets/index-DLOviMB1.js","assets/index-B-fsa5Ru.js","assets/index-B2fHW2_O.js","assets/index-BueCaPcI.css"])))=>i.map(i=>d[i]);
2
- import{_ as o,a as n,b as i}from"./index-B2fHW2_O.js";var _=function(e,a){return o(void 0,void 0,void 0,function(){var t;return n(this,function(r){switch(r.label){case 0:return[4,i(()=>import("./allPaths-CFKU23gh.js"),__vite__mapDeps([0,1,2,3,4]))];case 1:return t=r.sent().getIconPaths,[2,t(e,a)]}})})};export{_ as allPathsLoader};