react-instantsearch 7.49.0 → 7.50.0

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.
@@ -1,4 +1,4 @@
1
- /*! React InstantSearch 7.49.0 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
1
+ /*! React InstantSearch 7.50.0 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
2
2
  (function (global, factory) {
3
3
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
4
4
  typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
@@ -24,7 +24,7 @@
24
24
 
25
25
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
26
26
 
27
- var version$2 = '7.49.0';
27
+ var version$2 = '7.50.0';
28
28
 
29
29
  function _define_property(obj, key, value) {
30
30
  if (key in obj) {
@@ -5980,7 +5980,7 @@
5980
5980
  }
5981
5981
  }
5982
5982
 
5983
- var withUsage$x = createDocumentationMessageGenerator({
5983
+ var withUsage$y = createDocumentationMessageGenerator({
5984
5984
  name: 'configure',
5985
5985
  connector: true
5986
5986
  });
@@ -5996,7 +5996,7 @@
5996
5996
  var renderFn = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : noop, unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
5997
5997
  return function(widgetParams) {
5998
5998
  if (!widgetParams || !isPlainObject(widgetParams.searchParameters)) {
5999
- throw new Error(withUsage$x('The `searchParameters` option expects an object.'));
5999
+ throw new Error(withUsage$y('The `searchParameters` option expects an object.'));
6000
6000
  }
6001
6001
  var connectorState = {};
6002
6002
  function refine(helper) {
@@ -7808,13 +7808,13 @@
7808
7808
  return null;
7809
7809
  }
7810
7810
 
7811
- var withUsage$w = createDocumentationMessageGenerator({
7811
+ var withUsage$x = createDocumentationMessageGenerator({
7812
7812
  name: 'dynamic-widgets',
7813
7813
  connector: true
7814
7814
  });
7815
7815
  var connectDynamicWidgets = function connectDynamicWidgets(renderFn) {
7816
7816
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
7817
- checkRendering(renderFn, withUsage$w());
7817
+ checkRendering(renderFn, withUsage$x());
7818
7818
  return function(widgetParams) {
7819
7819
  var widgets = widgetParams.widgets, _widgetParams_maxValuesPerFacet = widgetParams.maxValuesPerFacet, maxValuesPerFacet = _widgetParams_maxValuesPerFacet === void 0 ? 20 : _widgetParams_maxValuesPerFacet, _widgetParams_facets = widgetParams.facets, facets = _widgetParams_facets === void 0 ? [
7820
7820
  '*'
@@ -7824,10 +7824,10 @@
7824
7824
  if (!(widgets && Array.isArray(widgets) && widgets.every(function(widget) {
7825
7825
  return (typeof widget === "undefined" ? "undefined" : _type_of(widget)) === 'object';
7826
7826
  }))) {
7827
- throw new Error(withUsage$w('The `widgets` option expects an array of widgets.'));
7827
+ throw new Error(withUsage$x('The `widgets` option expects an array of widgets.'));
7828
7828
  }
7829
7829
  if (!Array.isArray(facets)) {
7830
- throw new Error(withUsage$w("The `facets` option only accepts an array of facets, you passed ".concat(JSON.stringify(facets))));
7830
+ throw new Error(withUsage$x("The `facets` option only accepts an array of facets, you passed ".concat(JSON.stringify(facets))));
7831
7831
  }
7832
7832
  var localWidgets = new Map();
7833
7833
  return {
@@ -7929,7 +7929,7 @@
7929
7929
  results: results
7930
7930
  });
7931
7931
  if (!Array.isArray(attributesToRender)) {
7932
- throw new Error(withUsage$w('The `transformItems` option expects a function that returns an Array.'));
7932
+ throw new Error(withUsage$x('The `transformItems` option expects a function that returns an Array.'));
7933
7933
  }
7934
7934
  return {
7935
7935
  attributesToRender: attributesToRender,
@@ -8319,19 +8319,19 @@
8319
8319
  return toFeedSearchResults(lastResults._state, raw);
8320
8320
  });
8321
8321
  }
8322
- var withUsage$v = createDocumentationMessageGenerator({
8322
+ var withUsage$w = createDocumentationMessageGenerator({
8323
8323
  name: 'feeds',
8324
8324
  connector: true
8325
8325
  });
8326
8326
  var connectFeeds = function connectFeeds(renderFn) {
8327
8327
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
8328
- checkRendering(renderFn, withUsage$v());
8328
+ checkRendering(renderFn, withUsage$w());
8329
8329
  return function(widgetParams) {
8330
8330
  var isolated = widgetParams.isolated, _widgetParams_transformFeeds = widgetParams.transformFeeds, transformFeeds = _widgetParams_transformFeeds === void 0 ? function(feeds) {
8331
8331
  return feeds;
8332
8332
  } : _widgetParams_transformFeeds;
8333
8333
  if (isolated !== false) {
8334
- throw new Error(withUsage$v('The `isolated` option currently only supports `false`.'));
8334
+ throw new Error(withUsage$w('The `isolated` option currently only supports `false`.'));
8335
8335
  }
8336
8336
  return {
8337
8337
  $$type: 'ais.feeds',
@@ -8339,7 +8339,7 @@
8339
8339
  init: function init(initOptions) {
8340
8340
  var instantSearchInstance = initOptions.instantSearchInstance;
8341
8341
  if (!instantSearchInstance.compositionID) {
8342
- throw new Error(withUsage$v('The `feeds` widget requires a composition-based InstantSearch instance (compositionID must be set).'));
8342
+ throw new Error(withUsage$w('The `feeds` widget requires a composition-based InstantSearch instance (compositionID must be set).'));
8343
8343
  }
8344
8344
  hydrateFeedsFromInitialResultsIfNeeded(instantSearchInstance, initOptions.parent);
8345
8345
  renderFn(_object_spread_props(_object_spread({}, this.getWidgetRenderState(initOptions)), {
@@ -8385,12 +8385,12 @@
8385
8385
  ];
8386
8386
  feedIDs = transformFeeds(feedIDs);
8387
8387
  if (!Array.isArray(feedIDs)) {
8388
- throw new Error(withUsage$v('The `transformFeeds` option expects a function that returns an Array.'));
8388
+ throw new Error(withUsage$w('The `transformFeeds` option expects a function that returns an Array.'));
8389
8389
  }
8390
8390
  if (!feedIDs.every(function(feedID) {
8391
8391
  return typeof feedID === 'string';
8392
8392
  })) {
8393
- throw new Error(withUsage$v('The `transformFeeds` option expects a function that returns an array of feed IDs (strings).'));
8393
+ throw new Error(withUsage$w('The `transformFeeds` option expects a function that returns an array of feed IDs (strings).'));
8394
8394
  }
8395
8395
  return {
8396
8396
  feedIDs: feedIDs,
@@ -8501,7 +8501,7 @@
8501
8501
  }));
8502
8502
  }
8503
8503
 
8504
- var withUsage$u = createDocumentationMessageGenerator({
8504
+ var withUsage$v = createDocumentationMessageGenerator({
8505
8505
  name: 'index-widget'
8506
8506
  });
8507
8507
  /**
@@ -8629,7 +8629,7 @@
8629
8629
  var index = function index(widgetParams) {
8630
8630
  var _widgetParams_EXPERIMENTAL_isolated;
8631
8631
  if (widgetParams === undefined || widgetParams.indexName === undefined && !widgetParams.isolated && !widgetParams.EXPERIMENTAL_isolated) {
8632
- throw new Error(withUsage$u('The `indexName` option is required.'));
8632
+ throw new Error(withUsage$v('The `indexName` option is required.'));
8633
8633
  }
8634
8634
  // When isolated=true, we use an empty string as the default indexName.
8635
8635
  // This is intentional: isolated indices do not require a real index name.
@@ -8727,7 +8727,7 @@
8727
8727
  addWidgets: function addWidgets(widgets) {
8728
8728
  var _this = this;
8729
8729
  if (!Array.isArray(widgets)) {
8730
- throw new Error(withUsage$u('The `addWidgets` method expects an array of widgets.'));
8730
+ throw new Error(withUsage$v('The `addWidgets` method expects an array of widgets.'));
8731
8731
  }
8732
8732
  var flatWidgets = widgets.reduce(function(acc, w) {
8733
8733
  return acc.concat(Array.isArray(w) ? w : [
@@ -8737,7 +8737,7 @@
8737
8737
  if (flatWidgets.some(function(widget) {
8738
8738
  return typeof widget.init !== 'function' && typeof widget.render !== 'function';
8739
8739
  })) {
8740
- throw new Error(withUsage$u('The widget definition expects a `render` and/or an `init` method.'));
8740
+ throw new Error(withUsage$v('The widget definition expects a `render` and/or an `init` method.'));
8741
8741
  }
8742
8742
  flatWidgets.forEach(function(widget) {
8743
8743
  widget.parent = _this;
@@ -8787,10 +8787,10 @@
8787
8787
  },
8788
8788
  updateWidget: function updateWidget(previousWidget, nextWidget) {
8789
8789
  if (typeof previousWidget.dispose !== 'function') {
8790
- throw new Error(withUsage$u('The widget definition expects a `dispose` method.'));
8790
+ throw new Error(withUsage$v('The widget definition expects a `dispose` method.'));
8791
8791
  }
8792
8792
  if (typeof nextWidget.init !== 'function' && typeof nextWidget.render !== 'function') {
8793
- throw new Error(withUsage$u('The widget definition expects a `render` and/or an `init` method.'));
8793
+ throw new Error(withUsage$v('The widget definition expects a `render` and/or an `init` method.'));
8794
8794
  }
8795
8795
  // The `uiState` as it is before the previous widget is detached, so that
8796
8796
  // the state it owns can be handed over to the next widget.
@@ -8874,7 +8874,7 @@
8874
8874
  removeWidgets: function removeWidgets(widgets) {
8875
8875
  var _this = this;
8876
8876
  if (!Array.isArray(widgets)) {
8877
- throw new Error(withUsage$u('The `removeWidgets` method expects an array of widgets.'));
8877
+ throw new Error(withUsage$v('The `removeWidgets` method expects an array of widgets.'));
8878
8878
  }
8879
8879
  var flatWidgets = widgets.reduce(function(acc, w) {
8880
8880
  return acc.concat(Array.isArray(w) ? w : [
@@ -8884,7 +8884,7 @@
8884
8884
  if (flatWidgets.some(function(widget) {
8885
8885
  return typeof widget.dispose !== 'function';
8886
8886
  })) {
8887
- throw new Error(withUsage$u('The widget definition expects a `dispose` method.'));
8887
+ throw new Error(withUsage$v('The widget definition expects a `dispose` method.'));
8888
8888
  }
8889
8889
  localWidgets = localWidgets.filter(function(widget) {
8890
8890
  return flatWidgets.indexOf(widget) === -1;
@@ -9392,7 +9392,7 @@
9392
9392
  });
9393
9393
  }
9394
9394
 
9395
- var version = '4.116.0';
9395
+ var version = '4.118.0';
9396
9396
 
9397
9397
  var ANONYMOUS_TOKEN_COOKIE_KEY = '_ALGOLIA';
9398
9398
  function getCookie(name) {
@@ -11254,7 +11254,7 @@
11254
11254
  };
11255
11255
  }
11256
11256
 
11257
- var withUsage$t = createDocumentationMessageGenerator({
11257
+ var withUsage$u = createDocumentationMessageGenerator({
11258
11258
  name: 'instantsearch'
11259
11259
  });
11260
11260
  function defaultCreateURL() {
@@ -11325,7 +11325,7 @@
11325
11325
  _this.setMaxListeners(100);
11326
11326
  var _options_indexName = options.indexName, indexName = _options_indexName === void 0 ? '' : _options_indexName, compositionID = options.compositionID, numberLocale = options.numberLocale, _options_initialUiState = options.initialUiState, initialUiState = _options_initialUiState === void 0 ? {} : _options_initialUiState, _options_routing = options.routing, routing = _options_routing === void 0 ? null : _options_routing, _options_insights = options.insights, insights = _options_insights === void 0 ? undefined : _options_insights, searchFunction = options.searchFunction, _options_stalledSearchDelay = options.stalledSearchDelay, stalledSearchDelay = _options_stalledSearchDelay === void 0 ? 200 : _options_stalledSearchDelay, _options_searchClient = options.searchClient, searchClient = _options_searchClient === void 0 ? null : _options_searchClient, _options_insightsClient = options.insightsClient, insightsClient = _options_insightsClient === void 0 ? null : _options_insightsClient, _options_onStateChange = options.onStateChange, onStateChange = _options_onStateChange === void 0 ? null : _options_onStateChange, _options_future1 = options.future, future = _options_future1 === void 0 ? _object_spread({}, INSTANTSEARCH_FUTURE_DEFAULTS, options.future || {}) : _options_future1;
11327
11327
  if (searchClient === null) {
11328
- throw new Error(withUsage$t('The `searchClient` option is required.'));
11328
+ throw new Error(withUsage$u('The `searchClient` option is required.'));
11329
11329
  }
11330
11330
  if (typeof searchClient.search !== 'function') {
11331
11331
  throw new Error("The `searchClient` must implement a `search` method.\n\nSee: https://www.algolia.com/doc/guides/building-search-ui/going-further/backend-search/in-depth/backend-instantsearch/js/");
@@ -11334,7 +11334,7 @@
11334
11334
  searchClient.addAlgoliaAgent("instantsearch.js (".concat(version, ")"));
11335
11335
  }
11336
11336
  if (insightsClient && typeof insightsClient !== 'function') {
11337
- throw new Error(withUsage$t('The `insightsClient` option should be a function.'));
11337
+ throw new Error(withUsage$u('The `insightsClient` option should be a function.'));
11338
11338
  }
11339
11339
  _this._initialOptions = options;
11340
11340
  _this.client = searchClient;
@@ -11483,12 +11483,12 @@
11483
11483
  * @param widgets The array of widgets to add to InstantSearch.
11484
11484
  */ function addWidgets(widgets) {
11485
11485
  if (!Array.isArray(widgets)) {
11486
- throw new Error(withUsage$t('The `addWidgets` method expects an array of widgets. Please use `addWidget`.'));
11486
+ throw new Error(withUsage$u('The `addWidgets` method expects an array of widgets. Please use `addWidget`.'));
11487
11487
  }
11488
11488
  if (this.compositionID && widgets.some(function(w) {
11489
11489
  return !Array.isArray(w) && isIndexWidget(w) && !w._isolated;
11490
11490
  })) {
11491
- throw new Error(withUsage$t('The `index` widget cannot be used with a composition-based InstantSearch implementation.'));
11491
+ throw new Error(withUsage$u('The `index` widget cannot be used with a composition-based InstantSearch implementation.'));
11492
11492
  }
11493
11493
  this.mainIndex.addWidgets(widgets);
11494
11494
  return this;
@@ -11517,7 +11517,7 @@
11517
11517
  * The widgets must implement a `dispose()` method to clear their states.
11518
11518
  */ function removeWidgets(widgets) {
11519
11519
  if (!Array.isArray(widgets)) {
11520
- throw new Error(withUsage$t('The `removeWidgets` method expects an array of widgets. Please use `removeWidget`.'));
11520
+ throw new Error(withUsage$u('The `removeWidgets` method expects an array of widgets. Please use `removeWidget`.'));
11521
11521
  }
11522
11522
  this.mainIndex.removeWidgets(widgets);
11523
11523
  return this;
@@ -11531,7 +11531,7 @@
11531
11531
  */ function start() {
11532
11532
  var _this = this;
11533
11533
  if (this.started) {
11534
- throw new Error(withUsage$t('The `start` method has already been called once.'));
11534
+ throw new Error(withUsage$u('The `start` method has already been called once.'));
11535
11535
  }
11536
11536
  // This Helper is used for the queries, we don't care about its state. The
11537
11537
  // states are managed at the `index` level. We use this Helper to create
@@ -11739,7 +11739,7 @@
11739
11739
  var _this = this;
11740
11740
  var callOnStateChange = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
11741
11741
  if (!this.mainHelper) {
11742
- throw new Error(withUsage$t('The `start` method needs to be called before `setUiState`.'));
11742
+ throw new Error(withUsage$u('The `start` method needs to be called before `setUiState`.'));
11743
11743
  }
11744
11744
  // We refresh the index UI state to update the local UI state that the
11745
11745
  // main index passes to the function form of `setUiState`.
@@ -11776,7 +11776,7 @@
11776
11776
  value: function createURL() {
11777
11777
  var nextState = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
11778
11778
  if (!this.started) {
11779
- throw new Error(withUsage$t('The `start` method needs to be called before `createURL`.'));
11779
+ throw new Error(withUsage$u('The `start` method needs to be called before `createURL`.'));
11780
11780
  }
11781
11781
  return this._createURL(nextState);
11782
11782
  }
@@ -11785,7 +11785,7 @@
11785
11785
  key: "refresh",
11786
11786
  value: function refresh() {
11787
11787
  if (!this.mainHelper) {
11788
- throw new Error(withUsage$t('The `start` method needs to be called before `refresh`.'));
11788
+ throw new Error(withUsage$u('The `start` method needs to be called before `refresh`.'));
11789
11789
  }
11790
11790
  this.mainHelper.clearCache().search();
11791
11791
  }
@@ -12298,13 +12298,13 @@
12298
12298
  }, children);
12299
12299
  }
12300
12300
 
12301
- var withUsage$s = createDocumentationMessageGenerator({
12301
+ var withUsage$t = createDocumentationMessageGenerator({
12302
12302
  name: 'autocomplete',
12303
12303
  connector: true
12304
12304
  });
12305
12305
  var connectAutocomplete = function connectAutocomplete(renderFn) {
12306
12306
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
12307
- checkRendering(renderFn, withUsage$s());
12307
+ checkRendering(renderFn, withUsage$t());
12308
12308
  return function(widgetParams) {
12309
12309
  var _ref = widgetParams || {}, _ref_escapeHTML = _ref.escapeHTML, escapeHTML = _ref_escapeHTML === void 0 ? true : _ref_escapeHTML, _ref_transformItems = _ref.transformItems, transformItems = _ref_transformItems === void 0 ? function(indices) {
12310
12310
  return indices;
@@ -12417,20 +12417,20 @@
12417
12417
  return useConnector(connectAutocomplete, props, additionalWidgetProperties);
12418
12418
  }
12419
12419
 
12420
- var withUsage$r = createDocumentationMessageGenerator({
12420
+ var withUsage$s = createDocumentationMessageGenerator({
12421
12421
  name: 'breadcrumb',
12422
12422
  connector: true
12423
12423
  });
12424
12424
  var connectBreadcrumb = function connectBreadcrumb(renderFn) {
12425
12425
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
12426
- checkRendering(renderFn, withUsage$r());
12426
+ checkRendering(renderFn, withUsage$s());
12427
12427
  var connectorState = {};
12428
12428
  return function(widgetParams) {
12429
12429
  var _ref = widgetParams || {}, attributes = _ref.attributes, _ref_separator = _ref.separator, separator = _ref_separator === void 0 ? ' > ' : _ref_separator, _ref_rootPath = _ref.rootPath, rootPath = _ref_rootPath === void 0 ? null : _ref_rootPath, _ref_transformItems = _ref.transformItems, transformItems = _ref_transformItems === void 0 ? function(items) {
12430
12430
  return items;
12431
12431
  } : _ref_transformItems;
12432
12432
  if (!attributes || !Array.isArray(attributes) || attributes.length === 0) {
12433
- throw new Error(withUsage$r('The `attributes` option expects an array of strings.'));
12433
+ throw new Error(withUsage$s('The `attributes` option expects an array of strings.'));
12434
12434
  }
12435
12435
  var _attributes = _sliced_to_array(attributes, 1), hierarchicalFacetName = _attributes[0];
12436
12436
  function getRefinedState(state, facetValue) {
@@ -14380,6 +14380,26 @@
14380
14380
  facetFilters: getFacetFilters(query)
14381
14381
  };
14382
14382
  };
14383
+ /**
14384
+ * Whether the agent handed the turn to the Grouped Results tool for this
14385
+ * message, i.e. that tool renders the records and the search tool must not.
14386
+ *
14387
+ * The backend sets exactly one of the two flags, depending on which tool name
14388
+ * the agent was configured with: `groupedResultsEnabled` for
14389
+ * `algolia_grouped_results`, `displayResultsEnabled` for agents still on the
14390
+ * legacy `algolia_display_results`.
14391
+ */ var isGroupedResultsEnabled = function isGroupedResultsEnabled(metadata) {
14392
+ var flags = metadata;
14393
+ return (flags === null || flags === void 0 ? void 0 : flags.groupedResultsEnabled) === true || (flags === null || flags === void 0 ? void 0 : flags.displayResultsEnabled) === true;
14394
+ };
14395
+ /**
14396
+ * `shouldRender` for the search tool: it presents its own records only on turns
14397
+ * the agent did not hand to the Grouped Results tool, which would otherwise
14398
+ * present the same records a second time.
14399
+ */ var shouldSearchToolRenderResults = function shouldSearchToolRenderResults(param) {
14400
+ var parentMessage = param.parentMessage;
14401
+ return !isGroupedResultsEnabled(parentMessage.metadata);
14402
+ };
14383
14403
 
14384
14404
  function n(){return n=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t]);}return e},n.apply(this,arguments)}const t={blockQuote:"0",breakLine:"1",breakThematic:"2",codeBlock:"3",codeFenced:"4",codeInline:"5",footnote:"6",footnoteReference:"7",gfmTask:"8",heading:"9",headingSetext:"10",htmlBlock:"11",htmlComment:"12",htmlSelfClosing:"13",image:"14",link:"15",linkAngleBraceStyleDetector:"16",linkBareUrlDetector:"17",linkMailtoDetector:"18",newlineCoalescer:"19",orderedList:"20",paragraph:"21",ref:"22",refImage:"23",refLink:"24",table:"25",tableSeparator:"26",text:"27",textBolded:"28",textEmphasized:"29",textEscaped:"30",textMarked:"31",textStrikethroughed:"32",unorderedList:"33"},o=["allowFullScreen","allowTransparency","autoComplete","autoFocus","autoPlay","cellPadding","cellSpacing","charSet","classId","colSpan","contentEditable","contextMenu","crossOrigin","encType","formAction","formEncType","formMethod","formNoValidate","formTarget","frameBorder","hrefLang","inputMode","keyParams","keyType","marginHeight","marginWidth","maxLength","mediaGroup","minLength","noValidate","radioGroup","readOnly","rowSpan","spellCheck","srcDoc","srcLang","srcSet","tabIndex","useMap"].reduce((e,n)=>(e[n.toLowerCase()]=n,e),{class:"className",for:"htmlFor"}),a={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:"“"},c=["style","script","pre"],i=["src","href","data","formAction","srcDoc","action"],u=/([-A-Z0-9_:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|(?:\{((?:\\.|{[^}]*?}|[^}])*)\})))?/gi,l=/\n{2,}$/,s=/^(\s*>[\s\S]*?)(?=\n\n|$)/,f=/^ *> ?/gm,_=/^(?:\[!([^\]]*)\]\n)?([\s\S]*)/,d=/^ {2,}\n/,p=/^(?:([-*_])( *\1){2,}) *(?:\n *)+\n/,y=/^(?: {1,3})?(`{3,}|~{3,}) *(\S+)? *([^\n]*?)?\n([\s\S]*?)(?:\1\n?|$)/,h=/^(?: {4}[^\n]+\n*)+(?:\n *)+\n?/,g=/^(`+)((?:\\`|(?!\1)`|[^`])+)\1/,m=/^(?:\n *)*\n/,k=/\r\n?/g,x=/^\[\^([^\]]+)](:(.*)((\n+ {4,}.*)|(\n(?!\[\^).+))*)/,q=/^\[\^([^\]]+)]/,v=/\f/g,b=/^---[ \t]*\n(.|\n)*\n---[ \t]*\n/,$=/^\s*?\[(x|\s)\]/,S=/^ *(#{1,6}) *([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/,z=/^ *(#{1,6}) +([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/,E=/^([^\n]+)\n *(=|-)\2{2,} *\n/,A=/^ *(?!<[a-z][^ >/]* ?\/>)<([a-z][^ >/]*) ?((?:[^>]*[^/])?)>\n?(\s*(?:<\1[^>]*?>[\s\S]*?<\/\1>|(?!<\1\b)[\s\S])*?)<\/\1>(?!<\/\1>)\n*/i,R=/&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/gi,B=/^<!--[\s\S]*?(?:-->)/,L=/^(data|aria|x)-[a-z_][a-z\d_.-]*$/,O=/^ *<([a-z][a-z0-9:]*)(?:\s+((?:<.*?>|[^>])*))?\/?>(?!<\/\1>)(\s*\n)?/i,j=/^\{.*\}$/,C=/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,I=/^<([^ >]+[:@\/][^ >]+)>/,T=/-([a-z])?/gi,M=/^(\|.*)\n(?: *(\|? *[-:]+ *\|[-| :]*)\n((?:.*\|.*\n)*))?\n?/,w=/^[^\n]+(?: \n|\n{2,})/,D=/^\[([^\]]*)\]:\s+<?([^\s>]+)>?\s*("([^"]*)")?/,F=/^!\[([^\]]*)\] ?\[([^\]]*)\]/,P=/^\[([^\]]*)\] ?\[([^\]]*)\]/,Z=/(\n|^[-*]\s|^#|^ {2,}|^-{2,}|^>\s)/,N=/\t/g,G=/(^ *\||\| *$)/g,U=/^ *:-+: *$/,V=/^ *:-+ *$/,H=/^ *-+: *$/,Q=e=>`(?=[\\s\\S]+?\\1${e?"\\1":""})`,W="((?:\\[.*?\\][([].*?[)\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|\\\\\\1|[\\s\\S])+?)",J=RegExp(`^([*_])\\1${Q(1)}${W}\\1\\1(?!\\1)`),K=RegExp(`^([*_])${Q(0)}${W}\\1(?!\\1)`),X=RegExp(`^(==)${Q(0)}${W}\\1`),Y=RegExp(`^(~~)${Q(0)}${W}\\1`),ee=/^(:[a-zA-Z0-9-_]+:)/,ne=/^\\([^0-9A-Za-z\s])/,re=/\\([^0-9A-Za-z\s])/g,te=/^[\s\S](?:(?! \n|[0-9]\.|http)[^=*_~\-\n:<`\\\[!])*/,oe=/^\n+/,ae=/^([ \t]*)/,ce=/(?:^|\n)( *)$/,ie="(?:\\d+\\.)",ue="(?:[*+-])";function le(e){return "( *)("+(1===e?ie:ue)+") +"}const se=le(1),fe=le(2);function _e(e){return RegExp("^"+(1===e?se:fe))}const de=_e(1),pe=_e(2);function ye(e){return RegExp("^"+(1===e?se:fe)+"[^\\n]*(?:\\n(?!\\1"+(1===e?ie:ue)+" )[^\\n]*)*(\\n|$)","gm")}const he=ye(1),ge=ye(2);function me(e){const n=1===e?ie:ue;return RegExp("^( *)("+n+") [\\s\\S]+?(?:\\n{2,}(?! )(?!\\1"+n+" (?!"+n+" ))\\n*|\\s*\\n*$)")}const ke=me(1),xe=me(2);function qe(e,n){const r=1===n,t=r?ke:xe,o=r?he:ge,a=r?de:pe;return {t:e=>a.test(e),o:je(function(e,n){const r=ce.exec(n.prevCapture);return r&&(n.list||!n.inline&&!n.simple)?t.exec(e=r[1]+e):null}),i:1,u(e,n,t){const c=r?+e[2]:void 0,i=e[0].replace(l,"\n").match(o);let u=!1;return {items:i.map(function(e,r){const o=a.exec(e)[0].length,c=RegExp("^ {1,"+o+"}","gm"),l=e.replace(c,"").replace(a,""),s=r===i.length-1,f=-1!==l.indexOf("\n\n")||s&&u;u=f;const _=t.inline,d=t.list;let p;t.list=!0,f?(t.inline=!1,p=Se(l)+"\n\n"):(t.inline=!0,p=Se(l));const y=n(p,t);return t.inline=_,t.list=d,y}),ordered:r,start:c}},l:(n,r,t)=>e(n.ordered?"ol":"ul",{key:t.key,start:"20"===n.type?n.start:void 0},n.items.map(function(n,o){return e("li",{key:o},r(n,t))}))}}const ve=RegExp("^\\[((?:\\[[^\\[\\]]*(?:\\[[^\\[\\]]*\\][^\\[\\]]*)*\\]|[^\\[\\]])*)\\]\\(\\s*<?((?:\\([^)]*\\)|[^\\s\\\\]|\\\\.)*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*\\)"),be=/^!\[(.*?)\]\( *((?:\([^)]*\)|[^() ])*) *"?([^)"]*)?"?\)/;function $e(e){return "string"==typeof e}function Se(e){let n=e.length;for(;n>0&&e[n-1]<=" ";)n--;return e.slice(0,n)}function ze(e,n){return e.startsWith(n)}function Ee(e,n,r){if(Array.isArray(r)){for(let n=0;n<r.length;n++)if(ze(e,r[n]))return !0;return !1}return r(e,n)}function Ae(e){return e.replace(/[ÀÁÂÃÄÅàáâãä忯]/g,"a").replace(/[çÇ]/g,"c").replace(/[ðÐ]/g,"d").replace(/[ÈÉÊËéèêë]/g,"e").replace(/[ÏïÎîÍíÌì]/g,"i").replace(/[Ññ]/g,"n").replace(/[øØœŒÕõÔôÓóÒò]/g,"o").replace(/[ÜüÛûÚúÙù]/g,"u").replace(/[ŸÿÝý]/g,"y").replace(/[^a-z0-9- ]/gi,"").replace(/ /gi,"-").toLowerCase()}function Re(e){return H.test(e)?"right":U.test(e)?"center":V.test(e)?"left":null}function Be(e,n,r,t){const o=r.inTable;r.inTable=!0;let a=[[]],c="";function i(){if(!c)return;const e=a[a.length-1];e.push.apply(e,n(c,r)),c="";}return e.trim().split(/(`[^`]*`|\\\||\|)/).filter(Boolean).forEach((e,n,r)=>{"|"===e.trim()&&(i(),t)?0!==n&&n!==r.length-1&&a.push([]):c+=e;}),i(),r.inTable=o,a}function Le(e,n,r){r.inline=!0;const t=e[2]?e[2].replace(G,"").split("|").map(Re):[],o=e[3]?function(e,n,r){return e.trim().split("\n").map(function(e){return Be(e,n,r,!0)})}(e[3],n,r):[],a=Be(e[1],n,r,!!o.length);return r.inline=!1,o.length?{align:t,cells:o,header:a,type:"25"}:{children:a,type:"21"}}function Oe(e,n){return null==e.align[n]?{}:{textAlign:e.align[n]}}function je(e){return e.inline=1,e}function Ce(e){return je(function(n,r){return r.inline?e.exec(n):null})}function Ie(e){return je(function(n,r){return r.inline||r.simple?e.exec(n):null})}function Te(e){return function(n,r){return r.inline||r.simple?null:e.exec(n)}}function Me(e){return je(function(n){return e.exec(n)})}const we=/(javascript|vbscript|data(?!:image)):/i;function De(e){try{const n=decodeURIComponent(e).replace(/[^A-Za-z0-9/:]/g,"");if(we.test(n))return null}catch(e){return null}return e}function Fe(e){return e?e.replace(re,"$1"):e}function Pe(e,n,r){const t=r.inline||!1,o=r.simple||!1;r.inline=!0,r.simple=!0;const a=e(n,r);return r.inline=t,r.simple=o,a}function Ze(e,n,r){const t=r.inline||!1,o=r.simple||!1;r.inline=!1,r.simple=!0;const a=e(n,r);return r.inline=t,r.simple=o,a}function Ne(e,n,r){const t=r.inline||!1;r.inline=!1;const o=e(n,r);return r.inline=t,o}const Ge=(e,n,r)=>({children:Pe(n,e[2],r)});function Ue(){return {}}function Ve(){return null}function He(...e){return e.filter(Boolean).join(" ")}function Qe(e,n,r){let t=e;const o=n.split(".");for(;o.length&&(t=t[o[0]],void 0!==t);)o.shift();return t||r}function We(r="",t={}){t.overrides=t.overrides||{},t.namedCodesToUnicode=t.namedCodesToUnicode?n({},a,t.namedCodesToUnicode):a;const l=t.slugify||Ae,G=t.sanitizer||De,U=t.createElement||React__namespace.createElement,V=[s,y,h,t.enforceAtxHeadings?z:S,E,M,ke,xe],H=[...V,w,A,B,O];function Q(e,n){for(let r=0;r<e.length;r++)if(e[r].test(n))return !0;return !1}function W(e,r,...o){const a=Qe(t.overrides,e+".props",{});return U(function(e,n){const r=Qe(n,e);return r?"function"==typeof r||"object"==typeof r&&"render"in r?r:Qe(n,e+".component",e):e}(e,t.overrides),n({},r,a,{className:He(null==r?void 0:r.className,a.className)||void 0}),...o)}function re(e){e=e.replace(b,"");let n=!1;t.forceInline?n=!0:t.forceBlock||(n=!1===Z.test(e));const r=fe(se(n?e:Se(e).replace(oe,"")+"\n\n",{inline:n}));for(;$e(r[r.length-1])&&!r[r.length-1].trim();)r.pop();if(null===t.wrapper)return r;const o=t.wrapper||(n?"span":"div");let a;if(r.length>1||t.forceWrapper)a=r;else {if(1===r.length)return a=r[0],"string"==typeof a?W("span",{key:"outer"},a):a;a=null;}return U(o,{key:"outer"},a)}function ce(e,n){if(!n||!n.trim())return null;const r=n.match(u);return r?r.reduce(function(n,r){const t=r.indexOf("=");if(-1!==t){const a=function(e){return -1!==e.indexOf("-")&&null===e.match(L)&&(e=e.replace(T,function(e,n){return n.toUpperCase()})),e}(r.slice(0,t)).trim(),c=function(e){const n=e[0];return ('"'===n||"'"===n)&&e.length>=2&&e[e.length-1]===n?e.slice(1,-1):e}(r.slice(t+1).trim()),u=o[a]||a;if("ref"===u)return n;const l=n[u]=function(e,n,r,t){return "style"===n?function(e){const n=[];let r="",t=!1,o=!1,a="";if(!e)return n;for(let c=0;c<e.length;c++){const i=e[c];if('"'!==i&&"'"!==i||t||(o?i===a&&(o=!1,a=""):(o=!0,a=i)),"("===i&&r.endsWith("url")?t=!0:")"===i&&t&&(t=!1),";"!==i||o||t)r+=i;else {const e=r.trim();if(e){const r=e.indexOf(":");if(r>0){const t=e.slice(0,r).trim(),o=e.slice(r+1).trim();n.push([t,o]);}}r="";}}const c=r.trim();if(c){const e=c.indexOf(":");if(e>0){const r=c.slice(0,e).trim(),t=c.slice(e+1).trim();n.push([r,t]);}}return n}(r).reduce(function(n,[r,o]){return n[r.replace(/(-[a-z])/g,e=>e[1].toUpperCase())]=t(o,e,r),n},{}):-1!==i.indexOf(n)?t(Fe(r),e,n):(r.match(j)&&(r=Fe(r.slice(1,r.length-1))),"true"===r||"false"!==r&&r)}(e,a,c,G);"string"==typeof l&&(A.test(l)||O.test(l))&&(n[u]=re(l.trim()));}else "style"!==r&&(n[o[r]||r]=!0);return n},{}):null}const ie=[],ue={},le={0:{t:[">"],o:Te(s),i:1,u(e,n,r){const[,t,o]=e[0].replace(f,"").match(_);return {alert:t,children:n(o,r)}},l(e,n,r){const t={key:r.key};return e.alert&&(t.className="markdown-alert-"+l(e.alert.toLowerCase(),Ae),e.children.unshift({attrs:{},children:[{type:"27",text:e.alert}],noInnerParse:!0,type:"11",tag:"header"})),W("blockquote",t,n(e.children,r))}},1:{t:[" "],o:Me(d),i:1,u:Ue,l:(e,n,r)=>W("br",{key:r.key})},2:{t:["--","__","**","- ","* ","_ "],o:Te(p),i:1,u:Ue,l:(e,n,r)=>W("hr",{key:r.key})},3:{t:[" "],o:Te(h),i:0,u:e=>({lang:void 0,text:Fe(Se(e[0].replace(/^ {4}/gm,"")))}),l:(e,r,t)=>W("pre",{key:t.key},W("code",n({},e.attrs,{className:e.lang?"lang-"+e.lang:""}),e.text))},4:{t:["```","~~~"],o:Te(y),i:0,u:e=>({attrs:ce("code",e[3]||""),lang:e[2]||void 0,text:e[4],type:"3"})},5:{t:["`"],o:Ie(g),i:3,u:e=>({text:Fe(e[2])}),l:(e,n,r)=>W("code",{key:r.key},e.text)},6:{t:["[^"],o:Te(x),i:0,u:e=>(ie.push({footnote:e[2],identifier:e[1]}),{}),l:Ve},7:{t:["[^"],o:Ce(q),i:1,u:e=>({target:"#"+l(e[1],Ae),text:e[1]}),l:(e,n,r)=>W("a",{key:r.key,href:G(e.target,"a","href")},W("sup",{key:r.key},e.text))},8:{t:["[ ]","[x]"],o:Ce($),i:1,u:e=>({completed:"x"===e[1].toLowerCase()}),l:(e,n,r)=>W("input",{checked:e.completed,key:r.key,readOnly:!0,type:"checkbox"})},9:{t:["#"],o:Te(t.enforceAtxHeadings?z:S),i:1,u:(e,n,r)=>({children:Pe(n,e[2],r),id:l(e[2],Ae),level:e[1].length}),l:(e,n,r)=>W("h"+e.level,{id:e.id,key:r.key},n(e.children,r))},10:{t:e=>{const n=e.indexOf("\n");return n>0&&n<e.length-1&&("="===e[n+1]||"-"===e[n+1])},o:Te(E),i:0,u:(e,n,r)=>({children:Pe(n,e[1],r),level:"="===e[2]?1:2,type:"9"})},11:{t:["<"],o:Me(A),i:1,u(e,n,r){const[,t]=e[3].match(ae),o=RegExp("^"+t,"gm"),a=e[3].replace(o,""),i=Q(H,a)?Ne:Pe,u=e[1].toLowerCase(),l=-1!==c.indexOf(u),s=(l?u:e[1]).trim(),f={attrs:ce(s,e[2]),noInnerParse:l,tag:s};if(r.inAnchor=r.inAnchor||"a"===u,l)f.text=e[3];else {const e=r.inHTML;r.inHTML=!0,f.children=i(n,a,r),r.inHTML=e;}return r.inAnchor=!1,f},l:(e,r,t)=>W(e.tag,n({key:t.key},e.attrs),e.text||(e.children?r(e.children,t):""))},13:{t:["<"],o:Me(O),i:1,u(e){const n=e[1].trim();return {attrs:ce(n,e[2]||""),tag:n}},l:(e,r,t)=>W(e.tag,n({},e.attrs,{key:t.key}))},12:{t:["\x3c!--"],o:Me(B),i:1,u:()=>({}),l:Ve},14:{t:["!["],o:Ie(be),i:1,u:e=>({alt:Fe(e[1]),target:Fe(e[2]),title:Fe(e[3])}),l:(e,n,r)=>W("img",{key:r.key,alt:e.alt||void 0,title:e.title||void 0,src:G(e.target,"img","src")})},15:{t:["["],o:Ce(ve),i:3,u:(e,n,r)=>({children:Ze(n,e[1],r),target:Fe(e[2]),title:Fe(e[3])}),l:(e,n,r)=>W("a",{key:r.key,href:G(e.target,"a","href"),title:e.title},n(e.children,r))},16:{t:["<"],o:Ce(I),i:0,u(e){let n=e[1],r=!1;return -1!==n.indexOf("@")&&-1===n.indexOf("//")&&(r=!0,n=n.replace("mailto:","")),{children:[{text:n,type:"27"}],target:r?"mailto:"+n:n,type:"15"}}},17:{t:(e,n)=>!n.inAnchor&&!t.disableAutoLink&&(ze(e,"http://")||ze(e,"https://")),o:Ce(C),i:0,u:e=>({children:[{text:e[1],type:"27"}],target:e[1],title:void 0,type:"15"})},20:qe(W,1),33:qe(W,2),19:{t:["\n"],o:Te(m),i:3,u:Ue,l:()=>"\n"},21:{o:je(function(e,n){if(n.inline||n.simple||n.inHTML&&-1===e.indexOf("\n\n")&&-1===n.prevCapture.indexOf("\n\n"))return null;let r="",t=0;for(;;){const n=e.indexOf("\n",t),o=e.slice(t,-1===n?void 0:n+1);if(Q(V,o))break;if(r+=o,-1===n||!o.trim())break;t=n+1;}const o=Se(r);return ""===o?null:[r,,o]}),i:3,u:Ge,l:(e,n,r)=>W("p",{key:r.key},n(e.children,r))},22:{t:["["],o:Ce(D),i:0,u:e=>(ue[e[1]]={target:e[2],title:e[4]},{}),l:Ve},23:{t:["!["],o:Ie(F),i:0,u:e=>({alt:e[1]?Fe(e[1]):void 0,ref:e[2]}),l:(e,n,r)=>ue[e.ref]?W("img",{key:r.key,alt:e.alt,src:G(ue[e.ref].target,"img","src"),title:ue[e.ref].title}):null},24:{t:e=>"["===e[0]&&-1===e.indexOf("]("),o:Ce(P),i:0,u:(e,n,r)=>({children:n(e[1],r),fallbackChildren:e[0],ref:e[2]}),l:(e,n,r)=>ue[e.ref]?W("a",{key:r.key,href:G(ue[e.ref].target,"a","href"),title:ue[e.ref].title},n(e.children,r)):W("span",{key:r.key},e.fallbackChildren)},25:{t:["|"],o:Te(M),i:1,u:Le,l(e,n,r){const t=e;return W("table",{key:r.key},W("thead",null,W("tr",null,t.header.map(function(e,o){return W("th",{key:o,style:Oe(t,o)},n(e,r))}))),W("tbody",null,t.cells.map(function(e,o){return W("tr",{key:o},e.map(function(e,o){return W("td",{key:o,style:Oe(t,o)},n(e,r))}))})))}},27:{o:je(function(e,n){let r;return ze(e,":")&&(r=ee.exec(e)),r||te.exec(e)}),i:4,u(e){const n=e[0];return {text:-1===n.indexOf("&")?n:n.replace(R,(e,n)=>t.namedCodesToUnicode[n]||e)}},l:e=>e.text},28:{t:["**","__"],o:Ie(J),i:2,u:(e,n,r)=>({children:n(e[2],r)}),l:(e,n,r)=>W("strong",{key:r.key},n(e.children,r))},29:{t:e=>{const n=e[0];return ("*"===n||"_"===n)&&e[1]!==n},o:Ie(K),i:3,u:(e,n,r)=>({children:n(e[2],r)}),l:(e,n,r)=>W("em",{key:r.key},n(e.children,r))},30:{t:["\\"],o:Ie(ne),i:1,u:e=>({text:e[1],type:"27"})},31:{t:["=="],o:Ie(X),i:3,u:Ge,l:(e,n,r)=>W("mark",{key:r.key},n(e.children,r))},32:{t:["~~"],o:Ie(Y),i:3,u:Ge,l:(e,n,r)=>W("del",{key:r.key},n(e.children,r))}};!0===t.disableParsingRawHTML&&(delete le[11],delete le[13]);const se=function(e){var n=Object.keys(e);function r(t,o){var a=[];if(o.prevCapture=o.prevCapture||"",t.trim())for(;t;)for(var c=0;c<n.length;){var i=n[c],u=e[i];if(!u.t||Ee(t,o,u.t)){var l=u.o(t,o);if(l&&l[0]){t=t.substring(l[0].length);var s=u.u(l,r,o);o.prevCapture+=l[0],s.type||(s.type=i),a.push(s);break}c++;}else c++;}return o.prevCapture="",a}return n.sort(function(n,r){return e[n].i-e[r].i||(n<r?-1:1)}),function(e,n){return r(function(e){return e.replace(k,"\n").replace(v,"").replace(N," ")}(e),n)}}(le),fe=function(e,n){return function r(t,o={}){if(Array.isArray(t)){const e=o.key,n=[];let a=!1;for(let e=0;e<t.length;e++){o.key=e;const c=r(t[e],o),i=$e(c);i&&a?n[n.length-1]+=c:null!==c&&n.push(c),a=i;}return o.key=e,n}return function(r,t,o){const a=e[r.type].l;return n?n(()=>a(r,t,o),r,t,o):a(r,t,o)}(t,r,o)}}(le,t.renderRule),_e=re(r);return ie.length?W("div",null,_e,W("footer",{key:"footer"},ie.map(function(e){return W("div",{id:l(e.identifier,Ae),key:e.identifier},e.identifier,fe(se(e.footnote,{inline:!0})))}))):_e}
14385
14405
 
@@ -15317,7 +15337,7 @@
15317
15337
  return Promise.resolve();
15318
15338
  } : _userProps_regenerate, _userProps_stop = userProps.stop, stop = _userProps_stop === void 0 ? function() {
15319
15339
  return Promise.resolve();
15320
- } : _userProps_stop, _userProps_open = userProps.open, open = _userProps_open === void 0 ? false : _userProps_open, _userProps_maximized = userProps.maximized, maximized = _userProps_maximized === void 0 ? false : _userProps_maximized, setInput = userProps.setInput, userTranslations = userProps.translations, userMessageProps = userProps.userMessageProps, assistantMessageProps = userProps.assistantMessageProps, _userProps_isClearing = userProps.isClearing, isClearing = _userProps_isClearing === void 0 ? false : _userProps_isClearing, onClearTransitionEnd = userProps.onClearTransitionEnd, isScrollAtBottom = userProps.isScrollAtBottom, scrollRef = userProps.scrollRef, contentRef = userProps.contentRef, onScrollToBottom = userProps.onScrollToBottom, suggestionsElement = userProps.suggestionsElement, _userProps_suggestionsLoading = userProps.suggestionsLoading, suggestionsLoading = _userProps_suggestionsLoading === void 0 ? false : _userProps_suggestionsLoading, onFeedback = userProps.onFeedback, feedbackState = userProps.feedbackState, props = _object_without_properties(userProps, [
15340
+ } : _userProps_stop, _userProps_open = userProps.open, open = _userProps_open === void 0 ? false : _userProps_open, _userProps_maximized = userProps.maximized, maximized = _userProps_maximized === void 0 ? false : _userProps_maximized, setInput = userProps.setInput, userTranslations = userProps.translations, userMessageProps = userProps.userMessageProps, assistantMessageProps = userProps.assistantMessageProps, _userProps_isClearing = userProps.isClearing, isClearing = _userProps_isClearing === void 0 ? false : _userProps_isClearing, onClearTransitionEnd = userProps.onClearTransitionEnd, isScrollAtBottom = userProps.isScrollAtBottom, scrollRef = userProps.scrollRef, contentRef = userProps.contentRef, onScrollToBottom = userProps.onScrollToBottom, suggestionsElement = userProps.suggestionsElement, onFeedback = userProps.onFeedback, feedbackState = userProps.feedbackState, props = _object_without_properties(userProps, [
15321
15341
  "classNames",
15322
15342
  "messageClassNames",
15323
15343
  "messageTranslations",
@@ -15356,7 +15376,6 @@
15356
15376
  "contentRef",
15357
15377
  "onScrollToBottom",
15358
15378
  "suggestionsElement",
15359
- "suggestionsLoading",
15360
15379
  "onFeedback",
15361
15380
  "feedbackState"
15362
15381
  ]);
@@ -15446,9 +15465,6 @@
15446
15465
  loaderText: loaderText
15447
15466
  }
15448
15467
  }) : undefined;
15449
- // Waits for the answer's text and for the loader to step aside, so two
15450
- // progress affordances never stack up.
15451
- var showPendingSuggestions = suggestionsLoading && !showLoader && lastMessage !== undefined && hasTextContent(lastMessage);
15452
15468
  return /*#__PURE__*/ createElement("div", _object_spread_props(_object_spread({}, props), {
15453
15469
  className: cx(cssClasses.root, props.className),
15454
15470
  role: "log",
@@ -15492,7 +15508,7 @@
15492
15508
  classNames: messageClassNames,
15493
15509
  messageTranslations: messageTranslations,
15494
15510
  context: context,
15495
- suggestionsElement: (status === 'ready' || showPendingSuggestions) && message.role === 'assistant' && index === messages.length - 1 ? suggestionsElement : undefined,
15511
+ suggestionsElement: status === 'ready' && message.role === 'assistant' && index === messages.length - 1 ? suggestionsElement : undefined,
15496
15512
  loaderElement: isLoaderInline && index === messages.length - 1 ? loaderElement : undefined
15497
15513
  });
15498
15514
  }), !isLoaderInline && loaderElement, status === 'error' && /*#__PURE__*/ createElement(DefaultError, {
@@ -15800,31 +15816,23 @@
15800
15816
  createElement: createElement
15801
15817
  });
15802
15818
  return function ChatPromptSuggestions(userProps) {
15803
- var _userProps_suggestions = userProps.suggestions, suggestions = _userProps_suggestions === void 0 ? [] : _userProps_suggestions, onSuggestionClick = userProps.onSuggestionClick, _userProps_isLoading = userProps.isLoading, isLoading = _userProps_isLoading === void 0 ? false : _userProps_isLoading, _userProps_skeletonCount = userProps.skeletonCount, skeletonCount = _userProps_skeletonCount === void 0 ? 3 : _userProps_skeletonCount, _userProps_classNames = userProps.classNames, classNames = _userProps_classNames === void 0 ? {} : _userProps_classNames;
15819
+ var _userProps_suggestions = userProps.suggestions, suggestions = _userProps_suggestions === void 0 ? [] : _userProps_suggestions, onSuggestionClick = userProps.onSuggestionClick, _userProps_classNames = userProps.classNames, classNames = _userProps_classNames === void 0 ? {} : _userProps_classNames;
15804
15820
  var visibleSuggestions = suggestions.filter(function(suggestion) {
15805
15821
  return suggestion.trim() !== '';
15806
15822
  });
15807
- if (visibleSuggestions.length === 0 && !isLoading) {
15823
+ if (visibleSuggestions.length === 0) {
15808
15824
  return null;
15809
15825
  }
15810
15826
  return /*#__PURE__*/ createElement("div", {
15811
15827
  className: cx('ais-ChatPromptSuggestions', classNames.root)
15812
- }, isLoading && visibleSuggestions.length === 0 ? _to_consumable_array(new Array(skeletonCount)).map(function(_, index) {
15813
- return /*#__PURE__*/ createElement("div", {
15814
- key: index,
15815
- className: cx('ais-ChatPromptSuggestions-skeletonItem', classNames.skeletonItem)
15816
- });
15817
- }) : visibleSuggestions.map(function(suggestion, index) {
15828
+ }, visibleSuggestions.map(function(suggestion, index) {
15818
15829
  return /*#__PURE__*/ createElement(Button, {
15819
15830
  key: index,
15820
15831
  size: "sm",
15821
15832
  variant: "primary",
15822
15833
  className: cx('ais-ChatPromptSuggestions-suggestion', classNames.suggestion),
15823
- // A half-written suggestion can't be sent. Not `disabled`,
15824
- // which would restyle the pill mid-stream.
15825
15834
  onClick: function onClick() {
15826
- if (isLoading) return;
15827
- onSuggestionClick(suggestion);
15835
+ return onSuggestionClick(suggestion);
15828
15836
  }
15829
15837
  }, suggestion);
15830
15838
  }));
@@ -15917,7 +15925,6 @@
15917
15925
  error: error,
15918
15926
  classNames: classNames.messages,
15919
15927
  messageClassNames: classNames.message,
15920
- suggestionsLoading: suggestionsProps.isLoading,
15921
15928
  suggestionsElement: createElement(SuggestionsComponent || ChatPromptSuggestions, _object_spread_props(_object_spread({}, suggestionsProps), {
15922
15929
  classNames: classNames.suggestions
15923
15930
  }))
@@ -16385,13 +16392,144 @@
16385
16392
  };
16386
16393
  }
16387
16394
 
16395
+ var defaultComparisonTableTranslations = {
16396
+ missingValueLabel: '—',
16397
+ productColumnLabel: 'Product'
16398
+ };
16399
+ /** The display name of a product, sourced ONLY from the catalog record. */ function productLabel(hit) {
16400
+ var _ref, _hit_name;
16401
+ if (!hit) {
16402
+ return undefined;
16403
+ }
16404
+ return (_ref = (_hit_name = hit.name) !== null && _hit_name !== void 0 ? _hit_name : hit.title) !== null && _ref !== void 0 ? _ref : hit.objectID;
16405
+ }
16406
+ /**
16407
+ * Catalog values are arbitrary JSON. Primitives (and arrays of them) have an
16408
+ * obvious textual form; objects (e.g. `price: { value, currency }`) would
16409
+ * stringify to `[object Object]`, so they render as the missing marker
16410
+ * instead — an honest "no displayable value" beats a garbled cell.
16411
+ */ function formatCellValue(value) {
16412
+ if (value === undefined || value === null || value === '') {
16413
+ return undefined;
16414
+ }
16415
+ if (Array.isArray(value)) {
16416
+ var printable = value.filter(function(item) {
16417
+ return typeof item === 'string' && item !== '' || typeof item === 'number' || typeof item === 'boolean';
16418
+ });
16419
+ return printable.length > 0 ? printable.join(', ') : undefined;
16420
+ }
16421
+ if ((typeof value === "undefined" ? "undefined" : _type_of(value)) === 'object') {
16422
+ return undefined;
16423
+ }
16424
+ return String(value);
16425
+ }
16426
+ function createGroundedComparisonTableComponent(param) {
16427
+ var createElement = param.createElement, Fragment = param.Fragment;
16428
+ return function GroundedComparisonTable(props) {
16429
+ var _ref;
16430
+ var intro = props.intro, objectIDs = props.objectIDs, attributes = props.attributes, columns = props.columns, records = props.records;
16431
+ var translations = props.translations;
16432
+ if (objectIDs.length === 0) {
16433
+ return /*#__PURE__*/ createElement(Fragment, null);
16434
+ }
16435
+ // `columns` is model-authored and only trusted when it labels EVERY
16436
+ // column (`[product, ...attributes]`). A shorter list would shift labels
16437
+ // onto the wrong cells — `['Price', 'Rating']` over product/price/rating
16438
+ // puts the product names under "Price". Misaligned input falls back to
16439
+ // the attribute keys: correct data under plain headers.
16440
+ var columnLabels = columns && columns.length === attributes.length + 1 ? columns : undefined;
16441
+ var headerLabels = [
16442
+ (_ref = columnLabels === null || columnLabels === void 0 ? void 0 : columnLabels[0]) !== null && _ref !== void 0 ? _ref : translations.productColumnLabel
16443
+ ].concat(_to_consumable_array(attributes.map(function(attr, index) {
16444
+ var _ref;
16445
+ return (_ref = columnLabels === null || columnLabels === void 0 ? void 0 : columnLabels[index + 1]) !== null && _ref !== void 0 ? _ref : attr;
16446
+ })));
16447
+ return /*#__PURE__*/ createElement("div", {
16448
+ className: "ais-ChatToolComparisonTable"
16449
+ }, intro && /*#__PURE__*/ createElement("div", {
16450
+ className: "ais-ChatToolComparisonTable-intro"
16451
+ }, intro), /*#__PURE__*/ createElement("table", {
16452
+ className: "ais-ChatToolComparisonTable-table"
16453
+ }, /*#__PURE__*/ createElement("thead", null, /*#__PURE__*/ createElement("tr", null, headerLabels.map(function(label, index) {
16454
+ return /*#__PURE__*/ createElement("th", {
16455
+ key: "h-".concat(index),
16456
+ scope: "col",
16457
+ className: "ais-ChatToolComparisonTable-header"
16458
+ }, label);
16459
+ }))), /*#__PURE__*/ createElement("tbody", null, objectIDs.map(function(objectID) {
16460
+ var _formatCellValue;
16461
+ var hit = records === null || records === void 0 ? void 0 : records.get(objectID);
16462
+ var name = productLabel(hit);
16463
+ return /*#__PURE__*/ createElement("tr", {
16464
+ key: objectID,
16465
+ "data-object-id": objectID,
16466
+ className: "ais-ChatToolComparisonTable-row"
16467
+ }, /*#__PURE__*/ createElement("th", {
16468
+ scope: "row",
16469
+ "data-testid": "product-".concat(objectID),
16470
+ className: "ais-ChatToolComparisonTable-product"
16471
+ }, (_formatCellValue = formatCellValue(name)) !== null && _formatCellValue !== void 0 ? _formatCellValue : translations.missingValueLabel), attributes.map(function(attribute) {
16472
+ // The ONLY source of a cell value is the catalog record.
16473
+ var value = formatCellValue(hit ? hit[attribute] : undefined);
16474
+ return /*#__PURE__*/ createElement("td", {
16475
+ key: "".concat(objectID, "-").concat(attribute),
16476
+ "data-testid": "cell-".concat(objectID, "-").concat(attribute),
16477
+ className: "ais-ChatToolComparisonTable-cell"
16478
+ }, value !== null && value !== void 0 ? value : translations.missingValueLabel);
16479
+ }));
16480
+ }))));
16481
+ };
16482
+ }
16483
+
16484
+ /** Keeps only non-empty string entries, dropping anything else the model sent. */ function stringList(value) {
16485
+ if (!Array.isArray(value)) {
16486
+ return [];
16487
+ }
16488
+ return value.filter(function(entry) {
16489
+ return typeof entry === 'string' && entry !== '';
16490
+ });
16491
+ }
16492
+ function createCompareProductsToolComponent(param) {
16493
+ var createElement = param.createElement, Fragment = param.Fragment;
16494
+ var GroundedComparisonTable = createGroundedComparisonTableComponent({
16495
+ createElement: createElement,
16496
+ Fragment: Fragment
16497
+ });
16498
+ return function CompareProductsTool(userProps) {
16499
+ var _message_input;
16500
+ var toolProps = userProps.toolProps, userTranslations = userProps.translations;
16501
+ var _toolProps_context = toolProps.context, message = _toolProps_context.message, records = _toolProps_context.records;
16502
+ var translations = _object_spread({}, defaultComparisonTableTranslations, userTranslations);
16503
+ // Wait for the agent's arguments to be complete before rendering.
16504
+ if (!message || message.state !== 'input-available' && message.state !== 'output-available') {
16505
+ return /*#__PURE__*/ createElement(Fragment, null);
16506
+ }
16507
+ var input = (_message_input = message.input) !== null && _message_input !== void 0 ? _message_input : {};
16508
+ var objectIDs = stringList(input.objectIDs);
16509
+ var attributes = stringList(input.attributes);
16510
+ var columns = Array.isArray(input.columns) ? stringList(input.columns) : undefined;
16511
+ var intro = typeof input.intro === 'string' ? input.intro : undefined;
16512
+ if (objectIDs.length === 0) {
16513
+ return /*#__PURE__*/ createElement(Fragment, null);
16514
+ }
16515
+ return /*#__PURE__*/ createElement(GroundedComparisonTable, {
16516
+ intro: intro,
16517
+ objectIDs: objectIDs,
16518
+ attributes: attributes,
16519
+ columns: columns,
16520
+ records: records,
16521
+ translations: translations
16522
+ });
16523
+ };
16524
+ }
16525
+
16388
16526
  var isObject = function isObject(value) {
16389
16527
  return value !== null && (typeof value === "undefined" ? "undefined" : _type_of(value)) === 'object';
16390
16528
  };
16391
16529
  var hasOwn = function hasOwn(value, key) {
16392
16530
  return Object.prototype.hasOwnProperty.call(value, key);
16393
16531
  };
16394
- var claimsDisplayResultsPayload = function claimsDisplayResultsPayload(value) {
16532
+ var claimsGroupedResultsPayload = function claimsGroupedResultsPayload(value) {
16395
16533
  return isObject(value) && (hasOwn(value, 'intro') || hasOwn(value, 'groups'));
16396
16534
  };
16397
16535
  /**
@@ -16466,21 +16604,21 @@
16466
16604
  }
16467
16605
  return inString && !isKey && ((_frames_ = frames[frames.length - 1]) === null || _frames_ === void 0 ? void 0 : _frames_.lastKey) === 'objectID' && ((_frames_1 = frames[frames.length - 2]) === null || _frames_1 === void 0 ? void 0 : _frames_1.key) === 'results' && ((_frames_2 = frames[frames.length - 4]) === null || _frames_2 === void 0 ? void 0 : _frames_2.key) === 'groups';
16468
16606
  };
16469
- var DEFAULT_TRANSLATIONS$1 = {
16607
+ var DEFAULT_TRANSLATIONS$2 = {
16470
16608
  streamingLabel: 'Curating results…'
16471
16609
  };
16472
- function createDisplayResultsToolComponent(param) {
16610
+ function createGroupedResultsToolComponent(param) {
16473
16611
  var createElement = param.createElement, Fragment = param.Fragment, useEffect = param.useEffect, useRef = param.useRef;
16474
- return function DisplayResultsTool(userProps) {
16612
+ return function GroupedResultsTool(userProps) {
16475
16613
  var _ref;
16476
16614
  var toolProps = userProps.toolProps, renderGroupCarousel = userProps.groupCarouselComponent, userTranslations = userProps.translations;
16477
16615
  var context = toolProps.context;
16478
16616
  var message = context.message, insightsEventContext = context.insightsEventContext, sendEvent = context.sendEvent, messages = context.messages, status = context.status, records = context.records;
16479
16617
  var instantSearchStatus = (_ref = insightsEventContext === null || insightsEventContext === void 0 ? void 0 : insightsEventContext.instantSearchStatus) !== null && _ref !== void 0 ? _ref : 'idle';
16480
- var translations = _object_spread({}, DEFAULT_TRANSLATIONS$1, userTranslations);
16481
- var inputClaimsPayload = claimsDisplayResultsPayload(message === null || message === void 0 ? void 0 : message.input);
16618
+ var translations = _object_spread({}, DEFAULT_TRANSLATIONS$2, userTranslations);
16619
+ var inputClaimsPayload = claimsGroupedResultsPayload(message === null || message === void 0 ? void 0 : message.input);
16482
16620
  var legacyOutput = (message === null || message === void 0 ? void 0 : message.state) === 'output-available' && message.preliminary !== true && !inputClaimsPayload ? message.output : undefined;
16483
- var payload = inputClaimsPayload ? message === null || message === void 0 ? void 0 : message.input : claimsDisplayResultsPayload(legacyOutput) ? legacyOutput : undefined;
16621
+ var payload = inputClaimsPayload ? message === null || message === void 0 ? void 0 : message.input : claimsGroupedResultsPayload(legacyOutput) ? legacyOutput : undefined;
16484
16622
  var intro = typeof (payload === null || payload === void 0 ? void 0 : payload.intro) === 'string' ? payload.intro : undefined;
16485
16623
  var groups = Array.isArray(payload === null || payload === void 0 ? void 0 : payload.groups) ? payload.groups.filter(isObject) : [];
16486
16624
  var latestMessage = messages === null || messages === void 0 ? void 0 : messages[messages.length - 1];
@@ -16506,7 +16644,7 @@
16506
16644
  renderedItems.push(_object_spread_props(_object_spread({}, hydrated), {
16507
16645
  objectID: result.objectID,
16508
16646
  __position: renderedItems.length + 1,
16509
- __displayToolResult: result
16647
+ __groupedToolResult: result
16510
16648
  }));
16511
16649
  return renderedItems;
16512
16650
  }, []);
@@ -16549,27 +16687,112 @@
16549
16687
  return /*#__PURE__*/ createElement(Fragment, null);
16550
16688
  }
16551
16689
  return /*#__PURE__*/ createElement("div", {
16552
- className: "ais-ChatToolDisplayResults"
16690
+ className: "ais-ChatToolGroupedResults"
16553
16691
  }, intro && /*#__PURE__*/ createElement("div", {
16554
- className: "ais-ChatToolDisplayResults-intro"
16692
+ className: "ais-ChatToolGroupedResults-intro"
16555
16693
  }, intro), renderableGroups.map(function(group) {
16556
16694
  return /*#__PURE__*/ createElement("div", {
16557
16695
  key: group.key,
16558
- className: "ais-ChatToolDisplayResults-group"
16696
+ className: "ais-ChatToolGroupedResults-group"
16559
16697
  }, group.title && /*#__PURE__*/ createElement("div", {
16560
- className: "ais-ChatToolDisplayResults-groupTitle"
16698
+ className: "ais-ChatToolGroupedResults-groupTitle"
16561
16699
  }, group.title), group.why && /*#__PURE__*/ createElement("div", {
16562
- className: "ais-ChatToolDisplayResults-groupWhy"
16700
+ className: "ais-ChatToolGroupedResults-groupWhy"
16563
16701
  }, group.why), renderGroupCarousel({
16564
16702
  items: group.items,
16565
16703
  sendEvent: sendEvent
16566
16704
  }));
16567
16705
  }), isStreaming && /*#__PURE__*/ createElement("div", {
16568
- className: "ais-ChatToolDisplayResults-streaming"
16706
+ className: "ais-ChatToolGroupedResults-streaming"
16569
16707
  }, translations.streamingLabel));
16570
16708
  };
16571
16709
  }
16572
16710
 
16711
+ var DEFAULT_TRANSLATIONS$1 = {
16712
+ title: 'Compare',
16713
+ countText: function countText(count, maxItems) {
16714
+ return "".concat(count, " of ").concat(maxItems);
16715
+ },
16716
+ compareButtonText: function compareButtonText(count) {
16717
+ return "Compare ".concat(count);
16718
+ },
16719
+ clearButtonText: 'Clear all',
16720
+ removeItemLabel: function removeItemLabel(itemLabel) {
16721
+ return "Remove ".concat(itemLabel, " from comparison");
16722
+ },
16723
+ minItemsHint: function minItemsHint(minItems) {
16724
+ return "Select at least ".concat(minItems, " products to compare.");
16725
+ },
16726
+ limitReachedHint: 'Compare limit reached — remove a product to add another.'
16727
+ };
16728
+ /** The display label of a selected record. */ function getCompareBarItemLabel(item) {
16729
+ var _item_name;
16730
+ var label = (_item_name = item.name) !== null && _item_name !== void 0 ? _item_name : item.title;
16731
+ return typeof label === 'string' && label !== '' ? label : item.objectID;
16732
+ }
16733
+ function createCompareBarComponent(param) {
16734
+ var createElement = param.createElement;
16735
+ var Button = createButtonComponent({
16736
+ createElement: createElement
16737
+ });
16738
+ return function CompareBar(userProps) {
16739
+ var items = userProps.items, minItems = userProps.minItems, maxItems = userProps.maxItems, canCompare = userProps.canCompare, onCompare = userProps.onCompare, onRemove = userProps.onRemove, onClear = userProps.onClear, ItemComponent = userProps.itemComponent, _userProps_classNames = userProps.classNames, classNames = _userProps_classNames === void 0 ? {} : _userProps_classNames, userTranslations = userProps.translations;
16740
+ var translations = _object_spread({}, DEFAULT_TRANSLATIONS$1, userTranslations);
16741
+ if (items.length === 0) {
16742
+ return null;
16743
+ }
16744
+ var hint = items.length < minItems ? translations.minItemsHint(minItems) : items.length >= maxItems ? translations.limitReachedHint : undefined;
16745
+ return /*#__PURE__*/ createElement("section", {
16746
+ className: cx('ais-CompareBar', classNames.root),
16747
+ "aria-label": translations.title
16748
+ }, /*#__PURE__*/ createElement("div", {
16749
+ className: cx('ais-CompareBar-header', classNames.header)
16750
+ }, /*#__PURE__*/ createElement("span", {
16751
+ className: cx('ais-CompareBar-title', classNames.title)
16752
+ }, translations.title), /*#__PURE__*/ createElement("span", {
16753
+ className: cx('ais-CompareBar-count', classNames.count),
16754
+ "aria-live": "polite"
16755
+ }, translations.countText(items.length, maxItems))), /*#__PURE__*/ createElement("ul", {
16756
+ className: cx('ais-CompareBar-list', classNames.list)
16757
+ }, items.map(function(item) {
16758
+ var label = getCompareBarItemLabel(item);
16759
+ return /*#__PURE__*/ createElement("li", {
16760
+ key: item.objectID,
16761
+ "data-object-id": item.objectID,
16762
+ className: cx('ais-CompareBar-item', classNames.item)
16763
+ }, /*#__PURE__*/ createElement("span", {
16764
+ className: cx('ais-CompareBar-itemLabel', classNames.itemLabel)
16765
+ }, ItemComponent ? /*#__PURE__*/ createElement(ItemComponent, {
16766
+ item: item
16767
+ }) : label), /*#__PURE__*/ createElement("button", {
16768
+ type: "button",
16769
+ className: cx('ais-CompareBar-itemRemove', classNames.itemRemove),
16770
+ "aria-label": translations.removeItemLabel(label),
16771
+ onClick: function onClick() {
16772
+ return onRemove(item);
16773
+ }
16774
+ }, /*#__PURE__*/ createElement(CloseIcon, {
16775
+ createElement: createElement
16776
+ })));
16777
+ })), hint && /*#__PURE__*/ createElement("div", {
16778
+ className: cx('ais-CompareBar-hint', classNames.hint)
16779
+ }, hint), /*#__PURE__*/ createElement("div", {
16780
+ className: cx('ais-CompareBar-actions', classNames.actions)
16781
+ }, /*#__PURE__*/ createElement(Button, {
16782
+ variant: "outline",
16783
+ size: "sm",
16784
+ className: cx('ais-CompareBar-clearButton', classNames.clearButton),
16785
+ onClick: onClear
16786
+ }, translations.clearButtonText), /*#__PURE__*/ createElement(Button, {
16787
+ variant: "primary",
16788
+ size: "md",
16789
+ className: cx('ais-CompareBar-compareButton', classNames.compareButton),
16790
+ disabled: !canCompare,
16791
+ onClick: onCompare
16792
+ }, translations.compareButtonText(items.length))));
16793
+ };
16794
+ }
16795
+
16573
16796
  function createDefaultEmptyComponent(param) {
16574
16797
  var createElement = param.createElement, Fragment = param.Fragment;
16575
16798
  return function DefaultEmpty() {
@@ -19594,7 +19817,13 @@
19594
19817
  var MemorizeToolType = 'algolia_memorize';
19595
19818
  var MemorySearchToolType = 'algolia_memory_search';
19596
19819
  var PonderToolType = 'algolia_ponder';
19597
- var DisplayResultsToolType = 'algolia_display_results';
19820
+ var CompareProductsToolType = 'algolia_compare_products';
19821
+ var GroupedResultsToolType = 'algolia_grouped_results';
19822
+ /**
19823
+ * @deprecated The tool is now `algolia_grouped_results`
19824
+ * ({@link GroupedResultsToolType}). This name is still emitted by agents
19825
+ * configured before the rename, and renders the same UI.
19826
+ */ var DisplayResultsToolType = 'algolia_display_results';
19598
19827
  /**
19599
19828
  * Whether `toolName` is the search tool as the Algolia MCP Server exposes it:
19600
19829
  * one tool per index, named after the index it searches
@@ -19799,7 +20028,7 @@
19799
20028
  return DefaultChatTransport;
19800
20029
  }(HttpChatTransport);
19801
20030
 
19802
- var withUsage$q = createDocumentationMessageGenerator({
20031
+ var withUsage$r = createDocumentationMessageGenerator({
19803
20032
  name: 'chat',
19804
20033
  connector: true
19805
20034
  });
@@ -19930,7 +20159,7 @@
19930
20159
  }
19931
20160
  var connectChat = function connectChat(renderFn) {
19932
20161
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
19933
- checkRendering(renderFn, withUsage$q());
20162
+ checkRendering(renderFn, withUsage$r());
19934
20163
  return function(widgetParams) {
19935
20164
  var _ref = widgetParams || {}, _ref_resume = _ref.resume, resume = _ref_resume === void 0 ? false : _ref_resume, tmp = _ref.tools, tools_ = tmp === void 0 ? {} : tmp, _ref_type = _ref.type, type = _ref_type === void 0 ? 'chat' : _ref_type, persistence = _ref.persistence, context = _ref.context, initialUserMessage = _ref.initialUserMessage, initialMessages = _ref.initialMessages, _ref_disableTriggerValidation = _ref.disableTriggerValidation, disableTriggerValidation = _ref_disableTriggerValidation === void 0 ? false : _ref_disableTriggerValidation, _ref_sendAutomaticallyWhen = _ref.sendAutomaticallyWhen, sendAutomaticallyWhen = _ref_sendAutomaticallyWhen === void 0 ? lastAssistantMessageIsCompleteWithToolCalls : _ref_sendAutomaticallyWhen, _ref_requiresSearch = _ref.requiresSearch, requiresSearch = _ref_requiresSearch === void 0 ? true : _ref_requiresSearch, options = _object_without_properties(_ref, [
19936
20165
  "resume",
@@ -19963,7 +20192,7 @@
19963
20192
  var hasValidatedEntryPoints = false;
19964
20193
  var agentId = 'agentId' in options ? options.agentId : undefined;
19965
20194
  // Collected here rather than by the tool that searched: that tool renders
19966
- // nothing while display-results presents its records, and a record has to
20195
+ // nothing while Grouped Results presents its records, and a record has to
19967
20196
  // outlive the render that produced it.
19968
20197
  var records = createChatRecordsStore();
19969
20198
  var collectRecords = function collectRecords() {
@@ -19995,28 +20224,6 @@
19995
20224
  var _findSuggestionsPart;
19996
20225
  return (_findSuggestionsPart = findSuggestionsPart(findLastAssistantMessage(messages))) === null || _findSuggestionsPart === void 0 ? void 0 : _findSuggestionsPart.data.suggestions;
19997
20226
  };
19998
- // "Still coming" has to be inferred: the turn is running and has no
19999
- // `data-suggestions` part yet. Expecting any at all needs evidence, or an
20000
- // agent that never sends them would sit under a placeholder forever.
20001
- var getSuggestionsStatus = function getSuggestionsStatus(messages) {
20002
- var _lastAssistantMessage_metadata;
20003
- var status = _chatInstance.status;
20004
- if (status !== 'submitted' && status !== 'streaming') {
20005
- return 'idle';
20006
- }
20007
- var lastAssistantMessage = findLastAssistantMessage(messages);
20008
- if (findSuggestionsPart(lastAssistantMessage)) {
20009
- return 'idle';
20010
- }
20011
- var declaresSuggestions = (lastAssistantMessage === null || lastAssistantMessage === void 0 ? void 0 : (_lastAssistantMessage_metadata = lastAssistantMessage.metadata) === null || _lastAssistantMessage_metadata === void 0 ? void 0 : _lastAssistantMessage_metadata.suggestionsEnabled) === true;
20012
- if (declaresSuggestions) {
20013
- return 'loading';
20014
- }
20015
- var hasSuggestionsHistory = messages.some(function(message) {
20016
- return message !== lastAssistantMessage && message.role === 'assistant' && Boolean(findSuggestionsPart(message));
20017
- });
20018
- return hasSuggestionsHistory ? 'loading' : 'idle';
20019
- };
20020
20227
  var setMessages = function setMessages(messagesParam) {
20021
20228
  if (typeof messagesParam === 'function') {
20022
20229
  messagesParam = messagesParam(_chatInstance.messages);
@@ -20112,7 +20319,7 @@
20112
20319
  if ('agentId' in options && options.agentId) {
20113
20320
  var _options_requestOptions, _options_requestOptions1;
20114
20321
  if (!appId || !apiKey) {
20115
- throw new Error(withUsage$q('Could not extract Algolia credentials from the search client.'));
20322
+ throw new Error(withUsage$r('Could not extract Algolia credentials from the search client.'));
20116
20323
  }
20117
20324
  var createApi = function createApi() {
20118
20325
  var bypassCache = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
@@ -20151,7 +20358,7 @@
20151
20358
  });
20152
20359
  }
20153
20360
  if (!transport) {
20154
- throw new Error(withUsage$q('You need to provide either an `agentId` or a `transport`.'));
20361
+ throw new Error(withUsage$r('You need to provide either an `agentId` or a `transport`.'));
20155
20362
  }
20156
20363
  var canRepairRestoredPendingToolParts = !resume;
20157
20364
  var chat = new Chat$1(_object_spread_props(_object_spread({}, options), {
@@ -20341,7 +20548,7 @@
20341
20548
  if (agentId && feedback) {
20342
20549
  var _getAppIdAndApiKey = _sliced_to_array(getAppIdAndApiKey(initOptions.instantSearchInstance.client), 2), appId = _getAppIdAndApiKey[0], apiKey = _getAppIdAndApiKey[1];
20343
20550
  if (!appId || !apiKey) {
20344
- throw new Error(withUsage$q('Could not extract Algolia credentials from the search client.'));
20551
+ throw new Error(withUsage$r('Could not extract Algolia credentials from the search client.'));
20345
20552
  }
20346
20553
  feedbackAbortController = new AbortController();
20347
20554
  _sendChatMessageFeedback = function _sendChatMessageFeedback(messageId, vote) {
@@ -20504,7 +20711,6 @@
20504
20711
  '~isOpenStatePersistenceEnabled': normalizedPersistence.open,
20505
20712
  setMessages: setMessages,
20506
20713
  suggestions: getSuggestionsFromMessages(_chatInstance.messages),
20507
- suggestionsStatus: getSuggestionsStatus(_chatInstance.messages),
20508
20714
  clearMessages: clearMessages,
20509
20715
  tools: toolsWithAddToolResult,
20510
20716
  records: records,
@@ -20943,20 +21149,20 @@
20943
21149
  };
20944
21150
  }
20945
21151
 
20946
- var withUsage$p = createDocumentationMessageGenerator({
21152
+ var withUsage$q = createDocumentationMessageGenerator({
20947
21153
  name: 'tasks',
20948
21154
  connector: true
20949
21155
  });
20950
21156
  var connectTasks = function connectTasks(renderFn) {
20951
21157
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
20952
- checkRendering(renderFn, withUsage$p());
21158
+ checkRendering(renderFn, withUsage$q());
20953
21159
  return function(widgetParams) {
20954
21160
  var agentId = widgetParams.agentId, transport = widgetParams.transport, task = widgetParams.task, kind = widgetParams.kind, _widgetParams_stream = widgetParams.stream, stream = _widgetParams_stream === void 0 ? true : _widgetParams_stream;
20955
21161
  if (!agentId && !transport) {
20956
- throw new Error(withUsage$p('The `agentId` option is required unless a custom `transport` is provided.'));
21162
+ throw new Error(withUsage$q('The `agentId` option is required unless a custom `transport` is provided.'));
20957
21163
  }
20958
21164
  if (!task && !kind) {
20959
- throw new Error(withUsage$p('Either the `task` or `kind` option is required.'));
21165
+ throw new Error(withUsage$q('Either the `task` or `kind` option is required.'));
20960
21166
  }
20961
21167
  var runner;
20962
21168
  var output;
@@ -21030,7 +21236,7 @@
21030
21236
  if (agentId) {
21031
21237
  var _getAppIdAndApiKey = _sliced_to_array(getAppIdAndApiKey(instantSearchInstance.client), 2), appId = _getAppIdAndApiKey[0], apiKey = _getAppIdAndApiKey[1];
21032
21238
  if (!appId || !apiKey) {
21033
- throw new Error(withUsage$p('Could not extract Algolia credentials from the search client.'));
21239
+ throw new Error(withUsage$q('Could not extract Algolia credentials from the search client.'));
21034
21240
  }
21035
21241
  var taskTransport = createTaskTransport({
21036
21242
  transport: transport,
@@ -21077,7 +21283,7 @@
21077
21283
  };
21078
21284
  };
21079
21285
 
21080
- var withUsage$o = createDocumentationMessageGenerator({
21286
+ var withUsage$p = createDocumentationMessageGenerator({
21081
21287
  name: 'prompt-suggestions',
21082
21288
  connector: true
21083
21289
  });
@@ -21174,13 +21380,13 @@
21174
21380
  }
21175
21381
  var connectPromptSuggestions = function connectPromptSuggestions(renderFn) {
21176
21382
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
21177
- checkRendering(renderFn, withUsage$o());
21383
+ checkRendering(renderFn, withUsage$p());
21178
21384
  return function(widgetParams) {
21179
21385
  var agentId = widgetParams.agentId, configurationId = widgetParams.configurationId, _widgetParams_transformHits = widgetParams.transformHits, transformHits = _widgetParams_transformHits === void 0 ? DEFAULT_TRANSFORM_HITS : _widgetParams_transformHits, context = widgetParams.context, _widgetParams_transformItems = widgetParams.transformItems, transformItems = _widgetParams_transformItems === void 0 ? function(items) {
21180
21386
  return items;
21181
21387
  } : _widgetParams_transformItems, transport = widgetParams.transport;
21182
21388
  if (!agentId && !transport) {
21183
- throw new Error(withUsage$o('The `agentId` option is required unless a custom `transport` is provided.'));
21389
+ throw new Error(withUsage$p('The `agentId` option is required unless a custom `transport` is provided.'));
21184
21390
  }
21185
21391
  var tasksState;
21186
21392
  var suggestions = [];
@@ -21460,7 +21666,7 @@
21460
21666
  stream: true
21461
21667
  };
21462
21668
  } else {
21463
- throw new Error(withUsage$o('The `agentId` option is required unless a custom `transport` is provided.'));
21669
+ throw new Error(withUsage$p('The `agentId` option is required unless a custom `transport` is provided.'));
21464
21670
  }
21465
21671
  var tasksWidget = connectTasks(handleInnerRender, noop)(tasksParams);
21466
21672
  return {
@@ -21544,14 +21750,14 @@
21544
21750
  return useConnector(connectPromptSuggestions, props, additionalWidgetProperties);
21545
21751
  }
21546
21752
 
21547
- var withUsage$n = createDocumentationMessageGenerator({
21753
+ var withUsage$o = createDocumentationMessageGenerator({
21548
21754
  name: 'chatTrigger',
21549
21755
  connector: true
21550
21756
  });
21551
21757
  // Reads the sibling chat widget's render state from the live cross-index
21552
21758
  // `instantSearchInstance.renderState` map. We resolve at call time so that
21553
21759
  // `toggleOpen` always sees the latest `open`/`setOpen` values.
21554
- function getChatRenderState(options) {
21760
+ function getChatRenderState$1(options) {
21555
21761
  var _options_parent, _options_instantSearchInstance_renderState_indexId;
21556
21762
  var indexId = (_options_parent = options.parent) === null || _options_parent === void 0 ? void 0 : _options_parent.getIndexId();
21557
21763
  if (!indexId) return undefined;
@@ -21559,17 +21765,17 @@
21559
21765
  }
21560
21766
  var connectChatTrigger = function connectChatTrigger(renderFn) {
21561
21767
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
21562
- checkRendering(renderFn, withUsage$n());
21768
+ checkRendering(renderFn, withUsage$o());
21563
21769
  return function(widgetParams) {
21564
21770
  var params = widgetParams !== null && widgetParams !== void 0 ? widgetParams : {};
21565
21771
  var lastOptions = null;
21566
21772
  function openChatFromTrigger(options) {
21567
21773
  if (!lastOptions) return false;
21568
- return openChat(getChatRenderState(lastOptions), options);
21774
+ return openChat(getChatRenderState$1(lastOptions), options);
21569
21775
  }
21570
21776
  function toggleOpen() {
21571
21777
  if (!lastOptions) return;
21572
- var chatState = getChatRenderState(lastOptions);
21778
+ var chatState = getChatRenderState$1(lastOptions);
21573
21779
  if (!chatState) return;
21574
21780
  if (chatState.open) {
21575
21781
  var _chatState_setOpen;
@@ -21599,7 +21805,7 @@
21599
21805
  },
21600
21806
  getWidgetRenderState: function getWidgetRenderState(renderOptions) {
21601
21807
  var _ref;
21602
- var chatState = getChatRenderState(renderOptions);
21808
+ var chatState = getChatRenderState$1(renderOptions);
21603
21809
  return {
21604
21810
  open: (_ref = chatState === null || chatState === void 0 ? void 0 : chatState.open) !== null && _ref !== void 0 ? _ref : false,
21605
21811
  toggleOpen: toggleOpen,
@@ -21625,6 +21831,235 @@
21625
21831
  return useConnector(connectChatTrigger, props, additionalWidgetProperties);
21626
21832
  }
21627
21833
 
21834
+ var withUsage$n = createDocumentationMessageGenerator({
21835
+ name: 'compare',
21836
+ connector: true
21837
+ });
21838
+ /**
21839
+ * Builds the placeholder message for a dashboard-configured comparison. The
21840
+ * Agent Studio backend resolves it against the agent's comparison
21841
+ * configuration: the LLM gets the configured instructions and the transcript
21842
+ * keeps a natural-language message naming the selection.
21843
+ */ function getComparisonPlaceholderMessage(configurationId) {
21844
+ return "__ALGOLIA_COMPARISON_".concat(configurationId, "__");
21845
+ }
21846
+ /**
21847
+ * Builds the default comparison message. It names each selected item so the
21848
+ * agent can ground the comparison: it re-retrieves the records with
21849
+ * `algolia_search_index` and renders them with the builtin
21850
+ * `algolia_compare_products` tool. Works with the default shopping assistant
21851
+ * prompt — no agent configuration required.
21852
+ */ function getDefaultComparisonMessage(items) {
21853
+ var labels = items.map(function(item) {
21854
+ var _item_name;
21855
+ var name = (_item_name = item.name) !== null && _item_name !== void 0 ? _item_name : item.title;
21856
+ return typeof name === 'string' && name !== '' ? '"'.concat(name, '" (objectID: ').concat(item.objectID, ")") : 'the product with objectID "'.concat(item.objectID, '"');
21857
+ });
21858
+ return "Compare these products: ".concat(labels.join(' vs '));
21859
+ }
21860
+ // Turn-context payload for the comparison hand-off, per the Agent Studio
21861
+ // contract: the selection rides `selected_products` (JSON-encoded records,
21862
+ // `_`-prefixed internal metadata stripped) so the agent grounds the comparison
21863
+ // in what the shopper actually selected, and `comparison_configuration_id`
21864
+ // identifies the dashboard configuration when one is set.
21865
+ function buildComparisonTurnContext(items, configurationId) {
21866
+ var records = items.map(function(item) {
21867
+ var clean = {};
21868
+ Object.keys(item).forEach(function(key) {
21869
+ if (!key.startsWith('_')) {
21870
+ clean[key] = item[key];
21871
+ }
21872
+ });
21873
+ return clean;
21874
+ });
21875
+ return _object_spread({
21876
+ selected_products: JSON.stringify(records)
21877
+ }, configurationId ? {
21878
+ comparison_configuration_id: configurationId
21879
+ } : {});
21880
+ }
21881
+ // The selection is shared by every `compare` widget of the same InstantSearch
21882
+ // instance (per-hit toggles, the compare bar, a picker modal, ...), so it
21883
+ // lives in a store keyed by the instance rather than in any single widget.
21884
+ var compareStores = new WeakMap();
21885
+ function getCompareStore(instantSearchInstance) {
21886
+ var store = compareStores.get(instantSearchInstance);
21887
+ if (!store) {
21888
+ store = {
21889
+ items: [],
21890
+ listeners: new Set()
21891
+ };
21892
+ compareStores.set(instantSearchInstance, store);
21893
+ }
21894
+ return store;
21895
+ }
21896
+ // Reads the sibling chat widget's render state from the live cross-index
21897
+ // `instantSearchInstance.renderState` map. Resolved at call time so that
21898
+ // `compare` always sees the latest `open`/`sendMessage` values.
21899
+ function getChatRenderState(options) {
21900
+ var _options_parent, _options_instantSearchInstance_renderState_indexId;
21901
+ var indexId = (_options_parent = options.parent) === null || _options_parent === void 0 ? void 0 : _options_parent.getIndexId();
21902
+ if (!indexId) return undefined;
21903
+ return (_options_instantSearchInstance_renderState_indexId = options.instantSearchInstance.renderState[indexId]) === null || _options_instantSearchInstance_renderState_indexId === void 0 ? void 0 : _options_instantSearchInstance_renderState_indexId.chat;
21904
+ }
21905
+ /**
21906
+ * Compare connector.
21907
+ *
21908
+ * Owns the "products selected for comparison" state and the hand-off into the
21909
+ * chat: `compare()` opens the sibling `chat` widget and sends a comparison
21910
+ * message naming the selected records, which the agent answers with the
21911
+ * grounded `algolia_compare_products` table.
21912
+ *
21913
+ * The selection is shared across all `compare` widgets mounted on the same
21914
+ * InstantSearch instance, so per-hit "Compare" toggles and the `compareBar`
21915
+ * widget stay in sync. The widget is marked with `opensChat`, so it satisfies
21916
+ * the `chat` widget's entry-point validation.
21917
+ */ var connectCompare = function connectCompare(renderFn) {
21918
+ var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
21919
+ checkRendering(renderFn, withUsage$n());
21920
+ return function(widgetParams) {
21921
+ var _ref = widgetParams || {}, _ref_minItems = _ref.minItems, minItems = _ref_minItems === void 0 ? 2 : _ref_minItems, _ref_maxItems = _ref.maxItems, maxItems = _ref_maxItems === void 0 ? 3 : _ref_maxItems, configurationId = _ref.configurationId, _ref_getComparisonMessage = _ref.getComparisonMessage, getComparisonMessage = _ref_getComparisonMessage === void 0 ? configurationId ? function() {
21922
+ return getComparisonPlaceholderMessage(configurationId);
21923
+ } : getDefaultComparisonMessage : _ref_getComparisonMessage;
21924
+ if (minItems < 2) {
21925
+ throw new Error(withUsage$n('The `minItems` option must be at least 2.'));
21926
+ }
21927
+ if (maxItems < minItems) {
21928
+ throw new Error(withUsage$n('The `maxItems` option must be greater than `minItems`.'));
21929
+ }
21930
+ var lastOptions = null;
21931
+ var unsubscribe = null;
21932
+ function getStore() {
21933
+ if (!lastOptions) return null;
21934
+ return getCompareStore(lastOptions.instantSearchInstance);
21935
+ }
21936
+ // Re-renders every subscribed `compare` widget, then schedules a full
21937
+ // render so anything else reading `renderState.compare` catches up.
21938
+ function notify(store) {
21939
+ store.listeners.forEach(function(listener) {
21940
+ return listener();
21941
+ });
21942
+ lastOptions === null || lastOptions === void 0 ? void 0 : lastOptions.instantSearchInstance.scheduleRender();
21943
+ }
21944
+ function isSelected(objectID) {
21945
+ var store = getStore();
21946
+ return Boolean(store === null || store === void 0 ? void 0 : store.items.some(function(item) {
21947
+ return item.objectID === objectID;
21948
+ }));
21949
+ }
21950
+ function addItem(item) {
21951
+ var store = getStore();
21952
+ if (!store || store.items.length >= maxItems || isSelected(item.objectID)) {
21953
+ return;
21954
+ }
21955
+ store.items = _to_consumable_array(store.items).concat([
21956
+ item
21957
+ ]);
21958
+ notify(store);
21959
+ }
21960
+ function removeItem(objectID) {
21961
+ var store = getStore();
21962
+ if (!store || !isSelected(objectID)) return;
21963
+ store.items = store.items.filter(function(item) {
21964
+ return item.objectID !== objectID;
21965
+ });
21966
+ notify(store);
21967
+ }
21968
+ function toggleItem(item) {
21969
+ if (isSelected(item.objectID)) {
21970
+ removeItem(item.objectID);
21971
+ } else {
21972
+ addItem(item);
21973
+ }
21974
+ }
21975
+ function clearItems() {
21976
+ var store = getStore();
21977
+ if (!store || store.items.length === 0) return;
21978
+ store.items = [];
21979
+ notify(store);
21980
+ }
21981
+ function compare() {
21982
+ var store = getStore();
21983
+ if (!store || !lastOptions || store.items.length < minItems) {
21984
+ return false;
21985
+ }
21986
+ return openChat(getChatRenderState(lastOptions), {
21987
+ message: getComparisonMessage(store.items),
21988
+ referer: 'compare',
21989
+ turnContext: buildComparisonTurnContext(store.items, configurationId)
21990
+ });
21991
+ }
21992
+ return {
21993
+ $$type: 'ais.compare',
21994
+ opensChat: true,
21995
+ init: function init(initOptions) {
21996
+ var _this = this;
21997
+ lastOptions = initOptions;
21998
+ var store = getCompareStore(initOptions.instantSearchInstance);
21999
+ var listener = function listener() {
22000
+ if (!lastOptions) return;
22001
+ renderFn(_object_spread_props(_object_spread({}, _this.getWidgetRenderState(lastOptions)), {
22002
+ instantSearchInstance: lastOptions.instantSearchInstance
22003
+ }), false);
22004
+ };
22005
+ store.listeners.add(listener);
22006
+ unsubscribe = function unsubscribe() {
22007
+ return store.listeners.delete(listener);
22008
+ };
22009
+ renderFn(_object_spread_props(_object_spread({}, this.getWidgetRenderState(initOptions)), {
22010
+ instantSearchInstance: initOptions.instantSearchInstance
22011
+ }), true);
22012
+ },
22013
+ render: function render(renderOptions) {
22014
+ lastOptions = renderOptions;
22015
+ renderFn(_object_spread_props(_object_spread({}, this.getWidgetRenderState(renderOptions)), {
22016
+ instantSearchInstance: renderOptions.instantSearchInstance
22017
+ }), false);
22018
+ },
22019
+ dispose: function dispose() {
22020
+ unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe();
22021
+ unsubscribe = null;
22022
+ unmountFn();
22023
+ },
22024
+ getWidgetRenderState: function getWidgetRenderState(renderOptions) {
22025
+ lastOptions = renderOptions;
22026
+ var store = getCompareStore(renderOptions.instantSearchInstance);
22027
+ return {
22028
+ items: store.items,
22029
+ isSelected: isSelected,
22030
+ addItem: addItem,
22031
+ removeItem: removeItem,
22032
+ toggleItem: toggleItem,
22033
+ clearItems: clearItems,
22034
+ canAddItems: store.items.length < maxItems,
22035
+ canCompare: store.items.length >= minItems,
22036
+ minItems: minItems,
22037
+ maxItems: maxItems,
22038
+ compare: compare,
22039
+ widgetParams: widgetParams || {}
22040
+ };
22041
+ },
22042
+ getRenderState: function getRenderState(renderState, renderOptions) {
22043
+ return _object_spread_props(_object_spread({}, renderState), {
22044
+ compare: this.getWidgetRenderState(renderOptions)
22045
+ });
22046
+ }
22047
+ };
22048
+ };
22049
+ };
22050
+
22051
+ /**
22052
+ * Exposes the shared comparison selection and the chat hand-off.
22053
+ *
22054
+ * The selection is shared by every `useCompare` call on the same InstantSearch
22055
+ * instance, so a per-hit "Compare" toggle (`toggleItem`) and the `<CompareBar>`
22056
+ * widget stay in sync. `compare()` opens the `<Chat>` widget and sends the
22057
+ * comparison message for the current selection.
22058
+ */ function useCompare() {
22059
+ var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, additionalWidgetProperties = arguments.length > 1 ? arguments[1] : void 0;
22060
+ return useConnector(connectCompare, props, additionalWidgetProperties);
22061
+ }
22062
+
21628
22063
  var withUsage$m = createDocumentationMessageGenerator({
21629
22064
  name: 'clear-refinements',
21630
22065
  connector: true
@@ -26995,6 +27430,43 @@
26995
27430
  useState: React.useState
26996
27431
  });
26997
27432
 
27433
+ /**
27434
+ * Builtin comparison tool (`algolia_compare_products`).
27435
+ *
27436
+ * Registered by default in the chat widget so the agent can trigger a grounded
27437
+ * side-by-side comparison: its tool call names only the product objectIDs and
27438
+ * the attribute keys, and every cell is hydrated client-side from the real
27439
+ * `algolia_search_index` hits. The model never types a value, so it cannot
27440
+ * hallucinate one. See `instantsearch-ui-components` `CompareProductsTool` for
27441
+ * the contract, and `comparison-eval/README.md` for the study behind it.
27442
+ */ function createCompareProductsTool(translations) {
27443
+ var CompareProductsUIComponent = createCompareProductsToolComponent({
27444
+ createElement: React.createElement,
27445
+ Fragment: React.Fragment
27446
+ });
27447
+ var CompareProductsLayoutComponent = function CompareProductsLayoutComponent(toolProps) {
27448
+ return /*#__PURE__*/ React.createElement(CompareProductsUIComponent, {
27449
+ toolProps: toolProps,
27450
+ translations: translations
27451
+ });
27452
+ };
27453
+ return {
27454
+ layoutComponent: CompareProductsLayoutComponent,
27455
+ // Client-side tool: acknowledge the call so the agent's turn can complete.
27456
+ // The table itself is rendered from the call's input + real search hits.
27457
+ onToolCall: function onToolCall(param) {
27458
+ var input = param.input, addToolResult = param.addToolResult;
27459
+ var objectIDs = input === null || input === void 0 ? void 0 : input.objectIDs;
27460
+ addToolResult({
27461
+ output: {
27462
+ status: 'displayed',
27463
+ objectIDs: Array.isArray(objectIDs) ? objectIDs : []
27464
+ }
27465
+ });
27466
+ }
27467
+ };
27468
+ }
27469
+
26998
27470
  var CarouselUiComponent = createCarouselComponent({
26999
27471
  createElement: React.createElement,
27000
27472
  Fragment: React.Fragment,
@@ -27043,8 +27515,8 @@
27043
27515
  createElement: React.createElement
27044
27516
  });
27045
27517
 
27046
- function createDisplayResultsTool(itemComponent) {
27047
- var DisplayResultsUIComponent = createDisplayResultsToolComponent({
27518
+ function createGroupedResultsTool(itemComponent) {
27519
+ var GroupedResultsUIComponent = createGroupedResultsToolComponent({
27048
27520
  createElement: React.createElement,
27049
27521
  Fragment: React.Fragment,
27050
27522
  useEffect: React.useEffect,
@@ -27053,14 +27525,14 @@
27053
27525
  var Button = createButtonComponent({
27054
27526
  createElement: React.createElement
27055
27527
  });
27056
- var DisplayResultsCarouselHeader = function DisplayResultsCarouselHeader(param) {
27528
+ var GroupedResultsCarouselHeader = function GroupedResultsCarouselHeader(param) {
27057
27529
  var nbItems = param.nbItems, canScrollLeft = param.canScrollLeft, canScrollRight = param.canScrollRight, scrollLeft = param.scrollLeft, scrollRight = param.scrollRight;
27058
27530
  return /*#__PURE__*/ React.createElement("div", {
27059
- className: "ais-ChatToolDisplayResultsCarouselHeader"
27531
+ className: "ais-ChatToolGroupedResultsCarouselHeader"
27060
27532
  }, /*#__PURE__*/ React.createElement("div", {
27061
- className: "ais-ChatToolDisplayResultsCarouselHeaderCount"
27533
+ className: "ais-ChatToolGroupedResultsCarouselHeaderCount"
27062
27534
  }, nbItems, " result", nbItems > 1 ? 's' : ''), /*#__PURE__*/ React.createElement("div", {
27063
- className: "ais-ChatToolDisplayResultsCarouselHeaderScrollButtons"
27535
+ className: "ais-ChatToolGroupedResultsCarouselHeaderScrollButtons"
27064
27536
  }, /*#__PURE__*/ React.createElement(Button, {
27065
27537
  variant: "outline",
27066
27538
  size: "sm",
@@ -27068,7 +27540,7 @@
27068
27540
  "aria-label": "Previous",
27069
27541
  onClick: scrollLeft,
27070
27542
  disabled: !canScrollLeft,
27071
- className: "ais-ChatToolDisplayResultsCarouselHeaderScrollButton"
27543
+ className: "ais-ChatToolGroupedResultsCarouselHeaderScrollButton"
27072
27544
  }, /*#__PURE__*/ React.createElement(ChevronLeftIcon, {
27073
27545
  createElement: React.createElement
27074
27546
  })), /*#__PURE__*/ React.createElement(Button, {
@@ -27078,13 +27550,13 @@
27078
27550
  "aria-label": "Next",
27079
27551
  onClick: scrollRight,
27080
27552
  disabled: !canScrollRight,
27081
- className: "ais-ChatToolDisplayResultsCarouselHeaderScrollButton"
27553
+ className: "ais-ChatToolGroupedResultsCarouselHeaderScrollButton"
27082
27554
  }, /*#__PURE__*/ React.createElement(ChevronRightIcon, {
27083
27555
  createElement: React.createElement
27084
27556
  }))));
27085
27557
  };
27086
- var DisplayResultsLayoutComponent = function DisplayResultsLayoutComponent(toolProps) {
27087
- return /*#__PURE__*/ React.createElement(DisplayResultsUIComponent, {
27558
+ var GroupedResultsLayoutComponent = function GroupedResultsLayoutComponent(toolProps) {
27559
+ return /*#__PURE__*/ React.createElement(GroupedResultsUIComponent, {
27088
27560
  toolProps: toolProps,
27089
27561
  groupCarouselComponent: function groupCarouselComponent(param) {
27090
27562
  var items = param.items, sendEvent = param.sendEvent;
@@ -27093,13 +27565,13 @@
27093
27565
  itemComponent: itemComponent,
27094
27566
  sendEvent: sendEvent,
27095
27567
  showNavigation: false,
27096
- headerComponent: DisplayResultsCarouselHeader
27568
+ headerComponent: GroupedResultsCarouselHeader
27097
27569
  });
27098
27570
  }
27099
27571
  });
27100
27572
  };
27101
27573
  return {
27102
- layoutComponent: DisplayResultsLayoutComponent,
27574
+ layoutComponent: GroupedResultsLayoutComponent,
27103
27575
  streamInput: true
27104
27576
  };
27105
27577
  }
@@ -27136,20 +27608,15 @@
27136
27608
  useEffect: React.useEffect
27137
27609
  });
27138
27610
  function createDefaultTools(itemComponent, getSearchPageURL) {
27611
+ var groupedResultsTool = createGroupedResultsTool(itemComponent);
27139
27612
  var _obj;
27140
27613
  return _obj = {}, _define_property(_obj, SearchIndexToolType, _object_spread_props(_object_spread({}, createCarouselTool(true, itemComponent, getSearchPageURL)), {
27141
- // The agent decides per turn whether the richer display-results tool
27614
+ // The agent decides per turn whether the richer Grouped Results tool
27142
27615
  // takes over the rendering of the search results.
27143
- shouldRender: isDisplayResultsDisabled
27144
- })), _define_property(_obj, RecommendToolType, createCarouselTool(false, itemComponent, getSearchPageURL)), _define_property(_obj, DisplayResultsToolType, createDisplayResultsTool(itemComponent)), _define_property(_obj, MemorizeToolType, {}), _define_property(_obj, MemorySearchToolType, {}), _define_property(_obj, PonderToolType, {}), _obj;
27145
- }
27146
- /**
27147
- * Whether the search tool renders its own results, i.e. the agent did not hand
27148
- * the turn to the display-results tool. Set on the message by the backend.
27149
- */ function isDisplayResultsDisabled(param) {
27150
- var parentMessage = param.parentMessage;
27151
- var _parentMessage_metadata;
27152
- return ((_parentMessage_metadata = parentMessage.metadata) === null || _parentMessage_metadata === void 0 ? void 0 : _parentMessage_metadata.displayResultsEnabled) !== true;
27616
+ shouldRender: shouldSearchToolRenderResults
27617
+ })), _define_property(_obj, RecommendToolType, createCarouselTool(false, itemComponent, getSearchPageURL)), _define_property(_obj, GroupedResultsToolType, groupedResultsTool), // Agents configured before the rename still emit the legacy tool name.
27618
+ // eslint-disable-next-line typescript/no-deprecated
27619
+ _define_property(_obj, DisplayResultsToolType, groupedResultsTool), _define_property(_obj, CompareProductsToolType, createCompareProductsTool()), _define_property(_obj, MemorizeToolType, {}), _define_property(_obj, MemorySearchToolType, {}), _define_property(_obj, PonderToolType, {}), _obj;
27153
27620
  }
27154
27621
  function mergeToolOptions(defaultTools, userTools) {
27155
27622
  if (!userTools) {
@@ -27276,7 +27743,7 @@
27276
27743
  tools: tools,
27277
27744
  disableTriggerValidation: effectiveDisableTriggerValidation
27278
27745
  }));
27279
- var messages = chatState.messages, sendMessage = chatState.sendMessage, status = chatState.status, regenerate = chatState.regenerate, stop = chatState.stop, error = chatState.error, input = chatState.input, setInput = chatState.setInput, open = chatState.open, setOpen = chatState.setOpen, clearMessages = chatState.clearMessages, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, suggestionsStatus = chatState.suggestionsStatus, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState, consumeInputFocus = chatState['~consumeInputFocus'], isOpenStatePersistenceEnabled = chatState['~isOpenStatePersistenceEnabled'];
27746
+ var messages = chatState.messages, sendMessage = chatState.sendMessage, status = chatState.status, regenerate = chatState.regenerate, stop = chatState.stop, error = chatState.error, input = chatState.input, setInput = chatState.setInput, open = chatState.open, setOpen = chatState.setOpen, clearMessages = chatState.clearMessages, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState, consumeInputFocus = chatState['~consumeInputFocus'], isOpenStatePersistenceEnabled = chatState['~isOpenStatePersistenceEnabled'];
27280
27747
  var sendMessageAndScrollToBottom = React.useCallback(function() {
27281
27748
  for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){
27282
27749
  args[_key] = arguments[_key];
@@ -27437,7 +27904,6 @@
27437
27904
  }),
27438
27905
  suggestionsProps: {
27439
27906
  suggestions: suggestions,
27440
- isLoading: suggestionsStatus === 'loading',
27441
27907
  onSuggestionClick: function onSuggestionClick(suggestion) {
27442
27908
  sendMessageAndScrollToBottom({
27443
27909
  text: suggestion
@@ -27547,6 +28013,45 @@
27547
28013
  }, props));
27548
28014
  }
27549
28015
 
28016
+ var CompareBarUiComponent = createCompareBarComponent({
28017
+ createElement: React.createElement,
28018
+ Fragment: React.Fragment
28019
+ });
28020
+ /**
28021
+ * Renders the comparison selection bar: the records picked for comparison,
28022
+ * a clear-selection action, and the "Compare" call-to-action that opens the
28023
+ * `<Chat>` widget with the comparison message.
28024
+ *
28025
+ * Select records from your own UI (e.g. a "Compare" button in your hit
28026
+ * component) with `useCompare().toggleItem(hit)` — the selection is shared
28027
+ * with this widget.
28028
+ */ function CompareBar(_0) {
28029
+ var classNames = _0.classNames, translations = _0.translations, itemComponent = _0.itemComponent, props = _object_without_properties(_0, [
28030
+ "classNames",
28031
+ "translations",
28032
+ "itemComponent"
28033
+ ]);
28034
+ var _useCompare = useCompare(props, {
28035
+ $$widgetType: 'ais.compareBar'
28036
+ }), items = _useCompare.items, minItems = _useCompare.minItems, maxItems = _useCompare.maxItems, canCompare = _useCompare.canCompare, removeItem = _useCompare.removeItem, clearItems = _useCompare.clearItems, compare = _useCompare.compare;
28037
+ return /*#__PURE__*/ React.createElement(CompareBarUiComponent, {
28038
+ items: items,
28039
+ minItems: minItems,
28040
+ maxItems: maxItems,
28041
+ canCompare: canCompare,
28042
+ onCompare: function onCompare() {
28043
+ return compare();
28044
+ },
28045
+ onRemove: function onRemove(item) {
28046
+ return removeItem(item.objectID);
28047
+ },
28048
+ onClear: clearItems,
28049
+ itemComponent: itemComponent,
28050
+ classNames: classNames,
28051
+ translations: translations
28052
+ });
28053
+ }
28054
+
27550
28055
  function ClearRefinements$1(_0) {
27551
28056
  var _0_classNames = _0.classNames, classNames = _0_classNames === void 0 ? {} : _0_classNames, _0_disabled = _0.disabled, disabled = _0_disabled === void 0 ? false : _0_disabled, _0_onClick = _0.onClick, onClick = _0_onClick === void 0 ? function() {} : _0_onClick, translations = _0.translations, props = _object_without_properties(_0, [
27552
28057
  "classNames",
@@ -29379,6 +29884,8 @@
29379
29884
  exports.ChatSidePanelLayout = ChatSidePanelLayout;
29380
29885
  exports.ChatTrigger = ChatTrigger;
29381
29886
  exports.ClearRefinements = ClearRefinements;
29887
+ exports.CompareBar = CompareBar;
29888
+ exports.CompareProductsToolType = CompareProductsToolType;
29382
29889
  exports.Configure = Configure;
29383
29890
  exports.CurrentRefinements = CurrentRefinements;
29384
29891
  exports.DisplayResultsToolType = DisplayResultsToolType;
@@ -29387,6 +29894,7 @@
29387
29894
  exports.Feeds = Feeds;
29388
29895
  exports.FilterSuggestions = FilterSuggestions;
29389
29896
  exports.FrequentlyBoughtTogether = FrequentlyBoughtTogether;
29897
+ exports.GroupedResultsToolType = GroupedResultsToolType;
29390
29898
  exports.HierarchicalMenu = HierarchicalMenu;
29391
29899
  exports.Highlight = Highlight;
29392
29900
  exports.Hits = Hits;
@@ -29426,6 +29934,7 @@
29426
29934
  exports.useChat = useChat;
29427
29935
  exports.useChatTrigger = useChatTrigger;
29428
29936
  exports.useClearRefinements = useClearRefinements;
29937
+ exports.useCompare = useCompare;
29429
29938
  exports.useConfigure = useConfigure;
29430
29939
  exports.useConnector = useConnector;
29431
29940
  exports.useCurrentRefinements = useCurrentRefinements;