@websolutespa/bom-mixer-llm 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/index.css +16 -26
  3. package/dist/cjs/index.js +206 -124
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/esm/index.css +16 -26
  6. package/dist/esm/llm/components/Event/event.js +4 -1
  7. package/dist/esm/llm/components/Event/event.js.map +1 -1
  8. package/dist/esm/llm/components/FormRequest/FormRequest.js.map +1 -1
  9. package/dist/esm/llm/components/Header/header.js +4 -3
  10. package/dist/esm/llm/components/Header/header.js.map +1 -1
  11. package/dist/esm/llm/components/Main/main.js +4 -3
  12. package/dist/esm/llm/components/Main/main.js.map +1 -1
  13. package/dist/esm/llm/components/Poi/poi.js +4 -1
  14. package/dist/esm/llm/components/Poi/poi.js.map +1 -1
  15. package/dist/esm/llm/components/Prompt/prompt.js +4 -1
  16. package/dist/esm/llm/components/Prompt/prompt.js.map +1 -1
  17. package/dist/esm/llm/components/Prompt/suggestions.js +3 -2
  18. package/dist/esm/llm/components/Prompt/suggestions.js.map +1 -1
  19. package/dist/esm/llm/components/QuickLinks/quicklinks.js +4 -3
  20. package/dist/esm/llm/components/QuickLinks/quicklinks.js.map +1 -1
  21. package/dist/esm/llm/components/Text/text.js +9 -2
  22. package/dist/esm/llm/components/Text/text.js.map +1 -1
  23. package/dist/esm/llm/components/Trigger/trigger.js +3 -2
  24. package/dist/esm/llm/components/Trigger/trigger.js.map +1 -1
  25. package/dist/esm/llm/llm.js +15 -8
  26. package/dist/esm/llm/llm.js.map +1 -1
  27. package/dist/esm/useLlm/useLlm.js +16 -97
  28. package/dist/esm/useLlm/useLlm.js.map +1 -1
  29. package/dist/esm/useLlm/useLlmView.js +153 -0
  30. package/dist/esm/useLlm/useLlmView.js.map +1 -0
  31. package/dist/types/llm/components/Event/event.d.ts.map +1 -1
  32. package/dist/types/llm/components/FormRequest/FormRequest.d.ts.map +1 -1
  33. package/dist/types/llm/components/Header/header.d.ts.map +1 -1
  34. package/dist/types/llm/components/Main/main.d.ts.map +1 -1
  35. package/dist/types/llm/components/Poi/poi.d.ts.map +1 -1
  36. package/dist/types/llm/components/Prompt/prompt.d.ts.map +1 -1
  37. package/dist/types/llm/components/Prompt/suggestions.d.ts.map +1 -1
  38. package/dist/types/llm/components/QuickLinks/quicklinks.d.ts.map +1 -1
  39. package/dist/types/llm/components/Text/text.d.ts.map +1 -1
  40. package/dist/types/llm/components/Trigger/trigger.d.ts.map +1 -1
  41. package/dist/types/llm/llm.d.ts.map +1 -1
  42. package/dist/types/useLlm/useLlm.d.ts +4 -14
  43. package/dist/types/useLlm/useLlm.d.ts.map +1 -1
  44. package/dist/types/useLlm/useLlmView.d.ts +36 -0
  45. package/dist/types/useLlm/useLlmView.d.ts.map +1 -0
  46. package/package.json +2 -2
  47. package/src/llm/components/Event/event.tsx +3 -1
  48. package/src/llm/components/FormRequest/FormRequest.tsx +0 -1
  49. package/src/llm/components/Header/header.tsx +4 -3
  50. package/src/llm/components/Main/_style.scss +8 -2
  51. package/src/llm/components/Main/main.tsx +6 -5
  52. package/src/llm/components/Poi/poi.tsx +3 -1
  53. package/src/llm/components/Prompt/prompt.tsx +3 -1
  54. package/src/llm/components/Prompt/suggestions.tsx +3 -2
  55. package/src/llm/components/QuickLinks/quicklinks.tsx +3 -2
  56. package/src/llm/components/Text/_style.scss +7 -5
  57. package/src/llm/components/Text/text.tsx +9 -2
  58. package/src/llm/components/Trigger/trigger.tsx +2 -1
  59. package/src/llm/llm.tsx +12 -7
  60. package/src/llm/scss/_base.scss +1 -16
  61. package/src/swiper.d.ts +52 -0
  62. package/src/useLlm/useLlm.tsx +19 -96
  63. package/src/useLlm/useLlmView.tsx +166 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @websolutespa/bom-mixer-llm
2
2
 
3
+ ## 0.0.6
4
+
5
+ ### Patch Changes
6
+
7
+ - Fixing: markdown links
8
+
9
+ ## 0.0.5
10
+
11
+ ### Patch Changes
12
+
13
+ - Added: shared state between instances
14
+
3
15
  ## 0.0.4
4
16
 
5
17
  ### Patch Changes
@@ -155,30 +155,11 @@
155
155
  llm-embed {
156
156
  display: block;
157
157
  width: 100%;
158
+ height: 760px;
158
159
  max-height: 100vh;
159
160
  background: transparent;
160
161
  overflow: clip;
161
162
  }
162
- @media (max-width: 799px) {
163
- llm-embed {
164
- height: 100vh;
165
- }
166
- }
167
- @media (min-width: 800px) {
168
- llm-embed {
169
- aspect-ratio: 1/1;
170
- }
171
- }
172
- @media (min-width: 1080px) {
173
- llm-embed {
174
- aspect-ratio: 4/3;
175
- }
176
- }
177
- @media (min-width: 1440px) {
178
- llm-embed {
179
- aspect-ratio: 16/9;
180
- }
181
- }
182
163
 
183
164
  .llm {
184
165
  display: flex;
@@ -1018,7 +999,14 @@ llm-embed {
1018
999
  height: 100%;
1019
1000
  }
1020
1001
  .llm.-embedded .llm__content {
1021
- padding: 80px 0 0 0;
1002
+ padding-top: 40px;
1003
+ padding-bottom: 180px;
1004
+ }
1005
+ @media (min-width: 1024px) {
1006
+ .llm.-embedded .llm__content {
1007
+ padding-top: 60px;
1008
+ padding-bottom: 180px;
1009
+ }
1022
1010
  }
1023
1011
  .llm:not(.-embedded) .llm__main {
1024
1012
  position: absolute;
@@ -1029,7 +1017,7 @@ llm-embed {
1029
1017
  }
1030
1018
  @media (min-width: 1024px) {
1031
1019
  .llm:not(.-embedded) .llm__content {
1032
- padding: 200px 0;
1020
+ padding-top: 200px;
1033
1021
  padding-bottom: 280px;
1034
1022
  }
1035
1023
  }
@@ -1502,15 +1490,17 @@ llm-embed {
1502
1490
  border: 2px solid rgba(255, 255, 255, 0.4);
1503
1491
  }
1504
1492
  .llm .llm__message--assistant .llm__inner--string .llm__text .llm__text-body .llm__text-img {
1493
+ display: block;
1494
+ margin: 1rem 0;
1495
+ font-size: 0;
1496
+ text-decoration: none;
1497
+ }
1498
+ .llm .llm__message--assistant .llm__inner--string .llm__text .llm__text-body .llm__text-img > img {
1505
1499
  display: inline-flex;
1506
1500
  justify-content: center;
1507
1501
  align-items: center;
1508
1502
  width: 320px;
1509
1503
  height: 320px;
1510
- font-size: 0;
1511
- text-decoration: none;
1512
- }
1513
- .llm .llm__message--assistant .llm__inner--string .llm__text .llm__text-body .llm__text-img > img {
1514
1504
  object-fit: cover;
1515
1505
  }
1516
1506
  .llm .llm__text-disclaimer {
package/dist/cjs/index.js CHANGED
@@ -7,7 +7,7 @@ var framerMotion = require('framer-motion');
7
7
  var react = require('react');
8
8
  var zustand = require('zustand');
9
9
  var middleware = require('zustand/middleware');
10
- var reactLenis = require('@studio-freight/react-lenis');
10
+ var react$2 = require('lenis/react');
11
11
  var ArrayBuffer = require('nanogl/arraybuffer');
12
12
  var Program = require('nanogl/program');
13
13
  var bomMixerIcons = require('@websolutespa/bom-mixer-icons');
@@ -1502,13 +1502,156 @@ function stripEmojis(text) {
1502
1502
  return text.replace(/(\s?)([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, '');
1503
1503
  }
1504
1504
 
1505
+ const createLlmViewStore = _ref => {
1506
+ let {
1507
+ threadId,
1508
+ opened,
1509
+ embedded,
1510
+ send
1511
+ } = _ref;
1512
+ const props = {
1513
+ opened: opened != null || embedded != null ? Boolean(opened || embedded) : threadId != null ? true : false,
1514
+ embedded: embedded || false,
1515
+ hidden: false,
1516
+ fixed: false,
1517
+ idle: true,
1518
+ direction: 0
1519
+ };
1520
+ let lenis_ = undefined;
1521
+ let autoScroll = true;
1522
+ const useStore = zustand.createStore((set, get) => Object.assign(Object.assign({}, props), {
1523
+ actions: {
1524
+ initView: () => __awaiter(void 0, void 0, void 0, function* () {
1525
+ get();
1526
+ // handle idle times
1527
+ const setIdleTimeout = () => {
1528
+ return setTimeout(() => {
1529
+ set(() => ({
1530
+ idle: true
1531
+ }));
1532
+ }, 6000);
1533
+ };
1534
+ const handleIdleTimes = () => {
1535
+ let to = setIdleTimeout();
1536
+ let lastScrollTop = 0;
1537
+ window.addEventListener('scroll', () => {
1538
+ const st = window.scrollY || document.documentElement.scrollTop;
1539
+ let direction = 0;
1540
+ if (st > lastScrollTop) {
1541
+ direction = 1;
1542
+ } else if (st < lastScrollTop) {
1543
+ direction = -1;
1544
+ }
1545
+ lastScrollTop = st <= 0 ? 0 : st;
1546
+ if (direction === 1) {
1547
+ if (to) {
1548
+ clearTimeout(to);
1549
+ }
1550
+ set(() => ({
1551
+ idle: false
1552
+ }));
1553
+ to = setIdleTimeout();
1554
+ }
1555
+ });
1556
+ };
1557
+ setTimeout(() => {
1558
+ set(() => ({
1559
+ idle: false
1560
+ }));
1561
+ handleIdleTimes();
1562
+ }, 2000);
1563
+ }),
1564
+ send: (prompt, onMessage, onEnd) => __awaiter(void 0, void 0, void 0, function* () {
1565
+ const state = get();
1566
+ autoScroll = true;
1567
+ state.actions.scrollToBottom();
1568
+ yield send(prompt, response => {
1569
+ state.actions.scrollToBottom();
1570
+ if (typeof onMessage === 'function') {
1571
+ onMessage(response);
1572
+ }
1573
+ }, response => {
1574
+ state.actions.scrollToBottom();
1575
+ if (typeof onEnd === 'function') {
1576
+ onEnd(response);
1577
+ }
1578
+ });
1579
+ }),
1580
+ open: () => set(state => ({
1581
+ opened: !state.opened
1582
+ })),
1583
+ setLenis: lenis => {
1584
+ if (lenis_ !== lenis) {
1585
+ lenis_ = lenis;
1586
+ if (lenis) {
1587
+ lenis.on('scroll', event => {
1588
+ const {
1589
+ direction,
1590
+ targetScroll,
1591
+ limit
1592
+ } = event;
1593
+ if (limit === targetScroll) {
1594
+ autoScroll = true;
1595
+ } else if (direction == -1 && Math.abs(limit - targetScroll) > 100) {
1596
+ autoScroll = false;
1597
+ }
1598
+ const scrolled = targetScroll > 100;
1599
+ const fixed = direction == -1 && scrolled && !autoScroll;
1600
+ const hidden = autoScroll || direction == 1 && scrolled;
1601
+ const state = get();
1602
+ if (state.hidden !== hidden || state.fixed !== fixed || state.direction !== direction) {
1603
+ set(state => ({
1604
+ hidden,
1605
+ fixed,
1606
+ direction
1607
+ }));
1608
+ }
1609
+ });
1610
+ }
1611
+ }
1612
+ },
1613
+ scrollToBottom: () => {
1614
+ if (lenis_ && autoScroll) {
1615
+ lenis_.scrollTo('bottom', {
1616
+ immediate: true
1617
+ });
1618
+ }
1619
+ }
1620
+ }
1621
+ }));
1622
+ return useStore;
1623
+ };
1624
+ const LlmViewContext = /*#__PURE__*/react.createContext(null);
1625
+ function LlmViewProvider(_a) {
1626
+ var {
1627
+ children
1628
+ } = _a,
1629
+ props = __rest(_a, ["children"]);
1630
+ const {
1631
+ send
1632
+ } = useLlm(state => state.actions);
1633
+ const storeRef = react.useRef();
1634
+ if (!storeRef.current) {
1635
+ storeRef.current = createLlmViewStore(Object.assign(Object.assign({}, props), {
1636
+ send
1637
+ }));
1638
+ }
1639
+ return storeRef.current && jsxRuntime.jsx(LlmViewContext.Provider, {
1640
+ value: storeRef.current,
1641
+ children: children
1642
+ });
1643
+ }
1644
+ function useLlmView(selector) {
1645
+ const store = react.useContext(LlmViewContext);
1646
+ if (!store) throw new Error('Missing LlmContext.Provider in the tree');
1647
+ return zustand.useStore(store, selector);
1648
+ }
1649
+
1505
1650
  const createLlmStore = _ref => {
1506
1651
  let {
1507
1652
  appKey,
1508
1653
  apiKey,
1509
1654
  threadId,
1510
- opened,
1511
- embedded,
1512
1655
  decorateUrl,
1513
1656
  endpoint,
1514
1657
  test,
@@ -1521,25 +1664,10 @@ const createLlmStore = _ref => {
1521
1664
  prompt: '',
1522
1665
  locale: 'en',
1523
1666
  streaming: false,
1524
- opened: opened != null || embedded != null ? Boolean(opened || embedded) : threadId != null ? true : false,
1525
- embedded: embedded || false,
1526
- hidden: false,
1527
- fixed: false,
1528
- idle: true,
1529
- direction: 0,
1530
1667
  speakEnabled: true
1531
1668
  };
1532
1669
  let messageService = undefined;
1533
1670
  const speech = new Speech();
1534
- let lenis_ = undefined;
1535
- let autoScroll = true;
1536
- const scrollToBottom = () => {
1537
- if (lenis_ && autoScroll) {
1538
- lenis_.scrollTo('bottom', {
1539
- immediate: true
1540
- });
1541
- }
1542
- };
1543
1671
  function getApi(options) {
1544
1672
  const origin = endpoint || (bomCore.isBrowser ? window.location.origin : process.env.STORE_URL);
1545
1673
  const baseUrl = `${origin}/api/llm`;
@@ -1646,45 +1774,8 @@ const createLlmStore = _ref => {
1646
1774
  app,
1647
1775
  locale
1648
1776
  }, thread));
1649
- // handle idle times
1650
- const setIdleTimeout = () => {
1651
- return setTimeout(() => {
1652
- set(() => ({
1653
- idle: true
1654
- }));
1655
- }, 6000);
1656
- };
1657
- const handleIdleTimes = () => {
1658
- let to = setIdleTimeout();
1659
- let lastScrollTop = 0;
1660
- window.addEventListener('scroll', () => {
1661
- const st = window.scrollY || document.documentElement.scrollTop;
1662
- let direction = 0;
1663
- if (st > lastScrollTop) {
1664
- direction = 1;
1665
- } else if (st < lastScrollTop) {
1666
- direction = -1;
1667
- }
1668
- lastScrollTop = st <= 0 ? 0 : st;
1669
- if (direction === 1) {
1670
- if (to) {
1671
- clearTimeout(to);
1672
- }
1673
- set(() => ({
1674
- idle: false
1675
- }));
1676
- to = setIdleTimeout();
1677
- }
1678
- });
1679
- };
1680
- setTimeout(() => {
1681
- set(() => ({
1682
- idle: false
1683
- }));
1684
- handleIdleTimes();
1685
- }, 2000);
1686
1777
  }),
1687
- send: (prompt, onChunk, onEnd) => __awaiter(void 0, void 0, void 0, function* () {
1778
+ send: (prompt, onMessage, onEnd) => __awaiter(void 0, void 0, void 0, function* () {
1688
1779
  if (test) {
1689
1780
  const {
1690
1781
  locale
@@ -1705,8 +1796,6 @@ const createLlmStore = _ref => {
1705
1796
  prompt: '',
1706
1797
  streaming: true
1707
1798
  }));
1708
- autoScroll = true;
1709
- scrollToBottom();
1710
1799
  const state = get();
1711
1800
  const origin = endpoint || window.location.origin;
1712
1801
  const url = `${origin}/api/llm/message?locale=${state.locale}`;
@@ -1737,10 +1826,9 @@ const createLlmStore = _ref => {
1737
1826
  set(state => ({
1738
1827
  chunks: response.chunks
1739
1828
  }));
1740
- if (typeof onChunk === 'function') {
1741
- onChunk(response);
1829
+ if (typeof onMessage === 'function') {
1830
+ onMessage(response);
1742
1831
  }
1743
- scrollToBottom();
1744
1832
  },
1745
1833
  // onEnd
1746
1834
  response => {
@@ -1781,7 +1869,6 @@ const createLlmStore = _ref => {
1781
1869
  if (typeof onEnd === 'function') {
1782
1870
  onEnd(response);
1783
1871
  }
1784
- scrollToBottom();
1785
1872
  },
1786
1873
  // onChunk
1787
1874
  chunks => {
@@ -1873,42 +1960,9 @@ const createLlmStore = _ref => {
1873
1960
  }
1874
1961
  return url || defaultUrl || '#';
1875
1962
  }),
1876
- open: () => set(state => ({
1877
- opened: !state.opened
1878
- })),
1879
1963
  clear: () => set(state => ({
1880
1964
  messages: []
1881
- })),
1882
- setLenis: lenis => {
1883
- if (lenis_ !== lenis) {
1884
- lenis_ = lenis;
1885
- if (lenis) {
1886
- lenis.on('scroll', event => {
1887
- const {
1888
- direction,
1889
- targetScroll,
1890
- limit
1891
- } = event;
1892
- if (limit === targetScroll) {
1893
- autoScroll = true;
1894
- } else if (direction == -1 && Math.abs(limit - targetScroll) > 100) {
1895
- autoScroll = false;
1896
- }
1897
- const scrolled = targetScroll > 100;
1898
- const fixed = direction == -1 && scrolled && !autoScroll;
1899
- const hidden = autoScroll || direction == 1 && scrolled;
1900
- const state = get();
1901
- if (state.hidden !== hidden || state.fixed !== fixed || state.direction !== direction) {
1902
- set(state => ({
1903
- hidden,
1904
- fixed,
1905
- direction
1906
- }));
1907
- }
1908
- });
1909
- }
1910
- }
1911
- }
1965
+ }))
1912
1966
  }
1913
1967
  }), {
1914
1968
  name: 'llm',
@@ -1939,6 +1993,13 @@ const createLlmStore = _ref => {
1939
1993
  }));
1940
1994
  return useStore;
1941
1995
  };
1996
+ let sharedLlmStore;
1997
+ function createSharedLlmStore(props) {
1998
+ if (!sharedLlmStore) {
1999
+ sharedLlmStore = createLlmStore(props);
2000
+ }
2001
+ return sharedLlmStore;
2002
+ }
1942
2003
  const LlmContext = /*#__PURE__*/react.createContext(null);
1943
2004
  function LlmProvider(_a) {
1944
2005
  var {
@@ -1948,13 +2009,15 @@ function LlmProvider(_a) {
1948
2009
  const label = bomMixerHooks.useLabel();
1949
2010
  const storeRef = react.useRef();
1950
2011
  if (!storeRef.current) {
1951
- storeRef.current = createLlmStore(Object.assign(Object.assign({}, props), {
2012
+ storeRef.current = createSharedLlmStore(Object.assign(Object.assign({}, props), {
1952
2013
  label
1953
2014
  }));
1954
2015
  }
1955
2016
  return storeRef.current && jsxRuntime.jsx(LlmContext.Provider, {
1956
2017
  value: storeRef.current,
1957
- children: children
2018
+ children: jsxRuntime.jsx(LlmViewProvider, Object.assign({}, props, {
2019
+ children: children
2020
+ }))
1958
2021
  });
1959
2022
  }
1960
2023
  function useLlm(selector) {
@@ -2183,9 +2246,9 @@ const Header = props => {
2183
2246
  const app = useLlm(state => state.app);
2184
2247
  const {
2185
2248
  open
2186
- } = useLlm(state => state.actions);
2187
- const hidden = useLlm(state => state.hidden);
2188
- const fixed = useLlm(state => state.fixed);
2249
+ } = useLlmView(state => state.actions);
2250
+ const hidden = useLlmView(state => state.hidden);
2251
+ const fixed = useLlmView(state => state.fixed);
2189
2252
  const label = bomMixerHooks.useLabel();
2190
2253
  const logo = app === null || app === void 0 ? void 0 : app.contents.logo;
2191
2254
  const logoMini = (_a = app === null || app === void 0 ? void 0 : app.contents) === null || _a === void 0 ? void 0 : _a.logoMini;
@@ -2236,10 +2299,10 @@ const QuickLinks = () => {
2236
2299
  const {
2237
2300
  width
2238
2301
  } = bomMixerHooks.useWindowSize();
2302
+ const app = useLlm(state => state.app);
2239
2303
  const {
2240
2304
  send
2241
- } = useLlm(state => state.actions);
2242
- const app = useLlm(state => state.app);
2305
+ } = useLlmView(state => state.actions);
2243
2306
  const swiperProps = {
2244
2307
  spaceBetween: clamp(8, 16),
2245
2308
  slidesOffsetAfter: clamp(20, 110),
@@ -2248,7 +2311,7 @@ const QuickLinks = () => {
2248
2311
  };
2249
2312
  const onClick = item => __awaiter(void 0, void 0, void 0, function* () {
2250
2313
  yield send(item.message || item.title, response => {
2251
- // console.log('QuickLinks.onChunk', response.chunks);
2314
+ // console.log('QuickLinks.onMessage', response.chunks);
2252
2315
  }, response => {
2253
2316
  // console.log('QuickLinks.onEnd', response);
2254
2317
  });
@@ -2489,7 +2552,7 @@ const Suggestions = () => {
2489
2552
  const app = useLlm(state => state.app);
2490
2553
  const {
2491
2554
  send
2492
- } = useLlm(state => state.actions);
2555
+ } = useLlmView(state => state.actions);
2493
2556
  const swiperProps = {
2494
2557
  modules: [swiper.FreeMode],
2495
2558
  spaceBetween: 8,
@@ -2500,7 +2563,7 @@ const Suggestions = () => {
2500
2563
  };
2501
2564
  const onClick = item => __awaiter(void 0, void 0, void 0, function* () {
2502
2565
  yield send(item.sampleInputText, response => {
2503
- // console.log('Suggestions.onChunk', response.chunks);
2566
+ // console.log('Suggestions.onMessage', response.chunks);
2504
2567
  }, response => {
2505
2568
  // console.log('Suggestions.onEnd', response);
2506
2569
  });
@@ -2526,7 +2589,6 @@ const Prompt = () => {
2526
2589
  const streaming = useLlm(state => state.streaming);
2527
2590
  const speakEnabled = useLlm(state => state.speakEnabled);
2528
2591
  const {
2529
- send,
2530
2592
  setPrompt,
2531
2593
  recognizeStart,
2532
2594
  recognizeStop,
@@ -2534,6 +2596,9 @@ const Prompt = () => {
2534
2596
  toggleSpeak,
2535
2597
  hasSpeechSupport
2536
2598
  } = useLlm(state => state.actions);
2599
+ const {
2600
+ send
2601
+ } = useLlmView(state => state.actions);
2537
2602
  useAutosizeTextArea(textArea.current, prompt);
2538
2603
  const onChange = event => {
2539
2604
  var _a;
@@ -2719,9 +2784,11 @@ const Cta = props => {
2719
2784
  const Event = props => {
2720
2785
  const label = bomMixerHooks.useLabel();
2721
2786
  const {
2722
- send,
2723
2787
  decorateUrl
2724
2788
  } = useLlm(state => state.actions);
2789
+ const {
2790
+ send
2791
+ } = useLlmView(state => state.actions);
2725
2792
  const onTellMeMore = () => __awaiter(void 0, void 0, void 0, function* () {
2726
2793
  const prompt = `${label('llm.tellMeMoreAbout')} ${props.title}`;
2727
2794
  yield send(prompt, response => {
@@ -3085,10 +3152,17 @@ const Text = props => {
3085
3152
  marked.marked.use({
3086
3153
  renderer: {
3087
3154
  link(href, title, text) {
3088
- return `<a href="${href}" target="_blank"${title ? ` title="${title}"` : ''}>${text}</a>`;
3155
+ return `<a class="llm__text-link" href="${href}" target="_blank"
3156
+ ${title ? `title="${title}"` : ''}
3157
+ onclick="javascript:event.preventDefault(),window.open(event.currentTarget.href);">
3158
+ ${text}
3159
+ </a>`;
3089
3160
  },
3090
3161
  image(href, title, text) {
3091
- return `<a class="llm__text-img" href="${href}" target="_blank"><img src="${href}"${title ? ` title="${title}"` : ''} alt="${text}" /></a>`;
3162
+ return `<a class="llm__text-img" href="${href}" target="_blank"
3163
+ onclick="javascript:event.preventDefault(),window.open(event.currentTarget.href);">
3164
+ <img src="${href}"${title ? ` title="${title}"` : ''} alt="${text}" />
3165
+ </a>`;
3092
3166
  }
3093
3167
  }
3094
3168
  });
@@ -3158,9 +3232,11 @@ const FormRequest = _ref => {
3158
3232
  const Poi = props => {
3159
3233
  const label = bomMixerHooks.useLabel();
3160
3234
  const {
3161
- send,
3162
3235
  decorateUrl
3163
3236
  } = useLlm(state => state.actions);
3237
+ const {
3238
+ send
3239
+ } = useLlmView(state => state.actions);
3164
3240
  const onTellMeMore = () => __awaiter(void 0, void 0, void 0, function* () {
3165
3241
  const prompt = `${label('llm.tellMeMoreAbout')} ${props.title}`;
3166
3242
  yield send(prompt, response => {
@@ -3440,11 +3516,11 @@ const Thread = () => {
3440
3516
  const Main = () => {
3441
3517
  var _a;
3442
3518
  const lenisRef = react.useRef(null);
3443
- const embedded = useLlm(state => state.embedded);
3444
3519
  const messages = useLlm(state => state.messages);
3520
+ const embedded = useLlmView(state => state.embedded);
3445
3521
  const {
3446
3522
  setLenis
3447
- } = useLlm(state => state.actions);
3523
+ } = useLlmView(state => state.actions);
3448
3524
  const classNames = bomCore.getClassNames('llm__main');
3449
3525
  setLenis((_a = lenisRef.current) === null || _a === void 0 ? void 0 : _a.lenis);
3450
3526
  const reveal = {
@@ -3512,7 +3588,7 @@ const Main = () => {
3512
3588
  animate: "show",
3513
3589
  exit: "exit",
3514
3590
  children: !embedded && jsxRuntime.jsx(Header, {})
3515
- }), jsxRuntime.jsx(reactLenis.ReactLenis, {
3591
+ }), jsxRuntime.jsx(react$2.ReactLenis, {
3516
3592
  ref: lenisRef,
3517
3593
  className: "llm__scroller",
3518
3594
  children: jsxRuntime.jsxs(framerMotion.motion.div, {
@@ -3534,10 +3610,10 @@ const Main = () => {
3534
3610
  };
3535
3611
 
3536
3612
  const Trigger = () => {
3613
+ const app = useLlm(state => state.app);
3537
3614
  const {
3538
3615
  open
3539
- } = useLlm(state => state.actions);
3540
- const app = useLlm(state => state.app);
3616
+ } = useLlmView(state => state.actions);
3541
3617
  const label = bomMixerHooks.useLabel();
3542
3618
  return jsxRuntime.jsxs(framerMotion.motion.div, {
3543
3619
  initial: {
@@ -3590,13 +3666,16 @@ const LlmComponent = /*#__PURE__*/react.forwardRef((props, ref) => {
3590
3666
  locale
3591
3667
  } = bomMixerHooks.useLayout();
3592
3668
  const {
3593
- init,
3594
- open
3669
+ init
3595
3670
  } = useLlm(state => state.actions);
3596
3671
  const app = useLlm(state => state.app);
3597
- const idle = useLlm(state => state.idle);
3598
- const opened = useLlm(state => state.opened);
3599
- const embedded = useLlm(state => state.embedded);
3672
+ const {
3673
+ initView,
3674
+ open
3675
+ } = useLlmView(state => state.actions);
3676
+ const idle = useLlmView(state => state.idle);
3677
+ const opened = useLlmView(state => state.opened);
3678
+ const embedded = useLlmView(state => state.embedded);
3600
3679
  react.useImperativeHandle(ref, () => ({
3601
3680
  open: () => {
3602
3681
  open();
@@ -3604,10 +3683,13 @@ const LlmComponent = /*#__PURE__*/react.forwardRef((props, ref) => {
3604
3683
  }));
3605
3684
  react.useEffect(() => {
3606
3685
  init(locale);
3607
- }, [init, locale]);
3686
+ initView();
3687
+ }, [init, locale, initView]);
3608
3688
  react.useEffect(() => {
3609
- document.documentElement.style.overflow = opened ? 'hidden' : 'auto';
3610
- }, [opened]);
3689
+ if (!embedded) {
3690
+ document.documentElement.style.overflow = opened ? 'hidden' : 'auto';
3691
+ }
3692
+ }, [opened, embedded]);
3611
3693
  const mounted = bomMixerHooks.useMounted();
3612
3694
  const classNames = bomCore.getClassNames('llm', {
3613
3695
  '-open': opened,