@alan-ai/alan-sdk-web 1.8.88 → 1.8.90

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.
package/dist/alan_lib.js CHANGED
@@ -7042,8 +7042,8 @@
7042
7042
  this.options = options !== null && options !== void 0 ? options : defaultOpts;
7043
7043
  this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;
7044
7044
  }
7045
- DomHandler2.prototype.onparserinit = function(parser) {
7046
- this.parser = parser;
7045
+ DomHandler2.prototype.onparserinit = function(parser2) {
7046
+ this.parser = parser2;
7047
7047
  };
7048
7048
  DomHandler2.prototype.onreset = function() {
7049
7049
  this.dom = [];
@@ -8731,8 +8731,8 @@
8731
8731
  exports.getFeed = void 0;
8732
8732
  var stringify_js_1 = require_stringify();
8733
8733
  var legacy_js_1 = require_legacy();
8734
- function getFeed(doc) {
8735
- var feedRoot = getOneElement(isValidFeed, doc);
8734
+ function getFeed(doc2) {
8735
+ var feedRoot = getOneElement(isValidFeed, doc2);
8736
8736
  return !feedRoot ? null : feedRoot.name === "feed" ? getAtomFeed(feedRoot) : getRssFeed(feedRoot);
8737
8737
  }
8738
8738
  exports.getFeed = getFeed;
@@ -10614,8 +10614,8 @@
10614
10614
  this.options = options !== null && options !== void 0 ? options : defaultOpts;
10615
10615
  this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;
10616
10616
  }
10617
- DomHandler2.prototype.onparserinit = function(parser) {
10618
- this.parser = parser;
10617
+ DomHandler2.prototype.onparserinit = function(parser2) {
10618
+ this.parser = parser2;
10619
10619
  };
10620
10620
  DomHandler2.prototype.onreset = function() {
10621
10621
  this.dom = [];
@@ -12303,8 +12303,8 @@
12303
12303
  exports.getFeed = void 0;
12304
12304
  var stringify_js_1 = require_stringify3();
12305
12305
  var legacy_js_1 = require_legacy2();
12306
- function getFeed(doc) {
12307
- var feedRoot = getOneElement(isValidFeed, doc);
12306
+ function getFeed(doc2) {
12307
+ var feedRoot = getOneElement(isValidFeed, doc2);
12308
12308
  return !feedRoot ? null : feedRoot.name === "feed" ? getAtomFeed(feedRoot) : getRssFeed(feedRoot);
12309
12309
  }
12310
12310
  exports.getFeed = getFeed;
@@ -14558,20 +14558,20 @@
14558
14558
  exports.update = exports.getParse = void 0;
14559
14559
  var domutils_1 = require_lib5();
14560
14560
  var domhandler_1 = require_lib2();
14561
- function getParse(parser) {
14561
+ function getParse(parser2) {
14562
14562
  return function parse(content, options, isDocument, context) {
14563
14563
  if (typeof Buffer !== "undefined" && Buffer.isBuffer(content)) {
14564
14564
  content = content.toString();
14565
14565
  }
14566
14566
  if (typeof content === "string") {
14567
- return parser(content, options, isDocument, context);
14567
+ return parser2(content, options, isDocument, context);
14568
14568
  }
14569
- var doc = content;
14570
- if (!Array.isArray(doc) && (0, domhandler_1.isDocument)(doc)) {
14571
- return doc;
14569
+ var doc2 = content;
14570
+ if (!Array.isArray(doc2) && (0, domhandler_1.isDocument)(doc2)) {
14571
+ return doc2;
14572
14572
  }
14573
14573
  var root = new domhandler_1.Document([]);
14574
- update(doc, root);
14574
+ update(doc2, root);
14575
14575
  return root;
14576
14576
  };
14577
14577
  }
@@ -20110,23 +20110,23 @@
20110
20110
  }
20111
20111
  // API
20112
20112
  static parse(html, options) {
20113
- const parser = new this(options);
20114
- parser.tokenizer.write(html, true);
20115
- return parser.document;
20113
+ const parser2 = new this(options);
20114
+ parser2.tokenizer.write(html, true);
20115
+ return parser2.document;
20116
20116
  }
20117
20117
  static getFragmentParser(fragmentContext, options) {
20118
20118
  const opts = Object.assign(Object.assign({}, defaultParserOptions), options);
20119
20119
  fragmentContext !== null && fragmentContext !== void 0 ? fragmentContext : fragmentContext = opts.treeAdapter.createElement(html_js_1.TAG_NAMES.TEMPLATE, html_js_1.NS.HTML, []);
20120
20120
  const documentMock = opts.treeAdapter.createElement("documentmock", html_js_1.NS.HTML, []);
20121
- const parser = new this(opts, documentMock, fragmentContext);
20122
- if (parser.fragmentContextID === html_js_1.TAG_ID.TEMPLATE) {
20123
- parser.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE);
20121
+ const parser2 = new this(opts, documentMock, fragmentContext);
20122
+ if (parser2.fragmentContextID === html_js_1.TAG_ID.TEMPLATE) {
20123
+ parser2.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE);
20124
20124
  }
20125
- parser._initTokenizerForFragmentParsing();
20126
- parser._insertFakeRootElement();
20127
- parser._resetInsertionMode();
20128
- parser._findFormInFragmentContext();
20129
- return parser;
20125
+ parser2._initTokenizerForFragmentParsing();
20126
+ parser2._insertFakeRootElement();
20127
+ parser2._resetInsertionMode();
20128
+ parser2._findFormInFragmentContext();
20129
+ return parser2;
20130
20130
  }
20131
20131
  getFragment() {
20132
20132
  const rootElement = this.treeAdapter.getFirstChild(this.document);
@@ -23161,9 +23161,9 @@
23161
23161
  html = fragmentContext;
23162
23162
  fragmentContext = null;
23163
23163
  }
23164
- const parser = index_js_1.Parser.getFragmentParser(fragmentContext, options);
23165
- parser.tokenizer.write(html, true);
23166
- return parser.getFragment();
23164
+ const parser2 = index_js_1.Parser.getFragmentParser(fragmentContext, options);
23165
+ parser2.tokenizer.write(html, true);
23166
+ return parser2.getFragment();
23167
23167
  }
23168
23168
  exports.parseFragment = parseFragment;
23169
23169
  }
@@ -28388,23 +28388,23 @@
28388
28388
  }
28389
28389
  // API
28390
28390
  static parse(html, options) {
28391
- const parser = new this(options);
28392
- parser.tokenizer.write(html, true);
28393
- return parser.document;
28391
+ const parser2 = new this(options);
28392
+ parser2.tokenizer.write(html, true);
28393
+ return parser2.document;
28394
28394
  }
28395
28395
  static getFragmentParser(fragmentContext, options) {
28396
28396
  const opts = Object.assign(Object.assign({}, defaultParserOptions), options);
28397
28397
  fragmentContext !== null && fragmentContext !== void 0 ? fragmentContext : fragmentContext = opts.treeAdapter.createElement(html_js_1.TAG_NAMES.TEMPLATE, html_js_1.NS.HTML, []);
28398
28398
  const documentMock = opts.treeAdapter.createElement("documentmock", html_js_1.NS.HTML, []);
28399
- const parser = new this(opts, documentMock, fragmentContext);
28400
- if (parser.fragmentContextID === html_js_1.TAG_ID.TEMPLATE) {
28401
- parser.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE);
28399
+ const parser2 = new this(opts, documentMock, fragmentContext);
28400
+ if (parser2.fragmentContextID === html_js_1.TAG_ID.TEMPLATE) {
28401
+ parser2.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE);
28402
28402
  }
28403
- parser._initTokenizerForFragmentParsing();
28404
- parser._insertFakeRootElement();
28405
- parser._resetInsertionMode();
28406
- parser._findFormInFragmentContext();
28407
- return parser;
28403
+ parser2._initTokenizerForFragmentParsing();
28404
+ parser2._insertFakeRootElement();
28405
+ parser2._resetInsertionMode();
28406
+ parser2._findFormInFragmentContext();
28407
+ return parser2;
28408
28408
  }
28409
28409
  getFragment() {
28410
28410
  const rootElement = this.treeAdapter.getFirstChild(this.document);
@@ -31512,9 +31512,9 @@
31512
31512
  html = fragmentContext;
31513
31513
  fragmentContext = null;
31514
31514
  }
31515
- const parser = index_js_1.Parser.getFragmentParser(fragmentContext, options);
31516
- parser.tokenizer.write(html, true);
31517
- return parser.getFragment();
31515
+ const parser2 = index_js_1.Parser.getFragmentParser(fragmentContext, options);
31516
+ parser2.tokenizer.write(html, true);
31517
+ return parser2.getFragment();
31518
31518
  }
31519
31519
  exports.parseFragment = parseFragment;
31520
31520
  }
@@ -32047,8 +32047,8 @@
32047
32047
  this.options = options !== null && options !== void 0 ? options : defaultOpts;
32048
32048
  this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;
32049
32049
  }
32050
- DomHandler2.prototype.onparserinit = function(parser) {
32051
- this.parser = parser;
32050
+ DomHandler2.prototype.onparserinit = function(parser2) {
32051
+ this.parser = parser2;
32052
32052
  };
32053
32053
  DomHandler2.prototype.onreset = function() {
32054
32054
  this.dom = [];
@@ -90650,6 +90650,17 @@
90650
90650
  replaceLoader = false;
90651
90651
  isNew = false;
90652
90652
  mergeProgressiveMessages(messages, msgInd, msg);
90653
+ } else if (msg?.suggestions?.length > 0) {
90654
+ const lastResponseMsgInd = (0, import_lodash.findLastIndex)(messages, (m) => {
90655
+ return msg.type === "response" && m.type === "response" && msgReqId && (m?.ctx?.reqId || m.reqId) === msgReqId;
90656
+ });
90657
+ if (lastResponseMsgInd > -1) {
90658
+ msgInd = lastResponseMsgInd;
90659
+ updateResponse = true;
90660
+ replaceLoader = false;
90661
+ isNew = false;
90662
+ mergeProgressiveMessages(messages, msgInd, msg);
90663
+ }
90653
90664
  }
90654
90665
  }
90655
90666
  }
@@ -90914,7 +90925,7 @@
90914
90925
  var key;
90915
90926
  if (uiState.project.id) {
90916
90927
  key = uiState.project.id;
90917
- return key.substr(key.indexOf("/"));
90928
+ return key.substr(key.indexOf("/") + 1);
90918
90929
  }
90919
90930
  return "none";
90920
90931
  }
@@ -90962,7 +90973,7 @@
90962
90973
  // alan_btn/src/textChat/helpers/adjustIFrameSize.ts
90963
90974
  function adjustIFrameSize(iframeMsgData) {
90964
90975
  const maxIFrameHeight = 6e3;
90965
- var { height, width, iframeId, withSvg } = iframeMsgData;
90976
+ var { height, width, iframeId, withSvg, fullWidth } = iframeMsgData;
90966
90977
  if (!window.alanIframes) {
90967
90978
  window.alanIframes = {};
90968
90979
  }
@@ -91002,7 +91013,7 @@
91002
91013
  iframeEl.style.width = "100%";
91003
91014
  return;
91004
91015
  }
91005
- if (withSvg) {
91016
+ if (withSvg || fullWidth) {
91006
91017
  if (!responseWrapper.classList.contains(`with-svg-for-${iframeId}`)) {
91007
91018
  responseWrapper.classList.add(`with-svg-for-${iframeId}`);
91008
91019
  responseWrapper.classList.add("with-svg");
@@ -91564,8 +91575,8 @@
91564
91575
  function parseSvgSize(svgString) {
91565
91576
  if (!svgString)
91566
91577
  return [];
91567
- const parser = new DOMParser();
91568
- const svgDoc = parser.parseFromString(svgString, "image/svg+xml");
91578
+ const parser2 = new DOMParser();
91579
+ const svgDoc = parser2.parseFromString(svgString, "image/svg+xml");
91569
91580
  const svgElement = svgDoc.querySelector("svg");
91570
91581
  const width = svgElement.getAttribute("width");
91571
91582
  const height = svgElement.getAttribute("height");
@@ -93620,7 +93631,7 @@
93620
93631
  hasFooterLinks = !!tempNode.querySelector(".footnotes");
93621
93632
  tempNode.remove();
93622
93633
  }
93623
- const links = msg.links?.filter((link) => isValidUrl(link?.href));
93634
+ const links = msg.links?.filter((link) => isValidUrl2(link?.href));
93624
93635
  for (let i = 0; i < links?.length; i++) {
93625
93636
  const curLink = links[i];
93626
93637
  const target = getLinkTarget(curLink);
@@ -93644,7 +93655,7 @@
93644
93655
  return "_blank";
93645
93656
  }
93646
93657
  }
93647
- function isValidUrl(url) {
93658
+ function isValidUrl2(url) {
93648
93659
  try {
93649
93660
  const parsedUrl = new URL(url);
93650
93661
  const hasValidProtocol = parsedUrl.protocol === "http:" || parsedUrl.protocol === "https:";
@@ -94236,7 +94247,7 @@
94236
94247
  window.hljs.addPlugin({
94237
94248
  "after:highlightElement": ({ el, text }) => {
94238
94249
  const wrapper = el.parentElement;
94239
- if (wrapper == null) {
94250
+ if (wrapper == null || wrapper.closest(".no-copy-btn")) {
94240
94251
  return;
94241
94252
  }
94242
94253
  wrapper.classList.add("alan-btn__chat-response__code-wrapper");
@@ -94258,19 +94269,19 @@
94258
94269
  }
94259
94270
  var hljsTheme = false;
94260
94271
  function initHighlightJs(theme, customDocument) {
94261
- const doc = customDocument || document;
94272
+ const doc2 = customDocument || document;
94262
94273
  const hljsStylesId = `alan-hljs-styles-${theme}`;
94263
- if (hljsTheme === theme && doc.getElementById(hljsStylesId))
94274
+ if (hljsTheme === theme && doc2.getElementById(hljsStylesId))
94264
94275
  return;
94265
94276
  hljsTheme = theme;
94266
- var style = doc.createElement("style");
94277
+ var style = doc2.createElement("style");
94267
94278
  style.textContent = highlightJsCss(theme);
94268
94279
  style.id = hljsStylesId;
94269
- doc.getElementsByTagName("head")[0].appendChild(style);
94270
- var lightHLJSOnlyStyle = doc.createElement("style");
94280
+ doc2.getElementsByTagName("head")[0].appendChild(style);
94281
+ var lightHLJSOnlyStyle = doc2.createElement("style");
94271
94282
  lightHLJSOnlyStyle.textContent = highlightJsCssForOnlyLightTheme();
94272
94283
  lightHLJSOnlyStyle.id = `alan-hljs-styles-light-only`;
94273
- doc.getElementsByTagName("head")[0].appendChild(lightHLJSOnlyStyle);
94284
+ doc2.getElementsByTagName("head")[0].appendChild(lightHLJSOnlyStyle);
94274
94285
  }
94275
94286
  function highlightCode(msgsHolder) {
94276
94287
  if (window.hljs) {
@@ -94531,88 +94542,99 @@ code.hljs {
94531
94542
  }
94532
94543
  function highlightJsCssForOnlyLightTheme() {
94533
94544
  const lightOnlyTheme = `
94534
- .hljs-light-override pre code.hljs {
94545
+ #overlay.hljs-light-override pre code.hljs {
94535
94546
  display: block;
94536
94547
  overflow-x: auto;
94537
94548
  overflow-y: hidden;
94538
94549
  padding: 1em;
94550
+ background-color: #f8f8f8 !important;
94539
94551
  }
94540
- .hljs-light-override code.hljs {
94552
+ #overlay.hljs-light-override code.hljs {
94541
94553
  padding: 3px 5px;
94542
94554
  }
94543
- .hljs-light-override .hljs {
94555
+ #overlay.hljs-light-override .hljs {
94544
94556
  background-color: #f8f8f8 !important;
94545
94557
  }
94546
- .hljs-light-override .hljs-doctag,
94547
- .hljs-light-override .hljs-keyword,
94548
- .hljs-light-override .hljs-meta .hljs-keyword,
94549
- .hljs-light-override .hljs-template-tag,
94550
- .hljs-light-override .hljs-template-variable,
94551
- .hljs-light-override .hljs-type,
94552
- .hljs-light-override .hljs-variable.language_ {
94558
+ #overlay.hljs-light-override pre {
94559
+ background-color: #f8f8f8 !important;
94560
+ border: 1px solid #DDD !important;
94561
+ }
94562
+ #overlay.hljs-light-override code:not(.hljs) {
94563
+ background-color: #f8f8f8 !important;
94564
+ border: 1px solid #DDD !important;
94565
+ }
94566
+
94567
+
94568
+ #overlay.hljs-light-override .hljs-doctag,
94569
+ #overlay.hljs-light-override .hljs-keyword,
94570
+ #overlay.hljs-light-override .hljs-meta .hljs-keyword,
94571
+ #overlay.hljs-light-override .hljs-template-tag,
94572
+ #overlay.hljs-light-override .hljs-template-variable,
94573
+ #overlay.hljs-light-override .hljs-type,
94574
+ #overlay.hljs-light-override .hljs-variable.language_ {
94553
94575
  color: #d73a49;
94554
94576
  }
94555
- .hljs-light-override .hljs-title,
94556
- .hljs-light-override .hljs-title.class_,
94557
- .hljs-light-override .hljs-title.class_.inherited__,
94558
- .hljs-light-override .hljs-title.function_ {
94577
+ #overlay.hljs-light-override .hljs-title,
94578
+ #overlay.hljs-light-override .hljs-title.class_,
94579
+ #overlay.hljs-light-override .hljs-title.class_.inherited__,
94580
+ #overlay.hljs-light-override .hljs-title.function_ {
94559
94581
  color: #6f42c1;
94560
94582
  }
94561
- .hljs-light-override .hljs-attr,
94562
- .hljs-light-override .hljs-attribute,
94563
- .hljs-light-override .hljs-literal,
94564
- .hljs-light-override .hljs-meta,
94565
- .hljs-light-override .hljs-number,
94566
- .hljs-light-override .hljs-operator,
94567
- .hljs-light-override .hljs-variable,
94568
- .hljs-light-override .hljs-selector-attr,
94569
- .hljs-light-override .hljs-selector-class,
94570
- .hljs-light-override .hljs-selector-id {
94583
+ #overlay.hljs-light-override .hljs-attr,
94584
+ #overlay.hljs-light-override .hljs-attribute,
94585
+ #overlay.hljs-light-override .hljs-literal,
94586
+ #overlay.hljs-light-override .hljs-meta,
94587
+ #overlay.hljs-light-override .hljs-number,
94588
+ #overlay.hljs-light-override .hljs-operator,
94589
+ #overlay.hljs-light-override .hljs-variable,
94590
+ #overlay.hljs-light-override .hljs-selector-attr,
94591
+ #overlay.hljs-light-override .hljs-selector-class,
94592
+ #overlay.hljs-light-override .hljs-selector-id {
94571
94593
  color: #005cc5;
94572
94594
  }
94573
- .hljs-light-override .hljs-regexp,
94574
- .hljs-light-override .hljs-string,
94575
- .hljs-light-override .hljs-meta .hljs-string {
94595
+ #overlay.hljs-light-override .hljs-regexp,
94596
+ #overlay.hljs-light-override .hljs-string,
94597
+ #overlay.hljs-light-override .hljs-meta .hljs-string {
94576
94598
  color: #032f62;
94577
94599
  }
94578
- .hljs-light-override .hljs-built_in,
94579
- .hljs-light-override .hljs-symbol {
94600
+ #overlay.hljs-light-override .hljs-built_in,
94601
+ #overlay.hljs-light-override .hljs-symbol {
94580
94602
  color: #e36209;
94581
94603
  }
94582
- .hljs-light-override .hljs-comment,
94583
- .hljs-light-override .hljs-code,
94584
- .hljs-light-override .hljs-formula {
94604
+ #overlay.hljs-light-override .hljs-comment,
94605
+ #overlay.hljs-light-override .hljs-code,
94606
+ #overlay.hljs-light-override .hljs-formula {
94585
94607
  color: #6a737d;
94586
94608
  }
94587
- .hljs-light-override .hljs-name,
94588
- .hljs-light-override .hljs-quote,
94589
- .hljs-light-override .hljs-selector-tag,
94590
- .hljs-light-override .hljs-selector-pseudo {
94609
+ #overlay.hljs-light-override .hljs-name,
94610
+ #overlay.hljs-light-override .hljs-quote,
94611
+ #overlay.hljs-light-override .hljs-selector-tag,
94612
+ #overlay.hljs-light-override .hljs-selector-pseudo {
94591
94613
  color: #22863a;
94592
94614
  }
94593
- .hljs-light-override .hljs-subst {
94615
+ #overlay.hljs-light-override .hljs-subst {
94594
94616
  color: #24292e;
94595
94617
  }
94596
- .hljs-light-override .hljs-section {
94618
+ #overlay.hljs-light-override .hljs-section {
94597
94619
  color: #005cc5;
94598
94620
  font-weight: bold;
94599
94621
  }
94600
- .hljs-light-override .hljs-bullet {
94622
+ #overlay.hljs-light-override .hljs-bullet {
94601
94623
  color: #735c0f;
94602
94624
  }
94603
- .hljs-light-override .hljs-emphasis {
94625
+ #overlay.hljs-light-override .hljs-emphasis {
94604
94626
  color: #24292e;
94605
94627
  font-style: italic;
94606
94628
  }
94607
- .hljs-light-override .hljs-strong {
94629
+ #overlay.hljs-light-override .hljs-strong {
94608
94630
  color: #24292e;
94609
94631
  font-weight: bold;
94610
94632
  }
94611
- .hljs-light-override .hljs-addition {
94633
+ #overlay.hljs-light-override .hljs-addition {
94612
94634
  color: #22863a;
94613
94635
  background-color: #f0fff4;
94614
94636
  }
94615
- .hljs-light-override .hljs-deletion {
94637
+ #overlay.hljs-light-override .hljs-deletion {
94616
94638
  color: #b31d28;
94617
94639
  background-color: #ffeef0;
94618
94640
  }
@@ -94787,6 +94809,22 @@ code.hljs {
94787
94809
 
94788
94810
  // alan_btn/src/textChat/saveChatStateToFile.ts
94789
94811
  var LIBS_PREFIX = "https://storage.googleapis.com/alan-ai-public-resources/save-debug-chat-resources";
94812
+ function extractFunction(code, functionName) {
94813
+ const regex = new RegExp(`(?:async\\s+)?function\\s+${functionName}\\s*\\([^)]*\\)\\s*{(?:[^{}]*|{[^{}]*})*}`, "gs");
94814
+ const match = code.match(regex);
94815
+ return match ? match[0] : null;
94816
+ }
94817
+ function stripComments(code) {
94818
+ return code.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|\/\/.*|\/\*[\s\S]*?\*\//g, (match, quoted) => {
94819
+ return quoted ? quoted : "";
94820
+ });
94821
+ }
94822
+ function commentInitIframeFnInSourceCode(html, initIframeFn2) {
94823
+ const explanationComment = `// The initIframe function was commented out because resources were inlined in the iframe.
94824
+ `;
94825
+ const commentedFn = initIframeFn2.split("\n").map((line) => "// " + line).join("\n");
94826
+ return html.replace(initIframeFn2, explanationComment + commentedFn);
94827
+ }
94790
94828
  async function saveChatState({
94791
94829
  chatName,
94792
94830
  chatEl,
@@ -94814,19 +94852,25 @@ code.hljs {
94814
94852
  continue;
94815
94853
  }
94816
94854
  let initHtmlContent = await response.text();
94817
- let htmlContent = await inlineExternalScripts(initHtmlContent);
94855
+ let { htmlContent: htmlContent2 } = await inlineExternalScripts(initHtmlContent);
94856
+ const initIframeFn2 = extractFunction(htmlContent2, "initIframe");
94857
+ if (initIframeFn2) {
94858
+ htmlContent2 = commentInitIframeFnInSourceCode(htmlContent2, initIframeFn2);
94859
+ console.log("Replaced initIframe function with commented version as resources were successfully inlined.");
94860
+ }
94818
94861
  const frameSrc = iframe.getAttribute("src");
94819
94862
  iframe.removeAttribute("src");
94820
- iframe.setAttribute("srcdoc", htmlContent);
94863
+ iframe.setAttribute("srcdoc", htmlContent2);
94821
94864
  iframe.setAttribute("sandbox", "allow-scripts allow-same-origin");
94822
94865
  if (frameSrc.indexOf("alan.") > -1 || frameSrc.indexOf("alan-")) {
94823
94866
  const parent = iframe.parentNode;
94824
94867
  let controlsDiv = document.createElement("div");
94825
94868
  controlsDiv.classList.add("alan-iframe-controls");
94826
- let newIframe = document.createElement("iframe");
94827
- newIframe.srcdoc = initHtmlContent;
94828
- newIframe.setAttribute("style", "display: none;");
94829
- controlsDiv.appendChild(newIframe);
94869
+ let hiddenIframe = document.createElement("iframe");
94870
+ hiddenIframe.srcdoc = `<!--${initHtmlContent}-->`;
94871
+ hiddenIframe.setAttribute("style", "display: none;");
94872
+ hiddenIframe.setAttribute("sandbox", "");
94873
+ controlsDiv.appendChild(hiddenIframe);
94830
94874
  const loadIframeLink = document.createElement("a");
94831
94875
  loadIframeLink.classList.add("load-iframe-source");
94832
94876
  loadIframeLink.textContent = "Load IFrame source \u2B07\uFE0F";
@@ -94845,11 +94889,16 @@ code.hljs {
94845
94889
  const functionsToInsert = iFrameSizeListenerFunctions.map((fn) => fn.toString()).join("\n\n");
94846
94890
  const onIFrameSizeListenerString = onIFrameSizeListener.toString();
94847
94891
  const copyTextToBufferString = copyTextToBuffer.toString();
94848
- const outputPhrases = await getOutputLogs({
94849
- projectId,
94850
- environment,
94851
- requestIds
94852
- });
94892
+ let outputPhrases = [];
94893
+ try {
94894
+ outputPhrases = await getOutputLogs({
94895
+ projectId,
94896
+ environment,
94897
+ requestIds
94898
+ });
94899
+ } catch (error) {
94900
+ console.info("Chat will be exported without output graphs", error);
94901
+ }
94853
94902
  const alanMainClass = "alan-" + projectId;
94854
94903
  const code = `
94855
94904
  <script type="text/javascript">
@@ -94857,7 +94906,7 @@ code.hljs {
94857
94906
  ${functionsToInsert}
94858
94907
  ${copyTextToBufferString}
94859
94908
 
94860
- function copyCodeHandler(text){
94909
+ function copyCodeHandler(text, copyButton){
94861
94910
  copyTextToBuffer(text);
94862
94911
 
94863
94912
  copyButton.classList.add('alan-copy-btn-copied');
@@ -94866,35 +94915,36 @@ code.hljs {
94866
94915
  }, 2000);
94867
94916
  }
94868
94917
 
94918
+ if(window.hljs) {
94919
+ window.hljs.addPlugin({
94920
+ "after:highlightElement": ({ el, text }) => {
94921
+ const wrapper = el.parentElement;
94922
+ if (wrapper == null) {
94923
+ return;
94924
+ }
94869
94925
 
94870
- window.hljs.addPlugin({
94871
- "after:highlightElement": ({ el, text }) => {
94872
- const wrapper = el.parentElement;
94873
- if (wrapper == null) {
94874
- return;
94875
- }
94876
-
94877
- wrapper.classList.add("alan-btn__chat-response__code-wrapper");
94926
+ wrapper.classList.add("alan-btn__chat-response__code-wrapper");
94878
94927
 
94879
- const copyButton = document.createElement("span");
94880
- copyButton.classList.add(
94881
- "alan-btn__chat-response__copy-code-btn",
94882
- );
94928
+ const copyButton = document.createElement("span");
94929
+ copyButton.classList.add(
94930
+ "alan-btn__chat-response__copy-code-btn",
94931
+ );
94883
94932
 
94884
- const chatIcons = {
94885
- copy: '<svg class="alan-btn__copy-icon" width="24px" height="24px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M19.5 16.5L19.5 4.5L18.75 3.75H9L8.25 4.5L8.25 7.5L5.25 7.5L4.5 8.25V20.25L5.25 21H15L15.75 20.25V17.25H18.75L19.5 16.5ZM15.75 15.75L15.75 8.25L15 7.5L9.75 7.5V5.25L18 5.25V15.75H15.75ZM6 9L14.25 9L14.25 19.5L6 19.5L6 9Z" fill="#080341"/></svg>',
94886
- copied: '<svg class="alan-btn__copied-icon" width="24px" height="24px" viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg" aria-labelledby="okIconTitle" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" color="#000000"> <title id="okIconTitle">Copied!</title> <polyline points="4 13 9 18 20 7"/> </svg>'
94887
- };
94933
+ const chatIcons = {
94934
+ copy: '<svg class="alan-btn__copy-icon" width="24px" height="24px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M19.5 16.5L19.5 4.5L18.75 3.75H9L8.25 4.5L8.25 7.5L5.25 7.5L4.5 8.25V20.25L5.25 21H15L15.75 20.25V17.25H18.75L19.5 16.5ZM15.75 15.75L15.75 8.25L15 7.5L9.75 7.5V5.25L18 5.25V15.75H15.75ZM6 9L14.25 9L14.25 19.5L6 19.5L6 9Z" fill="#080341"/></svg>',
94935
+ copied: '<svg class="alan-btn__copied-icon" width="24px" height="24px" viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg" aria-labelledby="okIconTitle" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" color="#000000"> <title id="okIconTitle">Copied!</title> <polyline points="4 13 9 18 20 7"/> </svg>'
94936
+ };
94888
94937
 
94889
- copyButton.innerHTML = chatIcons.copy + chatIcons.copied;
94938
+ copyButton.innerHTML = chatIcons.copy + chatIcons.copied;
94890
94939
 
94891
- copyButton.onclick = () => {
94892
- copyCodeHandler(text)
94893
- };
94940
+ copyButton.onclick = () => {
94941
+ copyCodeHandler(text, copyButton)
94942
+ };
94894
94943
 
94895
- wrapper.appendChild(copyButton);
94896
- },
94897
- });
94944
+ wrapper.appendChild(copyButton);
94945
+ },
94946
+ });
94947
+ }
94898
94948
 
94899
94949
  window.addEventListener("message", ${onIFrameSizeListenerString});
94900
94950
 
@@ -94973,6 +95023,12 @@ code.hljs {
94973
95023
  document.addEventListener('click', function onGraphClick(e) {
94974
95024
  var graphEl = e.target.closest('.chat-bubble_graph, .alan-btn__chat-graph');
94975
95025
  if (graphEl) {
95026
+
95027
+ if (!window.d3 || !window.Viz || !window.alanMarkdown || !window.svgPanZoom || !window.hljs) {
95028
+ alert('Some libraries required to display the graph could not be loaded. Please check your internet connection and try again.');
95029
+ return;
95030
+ }
95031
+
94976
95032
  var phrase = logs.filter(l => l.requestId === graphEl.getAttribute('data-request-id'))[0];
94977
95033
 
94978
95034
  if (phrase) {
@@ -95239,8 +95295,6 @@ code.hljs {
95239
95295
  <head>
95240
95296
  <meta charset="UTF-8">
95241
95297
  <title>Alan Text Chat History</title>
95242
- <link href="${LIBS_PREFIX}/main.css?v=1" rel="stylesheet" />
95243
- <link href="${LIBS_PREFIX}/highlight.light.css" rel="stylesheet" />
95244
95298
  <script src="${LIBS_PREFIX}/d3.v7.min.js" type="text/javascript"><\/script>
95245
95299
  <script src="${LIBS_PREFIX}/viz-standalone.js" type="text/javascript"><\/script>
95246
95300
  <script src="${LIBS_PREFIX}/svg-pan-zoom.min.js" type="text/javascript"><\/script>
@@ -95462,7 +95516,7 @@ code.hljs {
95462
95516
 
95463
95517
  if(clickedEl.classList.contains('load-iframe-source')) {
95464
95518
  const iframe = clickedEl.previousElementSibling;
95465
- const iframeHtml = iframe.getAttribute('srcdoc');
95519
+ const iframeHtml = iframe.getAttribute('srcdoc').slice(4, -4);;
95466
95520
  let blob = new Blob([iframeHtml], { type: "text/html" });
95467
95521
 
95468
95522
  let now = new Date();
@@ -95635,7 +95689,76 @@ code.hljs {
95635
95689
  console.error(`Failed to inline script from ${src}:`, error);
95636
95690
  }
95637
95691
  }
95638
- return doc.documentElement.outerHTML;
95692
+ const initIframeFn = extractFunction(htmlContent, "initIframe");
95693
+ let allInitIframeResourcesInlined = false;
95694
+ if (initIframeFn) {
95695
+ let initIframeBody = stripComments(initIframeFn);
95696
+ const resourceRegex = /await iframe\.(addScript|addStyleSheet|addFont)\(['"]([^'"]+)['"]\)/g;
95697
+ let resourceMatch;
95698
+ const isValidUrlFn = extractFunction(htmlContent, "isValidUrl");
95699
+ const getResourceUrlFn = extractFunction(htmlContent, "getResourceUrl");
95700
+ const getStudioResourceUrlFn = extractFunction(htmlContent, "getStudioResourceUrl");
95701
+ const getProjectResourceUrlFn = extractFunction(htmlContent, "getProjectResourceUrl");
95702
+ let getResourceUrl = null;
95703
+ let getStudioResourceUrl = null;
95704
+ let getProjectResourceUrl = null;
95705
+ let isValidUrl = null;
95706
+ try {
95707
+ if (isValidUrlFn) {
95708
+ eval(`isValidUrl = ${isValidUrlFn}`);
95709
+ }
95710
+ if (getResourceUrlFn) {
95711
+ eval(`getResourceUrl = ${getResourceUrlFn}`);
95712
+ }
95713
+ if (getStudioResourceUrlFn) {
95714
+ eval(`getStudioResourceUrl = ${getStudioResourceUrlFn}`);
95715
+ }
95716
+ if (getProjectResourceUrlFn) {
95717
+ eval(`getProjectResourceUrl = ${getProjectResourceUrlFn}`);
95718
+ }
95719
+ } catch (error) {
95720
+ console.error("Failed to parse resource-related functions using eval:", error);
95721
+ }
95722
+ let hasInternalFunctions = true;
95723
+ if (!getResourceUrl || !getStudioResourceUrl || !getProjectResourceUrl || !isValidUrl) {
95724
+ hasInternalFunctions = false;
95725
+ console.error("Unable to parse resource-related functions from the iframe code. Some iframes may appear without content.");
95726
+ }
95727
+ allInitIframeResourcesInlined = true;
95728
+ if (hasInternalFunctions) {
95729
+ while ((resourceMatch = resourceRegex.exec(initIframeBody)) !== null) {
95730
+ const [_, resourceType, rawResourceUrl] = resourceMatch;
95731
+ try {
95732
+ const resourceUrl = getResourceUrl(rawResourceUrl);
95733
+ const response = await fetch(resourceUrl);
95734
+ if (!response.ok) {
95735
+ console.error(`Failed to fetch ${resourceType} from ${resourceUrl}: ${response.statusText}`);
95736
+ allInitIframeResourcesInlined = false;
95737
+ continue;
95738
+ }
95739
+ const resourceContent = await response.text();
95740
+ if (resourceType === "addScript") {
95741
+ const inlineScript = doc.createElement("script");
95742
+ inlineScript.textContent = resourceContent;
95743
+ doc.head.appendChild(inlineScript);
95744
+ console.log(`Inlined script from initIframe fn: ${resourceUrl}`);
95745
+ } else if (resourceType === "addStyleSheet") {
95746
+ const inlineStyle = doc.createElement("style");
95747
+ inlineStyle.textContent = resourceContent;
95748
+ doc.head.appendChild(inlineStyle);
95749
+ console.log(`Inlined stylesheet from initIframe fn: ${resourceUrl}`);
95750
+ }
95751
+ } catch (error) {
95752
+ console.error(`Failed to inline ${resourceType} from ${rawResourceUrl}:`, error);
95753
+ allInitIframeResourcesInlined = false;
95754
+ }
95755
+ }
95756
+ }
95757
+ }
95758
+ return {
95759
+ htmlContent: doc.documentElement.outerHTML,
95760
+ allInitIframeResourcesInlined
95761
+ };
95639
95762
  }
95640
95763
 
95641
95764
  // alan_btn/src/textChat/helpers/chat.ts
@@ -95812,7 +95935,7 @@ code.hljs {
95812
95935
 
95813
95936
  // alan_btn/alan_btn.ts
95814
95937
  (function(ns) {
95815
- uiState.lib.version = "alan-version.1.8.88".replace("alan-version.", "");
95938
+ uiState.lib.version = "alan-version.1.8.90".replace("alan-version.", "");
95816
95939
  if (window.alanBtn) {
95817
95940
  console.warn("Alan: the Alan Button source code has already added (v." + uiState.lib.version + ")");
95818
95941
  }
@@ -98168,13 +98291,15 @@ ${LEARN_MORE_LABEL}
98168
98291
  enableTextareaInTheChat();
98169
98292
  }
98170
98293
  }, false);
98171
- window.addEventListener("click", (e) => {
98294
+ window.addEventListener("click", (0, import_lodash2.debounce)((e) => {
98295
+ if (isTutorMode())
98296
+ return;
98172
98297
  var clickedEl = e.target;
98173
98298
  processClickByButtonInChat(clickedEl, btnInstance, (text) => {
98174
98299
  textChatScrollPosition = null;
98175
98300
  _sendText(text);
98176
98301
  });
98177
- });
98302
+ }, 300));
98178
98303
  function getMsgBubbleLabel(msg) {
98179
98304
  if (msg.type === "request" || msg.type === "response") {
98180
98305
  const isResponse = msg.type === "response";
@@ -98352,7 +98477,8 @@ ${LEARN_MORE_LABEL}
98352
98477
  innerEl.insertAdjacentHTML("beforeend", buildMsgTextContent(updatedMsg));
98353
98478
  innerEl.insertAdjacentHTML("beforeend", buildLinksContent(updatedMsg));
98354
98479
  innerEl.insertAdjacentHTML("beforeend", buildCommandsBlock(msg, uiState?.textChat?.options));
98355
- innerEl.insertAdjacentHTML("beforeend", buildMsgIncommingLoader(msg));
98480
+ innerEl.insertAdjacentHTML("beforeend", buildMsgIncommingLoader(updatedMsg));
98481
+ innerEl.insertAdjacentHTML("beforeend", addGraphIcon(updatedMsg));
98356
98482
  const newSuggestions = msg?.suggestions;
98357
98483
  if (newSuggestions?.length > 0) {
98358
98484
  if (innerEl.nextElementSibling?.classList.contains("alan-btn__chat-suggestions")) {
@@ -98981,8 +99107,19 @@ ${LEARN_MORE_LABEL}
98981
99107
  rightHeaderIconsHolder.appendChild(saveChatStateBtnImg);
98982
99108
  rightHeaderIconsHolder.appendChild(expandCollapseChatBtnImg);
98983
99109
  saveChatStateBtnImg.addEventListener("click", async () => {
99110
+ const projectId = getProjectId();
99111
+ const head = document.head.cloneNode(true);
99112
+ const styleSelectors = [
99113
+ `style#alan-hljs-styles-light`,
99114
+ `style#alan-hljs-styles-dark`,
99115
+ `style#alan-hljs-styles-light-only`,
99116
+ `style#MJX-SVG-styles`,
99117
+ `style#alan-stylesheet-${projectId}`
99118
+ ];
99119
+ const styles = head.querySelectorAll(styleSelectors.join(", "));
99120
+ const combinedStylesHTML = Array.from(styles).map((style) => style.outerHTML).join("\n");
98984
99121
  const customHeadContent = `
98985
- ${document.head.innerHTML}
99122
+ ${combinedStylesHTML}
98986
99123
  `;
98987
99124
  const initChat = document.querySelector("#chatMessagesWrapper");
98988
99125
  if (!initChat)
@@ -98999,7 +99136,7 @@ ${LEARN_MORE_LABEL}
98999
99136
  chatName: title,
99000
99137
  chatEl: initChat,
99001
99138
  width: chatWidth2,
99002
- projectId: getProjectId(),
99139
+ projectId,
99003
99140
  environment: getEnvironment(),
99004
99141
  requestIds: textChatMessages?.length > 0 ? textChatMessages.filter((m) => m.type === "response" /* Response */).map((m) => getMsgReqId(m)) : [],
99005
99142
  headContent: customHeadContent