@alan-ai/alan-sdk-web 1.8.89 → 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 = [];
@@ -90652,7 +90652,7 @@
90652
90652
  mergeProgressiveMessages(messages, msgInd, msg);
90653
90653
  } else if (msg?.suggestions?.length > 0) {
90654
90654
  const lastResponseMsgInd = (0, import_lodash.findLastIndex)(messages, (m) => {
90655
- return msg.type === "response" && msgReqId && (m?.ctx?.reqId || m.reqId) === msgReqId;
90655
+ return msg.type === "response" && m.type === "response" && msgReqId && (m?.ctx?.reqId || m.reqId) === msgReqId;
90656
90656
  });
90657
90657
  if (lastResponseMsgInd > -1) {
90658
90658
  msgInd = lastResponseMsgInd;
@@ -90925,7 +90925,7 @@
90925
90925
  var key;
90926
90926
  if (uiState.project.id) {
90927
90927
  key = uiState.project.id;
90928
- return key.substr(key.indexOf("/"));
90928
+ return key.substr(key.indexOf("/") + 1);
90929
90929
  }
90930
90930
  return "none";
90931
90931
  }
@@ -90973,7 +90973,7 @@
90973
90973
  // alan_btn/src/textChat/helpers/adjustIFrameSize.ts
90974
90974
  function adjustIFrameSize(iframeMsgData) {
90975
90975
  const maxIFrameHeight = 6e3;
90976
- var { height, width, iframeId, withSvg } = iframeMsgData;
90976
+ var { height, width, iframeId, withSvg, fullWidth } = iframeMsgData;
90977
90977
  if (!window.alanIframes) {
90978
90978
  window.alanIframes = {};
90979
90979
  }
@@ -91013,7 +91013,7 @@
91013
91013
  iframeEl.style.width = "100%";
91014
91014
  return;
91015
91015
  }
91016
- if (withSvg) {
91016
+ if (withSvg || fullWidth) {
91017
91017
  if (!responseWrapper.classList.contains(`with-svg-for-${iframeId}`)) {
91018
91018
  responseWrapper.classList.add(`with-svg-for-${iframeId}`);
91019
91019
  responseWrapper.classList.add("with-svg");
@@ -91575,8 +91575,8 @@
91575
91575
  function parseSvgSize(svgString) {
91576
91576
  if (!svgString)
91577
91577
  return [];
91578
- const parser = new DOMParser();
91579
- const svgDoc = parser.parseFromString(svgString, "image/svg+xml");
91578
+ const parser2 = new DOMParser();
91579
+ const svgDoc = parser2.parseFromString(svgString, "image/svg+xml");
91580
91580
  const svgElement = svgDoc.querySelector("svg");
91581
91581
  const width = svgElement.getAttribute("width");
91582
91582
  const height = svgElement.getAttribute("height");
@@ -93631,7 +93631,7 @@
93631
93631
  hasFooterLinks = !!tempNode.querySelector(".footnotes");
93632
93632
  tempNode.remove();
93633
93633
  }
93634
- const links = msg.links?.filter((link) => isValidUrl(link?.href));
93634
+ const links = msg.links?.filter((link) => isValidUrl2(link?.href));
93635
93635
  for (let i = 0; i < links?.length; i++) {
93636
93636
  const curLink = links[i];
93637
93637
  const target = getLinkTarget(curLink);
@@ -93655,7 +93655,7 @@
93655
93655
  return "_blank";
93656
93656
  }
93657
93657
  }
93658
- function isValidUrl(url) {
93658
+ function isValidUrl2(url) {
93659
93659
  try {
93660
93660
  const parsedUrl = new URL(url);
93661
93661
  const hasValidProtocol = parsedUrl.protocol === "http:" || parsedUrl.protocol === "https:";
@@ -94247,7 +94247,7 @@
94247
94247
  window.hljs.addPlugin({
94248
94248
  "after:highlightElement": ({ el, text }) => {
94249
94249
  const wrapper = el.parentElement;
94250
- if (wrapper == null) {
94250
+ if (wrapper == null || wrapper.closest(".no-copy-btn")) {
94251
94251
  return;
94252
94252
  }
94253
94253
  wrapper.classList.add("alan-btn__chat-response__code-wrapper");
@@ -94269,19 +94269,19 @@
94269
94269
  }
94270
94270
  var hljsTheme = false;
94271
94271
  function initHighlightJs(theme, customDocument) {
94272
- const doc = customDocument || document;
94272
+ const doc2 = customDocument || document;
94273
94273
  const hljsStylesId = `alan-hljs-styles-${theme}`;
94274
- if (hljsTheme === theme && doc.getElementById(hljsStylesId))
94274
+ if (hljsTheme === theme && doc2.getElementById(hljsStylesId))
94275
94275
  return;
94276
94276
  hljsTheme = theme;
94277
- var style = doc.createElement("style");
94277
+ var style = doc2.createElement("style");
94278
94278
  style.textContent = highlightJsCss(theme);
94279
94279
  style.id = hljsStylesId;
94280
- doc.getElementsByTagName("head")[0].appendChild(style);
94281
- var lightHLJSOnlyStyle = doc.createElement("style");
94280
+ doc2.getElementsByTagName("head")[0].appendChild(style);
94281
+ var lightHLJSOnlyStyle = doc2.createElement("style");
94282
94282
  lightHLJSOnlyStyle.textContent = highlightJsCssForOnlyLightTheme();
94283
94283
  lightHLJSOnlyStyle.id = `alan-hljs-styles-light-only`;
94284
- doc.getElementsByTagName("head")[0].appendChild(lightHLJSOnlyStyle);
94284
+ doc2.getElementsByTagName("head")[0].appendChild(lightHLJSOnlyStyle);
94285
94285
  }
94286
94286
  function highlightCode(msgsHolder) {
94287
94287
  if (window.hljs) {
@@ -94542,88 +94542,99 @@ code.hljs {
94542
94542
  }
94543
94543
  function highlightJsCssForOnlyLightTheme() {
94544
94544
  const lightOnlyTheme = `
94545
- .hljs-light-override pre code.hljs {
94545
+ #overlay.hljs-light-override pre code.hljs {
94546
94546
  display: block;
94547
94547
  overflow-x: auto;
94548
94548
  overflow-y: hidden;
94549
94549
  padding: 1em;
94550
+ background-color: #f8f8f8 !important;
94550
94551
  }
94551
- .hljs-light-override code.hljs {
94552
+ #overlay.hljs-light-override code.hljs {
94552
94553
  padding: 3px 5px;
94553
94554
  }
94554
- .hljs-light-override .hljs {
94555
+ #overlay.hljs-light-override .hljs {
94555
94556
  background-color: #f8f8f8 !important;
94556
94557
  }
94557
- .hljs-light-override .hljs-doctag,
94558
- .hljs-light-override .hljs-keyword,
94559
- .hljs-light-override .hljs-meta .hljs-keyword,
94560
- .hljs-light-override .hljs-template-tag,
94561
- .hljs-light-override .hljs-template-variable,
94562
- .hljs-light-override .hljs-type,
94563
- .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_ {
94564
94575
  color: #d73a49;
94565
94576
  }
94566
- .hljs-light-override .hljs-title,
94567
- .hljs-light-override .hljs-title.class_,
94568
- .hljs-light-override .hljs-title.class_.inherited__,
94569
- .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_ {
94570
94581
  color: #6f42c1;
94571
94582
  }
94572
- .hljs-light-override .hljs-attr,
94573
- .hljs-light-override .hljs-attribute,
94574
- .hljs-light-override .hljs-literal,
94575
- .hljs-light-override .hljs-meta,
94576
- .hljs-light-override .hljs-number,
94577
- .hljs-light-override .hljs-operator,
94578
- .hljs-light-override .hljs-variable,
94579
- .hljs-light-override .hljs-selector-attr,
94580
- .hljs-light-override .hljs-selector-class,
94581
- .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 {
94582
94593
  color: #005cc5;
94583
94594
  }
94584
- .hljs-light-override .hljs-regexp,
94585
- .hljs-light-override .hljs-string,
94586
- .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 {
94587
94598
  color: #032f62;
94588
94599
  }
94589
- .hljs-light-override .hljs-built_in,
94590
- .hljs-light-override .hljs-symbol {
94600
+ #overlay.hljs-light-override .hljs-built_in,
94601
+ #overlay.hljs-light-override .hljs-symbol {
94591
94602
  color: #e36209;
94592
94603
  }
94593
- .hljs-light-override .hljs-comment,
94594
- .hljs-light-override .hljs-code,
94595
- .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 {
94596
94607
  color: #6a737d;
94597
94608
  }
94598
- .hljs-light-override .hljs-name,
94599
- .hljs-light-override .hljs-quote,
94600
- .hljs-light-override .hljs-selector-tag,
94601
- .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 {
94602
94613
  color: #22863a;
94603
94614
  }
94604
- .hljs-light-override .hljs-subst {
94615
+ #overlay.hljs-light-override .hljs-subst {
94605
94616
  color: #24292e;
94606
94617
  }
94607
- .hljs-light-override .hljs-section {
94618
+ #overlay.hljs-light-override .hljs-section {
94608
94619
  color: #005cc5;
94609
94620
  font-weight: bold;
94610
94621
  }
94611
- .hljs-light-override .hljs-bullet {
94622
+ #overlay.hljs-light-override .hljs-bullet {
94612
94623
  color: #735c0f;
94613
94624
  }
94614
- .hljs-light-override .hljs-emphasis {
94625
+ #overlay.hljs-light-override .hljs-emphasis {
94615
94626
  color: #24292e;
94616
94627
  font-style: italic;
94617
94628
  }
94618
- .hljs-light-override .hljs-strong {
94629
+ #overlay.hljs-light-override .hljs-strong {
94619
94630
  color: #24292e;
94620
94631
  font-weight: bold;
94621
94632
  }
94622
- .hljs-light-override .hljs-addition {
94633
+ #overlay.hljs-light-override .hljs-addition {
94623
94634
  color: #22863a;
94624
94635
  background-color: #f0fff4;
94625
94636
  }
94626
- .hljs-light-override .hljs-deletion {
94637
+ #overlay.hljs-light-override .hljs-deletion {
94627
94638
  color: #b31d28;
94628
94639
  background-color: #ffeef0;
94629
94640
  }
@@ -94798,6 +94809,22 @@ code.hljs {
94798
94809
 
94799
94810
  // alan_btn/src/textChat/saveChatStateToFile.ts
94800
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
+ }
94801
94828
  async function saveChatState({
94802
94829
  chatName,
94803
94830
  chatEl,
@@ -94825,19 +94852,25 @@ code.hljs {
94825
94852
  continue;
94826
94853
  }
94827
94854
  let initHtmlContent = await response.text();
94828
- 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
+ }
94829
94861
  const frameSrc = iframe.getAttribute("src");
94830
94862
  iframe.removeAttribute("src");
94831
- iframe.setAttribute("srcdoc", htmlContent);
94863
+ iframe.setAttribute("srcdoc", htmlContent2);
94832
94864
  iframe.setAttribute("sandbox", "allow-scripts allow-same-origin");
94833
94865
  if (frameSrc.indexOf("alan.") > -1 || frameSrc.indexOf("alan-")) {
94834
94866
  const parent = iframe.parentNode;
94835
94867
  let controlsDiv = document.createElement("div");
94836
94868
  controlsDiv.classList.add("alan-iframe-controls");
94837
- let newIframe = document.createElement("iframe");
94838
- newIframe.srcdoc = initHtmlContent;
94839
- newIframe.setAttribute("style", "display: none;");
94840
- 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);
94841
94874
  const loadIframeLink = document.createElement("a");
94842
94875
  loadIframeLink.classList.add("load-iframe-source");
94843
94876
  loadIframeLink.textContent = "Load IFrame source \u2B07\uFE0F";
@@ -94856,11 +94889,16 @@ code.hljs {
94856
94889
  const functionsToInsert = iFrameSizeListenerFunctions.map((fn) => fn.toString()).join("\n\n");
94857
94890
  const onIFrameSizeListenerString = onIFrameSizeListener.toString();
94858
94891
  const copyTextToBufferString = copyTextToBuffer.toString();
94859
- const outputPhrases = await getOutputLogs({
94860
- projectId,
94861
- environment,
94862
- requestIds
94863
- });
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
+ }
94864
94902
  const alanMainClass = "alan-" + projectId;
94865
94903
  const code = `
94866
94904
  <script type="text/javascript">
@@ -94868,7 +94906,7 @@ code.hljs {
94868
94906
  ${functionsToInsert}
94869
94907
  ${copyTextToBufferString}
94870
94908
 
94871
- function copyCodeHandler(text){
94909
+ function copyCodeHandler(text, copyButton){
94872
94910
  copyTextToBuffer(text);
94873
94911
 
94874
94912
  copyButton.classList.add('alan-copy-btn-copied');
@@ -94877,35 +94915,36 @@ code.hljs {
94877
94915
  }, 2000);
94878
94916
  }
94879
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
+ }
94880
94925
 
94881
- window.hljs.addPlugin({
94882
- "after:highlightElement": ({ el, text }) => {
94883
- const wrapper = el.parentElement;
94884
- if (wrapper == null) {
94885
- return;
94886
- }
94887
-
94888
- wrapper.classList.add("alan-btn__chat-response__code-wrapper");
94926
+ wrapper.classList.add("alan-btn__chat-response__code-wrapper");
94889
94927
 
94890
- const copyButton = document.createElement("span");
94891
- copyButton.classList.add(
94892
- "alan-btn__chat-response__copy-code-btn",
94893
- );
94928
+ const copyButton = document.createElement("span");
94929
+ copyButton.classList.add(
94930
+ "alan-btn__chat-response__copy-code-btn",
94931
+ );
94894
94932
 
94895
- const chatIcons = {
94896
- 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>',
94897
- 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>'
94898
- };
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
+ };
94899
94937
 
94900
- copyButton.innerHTML = chatIcons.copy + chatIcons.copied;
94938
+ copyButton.innerHTML = chatIcons.copy + chatIcons.copied;
94901
94939
 
94902
- copyButton.onclick = () => {
94903
- copyCodeHandler(text)
94904
- };
94940
+ copyButton.onclick = () => {
94941
+ copyCodeHandler(text, copyButton)
94942
+ };
94905
94943
 
94906
- wrapper.appendChild(copyButton);
94907
- },
94908
- });
94944
+ wrapper.appendChild(copyButton);
94945
+ },
94946
+ });
94947
+ }
94909
94948
 
94910
94949
  window.addEventListener("message", ${onIFrameSizeListenerString});
94911
94950
 
@@ -94984,6 +95023,12 @@ code.hljs {
94984
95023
  document.addEventListener('click', function onGraphClick(e) {
94985
95024
  var graphEl = e.target.closest('.chat-bubble_graph, .alan-btn__chat-graph');
94986
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
+
94987
95032
  var phrase = logs.filter(l => l.requestId === graphEl.getAttribute('data-request-id'))[0];
94988
95033
 
94989
95034
  if (phrase) {
@@ -95250,8 +95295,6 @@ code.hljs {
95250
95295
  <head>
95251
95296
  <meta charset="UTF-8">
95252
95297
  <title>Alan Text Chat History</title>
95253
- <link href="${LIBS_PREFIX}/main.css?v=1" rel="stylesheet" />
95254
- <link href="${LIBS_PREFIX}/highlight.light.css" rel="stylesheet" />
95255
95298
  <script src="${LIBS_PREFIX}/d3.v7.min.js" type="text/javascript"><\/script>
95256
95299
  <script src="${LIBS_PREFIX}/viz-standalone.js" type="text/javascript"><\/script>
95257
95300
  <script src="${LIBS_PREFIX}/svg-pan-zoom.min.js" type="text/javascript"><\/script>
@@ -95473,7 +95516,7 @@ code.hljs {
95473
95516
 
95474
95517
  if(clickedEl.classList.contains('load-iframe-source')) {
95475
95518
  const iframe = clickedEl.previousElementSibling;
95476
- const iframeHtml = iframe.getAttribute('srcdoc');
95519
+ const iframeHtml = iframe.getAttribute('srcdoc').slice(4, -4);;
95477
95520
  let blob = new Blob([iframeHtml], { type: "text/html" });
95478
95521
 
95479
95522
  let now = new Date();
@@ -95646,7 +95689,76 @@ code.hljs {
95646
95689
  console.error(`Failed to inline script from ${src}:`, error);
95647
95690
  }
95648
95691
  }
95649
- 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
+ };
95650
95762
  }
95651
95763
 
95652
95764
  // alan_btn/src/textChat/helpers/chat.ts
@@ -95823,7 +95935,7 @@ code.hljs {
95823
95935
 
95824
95936
  // alan_btn/alan_btn.ts
95825
95937
  (function(ns) {
95826
- uiState.lib.version = "alan-version.1.8.89".replace("alan-version.", "");
95938
+ uiState.lib.version = "alan-version.1.8.90".replace("alan-version.", "");
95827
95939
  if (window.alanBtn) {
95828
95940
  console.warn("Alan: the Alan Button source code has already added (v." + uiState.lib.version + ")");
95829
95941
  }
@@ -98179,13 +98291,15 @@ ${LEARN_MORE_LABEL}
98179
98291
  enableTextareaInTheChat();
98180
98292
  }
98181
98293
  }, false);
98182
- window.addEventListener("click", (e) => {
98294
+ window.addEventListener("click", (0, import_lodash2.debounce)((e) => {
98295
+ if (isTutorMode())
98296
+ return;
98183
98297
  var clickedEl = e.target;
98184
98298
  processClickByButtonInChat(clickedEl, btnInstance, (text) => {
98185
98299
  textChatScrollPosition = null;
98186
98300
  _sendText(text);
98187
98301
  });
98188
- });
98302
+ }, 300));
98189
98303
  function getMsgBubbleLabel(msg) {
98190
98304
  if (msg.type === "request" || msg.type === "response") {
98191
98305
  const isResponse = msg.type === "response";
@@ -98364,6 +98478,7 @@ ${LEARN_MORE_LABEL}
98364
98478
  innerEl.insertAdjacentHTML("beforeend", buildLinksContent(updatedMsg));
98365
98479
  innerEl.insertAdjacentHTML("beforeend", buildCommandsBlock(msg, uiState?.textChat?.options));
98366
98480
  innerEl.insertAdjacentHTML("beforeend", buildMsgIncommingLoader(updatedMsg));
98481
+ innerEl.insertAdjacentHTML("beforeend", addGraphIcon(updatedMsg));
98367
98482
  const newSuggestions = msg?.suggestions;
98368
98483
  if (newSuggestions?.length > 0) {
98369
98484
  if (innerEl.nextElementSibling?.classList.contains("alan-btn__chat-suggestions")) {
@@ -98992,8 +99107,19 @@ ${LEARN_MORE_LABEL}
98992
99107
  rightHeaderIconsHolder.appendChild(saveChatStateBtnImg);
98993
99108
  rightHeaderIconsHolder.appendChild(expandCollapseChatBtnImg);
98994
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");
98995
99121
  const customHeadContent = `
98996
- ${document.head.innerHTML}
99122
+ ${combinedStylesHTML}
98997
99123
  `;
98998
99124
  const initChat = document.querySelector("#chatMessagesWrapper");
98999
99125
  if (!initChat)
@@ -99010,7 +99136,7 @@ ${LEARN_MORE_LABEL}
99010
99136
  chatName: title,
99011
99137
  chatEl: initChat,
99012
99138
  width: chatWidth2,
99013
- projectId: getProjectId(),
99139
+ projectId,
99014
99140
  environment: getEnvironment(),
99015
99141
  requestIds: textChatMessages?.length > 0 ? textChatMessages.filter((m) => m.type === "response" /* Response */).map((m) => getMsgReqId(m)) : [],
99016
99142
  headContent: customHeadContent