umanggarg commited on
Commit
6dbae4c
·
1 Parent(s): b3e7628

feat: add PostHog analytics — track pageviews, queries, repo selections, diagram views

Browse files
Files changed (4) hide show
  1. ui/package-lock.json +390 -0
  2. ui/package.json +1 -0
  3. ui/src/App.jsx +6 -2
  4. ui/src/main.jsx +7 -0
ui/package-lock.json CHANGED
@@ -11,6 +11,7 @@
11
  "@vercel/analytics": "^2.0.1",
12
  "d3": "^7.9.0",
13
  "mermaid": "^11.13.0",
 
14
  "react": "^19.2.4",
15
  "react-dom": "^19.2.4",
16
  "react-markdown": "^10.1.0",
@@ -993,6 +994,300 @@
993
  "langium": "^4.0.0"
994
  }
995
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
996
  "node_modules/@rolldown/pluginutils": {
997
  "version": "1.0.0-beta.27",
998
  "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
@@ -1645,6 +1940,14 @@
1645
  "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
1646
  "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="
1647
  },
 
 
 
 
 
 
 
 
1648
  "node_modules/@types/prismjs": {
1649
  "version": "1.26.6",
1650
  "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz",
@@ -2051,6 +2354,16 @@
2051
  "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
2052
  "dev": true
2053
  },
 
 
 
 
 
 
 
 
 
 
2054
  "node_modules/cose-base": {
2055
  "version": "1.0.3",
2056
  "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",
@@ -2904,6 +3217,11 @@
2904
  "url": "https://github.com/sponsors/wooorm"
2905
  }
2906
  },
 
 
 
 
 
2907
  "node_modules/file-entry-cache": {
2908
  "version": "8.0.0",
2909
  "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
@@ -3508,6 +3826,11 @@
3508
  "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
3509
  "dev": true
3510
  },
 
 
 
 
 
3511
  "node_modules/longest-streak": {
3512
  "version": "3.1.0",
3513
  "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
@@ -4666,6 +4989,35 @@
4666
  "node": "^10 || ^12 || >=14"
4667
  }
4668
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4669
  "node_modules/prelude-ls": {
4670
  "version": "1.2.1",
4671
  "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -4692,6 +5044,29 @@
4692
  "url": "https://github.com/sponsors/wooorm"
4693
  }
4694
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4695
  "node_modules/punycode": {
4696
  "version": "2.3.1",
4697
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -4701,6 +5076,11 @@
4701
  "node": ">=6"
4702
  }
4703
  },
 
 
 
 
 
4704
  "node_modules/react": {
4705
  "version": "19.2.4",
4706
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
@@ -5125,6 +5505,11 @@
5125
  "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
5126
  "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="
5127
  },
 
 
 
 
 
5128
  "node_modules/unified": {
5129
  "version": "11.0.5",
5130
  "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
@@ -5433,6 +5818,11 @@
5433
  "url": "https://github.com/sponsors/wooorm"
5434
  }
5435
  },
 
 
 
 
 
5436
  "node_modules/which": {
5437
  "version": "2.0.2",
5438
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
 
11
  "@vercel/analytics": "^2.0.1",
12
  "d3": "^7.9.0",
13
  "mermaid": "^11.13.0",
14
+ "posthog-js": "^1.366.0",
15
  "react": "^19.2.4",
16
  "react-dom": "^19.2.4",
17
  "react-markdown": "^10.1.0",
 
994
  "langium": "^4.0.0"
995
  }
996
  },
997
+ "node_modules/@opentelemetry/api": {
998
+ "version": "1.9.1",
999
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz",
1000
+ "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==",
1001
+ "engines": {
1002
+ "node": ">=8.0.0"
1003
+ }
1004
+ },
1005
+ "node_modules/@opentelemetry/api-logs": {
1006
+ "version": "0.208.0",
1007
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz",
1008
+ "integrity": "sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==",
1009
+ "dependencies": {
1010
+ "@opentelemetry/api": "^1.3.0"
1011
+ },
1012
+ "engines": {
1013
+ "node": ">=8.0.0"
1014
+ }
1015
+ },
1016
+ "node_modules/@opentelemetry/core": {
1017
+ "version": "2.2.0",
1018
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz",
1019
+ "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==",
1020
+ "dependencies": {
1021
+ "@opentelemetry/semantic-conventions": "^1.29.0"
1022
+ },
1023
+ "engines": {
1024
+ "node": "^18.19.0 || >=20.6.0"
1025
+ },
1026
+ "peerDependencies": {
1027
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
1028
+ }
1029
+ },
1030
+ "node_modules/@opentelemetry/exporter-logs-otlp-http": {
1031
+ "version": "0.208.0",
1032
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.208.0.tgz",
1033
+ "integrity": "sha512-jOv40Bs9jy9bZVLo/i8FwUiuCvbjWDI+ZW13wimJm4LjnlwJxGgB+N/VWOZUTpM+ah/awXeQqKdNlpLf2EjvYg==",
1034
+ "dependencies": {
1035
+ "@opentelemetry/api-logs": "0.208.0",
1036
+ "@opentelemetry/core": "2.2.0",
1037
+ "@opentelemetry/otlp-exporter-base": "0.208.0",
1038
+ "@opentelemetry/otlp-transformer": "0.208.0",
1039
+ "@opentelemetry/sdk-logs": "0.208.0"
1040
+ },
1041
+ "engines": {
1042
+ "node": "^18.19.0 || >=20.6.0"
1043
+ },
1044
+ "peerDependencies": {
1045
+ "@opentelemetry/api": "^1.3.0"
1046
+ }
1047
+ },
1048
+ "node_modules/@opentelemetry/otlp-exporter-base": {
1049
+ "version": "0.208.0",
1050
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.208.0.tgz",
1051
+ "integrity": "sha512-gMd39gIfVb2OgxldxUtOwGJYSH8P1kVFFlJLuut32L6KgUC4gl1dMhn+YC2mGn0bDOiQYSk/uHOdSjuKp58vvA==",
1052
+ "dependencies": {
1053
+ "@opentelemetry/core": "2.2.0",
1054
+ "@opentelemetry/otlp-transformer": "0.208.0"
1055
+ },
1056
+ "engines": {
1057
+ "node": "^18.19.0 || >=20.6.0"
1058
+ },
1059
+ "peerDependencies": {
1060
+ "@opentelemetry/api": "^1.3.0"
1061
+ }
1062
+ },
1063
+ "node_modules/@opentelemetry/otlp-transformer": {
1064
+ "version": "0.208.0",
1065
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.208.0.tgz",
1066
+ "integrity": "sha512-DCFPY8C6lAQHUNkzcNT9R+qYExvsk6C5Bto2pbNxgicpcSWbe2WHShLxkOxIdNcBiYPdVHv/e7vH7K6TI+C+fQ==",
1067
+ "dependencies": {
1068
+ "@opentelemetry/api-logs": "0.208.0",
1069
+ "@opentelemetry/core": "2.2.0",
1070
+ "@opentelemetry/resources": "2.2.0",
1071
+ "@opentelemetry/sdk-logs": "0.208.0",
1072
+ "@opentelemetry/sdk-metrics": "2.2.0",
1073
+ "@opentelemetry/sdk-trace-base": "2.2.0",
1074
+ "protobufjs": "^7.3.0"
1075
+ },
1076
+ "engines": {
1077
+ "node": "^18.19.0 || >=20.6.0"
1078
+ },
1079
+ "peerDependencies": {
1080
+ "@opentelemetry/api": "^1.3.0"
1081
+ }
1082
+ },
1083
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": {
1084
+ "version": "2.2.0",
1085
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz",
1086
+ "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==",
1087
+ "dependencies": {
1088
+ "@opentelemetry/core": "2.2.0",
1089
+ "@opentelemetry/semantic-conventions": "^1.29.0"
1090
+ },
1091
+ "engines": {
1092
+ "node": "^18.19.0 || >=20.6.0"
1093
+ },
1094
+ "peerDependencies": {
1095
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
1096
+ }
1097
+ },
1098
+ "node_modules/@opentelemetry/resources": {
1099
+ "version": "2.6.1",
1100
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz",
1101
+ "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==",
1102
+ "dependencies": {
1103
+ "@opentelemetry/core": "2.6.1",
1104
+ "@opentelemetry/semantic-conventions": "^1.29.0"
1105
+ },
1106
+ "engines": {
1107
+ "node": "^18.19.0 || >=20.6.0"
1108
+ },
1109
+ "peerDependencies": {
1110
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
1111
+ }
1112
+ },
1113
+ "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": {
1114
+ "version": "2.6.1",
1115
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz",
1116
+ "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==",
1117
+ "dependencies": {
1118
+ "@opentelemetry/semantic-conventions": "^1.29.0"
1119
+ },
1120
+ "engines": {
1121
+ "node": "^18.19.0 || >=20.6.0"
1122
+ },
1123
+ "peerDependencies": {
1124
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
1125
+ }
1126
+ },
1127
+ "node_modules/@opentelemetry/sdk-logs": {
1128
+ "version": "0.208.0",
1129
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.208.0.tgz",
1130
+ "integrity": "sha512-QlAyL1jRpOeaqx7/leG1vJMp84g0xKP6gJmfELBpnI4O/9xPX+Hu5m1POk9Kl+veNkyth5t19hRlN6tNY1sjbA==",
1131
+ "dependencies": {
1132
+ "@opentelemetry/api-logs": "0.208.0",
1133
+ "@opentelemetry/core": "2.2.0",
1134
+ "@opentelemetry/resources": "2.2.0"
1135
+ },
1136
+ "engines": {
1137
+ "node": "^18.19.0 || >=20.6.0"
1138
+ },
1139
+ "peerDependencies": {
1140
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
1141
+ }
1142
+ },
1143
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": {
1144
+ "version": "2.2.0",
1145
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz",
1146
+ "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==",
1147
+ "dependencies": {
1148
+ "@opentelemetry/core": "2.2.0",
1149
+ "@opentelemetry/semantic-conventions": "^1.29.0"
1150
+ },
1151
+ "engines": {
1152
+ "node": "^18.19.0 || >=20.6.0"
1153
+ },
1154
+ "peerDependencies": {
1155
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
1156
+ }
1157
+ },
1158
+ "node_modules/@opentelemetry/sdk-metrics": {
1159
+ "version": "2.2.0",
1160
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz",
1161
+ "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==",
1162
+ "dependencies": {
1163
+ "@opentelemetry/core": "2.2.0",
1164
+ "@opentelemetry/resources": "2.2.0"
1165
+ },
1166
+ "engines": {
1167
+ "node": "^18.19.0 || >=20.6.0"
1168
+ },
1169
+ "peerDependencies": {
1170
+ "@opentelemetry/api": ">=1.9.0 <1.10.0"
1171
+ }
1172
+ },
1173
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": {
1174
+ "version": "2.2.0",
1175
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz",
1176
+ "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==",
1177
+ "dependencies": {
1178
+ "@opentelemetry/core": "2.2.0",
1179
+ "@opentelemetry/semantic-conventions": "^1.29.0"
1180
+ },
1181
+ "engines": {
1182
+ "node": "^18.19.0 || >=20.6.0"
1183
+ },
1184
+ "peerDependencies": {
1185
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
1186
+ }
1187
+ },
1188
+ "node_modules/@opentelemetry/sdk-trace-base": {
1189
+ "version": "2.2.0",
1190
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz",
1191
+ "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==",
1192
+ "dependencies": {
1193
+ "@opentelemetry/core": "2.2.0",
1194
+ "@opentelemetry/resources": "2.2.0",
1195
+ "@opentelemetry/semantic-conventions": "^1.29.0"
1196
+ },
1197
+ "engines": {
1198
+ "node": "^18.19.0 || >=20.6.0"
1199
+ },
1200
+ "peerDependencies": {
1201
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
1202
+ }
1203
+ },
1204
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": {
1205
+ "version": "2.2.0",
1206
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz",
1207
+ "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==",
1208
+ "dependencies": {
1209
+ "@opentelemetry/core": "2.2.0",
1210
+ "@opentelemetry/semantic-conventions": "^1.29.0"
1211
+ },
1212
+ "engines": {
1213
+ "node": "^18.19.0 || >=20.6.0"
1214
+ },
1215
+ "peerDependencies": {
1216
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
1217
+ }
1218
+ },
1219
+ "node_modules/@opentelemetry/semantic-conventions": {
1220
+ "version": "1.40.0",
1221
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz",
1222
+ "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==",
1223
+ "engines": {
1224
+ "node": ">=14"
1225
+ }
1226
+ },
1227
+ "node_modules/@posthog/core": {
1228
+ "version": "1.25.2",
1229
+ "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.25.2.tgz",
1230
+ "integrity": "sha512-h2FO7ut/BbfwpAXWpwdDHTzQgUo9ibDFEs6ZO+3cI3KPWQt5XwczK1OLAuPprcjm8T/jl0SH8jSFo5XdU4RbTg=="
1231
+ },
1232
+ "node_modules/@posthog/types": {
1233
+ "version": "1.366.0",
1234
+ "resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.366.0.tgz",
1235
+ "integrity": "sha512-PIVnZktxesFFI3AWQqNZp/jrHNfpUe7iefTZnbF2vbYCewFT1n7hgkpU1Bd4zyJKiK1yckm+jkOJeH6gUem1ag=="
1236
+ },
1237
+ "node_modules/@protobufjs/aspromise": {
1238
+ "version": "1.1.2",
1239
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
1240
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
1241
+ },
1242
+ "node_modules/@protobufjs/base64": {
1243
+ "version": "1.1.2",
1244
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
1245
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
1246
+ },
1247
+ "node_modules/@protobufjs/codegen": {
1248
+ "version": "2.0.4",
1249
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
1250
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
1251
+ },
1252
+ "node_modules/@protobufjs/eventemitter": {
1253
+ "version": "1.1.0",
1254
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
1255
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
1256
+ },
1257
+ "node_modules/@protobufjs/fetch": {
1258
+ "version": "1.1.0",
1259
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
1260
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
1261
+ "dependencies": {
1262
+ "@protobufjs/aspromise": "^1.1.1",
1263
+ "@protobufjs/inquire": "^1.1.0"
1264
+ }
1265
+ },
1266
+ "node_modules/@protobufjs/float": {
1267
+ "version": "1.0.2",
1268
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
1269
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
1270
+ },
1271
+ "node_modules/@protobufjs/inquire": {
1272
+ "version": "1.1.0",
1273
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
1274
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
1275
+ },
1276
+ "node_modules/@protobufjs/path": {
1277
+ "version": "1.1.2",
1278
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
1279
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
1280
+ },
1281
+ "node_modules/@protobufjs/pool": {
1282
+ "version": "1.1.0",
1283
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
1284
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
1285
+ },
1286
+ "node_modules/@protobufjs/utf8": {
1287
+ "version": "1.1.0",
1288
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
1289
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
1290
+ },
1291
  "node_modules/@rolldown/pluginutils": {
1292
  "version": "1.0.0-beta.27",
1293
  "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
 
1940
  "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
1941
  "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="
1942
  },
1943
+ "node_modules/@types/node": {
1944
+ "version": "25.5.2",
1945
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.2.tgz",
1946
+ "integrity": "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==",
1947
+ "dependencies": {
1948
+ "undici-types": "~7.18.0"
1949
+ }
1950
+ },
1951
  "node_modules/@types/prismjs": {
1952
  "version": "1.26.6",
1953
  "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz",
 
2354
  "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
2355
  "dev": true
2356
  },
2357
+ "node_modules/core-js": {
2358
+ "version": "3.49.0",
2359
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz",
2360
+ "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==",
2361
+ "hasInstallScript": true,
2362
+ "funding": {
2363
+ "type": "opencollective",
2364
+ "url": "https://opencollective.com/core-js"
2365
+ }
2366
+ },
2367
  "node_modules/cose-base": {
2368
  "version": "1.0.3",
2369
  "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",
 
3217
  "url": "https://github.com/sponsors/wooorm"
3218
  }
3219
  },
3220
+ "node_modules/fflate": {
3221
+ "version": "0.4.8",
3222
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz",
3223
+ "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="
3224
+ },
3225
  "node_modules/file-entry-cache": {
3226
  "version": "8.0.0",
3227
  "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
 
3826
  "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
3827
  "dev": true
3828
  },
3829
+ "node_modules/long": {
3830
+ "version": "5.3.2",
3831
+ "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
3832
+ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="
3833
+ },
3834
  "node_modules/longest-streak": {
3835
  "version": "3.1.0",
3836
  "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
 
4989
  "node": "^10 || ^12 || >=14"
4990
  }
4991
  },
4992
+ "node_modules/posthog-js": {
4993
+ "version": "1.366.0",
4994
+ "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.366.0.tgz",
4995
+ "integrity": "sha512-WEr71LAdpxPYVUJADF8lRXnOXqYWi0aZbfN32GuqZiGW7rYADzkjAPTOy2RbkBTjmA6c4Em8vEbccSPzZa0abg==",
4996
+ "dependencies": {
4997
+ "@opentelemetry/api": "^1.9.0",
4998
+ "@opentelemetry/api-logs": "^0.208.0",
4999
+ "@opentelemetry/exporter-logs-otlp-http": "^0.208.0",
5000
+ "@opentelemetry/resources": "^2.2.0",
5001
+ "@opentelemetry/sdk-logs": "^0.208.0",
5002
+ "@posthog/core": "1.25.2",
5003
+ "@posthog/types": "1.366.0",
5004
+ "core-js": "^3.38.1",
5005
+ "dompurify": "^3.3.2",
5006
+ "fflate": "^0.4.8",
5007
+ "preact": "^10.28.2",
5008
+ "query-selector-shadow-dom": "^1.0.1",
5009
+ "web-vitals": "^5.1.0"
5010
+ }
5011
+ },
5012
+ "node_modules/preact": {
5013
+ "version": "10.29.1",
5014
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz",
5015
+ "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==",
5016
+ "funding": {
5017
+ "type": "opencollective",
5018
+ "url": "https://opencollective.com/preact"
5019
+ }
5020
+ },
5021
  "node_modules/prelude-ls": {
5022
  "version": "1.2.1",
5023
  "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
 
5044
  "url": "https://github.com/sponsors/wooorm"
5045
  }
5046
  },
5047
+ "node_modules/protobufjs": {
5048
+ "version": "7.5.4",
5049
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
5050
+ "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==",
5051
+ "hasInstallScript": true,
5052
+ "dependencies": {
5053
+ "@protobufjs/aspromise": "^1.1.2",
5054
+ "@protobufjs/base64": "^1.1.2",
5055
+ "@protobufjs/codegen": "^2.0.4",
5056
+ "@protobufjs/eventemitter": "^1.1.0",
5057
+ "@protobufjs/fetch": "^1.1.0",
5058
+ "@protobufjs/float": "^1.0.2",
5059
+ "@protobufjs/inquire": "^1.1.0",
5060
+ "@protobufjs/path": "^1.1.2",
5061
+ "@protobufjs/pool": "^1.1.0",
5062
+ "@protobufjs/utf8": "^1.1.0",
5063
+ "@types/node": ">=13.7.0",
5064
+ "long": "^5.0.0"
5065
+ },
5066
+ "engines": {
5067
+ "node": ">=12.0.0"
5068
+ }
5069
+ },
5070
  "node_modules/punycode": {
5071
  "version": "2.3.1",
5072
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
 
5076
  "node": ">=6"
5077
  }
5078
  },
5079
+ "node_modules/query-selector-shadow-dom": {
5080
+ "version": "1.0.1",
5081
+ "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz",
5082
+ "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw=="
5083
+ },
5084
  "node_modules/react": {
5085
  "version": "19.2.4",
5086
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
 
5505
  "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
5506
  "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="
5507
  },
5508
+ "node_modules/undici-types": {
5509
+ "version": "7.18.2",
5510
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
5511
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="
5512
+ },
5513
  "node_modules/unified": {
5514
  "version": "11.0.5",
5515
  "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
 
5818
  "url": "https://github.com/sponsors/wooorm"
5819
  }
5820
  },
5821
+ "node_modules/web-vitals": {
5822
+ "version": "5.2.0",
5823
+ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.2.0.tgz",
5824
+ "integrity": "sha512-i2z98bEmaCqSDiHEDu+gHl/dmR4Q+TxFmG3/13KkMO+o8UxQzCqWaDRCiLgEa41nlO4VpXSI0ASa1xWmO9sBlA=="
5825
+ },
5826
  "node_modules/which": {
5827
  "version": "2.0.2",
5828
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
ui/package.json CHANGED
@@ -13,6 +13,7 @@
13
  "@vercel/analytics": "^2.0.1",
14
  "d3": "^7.9.0",
15
  "mermaid": "^11.13.0",
 
16
  "react": "^19.2.4",
17
  "react-dom": "^19.2.4",
18
  "react-markdown": "^10.1.0",
 
13
  "@vercel/analytics": "^2.0.1",
14
  "d3": "^7.9.0",
15
  "mermaid": "^11.13.0",
16
+ "posthog-js": "^1.366.0",
17
  "react": "^19.2.4",
18
  "react-dom": "^19.2.4",
19
  "react-markdown": "^10.1.0",
ui/src/App.jsx CHANGED
@@ -1,4 +1,5 @@
1
  import { useState, useEffect, useRef, useCallback } from "react";
 
2
  import Sidebar from "./components/Sidebar";
3
  import Message from "./components/Message";
4
  import DiagramView from "./components/DiagramView";
@@ -325,6 +326,9 @@ export default function App() {
325
  .slice(-10)
326
  .map(m => ({ role: m.role, content: m.content }));
327
 
 
 
 
328
  // Add user message + placeholder assistant message.
329
  // On auto-retry (retryQuestion set), skip the user message — it's already in the chat
330
  // from the first attempt. Adding it again causes duplicate question bubbles.
@@ -610,7 +614,7 @@ export default function App() {
610
  repos={repos}
611
  reposLoading={reposLoading}
612
  activeRepo={activeRepo}
613
- onSelectRepo={setActiveRepo}
614
  onReposChange={loadRepos}
615
  mode={mode}
616
  onModeChange={setMode}
@@ -671,7 +675,7 @@ export default function App() {
671
  >Chat</button>
672
  <button
673
  className={`view-btn ${view === "graph" ? "active" : ""}`}
674
- onClick={() => setView("graph")}
675
  >Diagram <span style={{ fontSize: 8, verticalAlign: "middle", color: "var(--accent-soft)", marginLeft: 2 }}>●</span></button>
676
  </div>
677
  )}
 
1
  import { useState, useEffect, useRef, useCallback } from "react";
2
+ import posthog from "posthog-js";
3
  import Sidebar from "./components/Sidebar";
4
  import Message from "./components/Message";
5
  import DiagramView from "./components/DiagramView";
 
326
  .slice(-10)
327
  .map(m => ({ role: m.role, content: m.content }));
328
 
329
+ // Track query event
330
+ posthog.capture("query_submitted", { repo: activeRepo, mode: agentMode ? "agent" : "rag" });
331
+
332
  // Add user message + placeholder assistant message.
333
  // On auto-retry (retryQuestion set), skip the user message — it's already in the chat
334
  // from the first attempt. Adding it again causes duplicate question bubbles.
 
614
  repos={repos}
615
  reposLoading={reposLoading}
616
  activeRepo={activeRepo}
617
+ onSelectRepo={(repo) => { setActiveRepo(repo); posthog.capture("repo_selected", { repo }); }}
618
  onReposChange={loadRepos}
619
  mode={mode}
620
  onModeChange={setMode}
 
675
  >Chat</button>
676
  <button
677
  className={`view-btn ${view === "graph" ? "active" : ""}`}
678
+ onClick={() => { setView("graph"); posthog.capture("diagram_view_opened", { repo: activeRepo }); }}
679
  >Diagram <span style={{ fontSize: 8, verticalAlign: "middle", color: "var(--accent-soft)", marginLeft: 2 }}>●</span></button>
680
  </div>
681
  )}
ui/src/main.jsx CHANGED
@@ -1,9 +1,16 @@
1
  import { StrictMode } from 'react'
2
  import { createRoot } from 'react-dom/client'
3
  import { Analytics } from '@vercel/analytics/react'
 
4
  import './index.css'
5
  import App from './App.jsx'
6
 
 
 
 
 
 
 
7
  createRoot(document.getElementById('root')).render(
8
  <StrictMode>
9
  <App />
 
1
  import { StrictMode } from 'react'
2
  import { createRoot } from 'react-dom/client'
3
  import { Analytics } from '@vercel/analytics/react'
4
+ import posthog from 'posthog-js'
5
  import './index.css'
6
  import App from './App.jsx'
7
 
8
+ posthog.init('phc_B4VarKaWfNc3u7vMcsUPRDbNgSyVxaBqtYT3ZwP6FshM', {
9
+ api_host: 'https://us.i.posthog.com',
10
+ capture_pageview: true,
11
+ capture_pageleave: true,
12
+ })
13
+
14
  createRoot(document.getElementById('root')).render(
15
  <StrictMode>
16
  <App />