NeonClary commited on
Commit
8a55c98
·
1 Parent(s): 5f0d937

feat: markdown rendering, jump-to-latest-question, web search button

Browse files

- Render AI responses as formatted markdown (react-markdown + remark-gfm)

- Fix jump button: scroll to most recent question at top of view

- Add Search button in search popover (opens Google with query)

- Prepend 'Provide citations for' to auto-generated search prompt

- Remove leftover debug fetch instrumentation throughout

Made-with: Cursor

frontend/package-lock.json CHANGED
@@ -10,7 +10,9 @@
10
  "dependencies": {
11
  "lucide-react": "^0.468.0",
12
  "react": "^19.0.0",
13
- "react-dom": "^19.0.0"
 
 
14
  },
15
  "devDependencies": {
16
  "@vitejs/plugin-react": "^4.3.4",
@@ -1193,13 +1195,76 @@
1193
  "@babel/types": "^7.28.2"
1194
  }
1195
  },
 
 
 
 
 
 
 
 
 
1196
  "node_modules/@types/estree": {
1197
  "version": "1.0.8",
1198
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1199
  "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1200
- "dev": true,
1201
  "license": "MIT"
1202
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1203
  "node_modules/@vitejs/plugin-react": {
1204
  "version": "4.7.0",
1205
  "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
@@ -1221,6 +1286,16 @@
1221
  "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1222
  }
1223
  },
 
 
 
 
 
 
 
 
 
 
1224
  "node_modules/baseline-browser-mapping": {
1225
  "version": "2.10.13",
1226
  "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.13.tgz",
@@ -1289,6 +1364,66 @@
1289
  ],
1290
  "license": "CC-BY-4.0"
1291
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1292
  "node_modules/convert-source-map": {
1293
  "version": "2.0.0",
1294
  "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -1296,11 +1431,17 @@
1296
  "dev": true,
1297
  "license": "MIT"
1298
  },
 
 
 
 
 
 
 
1299
  "node_modules/debug": {
1300
  "version": "4.4.3",
1301
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1302
  "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1303
- "dev": true,
1304
  "license": "MIT",
1305
  "dependencies": {
1306
  "ms": "^2.1.3"
@@ -1314,6 +1455,41 @@
1314
  }
1315
  }
1316
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1317
  "node_modules/electron-to-chromium": {
1318
  "version": "1.5.331",
1319
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz",
@@ -1373,6 +1549,34 @@
1373
  "node": ">=6"
1374
  }
1375
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1376
  "node_modules/fdir": {
1377
  "version": "6.5.0",
1378
  "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
@@ -1402,77 +1606,1041 @@
1402
  "os": [
1403
  "darwin"
1404
  ],
1405
- "engines": {
1406
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1407
  }
1408
  },
1409
- "node_modules/gensync": {
1410
- "version": "1.0.0-beta.2",
1411
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1412
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1413
- "dev": true,
 
 
 
 
 
 
 
 
 
1414
  "license": "MIT",
1415
- "engines": {
1416
- "node": ">=6.9.0"
 
 
 
1417
  }
1418
  },
1419
- "node_modules/js-tokens": {
1420
- "version": "4.0.0",
1421
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1422
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1423
- "dev": true,
 
 
 
 
 
 
 
 
 
1424
  "license": "MIT"
1425
  },
1426
- "node_modules/jsesc": {
1427
- "version": "3.1.0",
1428
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1429
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1430
- "dev": true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1431
  "license": "MIT",
1432
- "bin": {
1433
- "jsesc": "bin/jsesc"
1434
- },
1435
- "engines": {
1436
- "node": ">=6"
1437
  }
1438
  },
1439
- "node_modules/json5": {
1440
- "version": "2.2.3",
1441
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1442
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1443
- "dev": true,
 
 
 
 
 
 
 
 
 
1444
  "license": "MIT",
1445
- "bin": {
1446
- "json5": "lib/cli.js"
1447
- },
1448
- "engines": {
1449
- "node": ">=6"
1450
  }
1451
  },
1452
- "node_modules/lru-cache": {
1453
- "version": "5.1.1",
1454
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1455
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1456
- "dev": true,
1457
- "license": "ISC",
 
 
 
 
 
 
 
 
 
1458
  "dependencies": {
1459
- "yallist": "^3.0.2"
 
 
1460
  }
1461
  },
1462
- "node_modules/lucide-react": {
1463
- "version": "0.468.0",
1464
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.468.0.tgz",
1465
- "integrity": "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==",
1466
- "license": "ISC",
1467
- "peerDependencies": {
1468
- "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
 
 
 
 
 
 
 
 
 
 
 
 
 
1469
  }
1470
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1471
  "node_modules/ms": {
1472
  "version": "2.1.3",
1473
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1474
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1475
- "dev": true,
1476
  "license": "MIT"
1477
  },
1478
  "node_modules/nanoid": {
@@ -1501,6 +2669,31 @@
1501
  "dev": true,
1502
  "license": "MIT"
1503
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1504
  "node_modules/picocolors": {
1505
  "version": "1.1.1",
1506
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -1550,6 +2743,16 @@
1550
  "node": "^10 || ^12 || >=14"
1551
  }
1552
  },
 
 
 
 
 
 
 
 
 
 
1553
  "node_modules/react": {
1554
  "version": "19.2.4",
1555
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
@@ -1571,6 +2774,33 @@
1571
  "react": "^19.2.4"
1572
  }
1573
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1574
  "node_modules/react-refresh": {
1575
  "version": "0.17.0",
1576
  "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
@@ -1581,6 +2811,72 @@
1581
  "node": ">=0.10.0"
1582
  }
1583
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1584
  "node_modules/rollup": {
1585
  "version": "4.60.1",
1586
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz",
@@ -1652,6 +2948,48 @@
1652
  "node": ">=0.10.0"
1653
  }
1654
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1655
  "node_modules/tinyglobby": {
1656
  "version": "0.2.15",
1657
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -1669,6 +3007,113 @@
1669
  "url": "https://github.com/sponsors/SuperchupuDev"
1670
  }
1671
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1672
  "node_modules/update-browserslist-db": {
1673
  "version": "1.2.3",
1674
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
@@ -1700,6 +3145,34 @@
1700
  "browserslist": ">= 4.21.0"
1701
  }
1702
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1703
  "node_modules/vite": {
1704
  "version": "6.4.1",
1705
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
@@ -1781,6 +3254,16 @@
1781
  "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
1782
  "dev": true,
1783
  "license": "ISC"
 
 
 
 
 
 
 
 
 
 
1784
  }
1785
  }
1786
  }
 
10
  "dependencies": {
11
  "lucide-react": "^0.468.0",
12
  "react": "^19.0.0",
13
+ "react-dom": "^19.0.0",
14
+ "react-markdown": "^10.1.0",
15
+ "remark-gfm": "^4.0.1"
16
  },
17
  "devDependencies": {
18
  "@vitejs/plugin-react": "^4.3.4",
 
1195
  "@babel/types": "^7.28.2"
1196
  }
1197
  },
1198
+ "node_modules/@types/debug": {
1199
+ "version": "4.1.13",
1200
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
1201
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
1202
+ "license": "MIT",
1203
+ "dependencies": {
1204
+ "@types/ms": "*"
1205
+ }
1206
+ },
1207
  "node_modules/@types/estree": {
1208
  "version": "1.0.8",
1209
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1210
  "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
 
1211
  "license": "MIT"
1212
  },
1213
+ "node_modules/@types/estree-jsx": {
1214
+ "version": "1.0.5",
1215
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
1216
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
1217
+ "license": "MIT",
1218
+ "dependencies": {
1219
+ "@types/estree": "*"
1220
+ }
1221
+ },
1222
+ "node_modules/@types/hast": {
1223
+ "version": "3.0.4",
1224
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
1225
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
1226
+ "license": "MIT",
1227
+ "dependencies": {
1228
+ "@types/unist": "*"
1229
+ }
1230
+ },
1231
+ "node_modules/@types/mdast": {
1232
+ "version": "4.0.4",
1233
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
1234
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
1235
+ "license": "MIT",
1236
+ "dependencies": {
1237
+ "@types/unist": "*"
1238
+ }
1239
+ },
1240
+ "node_modules/@types/ms": {
1241
+ "version": "2.1.0",
1242
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
1243
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
1244
+ "license": "MIT"
1245
+ },
1246
+ "node_modules/@types/react": {
1247
+ "version": "19.2.14",
1248
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
1249
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
1250
+ "license": "MIT",
1251
+ "peer": true,
1252
+ "dependencies": {
1253
+ "csstype": "^3.2.2"
1254
+ }
1255
+ },
1256
+ "node_modules/@types/unist": {
1257
+ "version": "3.0.3",
1258
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
1259
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
1260
+ "license": "MIT"
1261
+ },
1262
+ "node_modules/@ungap/structured-clone": {
1263
+ "version": "1.3.0",
1264
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
1265
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
1266
+ "license": "ISC"
1267
+ },
1268
  "node_modules/@vitejs/plugin-react": {
1269
  "version": "4.7.0",
1270
  "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
 
1286
  "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1287
  }
1288
  },
1289
+ "node_modules/bail": {
1290
+ "version": "2.0.2",
1291
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
1292
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
1293
+ "license": "MIT",
1294
+ "funding": {
1295
+ "type": "github",
1296
+ "url": "https://github.com/sponsors/wooorm"
1297
+ }
1298
+ },
1299
  "node_modules/baseline-browser-mapping": {
1300
  "version": "2.10.13",
1301
  "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.13.tgz",
 
1364
  ],
1365
  "license": "CC-BY-4.0"
1366
  },
1367
+ "node_modules/ccount": {
1368
+ "version": "2.0.1",
1369
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
1370
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
1371
+ "license": "MIT",
1372
+ "funding": {
1373
+ "type": "github",
1374
+ "url": "https://github.com/sponsors/wooorm"
1375
+ }
1376
+ },
1377
+ "node_modules/character-entities": {
1378
+ "version": "2.0.2",
1379
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
1380
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
1381
+ "license": "MIT",
1382
+ "funding": {
1383
+ "type": "github",
1384
+ "url": "https://github.com/sponsors/wooorm"
1385
+ }
1386
+ },
1387
+ "node_modules/character-entities-html4": {
1388
+ "version": "2.1.0",
1389
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
1390
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
1391
+ "license": "MIT",
1392
+ "funding": {
1393
+ "type": "github",
1394
+ "url": "https://github.com/sponsors/wooorm"
1395
+ }
1396
+ },
1397
+ "node_modules/character-entities-legacy": {
1398
+ "version": "3.0.0",
1399
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
1400
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
1401
+ "license": "MIT",
1402
+ "funding": {
1403
+ "type": "github",
1404
+ "url": "https://github.com/sponsors/wooorm"
1405
+ }
1406
+ },
1407
+ "node_modules/character-reference-invalid": {
1408
+ "version": "2.0.1",
1409
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
1410
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
1411
+ "license": "MIT",
1412
+ "funding": {
1413
+ "type": "github",
1414
+ "url": "https://github.com/sponsors/wooorm"
1415
+ }
1416
+ },
1417
+ "node_modules/comma-separated-tokens": {
1418
+ "version": "2.0.3",
1419
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
1420
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
1421
+ "license": "MIT",
1422
+ "funding": {
1423
+ "type": "github",
1424
+ "url": "https://github.com/sponsors/wooorm"
1425
+ }
1426
+ },
1427
  "node_modules/convert-source-map": {
1428
  "version": "2.0.0",
1429
  "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
 
1431
  "dev": true,
1432
  "license": "MIT"
1433
  },
1434
+ "node_modules/csstype": {
1435
+ "version": "3.2.3",
1436
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1437
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1438
+ "license": "MIT",
1439
+ "peer": true
1440
+ },
1441
  "node_modules/debug": {
1442
  "version": "4.4.3",
1443
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1444
  "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
 
1445
  "license": "MIT",
1446
  "dependencies": {
1447
  "ms": "^2.1.3"
 
1455
  }
1456
  }
1457
  },
1458
+ "node_modules/decode-named-character-reference": {
1459
+ "version": "1.3.0",
1460
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
1461
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
1462
+ "license": "MIT",
1463
+ "dependencies": {
1464
+ "character-entities": "^2.0.0"
1465
+ },
1466
+ "funding": {
1467
+ "type": "github",
1468
+ "url": "https://github.com/sponsors/wooorm"
1469
+ }
1470
+ },
1471
+ "node_modules/dequal": {
1472
+ "version": "2.0.3",
1473
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
1474
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
1475
+ "license": "MIT",
1476
+ "engines": {
1477
+ "node": ">=6"
1478
+ }
1479
+ },
1480
+ "node_modules/devlop": {
1481
+ "version": "1.1.0",
1482
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
1483
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
1484
+ "license": "MIT",
1485
+ "dependencies": {
1486
+ "dequal": "^2.0.0"
1487
+ },
1488
+ "funding": {
1489
+ "type": "github",
1490
+ "url": "https://github.com/sponsors/wooorm"
1491
+ }
1492
+ },
1493
  "node_modules/electron-to-chromium": {
1494
  "version": "1.5.331",
1495
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz",
 
1549
  "node": ">=6"
1550
  }
1551
  },
1552
+ "node_modules/escape-string-regexp": {
1553
+ "version": "5.0.0",
1554
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
1555
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
1556
+ "license": "MIT",
1557
+ "engines": {
1558
+ "node": ">=12"
1559
+ },
1560
+ "funding": {
1561
+ "url": "https://github.com/sponsors/sindresorhus"
1562
+ }
1563
+ },
1564
+ "node_modules/estree-util-is-identifier-name": {
1565
+ "version": "3.0.0",
1566
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
1567
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
1568
+ "license": "MIT",
1569
+ "funding": {
1570
+ "type": "opencollective",
1571
+ "url": "https://opencollective.com/unified"
1572
+ }
1573
+ },
1574
+ "node_modules/extend": {
1575
+ "version": "3.0.2",
1576
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1577
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
1578
+ "license": "MIT"
1579
+ },
1580
  "node_modules/fdir": {
1581
  "version": "6.5.0",
1582
  "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
 
1606
  "os": [
1607
  "darwin"
1608
  ],
1609
+ "engines": {
1610
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1611
+ }
1612
+ },
1613
+ "node_modules/gensync": {
1614
+ "version": "1.0.0-beta.2",
1615
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1616
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1617
+ "dev": true,
1618
+ "license": "MIT",
1619
+ "engines": {
1620
+ "node": ">=6.9.0"
1621
+ }
1622
+ },
1623
+ "node_modules/hast-util-to-jsx-runtime": {
1624
+ "version": "2.3.6",
1625
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
1626
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
1627
+ "license": "MIT",
1628
+ "dependencies": {
1629
+ "@types/estree": "^1.0.0",
1630
+ "@types/hast": "^3.0.0",
1631
+ "@types/unist": "^3.0.0",
1632
+ "comma-separated-tokens": "^2.0.0",
1633
+ "devlop": "^1.0.0",
1634
+ "estree-util-is-identifier-name": "^3.0.0",
1635
+ "hast-util-whitespace": "^3.0.0",
1636
+ "mdast-util-mdx-expression": "^2.0.0",
1637
+ "mdast-util-mdx-jsx": "^3.0.0",
1638
+ "mdast-util-mdxjs-esm": "^2.0.0",
1639
+ "property-information": "^7.0.0",
1640
+ "space-separated-tokens": "^2.0.0",
1641
+ "style-to-js": "^1.0.0",
1642
+ "unist-util-position": "^5.0.0",
1643
+ "vfile-message": "^4.0.0"
1644
+ },
1645
+ "funding": {
1646
+ "type": "opencollective",
1647
+ "url": "https://opencollective.com/unified"
1648
+ }
1649
+ },
1650
+ "node_modules/hast-util-whitespace": {
1651
+ "version": "3.0.0",
1652
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
1653
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
1654
+ "license": "MIT",
1655
+ "dependencies": {
1656
+ "@types/hast": "^3.0.0"
1657
+ },
1658
+ "funding": {
1659
+ "type": "opencollective",
1660
+ "url": "https://opencollective.com/unified"
1661
+ }
1662
+ },
1663
+ "node_modules/html-url-attributes": {
1664
+ "version": "3.0.1",
1665
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
1666
+ "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
1667
+ "license": "MIT",
1668
+ "funding": {
1669
+ "type": "opencollective",
1670
+ "url": "https://opencollective.com/unified"
1671
+ }
1672
+ },
1673
+ "node_modules/inline-style-parser": {
1674
+ "version": "0.2.7",
1675
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
1676
+ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
1677
+ "license": "MIT"
1678
+ },
1679
+ "node_modules/is-alphabetical": {
1680
+ "version": "2.0.1",
1681
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
1682
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
1683
+ "license": "MIT",
1684
+ "funding": {
1685
+ "type": "github",
1686
+ "url": "https://github.com/sponsors/wooorm"
1687
+ }
1688
+ },
1689
+ "node_modules/is-alphanumerical": {
1690
+ "version": "2.0.1",
1691
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
1692
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
1693
+ "license": "MIT",
1694
+ "dependencies": {
1695
+ "is-alphabetical": "^2.0.0",
1696
+ "is-decimal": "^2.0.0"
1697
+ },
1698
+ "funding": {
1699
+ "type": "github",
1700
+ "url": "https://github.com/sponsors/wooorm"
1701
+ }
1702
+ },
1703
+ "node_modules/is-decimal": {
1704
+ "version": "2.0.1",
1705
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
1706
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
1707
+ "license": "MIT",
1708
+ "funding": {
1709
+ "type": "github",
1710
+ "url": "https://github.com/sponsors/wooorm"
1711
+ }
1712
+ },
1713
+ "node_modules/is-hexadecimal": {
1714
+ "version": "2.0.1",
1715
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
1716
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
1717
+ "license": "MIT",
1718
+ "funding": {
1719
+ "type": "github",
1720
+ "url": "https://github.com/sponsors/wooorm"
1721
+ }
1722
+ },
1723
+ "node_modules/is-plain-obj": {
1724
+ "version": "4.1.0",
1725
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
1726
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
1727
+ "license": "MIT",
1728
+ "engines": {
1729
+ "node": ">=12"
1730
+ },
1731
+ "funding": {
1732
+ "url": "https://github.com/sponsors/sindresorhus"
1733
+ }
1734
+ },
1735
+ "node_modules/js-tokens": {
1736
+ "version": "4.0.0",
1737
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1738
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1739
+ "dev": true,
1740
+ "license": "MIT"
1741
+ },
1742
+ "node_modules/jsesc": {
1743
+ "version": "3.1.0",
1744
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1745
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1746
+ "dev": true,
1747
+ "license": "MIT",
1748
+ "bin": {
1749
+ "jsesc": "bin/jsesc"
1750
+ },
1751
+ "engines": {
1752
+ "node": ">=6"
1753
+ }
1754
+ },
1755
+ "node_modules/json5": {
1756
+ "version": "2.2.3",
1757
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1758
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1759
+ "dev": true,
1760
+ "license": "MIT",
1761
+ "bin": {
1762
+ "json5": "lib/cli.js"
1763
+ },
1764
+ "engines": {
1765
+ "node": ">=6"
1766
+ }
1767
+ },
1768
+ "node_modules/longest-streak": {
1769
+ "version": "3.1.0",
1770
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
1771
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
1772
+ "license": "MIT",
1773
+ "funding": {
1774
+ "type": "github",
1775
+ "url": "https://github.com/sponsors/wooorm"
1776
+ }
1777
+ },
1778
+ "node_modules/lru-cache": {
1779
+ "version": "5.1.1",
1780
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1781
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1782
+ "dev": true,
1783
+ "license": "ISC",
1784
+ "dependencies": {
1785
+ "yallist": "^3.0.2"
1786
+ }
1787
+ },
1788
+ "node_modules/lucide-react": {
1789
+ "version": "0.468.0",
1790
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.468.0.tgz",
1791
+ "integrity": "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==",
1792
+ "license": "ISC",
1793
+ "peerDependencies": {
1794
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
1795
+ }
1796
+ },
1797
+ "node_modules/markdown-table": {
1798
+ "version": "3.0.4",
1799
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
1800
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
1801
+ "license": "MIT",
1802
+ "funding": {
1803
+ "type": "github",
1804
+ "url": "https://github.com/sponsors/wooorm"
1805
+ }
1806
+ },
1807
+ "node_modules/mdast-util-find-and-replace": {
1808
+ "version": "3.0.2",
1809
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
1810
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
1811
+ "license": "MIT",
1812
+ "dependencies": {
1813
+ "@types/mdast": "^4.0.0",
1814
+ "escape-string-regexp": "^5.0.0",
1815
+ "unist-util-is": "^6.0.0",
1816
+ "unist-util-visit-parents": "^6.0.0"
1817
+ },
1818
+ "funding": {
1819
+ "type": "opencollective",
1820
+ "url": "https://opencollective.com/unified"
1821
+ }
1822
+ },
1823
+ "node_modules/mdast-util-from-markdown": {
1824
+ "version": "2.0.3",
1825
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
1826
+ "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
1827
+ "license": "MIT",
1828
+ "dependencies": {
1829
+ "@types/mdast": "^4.0.0",
1830
+ "@types/unist": "^3.0.0",
1831
+ "decode-named-character-reference": "^1.0.0",
1832
+ "devlop": "^1.0.0",
1833
+ "mdast-util-to-string": "^4.0.0",
1834
+ "micromark": "^4.0.0",
1835
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
1836
+ "micromark-util-decode-string": "^2.0.0",
1837
+ "micromark-util-normalize-identifier": "^2.0.0",
1838
+ "micromark-util-symbol": "^2.0.0",
1839
+ "micromark-util-types": "^2.0.0",
1840
+ "unist-util-stringify-position": "^4.0.0"
1841
+ },
1842
+ "funding": {
1843
+ "type": "opencollective",
1844
+ "url": "https://opencollective.com/unified"
1845
+ }
1846
+ },
1847
+ "node_modules/mdast-util-gfm": {
1848
+ "version": "3.1.0",
1849
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
1850
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
1851
+ "license": "MIT",
1852
+ "dependencies": {
1853
+ "mdast-util-from-markdown": "^2.0.0",
1854
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
1855
+ "mdast-util-gfm-footnote": "^2.0.0",
1856
+ "mdast-util-gfm-strikethrough": "^2.0.0",
1857
+ "mdast-util-gfm-table": "^2.0.0",
1858
+ "mdast-util-gfm-task-list-item": "^2.0.0",
1859
+ "mdast-util-to-markdown": "^2.0.0"
1860
+ },
1861
+ "funding": {
1862
+ "type": "opencollective",
1863
+ "url": "https://opencollective.com/unified"
1864
+ }
1865
+ },
1866
+ "node_modules/mdast-util-gfm-autolink-literal": {
1867
+ "version": "2.0.1",
1868
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
1869
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
1870
+ "license": "MIT",
1871
+ "dependencies": {
1872
+ "@types/mdast": "^4.0.0",
1873
+ "ccount": "^2.0.0",
1874
+ "devlop": "^1.0.0",
1875
+ "mdast-util-find-and-replace": "^3.0.0",
1876
+ "micromark-util-character": "^2.0.0"
1877
+ },
1878
+ "funding": {
1879
+ "type": "opencollective",
1880
+ "url": "https://opencollective.com/unified"
1881
+ }
1882
+ },
1883
+ "node_modules/mdast-util-gfm-footnote": {
1884
+ "version": "2.1.0",
1885
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
1886
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
1887
+ "license": "MIT",
1888
+ "dependencies": {
1889
+ "@types/mdast": "^4.0.0",
1890
+ "devlop": "^1.1.0",
1891
+ "mdast-util-from-markdown": "^2.0.0",
1892
+ "mdast-util-to-markdown": "^2.0.0",
1893
+ "micromark-util-normalize-identifier": "^2.0.0"
1894
+ },
1895
+ "funding": {
1896
+ "type": "opencollective",
1897
+ "url": "https://opencollective.com/unified"
1898
+ }
1899
+ },
1900
+ "node_modules/mdast-util-gfm-strikethrough": {
1901
+ "version": "2.0.0",
1902
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
1903
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
1904
+ "license": "MIT",
1905
+ "dependencies": {
1906
+ "@types/mdast": "^4.0.0",
1907
+ "mdast-util-from-markdown": "^2.0.0",
1908
+ "mdast-util-to-markdown": "^2.0.0"
1909
+ },
1910
+ "funding": {
1911
+ "type": "opencollective",
1912
+ "url": "https://opencollective.com/unified"
1913
+ }
1914
+ },
1915
+ "node_modules/mdast-util-gfm-table": {
1916
+ "version": "2.0.0",
1917
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
1918
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
1919
+ "license": "MIT",
1920
+ "dependencies": {
1921
+ "@types/mdast": "^4.0.0",
1922
+ "devlop": "^1.0.0",
1923
+ "markdown-table": "^3.0.0",
1924
+ "mdast-util-from-markdown": "^2.0.0",
1925
+ "mdast-util-to-markdown": "^2.0.0"
1926
+ },
1927
+ "funding": {
1928
+ "type": "opencollective",
1929
+ "url": "https://opencollective.com/unified"
1930
+ }
1931
+ },
1932
+ "node_modules/mdast-util-gfm-task-list-item": {
1933
+ "version": "2.0.0",
1934
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
1935
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
1936
+ "license": "MIT",
1937
+ "dependencies": {
1938
+ "@types/mdast": "^4.0.0",
1939
+ "devlop": "^1.0.0",
1940
+ "mdast-util-from-markdown": "^2.0.0",
1941
+ "mdast-util-to-markdown": "^2.0.0"
1942
+ },
1943
+ "funding": {
1944
+ "type": "opencollective",
1945
+ "url": "https://opencollective.com/unified"
1946
+ }
1947
+ },
1948
+ "node_modules/mdast-util-mdx-expression": {
1949
+ "version": "2.0.1",
1950
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
1951
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
1952
+ "license": "MIT",
1953
+ "dependencies": {
1954
+ "@types/estree-jsx": "^1.0.0",
1955
+ "@types/hast": "^3.0.0",
1956
+ "@types/mdast": "^4.0.0",
1957
+ "devlop": "^1.0.0",
1958
+ "mdast-util-from-markdown": "^2.0.0",
1959
+ "mdast-util-to-markdown": "^2.0.0"
1960
+ },
1961
+ "funding": {
1962
+ "type": "opencollective",
1963
+ "url": "https://opencollective.com/unified"
1964
+ }
1965
+ },
1966
+ "node_modules/mdast-util-mdx-jsx": {
1967
+ "version": "3.2.0",
1968
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
1969
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
1970
+ "license": "MIT",
1971
+ "dependencies": {
1972
+ "@types/estree-jsx": "^1.0.0",
1973
+ "@types/hast": "^3.0.0",
1974
+ "@types/mdast": "^4.0.0",
1975
+ "@types/unist": "^3.0.0",
1976
+ "ccount": "^2.0.0",
1977
+ "devlop": "^1.1.0",
1978
+ "mdast-util-from-markdown": "^2.0.0",
1979
+ "mdast-util-to-markdown": "^2.0.0",
1980
+ "parse-entities": "^4.0.0",
1981
+ "stringify-entities": "^4.0.0",
1982
+ "unist-util-stringify-position": "^4.0.0",
1983
+ "vfile-message": "^4.0.0"
1984
+ },
1985
+ "funding": {
1986
+ "type": "opencollective",
1987
+ "url": "https://opencollective.com/unified"
1988
+ }
1989
+ },
1990
+ "node_modules/mdast-util-mdxjs-esm": {
1991
+ "version": "2.0.1",
1992
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
1993
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
1994
+ "license": "MIT",
1995
+ "dependencies": {
1996
+ "@types/estree-jsx": "^1.0.0",
1997
+ "@types/hast": "^3.0.0",
1998
+ "@types/mdast": "^4.0.0",
1999
+ "devlop": "^1.0.0",
2000
+ "mdast-util-from-markdown": "^2.0.0",
2001
+ "mdast-util-to-markdown": "^2.0.0"
2002
+ },
2003
+ "funding": {
2004
+ "type": "opencollective",
2005
+ "url": "https://opencollective.com/unified"
2006
+ }
2007
+ },
2008
+ "node_modules/mdast-util-phrasing": {
2009
+ "version": "4.1.0",
2010
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
2011
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
2012
+ "license": "MIT",
2013
+ "dependencies": {
2014
+ "@types/mdast": "^4.0.0",
2015
+ "unist-util-is": "^6.0.0"
2016
+ },
2017
+ "funding": {
2018
+ "type": "opencollective",
2019
+ "url": "https://opencollective.com/unified"
2020
+ }
2021
+ },
2022
+ "node_modules/mdast-util-to-hast": {
2023
+ "version": "13.2.1",
2024
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
2025
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
2026
+ "license": "MIT",
2027
+ "dependencies": {
2028
+ "@types/hast": "^3.0.0",
2029
+ "@types/mdast": "^4.0.0",
2030
+ "@ungap/structured-clone": "^1.0.0",
2031
+ "devlop": "^1.0.0",
2032
+ "micromark-util-sanitize-uri": "^2.0.0",
2033
+ "trim-lines": "^3.0.0",
2034
+ "unist-util-position": "^5.0.0",
2035
+ "unist-util-visit": "^5.0.0",
2036
+ "vfile": "^6.0.0"
2037
+ },
2038
+ "funding": {
2039
+ "type": "opencollective",
2040
+ "url": "https://opencollective.com/unified"
2041
+ }
2042
+ },
2043
+ "node_modules/mdast-util-to-markdown": {
2044
+ "version": "2.1.2",
2045
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
2046
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
2047
+ "license": "MIT",
2048
+ "dependencies": {
2049
+ "@types/mdast": "^4.0.0",
2050
+ "@types/unist": "^3.0.0",
2051
+ "longest-streak": "^3.0.0",
2052
+ "mdast-util-phrasing": "^4.0.0",
2053
+ "mdast-util-to-string": "^4.0.0",
2054
+ "micromark-util-classify-character": "^2.0.0",
2055
+ "micromark-util-decode-string": "^2.0.0",
2056
+ "unist-util-visit": "^5.0.0",
2057
+ "zwitch": "^2.0.0"
2058
+ },
2059
+ "funding": {
2060
+ "type": "opencollective",
2061
+ "url": "https://opencollective.com/unified"
2062
+ }
2063
+ },
2064
+ "node_modules/mdast-util-to-string": {
2065
+ "version": "4.0.0",
2066
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
2067
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
2068
+ "license": "MIT",
2069
+ "dependencies": {
2070
+ "@types/mdast": "^4.0.0"
2071
+ },
2072
+ "funding": {
2073
+ "type": "opencollective",
2074
+ "url": "https://opencollective.com/unified"
2075
+ }
2076
+ },
2077
+ "node_modules/micromark": {
2078
+ "version": "4.0.2",
2079
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
2080
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
2081
+ "funding": [
2082
+ {
2083
+ "type": "GitHub Sponsors",
2084
+ "url": "https://github.com/sponsors/unifiedjs"
2085
+ },
2086
+ {
2087
+ "type": "OpenCollective",
2088
+ "url": "https://opencollective.com/unified"
2089
+ }
2090
+ ],
2091
+ "license": "MIT",
2092
+ "dependencies": {
2093
+ "@types/debug": "^4.0.0",
2094
+ "debug": "^4.0.0",
2095
+ "decode-named-character-reference": "^1.0.0",
2096
+ "devlop": "^1.0.0",
2097
+ "micromark-core-commonmark": "^2.0.0",
2098
+ "micromark-factory-space": "^2.0.0",
2099
+ "micromark-util-character": "^2.0.0",
2100
+ "micromark-util-chunked": "^2.0.0",
2101
+ "micromark-util-combine-extensions": "^2.0.0",
2102
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
2103
+ "micromark-util-encode": "^2.0.0",
2104
+ "micromark-util-normalize-identifier": "^2.0.0",
2105
+ "micromark-util-resolve-all": "^2.0.0",
2106
+ "micromark-util-sanitize-uri": "^2.0.0",
2107
+ "micromark-util-subtokenize": "^2.0.0",
2108
+ "micromark-util-symbol": "^2.0.0",
2109
+ "micromark-util-types": "^2.0.0"
2110
+ }
2111
+ },
2112
+ "node_modules/micromark-core-commonmark": {
2113
+ "version": "2.0.3",
2114
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
2115
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
2116
+ "funding": [
2117
+ {
2118
+ "type": "GitHub Sponsors",
2119
+ "url": "https://github.com/sponsors/unifiedjs"
2120
+ },
2121
+ {
2122
+ "type": "OpenCollective",
2123
+ "url": "https://opencollective.com/unified"
2124
+ }
2125
+ ],
2126
+ "license": "MIT",
2127
+ "dependencies": {
2128
+ "decode-named-character-reference": "^1.0.0",
2129
+ "devlop": "^1.0.0",
2130
+ "micromark-factory-destination": "^2.0.0",
2131
+ "micromark-factory-label": "^2.0.0",
2132
+ "micromark-factory-space": "^2.0.0",
2133
+ "micromark-factory-title": "^2.0.0",
2134
+ "micromark-factory-whitespace": "^2.0.0",
2135
+ "micromark-util-character": "^2.0.0",
2136
+ "micromark-util-chunked": "^2.0.0",
2137
+ "micromark-util-classify-character": "^2.0.0",
2138
+ "micromark-util-html-tag-name": "^2.0.0",
2139
+ "micromark-util-normalize-identifier": "^2.0.0",
2140
+ "micromark-util-resolve-all": "^2.0.0",
2141
+ "micromark-util-subtokenize": "^2.0.0",
2142
+ "micromark-util-symbol": "^2.0.0",
2143
+ "micromark-util-types": "^2.0.0"
2144
+ }
2145
+ },
2146
+ "node_modules/micromark-extension-gfm": {
2147
+ "version": "3.0.0",
2148
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
2149
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
2150
+ "license": "MIT",
2151
+ "dependencies": {
2152
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
2153
+ "micromark-extension-gfm-footnote": "^2.0.0",
2154
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
2155
+ "micromark-extension-gfm-table": "^2.0.0",
2156
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
2157
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
2158
+ "micromark-util-combine-extensions": "^2.0.0",
2159
+ "micromark-util-types": "^2.0.0"
2160
+ },
2161
+ "funding": {
2162
+ "type": "opencollective",
2163
+ "url": "https://opencollective.com/unified"
2164
+ }
2165
+ },
2166
+ "node_modules/micromark-extension-gfm-autolink-literal": {
2167
+ "version": "2.1.0",
2168
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
2169
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
2170
+ "license": "MIT",
2171
+ "dependencies": {
2172
+ "micromark-util-character": "^2.0.0",
2173
+ "micromark-util-sanitize-uri": "^2.0.0",
2174
+ "micromark-util-symbol": "^2.0.0",
2175
+ "micromark-util-types": "^2.0.0"
2176
+ },
2177
+ "funding": {
2178
+ "type": "opencollective",
2179
+ "url": "https://opencollective.com/unified"
2180
+ }
2181
+ },
2182
+ "node_modules/micromark-extension-gfm-footnote": {
2183
+ "version": "2.1.0",
2184
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
2185
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
2186
+ "license": "MIT",
2187
+ "dependencies": {
2188
+ "devlop": "^1.0.0",
2189
+ "micromark-core-commonmark": "^2.0.0",
2190
+ "micromark-factory-space": "^2.0.0",
2191
+ "micromark-util-character": "^2.0.0",
2192
+ "micromark-util-normalize-identifier": "^2.0.0",
2193
+ "micromark-util-sanitize-uri": "^2.0.0",
2194
+ "micromark-util-symbol": "^2.0.0",
2195
+ "micromark-util-types": "^2.0.0"
2196
+ },
2197
+ "funding": {
2198
+ "type": "opencollective",
2199
+ "url": "https://opencollective.com/unified"
2200
+ }
2201
+ },
2202
+ "node_modules/micromark-extension-gfm-strikethrough": {
2203
+ "version": "2.1.0",
2204
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
2205
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
2206
+ "license": "MIT",
2207
+ "dependencies": {
2208
+ "devlop": "^1.0.0",
2209
+ "micromark-util-chunked": "^2.0.0",
2210
+ "micromark-util-classify-character": "^2.0.0",
2211
+ "micromark-util-resolve-all": "^2.0.0",
2212
+ "micromark-util-symbol": "^2.0.0",
2213
+ "micromark-util-types": "^2.0.0"
2214
+ },
2215
+ "funding": {
2216
+ "type": "opencollective",
2217
+ "url": "https://opencollective.com/unified"
2218
+ }
2219
+ },
2220
+ "node_modules/micromark-extension-gfm-table": {
2221
+ "version": "2.1.1",
2222
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
2223
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
2224
+ "license": "MIT",
2225
+ "dependencies": {
2226
+ "devlop": "^1.0.0",
2227
+ "micromark-factory-space": "^2.0.0",
2228
+ "micromark-util-character": "^2.0.0",
2229
+ "micromark-util-symbol": "^2.0.0",
2230
+ "micromark-util-types": "^2.0.0"
2231
+ },
2232
+ "funding": {
2233
+ "type": "opencollective",
2234
+ "url": "https://opencollective.com/unified"
2235
+ }
2236
+ },
2237
+ "node_modules/micromark-extension-gfm-tagfilter": {
2238
+ "version": "2.0.0",
2239
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
2240
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
2241
+ "license": "MIT",
2242
+ "dependencies": {
2243
+ "micromark-util-types": "^2.0.0"
2244
+ },
2245
+ "funding": {
2246
+ "type": "opencollective",
2247
+ "url": "https://opencollective.com/unified"
2248
+ }
2249
+ },
2250
+ "node_modules/micromark-extension-gfm-task-list-item": {
2251
+ "version": "2.1.0",
2252
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
2253
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
2254
+ "license": "MIT",
2255
+ "dependencies": {
2256
+ "devlop": "^1.0.0",
2257
+ "micromark-factory-space": "^2.0.0",
2258
+ "micromark-util-character": "^2.0.0",
2259
+ "micromark-util-symbol": "^2.0.0",
2260
+ "micromark-util-types": "^2.0.0"
2261
+ },
2262
+ "funding": {
2263
+ "type": "opencollective",
2264
+ "url": "https://opencollective.com/unified"
2265
+ }
2266
+ },
2267
+ "node_modules/micromark-factory-destination": {
2268
+ "version": "2.0.1",
2269
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
2270
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
2271
+ "funding": [
2272
+ {
2273
+ "type": "GitHub Sponsors",
2274
+ "url": "https://github.com/sponsors/unifiedjs"
2275
+ },
2276
+ {
2277
+ "type": "OpenCollective",
2278
+ "url": "https://opencollective.com/unified"
2279
+ }
2280
+ ],
2281
+ "license": "MIT",
2282
+ "dependencies": {
2283
+ "micromark-util-character": "^2.0.0",
2284
+ "micromark-util-symbol": "^2.0.0",
2285
+ "micromark-util-types": "^2.0.0"
2286
+ }
2287
+ },
2288
+ "node_modules/micromark-factory-label": {
2289
+ "version": "2.0.1",
2290
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
2291
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
2292
+ "funding": [
2293
+ {
2294
+ "type": "GitHub Sponsors",
2295
+ "url": "https://github.com/sponsors/unifiedjs"
2296
+ },
2297
+ {
2298
+ "type": "OpenCollective",
2299
+ "url": "https://opencollective.com/unified"
2300
+ }
2301
+ ],
2302
+ "license": "MIT",
2303
+ "dependencies": {
2304
+ "devlop": "^1.0.0",
2305
+ "micromark-util-character": "^2.0.0",
2306
+ "micromark-util-symbol": "^2.0.0",
2307
+ "micromark-util-types": "^2.0.0"
2308
+ }
2309
+ },
2310
+ "node_modules/micromark-factory-space": {
2311
+ "version": "2.0.1",
2312
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
2313
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
2314
+ "funding": [
2315
+ {
2316
+ "type": "GitHub Sponsors",
2317
+ "url": "https://github.com/sponsors/unifiedjs"
2318
+ },
2319
+ {
2320
+ "type": "OpenCollective",
2321
+ "url": "https://opencollective.com/unified"
2322
+ }
2323
+ ],
2324
+ "license": "MIT",
2325
+ "dependencies": {
2326
+ "micromark-util-character": "^2.0.0",
2327
+ "micromark-util-types": "^2.0.0"
2328
+ }
2329
+ },
2330
+ "node_modules/micromark-factory-title": {
2331
+ "version": "2.0.1",
2332
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
2333
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
2334
+ "funding": [
2335
+ {
2336
+ "type": "GitHub Sponsors",
2337
+ "url": "https://github.com/sponsors/unifiedjs"
2338
+ },
2339
+ {
2340
+ "type": "OpenCollective",
2341
+ "url": "https://opencollective.com/unified"
2342
+ }
2343
+ ],
2344
+ "license": "MIT",
2345
+ "dependencies": {
2346
+ "micromark-factory-space": "^2.0.0",
2347
+ "micromark-util-character": "^2.0.0",
2348
+ "micromark-util-symbol": "^2.0.0",
2349
+ "micromark-util-types": "^2.0.0"
2350
+ }
2351
+ },
2352
+ "node_modules/micromark-factory-whitespace": {
2353
+ "version": "2.0.1",
2354
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
2355
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
2356
+ "funding": [
2357
+ {
2358
+ "type": "GitHub Sponsors",
2359
+ "url": "https://github.com/sponsors/unifiedjs"
2360
+ },
2361
+ {
2362
+ "type": "OpenCollective",
2363
+ "url": "https://opencollective.com/unified"
2364
+ }
2365
+ ],
2366
+ "license": "MIT",
2367
+ "dependencies": {
2368
+ "micromark-factory-space": "^2.0.0",
2369
+ "micromark-util-character": "^2.0.0",
2370
+ "micromark-util-symbol": "^2.0.0",
2371
+ "micromark-util-types": "^2.0.0"
2372
+ }
2373
+ },
2374
+ "node_modules/micromark-util-character": {
2375
+ "version": "2.1.1",
2376
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
2377
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
2378
+ "funding": [
2379
+ {
2380
+ "type": "GitHub Sponsors",
2381
+ "url": "https://github.com/sponsors/unifiedjs"
2382
+ },
2383
+ {
2384
+ "type": "OpenCollective",
2385
+ "url": "https://opencollective.com/unified"
2386
+ }
2387
+ ],
2388
+ "license": "MIT",
2389
+ "dependencies": {
2390
+ "micromark-util-symbol": "^2.0.0",
2391
+ "micromark-util-types": "^2.0.0"
2392
+ }
2393
+ },
2394
+ "node_modules/micromark-util-chunked": {
2395
+ "version": "2.0.1",
2396
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
2397
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
2398
+ "funding": [
2399
+ {
2400
+ "type": "GitHub Sponsors",
2401
+ "url": "https://github.com/sponsors/unifiedjs"
2402
+ },
2403
+ {
2404
+ "type": "OpenCollective",
2405
+ "url": "https://opencollective.com/unified"
2406
+ }
2407
+ ],
2408
+ "license": "MIT",
2409
+ "dependencies": {
2410
+ "micromark-util-symbol": "^2.0.0"
2411
+ }
2412
+ },
2413
+ "node_modules/micromark-util-classify-character": {
2414
+ "version": "2.0.1",
2415
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
2416
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
2417
+ "funding": [
2418
+ {
2419
+ "type": "GitHub Sponsors",
2420
+ "url": "https://github.com/sponsors/unifiedjs"
2421
+ },
2422
+ {
2423
+ "type": "OpenCollective",
2424
+ "url": "https://opencollective.com/unified"
2425
+ }
2426
+ ],
2427
+ "license": "MIT",
2428
+ "dependencies": {
2429
+ "micromark-util-character": "^2.0.0",
2430
+ "micromark-util-symbol": "^2.0.0",
2431
+ "micromark-util-types": "^2.0.0"
2432
+ }
2433
+ },
2434
+ "node_modules/micromark-util-combine-extensions": {
2435
+ "version": "2.0.1",
2436
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
2437
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
2438
+ "funding": [
2439
+ {
2440
+ "type": "GitHub Sponsors",
2441
+ "url": "https://github.com/sponsors/unifiedjs"
2442
+ },
2443
+ {
2444
+ "type": "OpenCollective",
2445
+ "url": "https://opencollective.com/unified"
2446
+ }
2447
+ ],
2448
+ "license": "MIT",
2449
+ "dependencies": {
2450
+ "micromark-util-chunked": "^2.0.0",
2451
+ "micromark-util-types": "^2.0.0"
2452
+ }
2453
+ },
2454
+ "node_modules/micromark-util-decode-numeric-character-reference": {
2455
+ "version": "2.0.2",
2456
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
2457
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
2458
+ "funding": [
2459
+ {
2460
+ "type": "GitHub Sponsors",
2461
+ "url": "https://github.com/sponsors/unifiedjs"
2462
+ },
2463
+ {
2464
+ "type": "OpenCollective",
2465
+ "url": "https://opencollective.com/unified"
2466
+ }
2467
+ ],
2468
+ "license": "MIT",
2469
+ "dependencies": {
2470
+ "micromark-util-symbol": "^2.0.0"
2471
  }
2472
  },
2473
+ "node_modules/micromark-util-decode-string": {
2474
+ "version": "2.0.1",
2475
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
2476
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
2477
+ "funding": [
2478
+ {
2479
+ "type": "GitHub Sponsors",
2480
+ "url": "https://github.com/sponsors/unifiedjs"
2481
+ },
2482
+ {
2483
+ "type": "OpenCollective",
2484
+ "url": "https://opencollective.com/unified"
2485
+ }
2486
+ ],
2487
  "license": "MIT",
2488
+ "dependencies": {
2489
+ "decode-named-character-reference": "^1.0.0",
2490
+ "micromark-util-character": "^2.0.0",
2491
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
2492
+ "micromark-util-symbol": "^2.0.0"
2493
  }
2494
  },
2495
+ "node_modules/micromark-util-encode": {
2496
+ "version": "2.0.1",
2497
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
2498
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
2499
+ "funding": [
2500
+ {
2501
+ "type": "GitHub Sponsors",
2502
+ "url": "https://github.com/sponsors/unifiedjs"
2503
+ },
2504
+ {
2505
+ "type": "OpenCollective",
2506
+ "url": "https://opencollective.com/unified"
2507
+ }
2508
+ ],
2509
  "license": "MIT"
2510
  },
2511
+ "node_modules/micromark-util-html-tag-name": {
2512
+ "version": "2.0.1",
2513
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
2514
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
2515
+ "funding": [
2516
+ {
2517
+ "type": "GitHub Sponsors",
2518
+ "url": "https://github.com/sponsors/unifiedjs"
2519
+ },
2520
+ {
2521
+ "type": "OpenCollective",
2522
+ "url": "https://opencollective.com/unified"
2523
+ }
2524
+ ],
2525
+ "license": "MIT"
2526
+ },
2527
+ "node_modules/micromark-util-normalize-identifier": {
2528
+ "version": "2.0.1",
2529
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
2530
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
2531
+ "funding": [
2532
+ {
2533
+ "type": "GitHub Sponsors",
2534
+ "url": "https://github.com/sponsors/unifiedjs"
2535
+ },
2536
+ {
2537
+ "type": "OpenCollective",
2538
+ "url": "https://opencollective.com/unified"
2539
+ }
2540
+ ],
2541
  "license": "MIT",
2542
+ "dependencies": {
2543
+ "micromark-util-symbol": "^2.0.0"
 
 
 
2544
  }
2545
  },
2546
+ "node_modules/micromark-util-resolve-all": {
2547
+ "version": "2.0.1",
2548
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
2549
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
2550
+ "funding": [
2551
+ {
2552
+ "type": "GitHub Sponsors",
2553
+ "url": "https://github.com/sponsors/unifiedjs"
2554
+ },
2555
+ {
2556
+ "type": "OpenCollective",
2557
+ "url": "https://opencollective.com/unified"
2558
+ }
2559
+ ],
2560
  "license": "MIT",
2561
+ "dependencies": {
2562
+ "micromark-util-types": "^2.0.0"
 
 
 
2563
  }
2564
  },
2565
+ "node_modules/micromark-util-sanitize-uri": {
2566
+ "version": "2.0.1",
2567
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
2568
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
2569
+ "funding": [
2570
+ {
2571
+ "type": "GitHub Sponsors",
2572
+ "url": "https://github.com/sponsors/unifiedjs"
2573
+ },
2574
+ {
2575
+ "type": "OpenCollective",
2576
+ "url": "https://opencollective.com/unified"
2577
+ }
2578
+ ],
2579
+ "license": "MIT",
2580
  "dependencies": {
2581
+ "micromark-util-character": "^2.0.0",
2582
+ "micromark-util-encode": "^2.0.0",
2583
+ "micromark-util-symbol": "^2.0.0"
2584
  }
2585
  },
2586
+ "node_modules/micromark-util-subtokenize": {
2587
+ "version": "2.1.0",
2588
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
2589
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
2590
+ "funding": [
2591
+ {
2592
+ "type": "GitHub Sponsors",
2593
+ "url": "https://github.com/sponsors/unifiedjs"
2594
+ },
2595
+ {
2596
+ "type": "OpenCollective",
2597
+ "url": "https://opencollective.com/unified"
2598
+ }
2599
+ ],
2600
+ "license": "MIT",
2601
+ "dependencies": {
2602
+ "devlop": "^1.0.0",
2603
+ "micromark-util-chunked": "^2.0.0",
2604
+ "micromark-util-symbol": "^2.0.0",
2605
+ "micromark-util-types": "^2.0.0"
2606
  }
2607
  },
2608
+ "node_modules/micromark-util-symbol": {
2609
+ "version": "2.0.1",
2610
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
2611
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
2612
+ "funding": [
2613
+ {
2614
+ "type": "GitHub Sponsors",
2615
+ "url": "https://github.com/sponsors/unifiedjs"
2616
+ },
2617
+ {
2618
+ "type": "OpenCollective",
2619
+ "url": "https://opencollective.com/unified"
2620
+ }
2621
+ ],
2622
+ "license": "MIT"
2623
+ },
2624
+ "node_modules/micromark-util-types": {
2625
+ "version": "2.0.2",
2626
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
2627
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
2628
+ "funding": [
2629
+ {
2630
+ "type": "GitHub Sponsors",
2631
+ "url": "https://github.com/sponsors/unifiedjs"
2632
+ },
2633
+ {
2634
+ "type": "OpenCollective",
2635
+ "url": "https://opencollective.com/unified"
2636
+ }
2637
+ ],
2638
+ "license": "MIT"
2639
+ },
2640
  "node_modules/ms": {
2641
  "version": "2.1.3",
2642
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2643
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
 
2644
  "license": "MIT"
2645
  },
2646
  "node_modules/nanoid": {
 
2669
  "dev": true,
2670
  "license": "MIT"
2671
  },
2672
+ "node_modules/parse-entities": {
2673
+ "version": "4.0.2",
2674
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
2675
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
2676
+ "license": "MIT",
2677
+ "dependencies": {
2678
+ "@types/unist": "^2.0.0",
2679
+ "character-entities-legacy": "^3.0.0",
2680
+ "character-reference-invalid": "^2.0.0",
2681
+ "decode-named-character-reference": "^1.0.0",
2682
+ "is-alphanumerical": "^2.0.0",
2683
+ "is-decimal": "^2.0.0",
2684
+ "is-hexadecimal": "^2.0.0"
2685
+ },
2686
+ "funding": {
2687
+ "type": "github",
2688
+ "url": "https://github.com/sponsors/wooorm"
2689
+ }
2690
+ },
2691
+ "node_modules/parse-entities/node_modules/@types/unist": {
2692
+ "version": "2.0.11",
2693
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
2694
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
2695
+ "license": "MIT"
2696
+ },
2697
  "node_modules/picocolors": {
2698
  "version": "1.1.1",
2699
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
 
2743
  "node": "^10 || ^12 || >=14"
2744
  }
2745
  },
2746
+ "node_modules/property-information": {
2747
+ "version": "7.1.0",
2748
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
2749
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
2750
+ "license": "MIT",
2751
+ "funding": {
2752
+ "type": "github",
2753
+ "url": "https://github.com/sponsors/wooorm"
2754
+ }
2755
+ },
2756
  "node_modules/react": {
2757
  "version": "19.2.4",
2758
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
 
2774
  "react": "^19.2.4"
2775
  }
2776
  },
2777
+ "node_modules/react-markdown": {
2778
+ "version": "10.1.0",
2779
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz",
2780
+ "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==",
2781
+ "license": "MIT",
2782
+ "dependencies": {
2783
+ "@types/hast": "^3.0.0",
2784
+ "@types/mdast": "^4.0.0",
2785
+ "devlop": "^1.0.0",
2786
+ "hast-util-to-jsx-runtime": "^2.0.0",
2787
+ "html-url-attributes": "^3.0.0",
2788
+ "mdast-util-to-hast": "^13.0.0",
2789
+ "remark-parse": "^11.0.0",
2790
+ "remark-rehype": "^11.0.0",
2791
+ "unified": "^11.0.0",
2792
+ "unist-util-visit": "^5.0.0",
2793
+ "vfile": "^6.0.0"
2794
+ },
2795
+ "funding": {
2796
+ "type": "opencollective",
2797
+ "url": "https://opencollective.com/unified"
2798
+ },
2799
+ "peerDependencies": {
2800
+ "@types/react": ">=18",
2801
+ "react": ">=18"
2802
+ }
2803
+ },
2804
  "node_modules/react-refresh": {
2805
  "version": "0.17.0",
2806
  "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
 
2811
  "node": ">=0.10.0"
2812
  }
2813
  },
2814
+ "node_modules/remark-gfm": {
2815
+ "version": "4.0.1",
2816
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
2817
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
2818
+ "license": "MIT",
2819
+ "dependencies": {
2820
+ "@types/mdast": "^4.0.0",
2821
+ "mdast-util-gfm": "^3.0.0",
2822
+ "micromark-extension-gfm": "^3.0.0",
2823
+ "remark-parse": "^11.0.0",
2824
+ "remark-stringify": "^11.0.0",
2825
+ "unified": "^11.0.0"
2826
+ },
2827
+ "funding": {
2828
+ "type": "opencollective",
2829
+ "url": "https://opencollective.com/unified"
2830
+ }
2831
+ },
2832
+ "node_modules/remark-parse": {
2833
+ "version": "11.0.0",
2834
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
2835
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
2836
+ "license": "MIT",
2837
+ "dependencies": {
2838
+ "@types/mdast": "^4.0.0",
2839
+ "mdast-util-from-markdown": "^2.0.0",
2840
+ "micromark-util-types": "^2.0.0",
2841
+ "unified": "^11.0.0"
2842
+ },
2843
+ "funding": {
2844
+ "type": "opencollective",
2845
+ "url": "https://opencollective.com/unified"
2846
+ }
2847
+ },
2848
+ "node_modules/remark-rehype": {
2849
+ "version": "11.1.2",
2850
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
2851
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
2852
+ "license": "MIT",
2853
+ "dependencies": {
2854
+ "@types/hast": "^3.0.0",
2855
+ "@types/mdast": "^4.0.0",
2856
+ "mdast-util-to-hast": "^13.0.0",
2857
+ "unified": "^11.0.0",
2858
+ "vfile": "^6.0.0"
2859
+ },
2860
+ "funding": {
2861
+ "type": "opencollective",
2862
+ "url": "https://opencollective.com/unified"
2863
+ }
2864
+ },
2865
+ "node_modules/remark-stringify": {
2866
+ "version": "11.0.0",
2867
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
2868
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
2869
+ "license": "MIT",
2870
+ "dependencies": {
2871
+ "@types/mdast": "^4.0.0",
2872
+ "mdast-util-to-markdown": "^2.0.0",
2873
+ "unified": "^11.0.0"
2874
+ },
2875
+ "funding": {
2876
+ "type": "opencollective",
2877
+ "url": "https://opencollective.com/unified"
2878
+ }
2879
+ },
2880
  "node_modules/rollup": {
2881
  "version": "4.60.1",
2882
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz",
 
2948
  "node": ">=0.10.0"
2949
  }
2950
  },
2951
+ "node_modules/space-separated-tokens": {
2952
+ "version": "2.0.2",
2953
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
2954
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
2955
+ "license": "MIT",
2956
+ "funding": {
2957
+ "type": "github",
2958
+ "url": "https://github.com/sponsors/wooorm"
2959
+ }
2960
+ },
2961
+ "node_modules/stringify-entities": {
2962
+ "version": "4.0.4",
2963
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
2964
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
2965
+ "license": "MIT",
2966
+ "dependencies": {
2967
+ "character-entities-html4": "^2.0.0",
2968
+ "character-entities-legacy": "^3.0.0"
2969
+ },
2970
+ "funding": {
2971
+ "type": "github",
2972
+ "url": "https://github.com/sponsors/wooorm"
2973
+ }
2974
+ },
2975
+ "node_modules/style-to-js": {
2976
+ "version": "1.1.21",
2977
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
2978
+ "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
2979
+ "license": "MIT",
2980
+ "dependencies": {
2981
+ "style-to-object": "1.0.14"
2982
+ }
2983
+ },
2984
+ "node_modules/style-to-object": {
2985
+ "version": "1.0.14",
2986
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
2987
+ "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
2988
+ "license": "MIT",
2989
+ "dependencies": {
2990
+ "inline-style-parser": "0.2.7"
2991
+ }
2992
+ },
2993
  "node_modules/tinyglobby": {
2994
  "version": "0.2.15",
2995
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
 
3007
  "url": "https://github.com/sponsors/SuperchupuDev"
3008
  }
3009
  },
3010
+ "node_modules/trim-lines": {
3011
+ "version": "3.0.1",
3012
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
3013
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
3014
+ "license": "MIT",
3015
+ "funding": {
3016
+ "type": "github",
3017
+ "url": "https://github.com/sponsors/wooorm"
3018
+ }
3019
+ },
3020
+ "node_modules/trough": {
3021
+ "version": "2.2.0",
3022
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
3023
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
3024
+ "license": "MIT",
3025
+ "funding": {
3026
+ "type": "github",
3027
+ "url": "https://github.com/sponsors/wooorm"
3028
+ }
3029
+ },
3030
+ "node_modules/unified": {
3031
+ "version": "11.0.5",
3032
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
3033
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
3034
+ "license": "MIT",
3035
+ "dependencies": {
3036
+ "@types/unist": "^3.0.0",
3037
+ "bail": "^2.0.0",
3038
+ "devlop": "^1.0.0",
3039
+ "extend": "^3.0.0",
3040
+ "is-plain-obj": "^4.0.0",
3041
+ "trough": "^2.0.0",
3042
+ "vfile": "^6.0.0"
3043
+ },
3044
+ "funding": {
3045
+ "type": "opencollective",
3046
+ "url": "https://opencollective.com/unified"
3047
+ }
3048
+ },
3049
+ "node_modules/unist-util-is": {
3050
+ "version": "6.0.1",
3051
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
3052
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
3053
+ "license": "MIT",
3054
+ "dependencies": {
3055
+ "@types/unist": "^3.0.0"
3056
+ },
3057
+ "funding": {
3058
+ "type": "opencollective",
3059
+ "url": "https://opencollective.com/unified"
3060
+ }
3061
+ },
3062
+ "node_modules/unist-util-position": {
3063
+ "version": "5.0.0",
3064
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
3065
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
3066
+ "license": "MIT",
3067
+ "dependencies": {
3068
+ "@types/unist": "^3.0.0"
3069
+ },
3070
+ "funding": {
3071
+ "type": "opencollective",
3072
+ "url": "https://opencollective.com/unified"
3073
+ }
3074
+ },
3075
+ "node_modules/unist-util-stringify-position": {
3076
+ "version": "4.0.0",
3077
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
3078
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
3079
+ "license": "MIT",
3080
+ "dependencies": {
3081
+ "@types/unist": "^3.0.0"
3082
+ },
3083
+ "funding": {
3084
+ "type": "opencollective",
3085
+ "url": "https://opencollective.com/unified"
3086
+ }
3087
+ },
3088
+ "node_modules/unist-util-visit": {
3089
+ "version": "5.1.0",
3090
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
3091
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
3092
+ "license": "MIT",
3093
+ "dependencies": {
3094
+ "@types/unist": "^3.0.0",
3095
+ "unist-util-is": "^6.0.0",
3096
+ "unist-util-visit-parents": "^6.0.0"
3097
+ },
3098
+ "funding": {
3099
+ "type": "opencollective",
3100
+ "url": "https://opencollective.com/unified"
3101
+ }
3102
+ },
3103
+ "node_modules/unist-util-visit-parents": {
3104
+ "version": "6.0.2",
3105
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
3106
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
3107
+ "license": "MIT",
3108
+ "dependencies": {
3109
+ "@types/unist": "^3.0.0",
3110
+ "unist-util-is": "^6.0.0"
3111
+ },
3112
+ "funding": {
3113
+ "type": "opencollective",
3114
+ "url": "https://opencollective.com/unified"
3115
+ }
3116
+ },
3117
  "node_modules/update-browserslist-db": {
3118
  "version": "1.2.3",
3119
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
 
3145
  "browserslist": ">= 4.21.0"
3146
  }
3147
  },
3148
+ "node_modules/vfile": {
3149
+ "version": "6.0.3",
3150
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
3151
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
3152
+ "license": "MIT",
3153
+ "dependencies": {
3154
+ "@types/unist": "^3.0.0",
3155
+ "vfile-message": "^4.0.0"
3156
+ },
3157
+ "funding": {
3158
+ "type": "opencollective",
3159
+ "url": "https://opencollective.com/unified"
3160
+ }
3161
+ },
3162
+ "node_modules/vfile-message": {
3163
+ "version": "4.0.3",
3164
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
3165
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
3166
+ "license": "MIT",
3167
+ "dependencies": {
3168
+ "@types/unist": "^3.0.0",
3169
+ "unist-util-stringify-position": "^4.0.0"
3170
+ },
3171
+ "funding": {
3172
+ "type": "opencollective",
3173
+ "url": "https://opencollective.com/unified"
3174
+ }
3175
+ },
3176
  "node_modules/vite": {
3177
  "version": "6.4.1",
3178
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
 
3254
  "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
3255
  "dev": true,
3256
  "license": "ISC"
3257
+ },
3258
+ "node_modules/zwitch": {
3259
+ "version": "2.0.4",
3260
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
3261
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
3262
+ "license": "MIT",
3263
+ "funding": {
3264
+ "type": "github",
3265
+ "url": "https://github.com/sponsors/wooorm"
3266
+ }
3267
  }
3268
  }
3269
  }
frontend/package.json CHANGED
@@ -11,7 +11,9 @@
11
  "dependencies": {
12
  "lucide-react": "^0.468.0",
13
  "react": "^19.0.0",
14
- "react-dom": "^19.0.0"
 
 
15
  },
16
  "devDependencies": {
17
  "@vitejs/plugin-react": "^4.3.4",
 
11
  "dependencies": {
12
  "lucide-react": "^0.468.0",
13
  "react": "^19.0.0",
14
+ "react-dom": "^19.0.0",
15
+ "react-markdown": "^10.1.0",
16
+ "remark-gfm": "^4.0.1"
17
  },
18
  "devDependencies": {
19
  "@vitejs/plugin-react": "^4.3.4",
frontend/src/App.css CHANGED
@@ -332,6 +332,126 @@ html.aj-hide-pointer * {
332
  border-color: transparent;
333
  }
334
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
335
  .aj-typing {
336
  display: inline-block;
337
  width: 8px;
 
332
  border-color: transparent;
333
  }
334
 
335
+ /* Assistant replies: render markdown as formatted text (not raw syntax) */
336
+ .aj-bubble--assistant-md {
337
+ white-space: normal;
338
+ }
339
+
340
+ .aj-bubble-md {
341
+ line-height: 1.55;
342
+ }
343
+
344
+ .aj-bubble-md p {
345
+ margin: 0 0 0.65em;
346
+ }
347
+
348
+ .aj-bubble-md p:last-child {
349
+ margin-bottom: 0;
350
+ }
351
+
352
+ .aj-bubble-md h1,
353
+ .aj-bubble-md h2,
354
+ .aj-bubble-md h3,
355
+ .aj-bubble-md h4 {
356
+ margin: 0.85em 0 0.4em;
357
+ line-height: 1.25;
358
+ font-weight: 600;
359
+ }
360
+
361
+ .aj-bubble-md h1:first-child,
362
+ .aj-bubble-md h2:first-child,
363
+ .aj-bubble-md h3:first-child,
364
+ .aj-bubble-md h4:first-child {
365
+ margin-top: 0;
366
+ }
367
+
368
+ .aj-bubble-md h1 {
369
+ font-size: 1.2em;
370
+ }
371
+
372
+ .aj-bubble-md h2 {
373
+ font-size: 1.1em;
374
+ }
375
+
376
+ .aj-bubble-md h3,
377
+ .aj-bubble-md h4 {
378
+ font-size: 1.05em;
379
+ }
380
+
381
+ .aj-bubble-md ul,
382
+ .aj-bubble-md ol {
383
+ margin: 0 0 0.65em;
384
+ padding-left: 1.35em;
385
+ }
386
+
387
+ .aj-bubble-md li {
388
+ margin: 0.2em 0;
389
+ }
390
+
391
+ .aj-bubble-md li > p {
392
+ margin: 0.25em 0;
393
+ }
394
+
395
+ .aj-bubble-md blockquote {
396
+ margin: 0.5em 0;
397
+ padding: 0 0 0 0.75em;
398
+ border-left: 3px solid var(--lc-accent);
399
+ color: var(--lc-muted);
400
+ }
401
+
402
+ .aj-bubble-md hr {
403
+ margin: 0.85em 0;
404
+ border: none;
405
+ border-top: 1px solid var(--lc-border);
406
+ }
407
+
408
+ .aj-bubble-md pre {
409
+ margin: 0.5em 0;
410
+ padding: 10px 12px;
411
+ border-radius: 10px;
412
+ background: rgba(15, 23, 42, 0.06);
413
+ overflow-x: auto;
414
+ font-size: 13px;
415
+ }
416
+
417
+ .aj-bubble-md code {
418
+ font-family: ui-monospace, 'Cascadia Code', 'Segoe UI Mono', monospace;
419
+ font-size: 0.92em;
420
+ padding: 0.1em 0.35em;
421
+ border-radius: 4px;
422
+ background: rgba(15, 23, 42, 0.07);
423
+ }
424
+
425
+ .aj-bubble-md pre code {
426
+ padding: 0;
427
+ background: none;
428
+ font-size: inherit;
429
+ }
430
+
431
+ .aj-bubble-md a {
432
+ color: var(--lc-accent);
433
+ text-decoration: underline;
434
+ text-underline-offset: 2px;
435
+ }
436
+
437
+ .aj-bubble-md table {
438
+ width: 100%;
439
+ border-collapse: collapse;
440
+ margin: 0.5em 0;
441
+ font-size: 13px;
442
+ }
443
+
444
+ .aj-bubble-md th,
445
+ .aj-bubble-md td {
446
+ border: 1px solid var(--lc-border);
447
+ padding: 6px 8px;
448
+ text-align: left;
449
+ }
450
+
451
+ .aj-bubble-md th {
452
+ background: rgba(15, 23, 42, 0.04);
453
+ }
454
+
455
  .aj-typing {
456
  display: inline-block;
457
  width: 8px;
frontend/src/App.jsx CHANGED
@@ -1,4 +1,6 @@
1
  import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'
 
 
2
  import {
3
  AlertTriangle,
4
  ChevronDown,
@@ -84,12 +86,7 @@ function AssistantSearchBar({ content, show }) {
84
  return
85
  }
86
  const bubble = wrapRef.current?.closest('.aj-bubble-wrap')
87
- if (!bubble) {
88
- // #region agent log
89
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:measurePopover', message: 'bubble null', data: { hypothesisId: 'search-pos', hasWrapRef: !!wrapRef.current }, timestamp: Date.now(), runId: 'search-debug' }) }).catch(() => {})
90
- // #endregion
91
- return
92
- }
93
  const br = bubble.getBoundingClientRect()
94
  const vw = window.visualViewport?.width ?? window.innerWidth
95
  const margin = 12
@@ -110,9 +107,6 @@ function AssistantSearchBar({ content, show }) {
110
  const left = Math.max(margin, Math.min(br.left, vw - w - margin))
111
  style = { position: 'fixed', visibility: 'visible', top: br.bottom + gap, left, width: w }
112
  }
113
- // #region agent log
114
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:measurePopover', message: 'computed', data: { hypothesisId: 'search-pos', canPlaceRight, brTop: br.top, brRight: br.right, brBottom: br.bottom, brLeft: br.left, vw, style }, timestamp: Date.now(), runId: 'search-debug' }) }).catch(() => {})
115
- // #endregion
116
  setPopoverStyle(style)
117
  }, [open])
118
 
@@ -141,9 +135,6 @@ function AssistantSearchBar({ content, show }) {
141
  }, [open])
142
 
143
  const openPanel = async () => {
144
- // #region agent log
145
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:openPanel', message: 'clicked', data: { hypothesisId: 'search', wasOpen: open, contentLen: (content || '').length, showProp: show }, timestamp: Date.now(), runId: 'search-debug' }) }).catch(() => {})
146
- // #endregion
147
  if (open) {
148
  setOpen(false)
149
  return
@@ -159,17 +150,11 @@ function AssistantSearchBar({ content, show }) {
159
  headers: { 'Content-Type': 'application/json' },
160
  body: JSON.stringify({ statement: text }),
161
  })
162
- // #region agent log
163
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:openPanel:response', message: 'api replied', data: { hypothesisId: 'search', status: res.status, ok: res.ok }, timestamp: Date.now(), runId: 'search-debug' }) }).catch(() => {})
164
- // #endregion
165
  const data = await res.json().catch(() => ({}))
166
  const q = (data.search_query || '').trim() || text.slice(0, 100)
167
- setDraft(q)
168
- } catch (err) {
169
- // #region agent log
170
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:openPanel:error', message: 'fetch failed', data: { hypothesisId: 'search', error: String(err) }, timestamp: Date.now(), runId: 'search-debug' }) }).catch(() => {})
171
- // #endregion
172
- setDraft(text.slice(0, 100))
173
  } finally {
174
  setLoading(false)
175
  }
@@ -186,6 +171,10 @@ function AssistantSearchBar({ content, show }) {
186
  window.open(`https://www.perplexity.ai/?q=${encodeURIComponent(draft)}`, '_blank', 'noopener,noreferrer')
187
  }
188
 
 
 
 
 
189
  if (!show || !(content || '').trim()) return null
190
 
191
  return (
@@ -231,6 +220,9 @@ function AssistantSearchBar({ content, show }) {
231
  <button type="button" className="aj-btn aj-msg-search-action" onClick={copyDraft}>
232
  {copied ? 'Copied!' : 'Copy'}
233
  </button>
 
 
 
234
  </div>
235
  </>
236
  )}
@@ -240,6 +232,25 @@ function AssistantSearchBar({ content, show }) {
240
  )
241
  }
242
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
  export default function App() {
244
  const [optionsOpen, setOptionsOpen] = useState(false)
245
  const [shareOpen, setShareOpen] = useState(false)
@@ -261,7 +272,7 @@ export default function App() {
261
  const shareRef = useRef(null)
262
  const exportRef = useRef(null)
263
  const composerRef = useRef(null)
264
- const jumpLogTsRef = useRef(0)
265
 
266
  useEffect(() => {
267
  const el = document.documentElement
@@ -281,23 +292,11 @@ export default function App() {
281
 
282
  const updateJumpToBottomVisibility = useCallback(() => {
283
  const el = chatScrollRef.current
284
- if (!el) {
285
- // #region agent log
286
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:updateJumpToBottomVisibility', message: 'chatScrollRef null', data: { hypothesisId: 'A' }, timestamp: Date.now(), runId: 'pre-fix' }) }).catch(() => {})
287
- // #endregion
288
- return
289
- }
290
  const { scrollHeight, clientHeight, scrollTop } = el
291
  const canScroll = scrollHeight > clientHeight + 2
292
  const atBottom = scrollTop + clientHeight >= scrollHeight - 48
293
  setShowJumpToBottom(canScroll && !atBottom)
294
- const now = Date.now()
295
- if (now - jumpLogTsRef.current > 400) {
296
- jumpLogTsRef.current = now
297
- // #region agent log
298
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:updateJumpToBottomVisibility', message: 'jump metrics', data: { hypothesisId: 'B,C', scrollHeight, clientHeight, scrollTop, canScroll, atBottom, showJump: canScroll && !atBottom }, timestamp: Date.now(), runId: 'pre-fix' }) }).catch(() => {})
299
- // #endregion
300
- }
301
  }, [])
302
 
303
  useLayoutEffect(() => {
@@ -310,37 +309,18 @@ export default function App() {
310
  return
311
  }
312
  if (didScrollForStreamRef.current) return
313
- const lastAiIdx =
314
- messages.length > 0 && messages[messages.length - 1].role === 'assistant'
315
- ? messages.length - 1
316
- : -1
317
  const doScroll = () => {
318
  const container = chatScrollRef.current
319
- const target = streamingAssistantRowRef.current
320
- const sh = container?.scrollHeight
321
- const ch = container?.clientHeight
322
- // #region agent log
323
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:streamScroll:doScroll', message: 'attempt', data: { hypothesisId: 'A,B,D,E', scrollAnchor: 'assistant', hasContainer: !!container, hasTarget: !!target, lastAssistantIdx: lastAiIdx, scrollHeight: sh, clientHeight: ch, overflow: sh != null && ch != null ? sh > ch + 2 : null, didScrollAlready: didScrollForStreamRef.current }, timestamp: Date.now(), runId: 'pre-fix' }) }).catch(() => {})
324
- // #endregion
325
  if (!container || !target) return false
326
  const canScroll = container.scrollHeight > container.clientHeight + 2
327
- if (!canScroll) {
328
- // #region agent log
329
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:streamScroll:skip', message: 'no overflow yet', data: { hypothesisId: 'D', willRetry: true, scrollHeight: sh, clientHeight: ch }, timestamp: Date.now(), runId: 'post-fix' }) }).catch(() => {})
330
- // #endregion
331
- return false
332
- }
333
- const stBefore = container.scrollTop
334
- const delta = target.getBoundingClientRect().top - container.getBoundingClientRect().top
335
- container.scrollTop += delta
336
- const remainingOffset = target.getBoundingClientRect().top - container.getBoundingClientRect().top
337
- const reachedTarget = Math.abs(remainingOffset) < 12
338
- if (reachedTarget) {
339
- didScrollForStreamRef.current = true
340
- }
341
- // #region agent log
342
- fetch('http://127.0.0.1:7242/ingest/4ceffb36-6066-4085-8960-0ad323da4e60', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '24f871' }, body: JSON.stringify({ sessionId: '24f871', location: 'App.jsx:streamScroll:after', message: 'scrolled', data: { hypothesisId: 'F', stBefore, delta, stAfter: container.scrollTop, remainingOffset, reachedTarget, locked: didScrollForStreamRef.current }, timestamp: Date.now(), runId: 'post-fix-2' }) }).catch(() => {})
343
- // #endregion
344
  updateJumpToBottomVisibility()
345
  return true
346
  }
@@ -363,10 +343,16 @@ export default function App() {
363
  }
364
  }, [updateJumpToBottomVisibility])
365
 
366
- const scrollChatToBottom = useCallback(() => {
367
- const el = chatScrollRef.current
368
- if (!el) return
369
- el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' })
 
 
 
 
 
 
370
  requestAnimationFrame(() => {
371
  updateJumpToBottomVisibility()
372
  composerRef.current?.focus()
@@ -918,25 +904,35 @@ export default function App() {
918
  <p className="aj-summary-text">{summary}</p>
919
  </div>
920
  )}
921
- {messages.map((m, i) => {
922
- const isUser = m.role === 'user'
923
- return (
924
- <div
925
- key={i}
926
- ref={
927
- i === messages.length - 1 && m.role === 'assistant'
 
928
  ? streamingAssistantRowRef
929
  : undefined
930
- }
931
- className={`aj-msg-row ${isUser ? 'user' : ''}`}
932
- >
 
 
 
933
  {!isUser && <div className="aj-shape" aria-hidden />}
934
  <div className="aj-bubble-wrap">
935
  <div className="aj-bubble-name">{isUser ? 'You' : 'AI Jerry'}</div>
936
- <div className="aj-bubble">
937
- {m.content}
938
- {!isUser && streaming && i === messages.length - 1 && !m.content && (
939
- <span className="aj-typing" />
 
 
 
 
 
 
940
  )}
941
  </div>
942
  {!isUser && (
@@ -946,9 +942,10 @@ export default function App() {
946
  />
947
  )}
948
  </div>
949
- </div>
950
- )
951
- })}
 
952
  </div>
953
 
954
  {contextOverflow && (
@@ -1115,9 +1112,9 @@ export default function App() {
1115
  <button
1116
  type="button"
1117
  className="aj-jump-bottom-btn"
1118
- onClick={scrollChatToBottom}
1119
- title="Jump to message input"
1120
- aria-label="Jump to message input"
1121
  >
1122
  <ChevronDown size={22} aria-hidden />
1123
  </button>
 
1
  import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'
2
+ import ReactMarkdown from 'react-markdown'
3
+ import remarkGfm from 'remark-gfm'
4
  import {
5
  AlertTriangle,
6
  ChevronDown,
 
86
  return
87
  }
88
  const bubble = wrapRef.current?.closest('.aj-bubble-wrap')
89
+ if (!bubble) return
 
 
 
 
 
90
  const br = bubble.getBoundingClientRect()
91
  const vw = window.visualViewport?.width ?? window.innerWidth
92
  const margin = 12
 
107
  const left = Math.max(margin, Math.min(br.left, vw - w - margin))
108
  style = { position: 'fixed', visibility: 'visible', top: br.bottom + gap, left, width: w }
109
  }
 
 
 
110
  setPopoverStyle(style)
111
  }, [open])
112
 
 
135
  }, [open])
136
 
137
  const openPanel = async () => {
 
 
 
138
  if (open) {
139
  setOpen(false)
140
  return
 
150
  headers: { 'Content-Type': 'application/json' },
151
  body: JSON.stringify({ statement: text }),
152
  })
 
 
 
153
  const data = await res.json().catch(() => ({}))
154
  const q = (data.search_query || '').trim() || text.slice(0, 100)
155
+ setDraft(`Provide citations for ${q}`)
156
+ } catch {
157
+ setDraft(`Provide citations for ${text.slice(0, 100)}`)
 
 
 
158
  } finally {
159
  setLoading(false)
160
  }
 
171
  window.open(`https://www.perplexity.ai/?q=${encodeURIComponent(draft)}`, '_blank', 'noopener,noreferrer')
172
  }
173
 
174
+ const openWebSearch = () => {
175
+ window.open(`https://www.google.com/search?q=${encodeURIComponent(draft)}`, '_blank', 'noopener,noreferrer')
176
+ }
177
+
178
  if (!show || !(content || '').trim()) return null
179
 
180
  return (
 
220
  <button type="button" className="aj-btn aj-msg-search-action" onClick={copyDraft}>
221
  {copied ? 'Copied!' : 'Copy'}
222
  </button>
223
+ <button type="button" className="aj-btn aj-msg-search-action" onClick={openWebSearch}>
224
+ Search
225
+ </button>
226
  </div>
227
  </>
228
  )}
 
232
  )
233
  }
234
 
235
+ function AssistantBubbleContent({ content }) {
236
+ return (
237
+ <div className="aj-bubble-md">
238
+ <ReactMarkdown
239
+ remarkPlugins={[remarkGfm]}
240
+ components={{
241
+ a: ({ href, children, ...rest }) => (
242
+ <a href={href} target="_blank" rel="noopener noreferrer" {...rest}>
243
+ {children}
244
+ </a>
245
+ ),
246
+ }}
247
+ >
248
+ {content}
249
+ </ReactMarkdown>
250
+ </div>
251
+ )
252
+ }
253
+
254
  export default function App() {
255
  const [optionsOpen, setOptionsOpen] = useState(false)
256
  const [shareOpen, setShareOpen] = useState(false)
 
272
  const shareRef = useRef(null)
273
  const exportRef = useRef(null)
274
  const composerRef = useRef(null)
275
+ const lastUserRowRef = useRef(null)
276
 
277
  useEffect(() => {
278
  const el = document.documentElement
 
292
 
293
  const updateJumpToBottomVisibility = useCallback(() => {
294
  const el = chatScrollRef.current
295
+ if (!el) return
 
 
 
 
 
296
  const { scrollHeight, clientHeight, scrollTop } = el
297
  const canScroll = scrollHeight > clientHeight + 2
298
  const atBottom = scrollTop + clientHeight >= scrollHeight - 48
299
  setShowJumpToBottom(canScroll && !atBottom)
 
 
 
 
 
 
 
300
  }, [])
301
 
302
  useLayoutEffect(() => {
 
309
  return
310
  }
311
  if (didScrollForStreamRef.current) return
 
 
 
 
312
  const doScroll = () => {
313
  const container = chatScrollRef.current
314
+ const target = lastUserRowRef.current || streamingAssistantRowRef.current
 
 
 
 
 
315
  if (!container || !target) return false
316
  const canScroll = container.scrollHeight > container.clientHeight + 2
317
+ if (!canScroll) return false
318
+ const offset = target.offsetTop - container.offsetTop
319
+ container.scrollTop = offset
320
+ const delta = Math.abs(
321
+ target.getBoundingClientRect().top - container.getBoundingClientRect().top,
322
+ )
323
+ if (delta < 12) didScrollForStreamRef.current = true
 
 
 
 
 
 
 
 
 
 
324
  updateJumpToBottomVisibility()
325
  return true
326
  }
 
343
  }
344
  }, [updateJumpToBottomVisibility])
345
 
346
+ const scrollToLatestQuestion = useCallback(() => {
347
+ const container = chatScrollRef.current
348
+ if (!container) return
349
+ const userRow = lastUserRowRef.current
350
+ if (userRow) {
351
+ const offset = userRow.offsetTop - container.offsetTop
352
+ container.scrollTo({ top: offset, behavior: 'smooth' })
353
+ } else {
354
+ container.scrollTo({ top: container.scrollHeight, behavior: 'smooth' })
355
+ }
356
  requestAnimationFrame(() => {
357
  updateJumpToBottomVisibility()
358
  composerRef.current?.focus()
 
904
  <p className="aj-summary-text">{summary}</p>
905
  </div>
906
  )}
907
+ {(() => {
908
+ const lastUserIdx = messages.reduce((acc, msg, idx) => msg.role === 'user' ? idx : acc, -1)
909
+ return messages.map((m, i) => {
910
+ const isUser = m.role === 'user'
911
+ const rowRef =
912
+ i === lastUserIdx
913
+ ? lastUserRowRef
914
+ : i === messages.length - 1 && m.role === 'assistant'
915
  ? streamingAssistantRowRef
916
  : undefined
917
+ return (
918
+ <div
919
+ key={i}
920
+ ref={rowRef}
921
+ className={`aj-msg-row ${isUser ? 'user' : ''}`}
922
+ >
923
  {!isUser && <div className="aj-shape" aria-hidden />}
924
  <div className="aj-bubble-wrap">
925
  <div className="aj-bubble-name">{isUser ? 'You' : 'AI Jerry'}</div>
926
+ <div className={`aj-bubble ${!isUser ? 'aj-bubble--assistant-md' : ''}`}>
927
+ {isUser ? (
928
+ m.content
929
+ ) : (
930
+ <>
931
+ {m.content ? <AssistantBubbleContent content={m.content} /> : null}
932
+ {streaming && i === messages.length - 1 && !m.content && (
933
+ <span className="aj-typing" />
934
+ )}
935
+ </>
936
  )}
937
  </div>
938
  {!isUser && (
 
942
  />
943
  )}
944
  </div>
945
+ </div>
946
+ )
947
+ })
948
+ })()}
949
  </div>
950
 
951
  {contextOverflow && (
 
1112
  <button
1113
  type="button"
1114
  className="aj-jump-bottom-btn"
1115
+ onClick={scrollToLatestQuestion}
1116
+ title="Jump to latest question"
1117
+ aria-label="Jump to latest question"
1118
  >
1119
  <ChevronDown size={22} aria-hidden />
1120
  </button>