alaselababatunde commited on
Commit
043bb6c
·
1 Parent(s): 253e3ae

Final UI Fixes: Verified table syntax, fixed typing indicator streaming, and added table horizontal scroll

Browse files
frontend/dist/assets/index-BeubaXht.css ADDED
@@ -0,0 +1 @@
 
 
1
+ @import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";:root{--primary: #B81104;--primary-hover: #9a0e03;--secondary: #FFFFFF;--bg-color: #f8f9fa;--text-main: #212529;--text-muted: #6c757d;--border-color: #dee2e6;--bubble-user: #B81104;--bubble-bot: #FFFFFF;--shadow: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06)}*{box-sizing:border-box;margin:0;padding:0}body{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;background-color:var(--bg-color);color:var(--text-main);height:100vh;display:flex;flex-direction:column}#root{height:100%;display:flex;flex-direction:column}.app-container{max-width:900px;margin:0 auto;width:100%;height:100%;display:flex;flex-direction:column;background:#fff;box-shadow:var(--shadow)}header{padding:1rem 2rem;background-color:var(--secondary);border-bottom:2px solid var(--primary);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}.header-logo{height:40px;display:flex;align-items:center;gap:12px}.header-logo img{height:100%;object-fit:contain}.header-title{font-weight:700;color:var(--primary);font-size:1.25rem}.chat-window{flex:1;overflow-y:auto;padding:2rem;display:flex;flex-direction:column;gap:1.5rem;background:#fdfdfd}.message{display:flex;flex-direction:column;max-width:80%;animation:fadeIn .3s ease}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.message.user{align-self:flex-end}.message.assistant{align-self:flex-start}.message-bubble{padding:1rem 1.25rem;border-radius:12px;line-height:1.6;font-size:1rem;position:relative}.user .message-bubble{background-color:var(--bubble-user);color:#fff;border-bottom-right-radius:2px}.assistant .message-bubble{background-color:var(--bubble-bot);color:var(--text-main);border:1px solid var(--border-color);border-bottom-left-radius:2px;box-shadow:0 2px 5px #0000000d}.message-sender{font-size:.75rem;font-weight:600;margin-bottom:4px;color:var(--text-muted)}.message-content p{margin-bottom:.75rem}.message-content p:last-child{margin-bottom:0}.input-area{padding:1.5rem 2rem;background:#fff;border-top:1px solid var(--border-color);display:flex;gap:1rem}.input-container{flex:1;position:relative}input{width:100%;padding:1rem 1.25rem;border:1px solid var(--border-color);border-radius:30px;font-size:1rem;outline:none;transition:border-color .2s,box-shadow .2s;font-family:inherit}input:focus{border-color:var(--primary);box-shadow:0 0 0 3px #b811041a}button.send-btn{background-color:var(--primary);color:#fff;border:none;width:50px;height:50px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color .2s,transform .1s}button.send-btn:hover{background-color:var(--primary-hover)}button.send-btn:active{transform:scale(.95)}button.send-btn:disabled{background-color:var(--border-color);cursor:not-allowed}.assistant .message-bubble ul,.assistant .message-bubble ol{margin-left:1.5rem;margin-bottom:.75rem}.assistant .message-bubble li{margin-bottom:.25rem}code{background:#f1f3f5;padding:.2rem .4rem;border-radius:4px;font-family:monospace}pre{background:#f1f3f5;padding:1rem;border-radius:8px;overflow-x:auto;margin:1rem 0}.assistant .message-bubble table{width:100%;border-collapse:collapse;margin:1rem 0;font-size:.9rem;background:#fff;border-radius:8px;overflow:hidden;border:1px solid var(--border-color);display:block;overflow-x:auto}.typing-indicator.mini{margin-top:8px;justify-content:flex-start}.typing-indicator.mini span{width:5px;height:5px}.assistant .message-bubble th{background-color:#f8f9fa;color:var(--primary);font-weight:600;text-align:left;padding:.75rem;border-bottom:2px solid var(--border-color)}.assistant .message-bubble td{padding:.75rem;border-bottom:1px solid var(--border-color);line-height:1.4}.assistant .message-bubble tr:last-child td{border-bottom:none}.assistant .message-bubble tr:hover{background-color:#fff9f9}.typing-indicator{display:flex;align-items:center;gap:4px;padding:4px 0}.typing-indicator span{width:8px;height:8px;border-radius:50%;background-color:var(--text-muted);animation:typingBounce 1.4s infinite ease-in-out}.typing-indicator span:nth-child(1){animation-delay:0s}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes typingBounce{0%,60%,to{transform:translateY(0);opacity:.7}30%{transform:translateY(-10px);opacity:1}}
frontend/dist/assets/index-nfniwr7O.js ADDED
The diff for this file is too large to render. See raw diff
 
frontend/dist/assets/logo.png ADDED
frontend/dist/index.html ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/png" href="/assets/logo.png" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>UBA AI Support</title>
8
+ <script type="module" crossorigin src="/assets/index-nfniwr7O.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-BeubaXht.css">
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ </body>
14
+ </html>
frontend/package-lock.json CHANGED
@@ -11,7 +11,9 @@
11
  "lucide-react": "^0.395.0",
12
  "react": "^18.3.1",
13
  "react-dom": "^18.3.1",
14
- "react-markdown": "^9.0.1"
 
 
15
  },
16
  "devDependencies": {
17
  "@vitejs/plugin-react": "^4.3.1",
@@ -1442,6 +1444,18 @@
1442
  "dev": true,
1443
  "license": "ISC"
1444
  },
 
 
 
 
 
 
 
 
 
 
 
 
1445
  "node_modules/esbuild": {
1446
  "version": "0.21.5",
1447
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
@@ -1491,6 +1505,18 @@
1491
  "node": ">=6"
1492
  }
1493
  },
 
 
 
 
 
 
 
 
 
 
 
 
1494
  "node_modules/estree-util-is-identifier-name": {
1495
  "version": "3.0.0",
1496
  "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
@@ -1532,6 +1558,64 @@
1532
  "node": ">=6.9.0"
1533
  }
1534
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1535
  "node_modules/hast-util-to-jsx-runtime": {
1536
  "version": "2.3.6",
1537
  "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
@@ -1559,6 +1643,25 @@
1559
  "url": "https://opencollective.com/unified"
1560
  }
1561
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1562
  "node_modules/hast-util-whitespace": {
1563
  "version": "3.0.0",
1564
  "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
@@ -1572,6 +1675,23 @@
1572
  "url": "https://opencollective.com/unified"
1573
  }
1574
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1575
  "node_modules/html-url-attributes": {
1576
  "version": "3.0.1",
1577
  "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
@@ -1582,6 +1702,16 @@
1582
  "url": "https://opencollective.com/unified"
1583
  }
1584
  },
 
 
 
 
 
 
 
 
 
 
1585
  "node_modules/inline-style-parser": {
1586
  "version": "0.2.7",
1587
  "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
@@ -1717,6 +1847,32 @@
1717
  "react": "^16.5.1 || ^17.0.0 || ^18.0.0"
1718
  }
1719
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1720
  "node_modules/mdast-util-from-markdown": {
1721
  "version": "2.0.2",
1722
  "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
@@ -1741,6 +1897,107 @@
1741
  "url": "https://opencollective.com/unified"
1742
  }
1743
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1744
  "node_modules/mdast-util-mdx-expression": {
1745
  "version": "2.0.1",
1746
  "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
@@ -1939,6 +2196,127 @@
1939
  "micromark-util-types": "^2.0.0"
1940
  }
1941
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1942
  "node_modules/micromark-factory-destination": {
1943
  "version": "2.0.1",
1944
  "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
@@ -2369,6 +2747,18 @@
2369
  "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
2370
  "license": "MIT"
2371
  },
 
 
 
 
 
 
 
 
 
 
 
 
2372
  "node_modules/picocolors": {
2373
  "version": "1.1.1",
2374
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -2477,6 +2867,39 @@
2477
  "node": ">=0.10.0"
2478
  }
2479
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2480
  "node_modules/remark-parse": {
2481
  "version": "11.0.0",
2482
  "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
@@ -2510,6 +2933,21 @@
2510
  "url": "https://opencollective.com/unified"
2511
  }
2512
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2513
  "node_modules/rollup": {
2514
  "version": "4.55.1",
2515
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz",
@@ -2778,6 +3216,20 @@
2778
  "url": "https://opencollective.com/unified"
2779
  }
2780
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2781
  "node_modules/vfile-message": {
2782
  "version": "4.0.3",
2783
  "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
@@ -2852,6 +3304,16 @@
2852
  }
2853
  }
2854
  },
 
 
 
 
 
 
 
 
 
 
2855
  "node_modules/yallist": {
2856
  "version": "3.1.1",
2857
  "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
 
11
  "lucide-react": "^0.395.0",
12
  "react": "^18.3.1",
13
  "react-dom": "^18.3.1",
14
+ "react-markdown": "^9.0.1",
15
+ "rehype-raw": "^7.0.0",
16
+ "remark-gfm": "^4.0.0"
17
  },
18
  "devDependencies": {
19
  "@vitejs/plugin-react": "^4.3.1",
 
1444
  "dev": true,
1445
  "license": "ISC"
1446
  },
1447
+ "node_modules/entities": {
1448
+ "version": "6.0.1",
1449
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
1450
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
1451
+ "license": "BSD-2-Clause",
1452
+ "engines": {
1453
+ "node": ">=0.12"
1454
+ },
1455
+ "funding": {
1456
+ "url": "https://github.com/fb55/entities?sponsor=1"
1457
+ }
1458
+ },
1459
  "node_modules/esbuild": {
1460
  "version": "0.21.5",
1461
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
 
1505
  "node": ">=6"
1506
  }
1507
  },
1508
+ "node_modules/escape-string-regexp": {
1509
+ "version": "5.0.0",
1510
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
1511
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
1512
+ "license": "MIT",
1513
+ "engines": {
1514
+ "node": ">=12"
1515
+ },
1516
+ "funding": {
1517
+ "url": "https://github.com/sponsors/sindresorhus"
1518
+ }
1519
+ },
1520
  "node_modules/estree-util-is-identifier-name": {
1521
  "version": "3.0.0",
1522
  "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
 
1558
  "node": ">=6.9.0"
1559
  }
1560
  },
1561
+ "node_modules/hast-util-from-parse5": {
1562
+ "version": "8.0.3",
1563
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
1564
+ "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
1565
+ "license": "MIT",
1566
+ "dependencies": {
1567
+ "@types/hast": "^3.0.0",
1568
+ "@types/unist": "^3.0.0",
1569
+ "devlop": "^1.0.0",
1570
+ "hastscript": "^9.0.0",
1571
+ "property-information": "^7.0.0",
1572
+ "vfile": "^6.0.0",
1573
+ "vfile-location": "^5.0.0",
1574
+ "web-namespaces": "^2.0.0"
1575
+ },
1576
+ "funding": {
1577
+ "type": "opencollective",
1578
+ "url": "https://opencollective.com/unified"
1579
+ }
1580
+ },
1581
+ "node_modules/hast-util-parse-selector": {
1582
+ "version": "4.0.0",
1583
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
1584
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
1585
+ "license": "MIT",
1586
+ "dependencies": {
1587
+ "@types/hast": "^3.0.0"
1588
+ },
1589
+ "funding": {
1590
+ "type": "opencollective",
1591
+ "url": "https://opencollective.com/unified"
1592
+ }
1593
+ },
1594
+ "node_modules/hast-util-raw": {
1595
+ "version": "9.1.0",
1596
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
1597
+ "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
1598
+ "license": "MIT",
1599
+ "dependencies": {
1600
+ "@types/hast": "^3.0.0",
1601
+ "@types/unist": "^3.0.0",
1602
+ "@ungap/structured-clone": "^1.0.0",
1603
+ "hast-util-from-parse5": "^8.0.0",
1604
+ "hast-util-to-parse5": "^8.0.0",
1605
+ "html-void-elements": "^3.0.0",
1606
+ "mdast-util-to-hast": "^13.0.0",
1607
+ "parse5": "^7.0.0",
1608
+ "unist-util-position": "^5.0.0",
1609
+ "unist-util-visit": "^5.0.0",
1610
+ "vfile": "^6.0.0",
1611
+ "web-namespaces": "^2.0.0",
1612
+ "zwitch": "^2.0.0"
1613
+ },
1614
+ "funding": {
1615
+ "type": "opencollective",
1616
+ "url": "https://opencollective.com/unified"
1617
+ }
1618
+ },
1619
  "node_modules/hast-util-to-jsx-runtime": {
1620
  "version": "2.3.6",
1621
  "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
 
1643
  "url": "https://opencollective.com/unified"
1644
  }
1645
  },
1646
+ "node_modules/hast-util-to-parse5": {
1647
+ "version": "8.0.1",
1648
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz",
1649
+ "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==",
1650
+ "license": "MIT",
1651
+ "dependencies": {
1652
+ "@types/hast": "^3.0.0",
1653
+ "comma-separated-tokens": "^2.0.0",
1654
+ "devlop": "^1.0.0",
1655
+ "property-information": "^7.0.0",
1656
+ "space-separated-tokens": "^2.0.0",
1657
+ "web-namespaces": "^2.0.0",
1658
+ "zwitch": "^2.0.0"
1659
+ },
1660
+ "funding": {
1661
+ "type": "opencollective",
1662
+ "url": "https://opencollective.com/unified"
1663
+ }
1664
+ },
1665
  "node_modules/hast-util-whitespace": {
1666
  "version": "3.0.0",
1667
  "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
 
1675
  "url": "https://opencollective.com/unified"
1676
  }
1677
  },
1678
+ "node_modules/hastscript": {
1679
+ "version": "9.0.1",
1680
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
1681
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
1682
+ "license": "MIT",
1683
+ "dependencies": {
1684
+ "@types/hast": "^3.0.0",
1685
+ "comma-separated-tokens": "^2.0.0",
1686
+ "hast-util-parse-selector": "^4.0.0",
1687
+ "property-information": "^7.0.0",
1688
+ "space-separated-tokens": "^2.0.0"
1689
+ },
1690
+ "funding": {
1691
+ "type": "opencollective",
1692
+ "url": "https://opencollective.com/unified"
1693
+ }
1694
+ },
1695
  "node_modules/html-url-attributes": {
1696
  "version": "3.0.1",
1697
  "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
 
1702
  "url": "https://opencollective.com/unified"
1703
  }
1704
  },
1705
+ "node_modules/html-void-elements": {
1706
+ "version": "3.0.0",
1707
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
1708
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
1709
+ "license": "MIT",
1710
+ "funding": {
1711
+ "type": "github",
1712
+ "url": "https://github.com/sponsors/wooorm"
1713
+ }
1714
+ },
1715
  "node_modules/inline-style-parser": {
1716
  "version": "0.2.7",
1717
  "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
 
1847
  "react": "^16.5.1 || ^17.0.0 || ^18.0.0"
1848
  }
1849
  },
1850
+ "node_modules/markdown-table": {
1851
+ "version": "3.0.4",
1852
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
1853
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
1854
+ "license": "MIT",
1855
+ "funding": {
1856
+ "type": "github",
1857
+ "url": "https://github.com/sponsors/wooorm"
1858
+ }
1859
+ },
1860
+ "node_modules/mdast-util-find-and-replace": {
1861
+ "version": "3.0.2",
1862
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
1863
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
1864
+ "license": "MIT",
1865
+ "dependencies": {
1866
+ "@types/mdast": "^4.0.0",
1867
+ "escape-string-regexp": "^5.0.0",
1868
+ "unist-util-is": "^6.0.0",
1869
+ "unist-util-visit-parents": "^6.0.0"
1870
+ },
1871
+ "funding": {
1872
+ "type": "opencollective",
1873
+ "url": "https://opencollective.com/unified"
1874
+ }
1875
+ },
1876
  "node_modules/mdast-util-from-markdown": {
1877
  "version": "2.0.2",
1878
  "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
 
1897
  "url": "https://opencollective.com/unified"
1898
  }
1899
  },
1900
+ "node_modules/mdast-util-gfm": {
1901
+ "version": "3.1.0",
1902
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
1903
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
1904
+ "license": "MIT",
1905
+ "dependencies": {
1906
+ "mdast-util-from-markdown": "^2.0.0",
1907
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
1908
+ "mdast-util-gfm-footnote": "^2.0.0",
1909
+ "mdast-util-gfm-strikethrough": "^2.0.0",
1910
+ "mdast-util-gfm-table": "^2.0.0",
1911
+ "mdast-util-gfm-task-list-item": "^2.0.0",
1912
+ "mdast-util-to-markdown": "^2.0.0"
1913
+ },
1914
+ "funding": {
1915
+ "type": "opencollective",
1916
+ "url": "https://opencollective.com/unified"
1917
+ }
1918
+ },
1919
+ "node_modules/mdast-util-gfm-autolink-literal": {
1920
+ "version": "2.0.1",
1921
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
1922
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
1923
+ "license": "MIT",
1924
+ "dependencies": {
1925
+ "@types/mdast": "^4.0.0",
1926
+ "ccount": "^2.0.0",
1927
+ "devlop": "^1.0.0",
1928
+ "mdast-util-find-and-replace": "^3.0.0",
1929
+ "micromark-util-character": "^2.0.0"
1930
+ },
1931
+ "funding": {
1932
+ "type": "opencollective",
1933
+ "url": "https://opencollective.com/unified"
1934
+ }
1935
+ },
1936
+ "node_modules/mdast-util-gfm-footnote": {
1937
+ "version": "2.1.0",
1938
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
1939
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
1940
+ "license": "MIT",
1941
+ "dependencies": {
1942
+ "@types/mdast": "^4.0.0",
1943
+ "devlop": "^1.1.0",
1944
+ "mdast-util-from-markdown": "^2.0.0",
1945
+ "mdast-util-to-markdown": "^2.0.0",
1946
+ "micromark-util-normalize-identifier": "^2.0.0"
1947
+ },
1948
+ "funding": {
1949
+ "type": "opencollective",
1950
+ "url": "https://opencollective.com/unified"
1951
+ }
1952
+ },
1953
+ "node_modules/mdast-util-gfm-strikethrough": {
1954
+ "version": "2.0.0",
1955
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
1956
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
1957
+ "license": "MIT",
1958
+ "dependencies": {
1959
+ "@types/mdast": "^4.0.0",
1960
+ "mdast-util-from-markdown": "^2.0.0",
1961
+ "mdast-util-to-markdown": "^2.0.0"
1962
+ },
1963
+ "funding": {
1964
+ "type": "opencollective",
1965
+ "url": "https://opencollective.com/unified"
1966
+ }
1967
+ },
1968
+ "node_modules/mdast-util-gfm-table": {
1969
+ "version": "2.0.0",
1970
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
1971
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
1972
+ "license": "MIT",
1973
+ "dependencies": {
1974
+ "@types/mdast": "^4.0.0",
1975
+ "devlop": "^1.0.0",
1976
+ "markdown-table": "^3.0.0",
1977
+ "mdast-util-from-markdown": "^2.0.0",
1978
+ "mdast-util-to-markdown": "^2.0.0"
1979
+ },
1980
+ "funding": {
1981
+ "type": "opencollective",
1982
+ "url": "https://opencollective.com/unified"
1983
+ }
1984
+ },
1985
+ "node_modules/mdast-util-gfm-task-list-item": {
1986
+ "version": "2.0.0",
1987
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
1988
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
1989
+ "license": "MIT",
1990
+ "dependencies": {
1991
+ "@types/mdast": "^4.0.0",
1992
+ "devlop": "^1.0.0",
1993
+ "mdast-util-from-markdown": "^2.0.0",
1994
+ "mdast-util-to-markdown": "^2.0.0"
1995
+ },
1996
+ "funding": {
1997
+ "type": "opencollective",
1998
+ "url": "https://opencollective.com/unified"
1999
+ }
2000
+ },
2001
  "node_modules/mdast-util-mdx-expression": {
2002
  "version": "2.0.1",
2003
  "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
 
2196
  "micromark-util-types": "^2.0.0"
2197
  }
2198
  },
2199
+ "node_modules/micromark-extension-gfm": {
2200
+ "version": "3.0.0",
2201
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
2202
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
2203
+ "license": "MIT",
2204
+ "dependencies": {
2205
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
2206
+ "micromark-extension-gfm-footnote": "^2.0.0",
2207
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
2208
+ "micromark-extension-gfm-table": "^2.0.0",
2209
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
2210
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
2211
+ "micromark-util-combine-extensions": "^2.0.0",
2212
+ "micromark-util-types": "^2.0.0"
2213
+ },
2214
+ "funding": {
2215
+ "type": "opencollective",
2216
+ "url": "https://opencollective.com/unified"
2217
+ }
2218
+ },
2219
+ "node_modules/micromark-extension-gfm-autolink-literal": {
2220
+ "version": "2.1.0",
2221
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
2222
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
2223
+ "license": "MIT",
2224
+ "dependencies": {
2225
+ "micromark-util-character": "^2.0.0",
2226
+ "micromark-util-sanitize-uri": "^2.0.0",
2227
+ "micromark-util-symbol": "^2.0.0",
2228
+ "micromark-util-types": "^2.0.0"
2229
+ },
2230
+ "funding": {
2231
+ "type": "opencollective",
2232
+ "url": "https://opencollective.com/unified"
2233
+ }
2234
+ },
2235
+ "node_modules/micromark-extension-gfm-footnote": {
2236
+ "version": "2.1.0",
2237
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
2238
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
2239
+ "license": "MIT",
2240
+ "dependencies": {
2241
+ "devlop": "^1.0.0",
2242
+ "micromark-core-commonmark": "^2.0.0",
2243
+ "micromark-factory-space": "^2.0.0",
2244
+ "micromark-util-character": "^2.0.0",
2245
+ "micromark-util-normalize-identifier": "^2.0.0",
2246
+ "micromark-util-sanitize-uri": "^2.0.0",
2247
+ "micromark-util-symbol": "^2.0.0",
2248
+ "micromark-util-types": "^2.0.0"
2249
+ },
2250
+ "funding": {
2251
+ "type": "opencollective",
2252
+ "url": "https://opencollective.com/unified"
2253
+ }
2254
+ },
2255
+ "node_modules/micromark-extension-gfm-strikethrough": {
2256
+ "version": "2.1.0",
2257
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
2258
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
2259
+ "license": "MIT",
2260
+ "dependencies": {
2261
+ "devlop": "^1.0.0",
2262
+ "micromark-util-chunked": "^2.0.0",
2263
+ "micromark-util-classify-character": "^2.0.0",
2264
+ "micromark-util-resolve-all": "^2.0.0",
2265
+ "micromark-util-symbol": "^2.0.0",
2266
+ "micromark-util-types": "^2.0.0"
2267
+ },
2268
+ "funding": {
2269
+ "type": "opencollective",
2270
+ "url": "https://opencollective.com/unified"
2271
+ }
2272
+ },
2273
+ "node_modules/micromark-extension-gfm-table": {
2274
+ "version": "2.1.1",
2275
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
2276
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
2277
+ "license": "MIT",
2278
+ "dependencies": {
2279
+ "devlop": "^1.0.0",
2280
+ "micromark-factory-space": "^2.0.0",
2281
+ "micromark-util-character": "^2.0.0",
2282
+ "micromark-util-symbol": "^2.0.0",
2283
+ "micromark-util-types": "^2.0.0"
2284
+ },
2285
+ "funding": {
2286
+ "type": "opencollective",
2287
+ "url": "https://opencollective.com/unified"
2288
+ }
2289
+ },
2290
+ "node_modules/micromark-extension-gfm-tagfilter": {
2291
+ "version": "2.0.0",
2292
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
2293
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
2294
+ "license": "MIT",
2295
+ "dependencies": {
2296
+ "micromark-util-types": "^2.0.0"
2297
+ },
2298
+ "funding": {
2299
+ "type": "opencollective",
2300
+ "url": "https://opencollective.com/unified"
2301
+ }
2302
+ },
2303
+ "node_modules/micromark-extension-gfm-task-list-item": {
2304
+ "version": "2.1.0",
2305
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
2306
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
2307
+ "license": "MIT",
2308
+ "dependencies": {
2309
+ "devlop": "^1.0.0",
2310
+ "micromark-factory-space": "^2.0.0",
2311
+ "micromark-util-character": "^2.0.0",
2312
+ "micromark-util-symbol": "^2.0.0",
2313
+ "micromark-util-types": "^2.0.0"
2314
+ },
2315
+ "funding": {
2316
+ "type": "opencollective",
2317
+ "url": "https://opencollective.com/unified"
2318
+ }
2319
+ },
2320
  "node_modules/micromark-factory-destination": {
2321
  "version": "2.0.1",
2322
  "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
 
2747
  "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
2748
  "license": "MIT"
2749
  },
2750
+ "node_modules/parse5": {
2751
+ "version": "7.3.0",
2752
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
2753
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
2754
+ "license": "MIT",
2755
+ "dependencies": {
2756
+ "entities": "^6.0.0"
2757
+ },
2758
+ "funding": {
2759
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
2760
+ }
2761
+ },
2762
  "node_modules/picocolors": {
2763
  "version": "1.1.1",
2764
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
 
2867
  "node": ">=0.10.0"
2868
  }
2869
  },
2870
+ "node_modules/rehype-raw": {
2871
+ "version": "7.0.0",
2872
+ "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
2873
+ "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
2874
+ "license": "MIT",
2875
+ "dependencies": {
2876
+ "@types/hast": "^3.0.0",
2877
+ "hast-util-raw": "^9.0.0",
2878
+ "vfile": "^6.0.0"
2879
+ },
2880
+ "funding": {
2881
+ "type": "opencollective",
2882
+ "url": "https://opencollective.com/unified"
2883
+ }
2884
+ },
2885
+ "node_modules/remark-gfm": {
2886
+ "version": "4.0.1",
2887
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
2888
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
2889
+ "license": "MIT",
2890
+ "dependencies": {
2891
+ "@types/mdast": "^4.0.0",
2892
+ "mdast-util-gfm": "^3.0.0",
2893
+ "micromark-extension-gfm": "^3.0.0",
2894
+ "remark-parse": "^11.0.0",
2895
+ "remark-stringify": "^11.0.0",
2896
+ "unified": "^11.0.0"
2897
+ },
2898
+ "funding": {
2899
+ "type": "opencollective",
2900
+ "url": "https://opencollective.com/unified"
2901
+ }
2902
+ },
2903
  "node_modules/remark-parse": {
2904
  "version": "11.0.0",
2905
  "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
 
2933
  "url": "https://opencollective.com/unified"
2934
  }
2935
  },
2936
+ "node_modules/remark-stringify": {
2937
+ "version": "11.0.0",
2938
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
2939
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
2940
+ "license": "MIT",
2941
+ "dependencies": {
2942
+ "@types/mdast": "^4.0.0",
2943
+ "mdast-util-to-markdown": "^2.0.0",
2944
+ "unified": "^11.0.0"
2945
+ },
2946
+ "funding": {
2947
+ "type": "opencollective",
2948
+ "url": "https://opencollective.com/unified"
2949
+ }
2950
+ },
2951
  "node_modules/rollup": {
2952
  "version": "4.55.1",
2953
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz",
 
3216
  "url": "https://opencollective.com/unified"
3217
  }
3218
  },
3219
+ "node_modules/vfile-location": {
3220
+ "version": "5.0.3",
3221
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
3222
+ "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
3223
+ "license": "MIT",
3224
+ "dependencies": {
3225
+ "@types/unist": "^3.0.0",
3226
+ "vfile": "^6.0.0"
3227
+ },
3228
+ "funding": {
3229
+ "type": "opencollective",
3230
+ "url": "https://opencollective.com/unified"
3231
+ }
3232
+ },
3233
  "node_modules/vfile-message": {
3234
  "version": "4.0.3",
3235
  "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
 
3304
  }
3305
  }
3306
  },
3307
+ "node_modules/web-namespaces": {
3308
+ "version": "2.0.1",
3309
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
3310
+ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
3311
+ "license": "MIT",
3312
+ "funding": {
3313
+ "type": "github",
3314
+ "url": "https://github.com/sponsors/wooorm"
3315
+ }
3316
+ },
3317
  "node_modules/yallist": {
3318
  "version": "3.1.1",
3319
  "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
frontend/src/App.jsx CHANGED
@@ -126,12 +126,21 @@ const App = () => {
126
  <span></span>
127
  </div>
128
  ) : (
129
- <ReactMarkdown
130
- remarkPlugins={[remarkGfm]}
131
- rehypePlugins={[rehypeRaw]}
132
- >
133
- {msg.content}
134
- </ReactMarkdown>
 
 
 
 
 
 
 
 
 
135
  )}
136
  </div>
137
  </div>
 
126
  <span></span>
127
  </div>
128
  ) : (
129
+ <>
130
+ <ReactMarkdown
131
+ remarkPlugins={[remarkGfm]}
132
+ rehypePlugins={[rehypeRaw]}
133
+ >
134
+ {msg.content}
135
+ </ReactMarkdown>
136
+ {msg.role === 'assistant' && isLoading && index === messages.length - 1 && (
137
+ <div className="typing-indicator mini">
138
+ <span></span>
139
+ <span></span>
140
+ <span></span>
141
+ </div>
142
+ )}
143
+ </>
144
  )}
145
  </div>
146
  </div>
frontend/src/index.css CHANGED
@@ -243,6 +243,19 @@ pre {
243
  border-radius: 8px;
244
  overflow: hidden;
245
  border: 1px solid var(--border-color);
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  }
247
 
248
  .assistant .message-bubble th {
 
243
  border-radius: 8px;
244
  overflow: hidden;
245
  border: 1px solid var(--border-color);
246
+ display: block;
247
+ overflow-x: auto;
248
+ }
249
+
250
+ /* Mini indicator for streaming */
251
+ .typing-indicator.mini {
252
+ margin-top: 8px;
253
+ justify-content: flex-start;
254
+ }
255
+
256
+ .typing-indicator.mini span {
257
+ width: 5px;
258
+ height: 5px;
259
  }
260
 
261
  .assistant .message-bubble th {
llm.py CHANGED
@@ -29,10 +29,14 @@ Rules:
29
  - If information is missing from the context, use web search results if provided.
30
  - If you still don't know, suggest visiting a UBA branch or calling the official help line.
31
  - Use proper formatting (paragraphs, bullet points) for readability.
 
 
 
 
 
 
 
32
  - Maintain a helpful and polite tone.
33
- - When comparing products or listing details, use standard Markdown tables.
34
- - Use subheadings and bullet points for structured information.
35
- - Avoid cluttered text; ensure there is adequate whitespace.
36
  """
37
 
38
  async def get_streaming_response(messages: List[Dict[str, str]]) -> AsyncGenerator[str, None]:
 
29
  - If information is missing from the context, use web search results if provided.
30
  - If you still don't know, suggest visiting a UBA branch or calling the official help line.
31
  - Use proper formatting (paragraphs, bullet points) for readability.
32
+ - When comparing products or listing details, you MUST use standard Github Flavored Markdown (GFM) tables.
33
+ - Example table format:
34
+ | Feature | Description |
35
+ | :--- | :--- |
36
+ | Item Name | Item Detail |
37
+ - Use subheadings (###) and bullet points for structured information.
38
+ - Always ensure there is a blank line before and after a table for correct rendering.
39
  - Maintain a helpful and polite tone.
 
 
 
40
  """
41
 
42
  async def get_streaming_response(messages: List[Dict[str, str]]) -> AsyncGenerator[str, None]: