@docsearch/js 5.0.0-beta.3 → 5.0.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
- /*! @docsearch/js 5.0.0-beta.3 (UNRELEASED b044250) | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
1
+ /*! @docsearch/js 5.0.0 (UNRELEASED 0c5978a) | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
2
  import { InitialAskAiMessage } from "@docsearch/core";
3
3
  import { HitComponentProps, ResultsFooterComponentProps } from "@docsearch/react";
4
4
  import { DocSearchAIProps as DocSearchAIProps$1 } from "@docsearch/react/docsearchAi";
package/dist/esm/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @docsearch/js 5.0.0-beta.3 (UNRELEASED b044250) | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
1
+ /*! @docsearch/js 5.0.0 (UNRELEASED 0c5978a) | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
2
  //#region \0rolldown/runtime.js
3
3
  var __create = Object.create;
4
4
  var __defProp$1 = Object.defineProperty;
@@ -1188,7 +1188,7 @@ function DocSearchButtonKey({ reactsToKey, children }) {
1188
1188
 
1189
1189
  //#endregion
1190
1190
  //#region ../docsearch-react/dist/esm/version.js
1191
- const version$2 = "5.0.0-beta.3";
1191
+ const version$2 = "5.0.0";
1192
1192
 
1193
1193
  //#endregion
1194
1194
  //#region \0@oxc-project+runtime@0.139.0/helpers/esm/OverloadYield.js
@@ -27404,7 +27404,7 @@ function useChat(_ref2 = {}) {
27404
27404
  }
27405
27405
 
27406
27406
  //#endregion
27407
- //#region ../docsearch-react/dist/esm/useSuggestedQuestions-DwcUPOf_.js
27407
+ //#region ../docsearch-react/dist/esm/useSuggestedQuestions-BjSZvxwr.js
27408
27408
  init_compat();
27409
27409
  function AlertIcon(props) {
27410
27410
  return /* @__PURE__ */ En.createElement("svg", _objectSpread2$2({
@@ -27860,6 +27860,85 @@ function SourcesPanel({ links, titleText = "Source", pluralTitleText = "Sources"
27860
27860
  rel: "noopener noreferrer"
27861
27861
  }, /* @__PURE__ */ En.createElement(ContentIcon, null), /* @__PURE__ */ En.createElement("span", { className: "DocSearch-AskAiScreen-Sources-source-title" }, l.title || l.url)))))));
27862
27862
  }
27863
+ const PROMPT_BLOCKING_CODES = /* @__PURE__ */ new Set([
27864
+ "AI-203",
27865
+ "AI-205",
27866
+ "AI-224",
27867
+ "AI-225"
27868
+ ]);
27869
+ function readStringField(value, key) {
27870
+ for (const [field, fieldValue] of Object.entries(value)) if (field.toLowerCase() === key.toLowerCase() && typeof fieldValue === "string" && fieldValue.trim() !== "") return fieldValue.trim();
27871
+ }
27872
+ function extractErrorCode(message) {
27873
+ const directMatch = /\b(AI-\d{3})\b/i.exec(message);
27874
+ if (directMatch) return directMatch[1].toUpperCase();
27875
+ }
27876
+ function parseJson(message) {
27877
+ try {
27878
+ const parsed = JSON.parse(message);
27879
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) return parsed;
27880
+ } catch (_unused) {}
27881
+ return null;
27882
+ }
27883
+ function matchesDomainBlock(message) {
27884
+ return /\brequest blocked for this domain\b/.test(message) || /\bblocked for this domain\b/.test(message);
27885
+ }
27886
+ function matchesRateLimit(message) {
27887
+ return /\b429\b/.test(message) || /\brate\s*limit/.test(message) || /\bretry\s+after\s+\d+/.test(message) || /\btoo\s+many\s+attempts\b/.test(message) || /\btoo_many_requests\b/.test(message);
27888
+ }
27889
+ function matchesTokenOutputLimit(message) {
27890
+ return /\btokenoutputlimiterror\b/.test(message) || /could not complete response due to token output limits/.test(message);
27891
+ }
27892
+ function matchesAccessOrLimit(message) {
27893
+ return /\bwhitelist(?:ed)?\b/.test(message) || /\bnot\s+allowed\s+for\s+this\s+domain\b/.test(message) || /\bcontext\s+length\b/.test(message) || /\b(?:max|maximum)\s+tokens?\b/.test(message) || /\btoken\s+limit\b/.test(message) || /\btoken\s+output\b/.test(message) || /\boutput\s+limits?\b/.test(message) || /\bstep\s+limit\b/.test(message) || /\b(?:max|maximum)(?:\s+agent)?\s+steps?\b/.test(message);
27894
+ }
27895
+ function jsonImpliesCostControl(value) {
27896
+ var _readStringField, _readStringField2, _readStringField3;
27897
+ const type = (_readStringField = readStringField(value, "type")) !== null && _readStringField !== void 0 ? _readStringField : "";
27898
+ const error = (_readStringField2 = readStringField(value, "error")) !== null && _readStringField2 !== void 0 ? _readStringField2 : "";
27899
+ const message = (_readStringField3 = readStringField(value, "message")) !== null && _readStringField3 !== void 0 ? _readStringField3 : "";
27900
+ return /tokenoutput|outputlimit|steplimit|maxstep|ratelimit|domainnotallowed/i.test(type) || error.toUpperCase() === "TOO_MANY_REQUESTS" || matchesRateLimit(`${error} ${message}`.toLowerCase()) || matchesAccessOrLimit(`${error} ${message}`.toLowerCase());
27901
+ }
27902
+ const BLOCKING_MATCHERS = [
27903
+ { matches: ({ code }) => Boolean(code && PROMPT_BLOCKING_CODES.has(code)) },
27904
+ {
27905
+ matches: ({ parsedJson }) => {
27906
+ var _readStringField4;
27907
+ return Boolean(parsedJson && matchesDomainBlock(((_readStringField4 = readStringField(parsedJson, "message")) !== null && _readStringField4 !== void 0 ? _readStringField4 : "").toLowerCase()));
27908
+ },
27909
+ showNewConversationLink: false
27910
+ },
27911
+ { matches: ({ parsedJson }) => Boolean(parsedJson && jsonImpliesCostControl(parsedJson)) },
27912
+ {
27913
+ matches: ({ messageLower }) => matchesTokenOutputLimit(messageLower),
27914
+ showNewConversationLink: false
27915
+ },
27916
+ { matches: ({ messageLower }) => matchesRateLimit(messageLower) },
27917
+ {
27918
+ matches: ({ messageLower }) => matchesDomainBlock(messageLower),
27919
+ showNewConversationLink: false
27920
+ },
27921
+ { matches: ({ messageLower }) => matchesAccessOrLimit(messageLower) }
27922
+ ];
27923
+ function resolvePromptBlockingError(error) {
27924
+ var _error$message;
27925
+ const message = (_error$message = error.message) !== null && _error$message !== void 0 ? _error$message : "";
27926
+ const context = {
27927
+ message,
27928
+ messageLower: message.toLowerCase(),
27929
+ parsedJson: parseJson(message),
27930
+ code: extractErrorCode(message)
27931
+ };
27932
+ const matches = BLOCKING_MATCHERS.filter((matcher) => matcher.matches(context));
27933
+ return {
27934
+ blocking: matches.length > 0,
27935
+ showNewConversationLink: matches.every((matcher) => matcher.showNewConversationLink !== false)
27936
+ };
27937
+ }
27938
+ function isTokenOutputLimitError(error) {
27939
+ var _error$message2;
27940
+ return Boolean(error && matchesTokenOutputLimit(((_error$message2 = error.message) !== null && _error$message2 !== void 0 ? _error$message2 : "").toLowerCase()));
27941
+ }
27863
27942
  /** Escapes HTML special characters for safe interpolation into HTML strings. */
27864
27943
  function escapeHtml(unsafe) {
27865
27944
  return unsafe.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
@@ -27974,6 +28053,51 @@ function isThreadDepthError(error) {
27974
28053
  if (!error) return false;
27975
28054
  return /(?:ai-217|conversation\s+depth)/i.test((_error$message = error.message) !== null && _error$message !== void 0 ? _error$message : "");
27976
28055
  }
28056
+ function isAskAiPromptBlockingError(error) {
28057
+ return Boolean(error && (isThreadDepthError(error) || resolvePromptBlockingError(error).blocking));
28058
+ }
28059
+ function isAgentStudioTokenOutputLimitError(error) {
28060
+ return isTokenOutputLimitError(error);
28061
+ }
28062
+ function showAskAiBlockingBannerNewConversationLink(error) {
28063
+ if (!error || isThreadDepthError(error)) return true;
28064
+ return resolvePromptBlockingError(error).showNewConversationLink;
28065
+ }
28066
+ function extractAgentStudioErrorFieldMessage(raw) {
28067
+ let value = raw.trim();
28068
+ for (let iteration = 0; iteration < 10 && value; iteration++) try {
28069
+ var _exec, _fieldMatch$;
28070
+ const parsed = JSON.parse(value);
28071
+ if (typeof parsed === "string") {
28072
+ value = parsed.trim();
28073
+ continue;
28074
+ }
28075
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
28076
+ const record = parsed;
28077
+ const message = readStringField(record, "message");
28078
+ const error = readStringField(record, "error");
28079
+ if (message) return message;
28080
+ if (error) return error;
28081
+ }
28082
+ const fieldMatch = (_exec = /"message"\s*:\s*"((?:[^"\\]|\\.)*)"/.exec(value)) !== null && _exec !== void 0 ? _exec : /"error"\s*:\s*"((?:[^"\\]|\\.)*)"/.exec(value);
28083
+ return fieldMatch === null || fieldMatch === void 0 || (_fieldMatch$ = fieldMatch[1]) === null || _fieldMatch$ === void 0 ? void 0 : _fieldMatch$.replace(/\\"/g, "\"").replace(/\\\\/g, "\\").trim();
28084
+ } catch (_unused) {
28085
+ if (value.includes("\\\"")) {
28086
+ value = value.replace(/\\"/g, "\"").replace(/\\\\/g, "\\").trim();
28087
+ continue;
28088
+ }
28089
+ return;
28090
+ }
28091
+ }
28092
+ function getAskAiBlockingBannerMessage(error) {
28093
+ var _error$message2;
28094
+ if (!error) return;
28095
+ const extracted = extractAgentStudioErrorFieldMessage((_error$message2 = error.message) !== null && _error$message2 !== void 0 ? _error$message2 : "");
28096
+ if (isThreadDepthError(error) && (/^\s*AI-217\s*$/i.test(error.message) || /^\s*\{.*\}\s*$/.test(error.message) && !extracted)) return;
28097
+ const message = (extracted !== null && extracted !== void 0 ? extracted : error.message.replace(/\s*\(AI-\d{3}\)\s*$/i, "")).trim();
28098
+ if (message && !(message.startsWith("{") && message.endsWith("}"))) return message;
28099
+ if (isAgentStudioTokenOutputLimitError(error)) return "Could not complete response due to token output limits";
28100
+ }
27977
28101
  const EMPTY_TOOLS = Object.freeze({});
27978
28102
  function isAIToolPart(part) {
27979
28103
  return part.type.startsWith("tool-");
@@ -28296,17 +28420,40 @@ function MenuItem(_ref) {
28296
28420
  Menu.Item = MenuItem;
28297
28421
  const agentStudioBaseUrl = (appId) => `https://${appId}.algolia.net/agent-studio/1`;
28298
28422
  const getAgentStudioErrorMessage = (error) => {
28299
- let errorMessage = error.message;
28423
+ var _parsedError$code;
28424
+ const raw = error.message;
28425
+ let parsed;
28300
28426
  try {
28301
- const parsedError = JSON.parse(error.message);
28302
- if (parsedError.name === "ValidationError") {
28303
- const validationError = parsedError;
28304
- if (validationError.detail && validationError.detail.length > 0) {
28305
- const { msg, loc } = validationError.detail[0];
28306
- errorMessage = `${msg}: ${loc.at(-1)}`;
28307
- }
28308
- } else errorMessage = parsedError.message;
28309
- } catch (_unused) {}
28427
+ parsed = JSON.parse(raw);
28428
+ } catch (_unused) {
28429
+ return new Error(raw);
28430
+ }
28431
+ let iterations = 0;
28432
+ while (typeof parsed === "string" && iterations < 10) {
28433
+ iterations += 1;
28434
+ const serializedError = parsed.trim();
28435
+ try {
28436
+ parsed = JSON.parse(serializedError);
28437
+ } catch (_unused2) {
28438
+ return new Error(serializedError);
28439
+ }
28440
+ }
28441
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return new Error(raw);
28442
+ const parsedRecord = parsed;
28443
+ const parsedError = parsed;
28444
+ let errorMessage = raw;
28445
+ if (parsedError.name === "ValidationError") {
28446
+ const validationError = parsedError;
28447
+ if (validationError.detail && validationError.detail.length > 0) {
28448
+ const { msg, loc } = validationError.detail[0];
28449
+ errorMessage = `${msg}: ${loc.at(-1)}`;
28450
+ }
28451
+ } else {
28452
+ var _ref, _readStringField;
28453
+ errorMessage = (_ref = (_readStringField = readStringField(parsedRecord, "message")) !== null && _readStringField !== void 0 ? _readStringField : readStringField(parsedRecord, "error")) !== null && _ref !== void 0 ? _ref : raw;
28454
+ }
28455
+ const code = (_parsedError$code = parsedError.code) !== null && _parsedError$code !== void 0 ? _parsedError$code : parsedError.errorCode;
28456
+ if (typeof code === "string" && code.trim() && !errorMessage.toUpperCase().includes(code.trim().toUpperCase())) errorMessage = `${errorMessage} (${code.trim()})`;
28310
28457
  return new Error(errorMessage);
28311
28458
  };
28312
28459
  const postAgentStudioFeedback = ({ agentId, vote, messageId, appId, apiKey, abortSignal, notes, tags }) => {
@@ -31308,7 +31455,7 @@ function createAutocomplete(options) {
31308
31455
  }
31309
31456
 
31310
31457
  //#endregion
31311
- //#region ../docsearch-react/dist/esm/DocSearchAskAiModal-C_sH1j8Y.js
31458
+ //#region ../docsearch-react/dist/esm/DocSearchAskAiModal-ByqIW5ZA.js
31312
31459
  init_compat();
31313
31460
  function MessageIcon() {
31314
31461
  return /* @__PURE__ */ En.createElement("svg", {
@@ -31370,7 +31517,7 @@ function AskAiExchangeCard({ exchange, askAiError, isLastExchange, loadingStatus
31370
31517
  const { userMessage, assistantMessage } = exchange;
31371
31518
  const { stoppedStreamingText = "You stopped this response", errorTitleText = "Chat error", relatedSourcesText, relatedSourcesTextPlural, suggestedPromptsTitleText = "Suggested prompts" } = translations;
31372
31519
  const toolCallTranslations = q$2(() => toToolCallTranslations(translations), [translations]);
31373
- const isThreadDepth = isThreadDepthError(askAiError);
31520
+ const isPromptBlockingError = isAskAiPromptBlockingError(askAiError);
31374
31521
  const assistantContent = q$2(() => getMessageContent(assistantMessage), [assistantMessage]);
31375
31522
  const userContent = q$2(() => getMessageContent(userMessage), [userMessage]);
31376
31523
  const urlsToDisplay = En.useMemo(() => extractLinksFromMessage(assistantMessage), [assistantMessage]);
@@ -31385,7 +31532,7 @@ function AskAiExchangeCard({ exchange, askAiError, isLastExchange, loadingStatus
31385
31532
  const showActions = !wasStopped && (!isLastExchange || isLastExchange && loadingStatus === "ready" && Boolean(assistantMessage));
31386
31533
  const isThinking = ["submitted", "streaming"].includes(loadingStatus) && isLastExchange && !displayParts.some((part) => part.type !== "step-start");
31387
31534
  const messageId = (assistantMessage === null || assistantMessage === void 0 ? void 0 : assistantMessage.id) || exchange.id;
31388
- return /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Response-Container" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Response" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--user" }, /* @__PURE__ */ En.createElement("p", { className: "DocSearch-AskAiScreen-Query" }, userContent !== null && userContent !== void 0 ? userContent : "")), /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--assistant" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-MessageContent" }, loadingStatus === "error" && askAiError && isLastExchange && !isThreadDepth && /* @__PURE__ */ En.createElement("div", {
31535
+ return /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Response-Container" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Response" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--user" }, /* @__PURE__ */ En.createElement("p", { className: "DocSearch-AskAiScreen-Query" }, userContent !== null && userContent !== void 0 ? userContent : "")), /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--assistant" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-MessageContent" }, loadingStatus === "error" && askAiError && isLastExchange && !isPromptBlockingError && /* @__PURE__ */ En.createElement("div", {
31389
31536
  className: "DocSearch-AskAiScreen-Error",
31390
31537
  role: "alert"
31391
31538
  }, /* @__PURE__ */ En.createElement(AlertIcon, { "aria-hidden": "true" }), /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Error-Content" }, /* @__PURE__ */ En.createElement("h4", { className: "DocSearch-AskAiScreen-Error-Title" }, errorTitleText), /* @__PURE__ */ En.createElement(MemoizedMarkdown, {
@@ -31452,9 +31599,11 @@ function AskAiScreen(_ref) {
31452
31599
  let { translations = {} } = _ref, props = _objectWithoutProperties$6(_ref, _excluded$6);
31453
31600
  const { disclaimerText = "Answers are generated with AI which can make mistakes.", threadDepthExceededMessage = "This conversation is now closed to keep responses accurate.", startNewConversationButtonText = "Start a new conversation" } = translations;
31454
31601
  const { messages, tools, askAiError, status, memoryEnabled } = props;
31455
- const hasThreadDepthError = q$2(() => {
31456
- return status === "error" && isThreadDepthError(askAiError);
31602
+ const hasPromptBlockingError = q$2(() => {
31603
+ return status === "error" && isAskAiPromptBlockingError(askAiError);
31457
31604
  }, [status, askAiError]);
31605
+ const blockingMessage = q$2(() => getAskAiBlockingBannerMessage(askAiError), [askAiError]);
31606
+ const showNewConversationLink = showAskAiBlockingBannerNewConversationLink(askAiError);
31458
31607
  const exchanges = q$2(() => {
31459
31608
  const grouped = [];
31460
31609
  for (let i = 0; i < messages.length; i++) if (messages[i].role === "user") {
@@ -31468,21 +31617,21 @@ function AskAiScreen(_ref) {
31468
31617
  });
31469
31618
  if (assistantMessage) i++;
31470
31619
  }
31471
- if (hasThreadDepthError && grouped.length > 0) {
31472
- if (!grouped[grouped.length - 1].assistantMessage) grouped.pop();
31473
- }
31474
31620
  return grouped;
31475
- }, [messages, hasThreadDepthError]);
31621
+ }, [messages]);
31476
31622
  const handleSearchQueryClick = (query) => {
31477
31623
  props.onAskAiToggle(false);
31478
31624
  props.setQuery(query);
31479
31625
  };
31480
- const showThreadDepthError = hasThreadDepthError && messages.some((m) => m.role === "assistant");
31481
- return /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen DocSearch-AskAiScreen-Container" }, showThreadDepthError && /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-MessageContent DocSearch-AskAiScreen-Error DocSearch-AskAiScreen-Error--ThreadDepth" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Error-Content" }, /* @__PURE__ */ En.createElement("p", null, threadDepthExceededMessage, " ", /* @__PURE__ */ En.createElement("button", {
31626
+ const showBlockingBanner = hasPromptBlockingError && (!isThreadDepthError(askAiError) || messages.some((message) => message.role === "assistant"));
31627
+ return /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen DocSearch-AskAiScreen-Container" }, /* @__PURE__ */ En.createElement("div", {
31628
+ id: props.promptBlockingErrorId,
31629
+ role: "alert"
31630
+ }, showBlockingBanner && /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-MessageContent DocSearch-AskAiScreen-Error DocSearch-AskAiScreen-Error--ThreadDepth" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Error-Content" }, /* @__PURE__ */ En.createElement("p", { className: "DocSearch-AskAiScreen-Error-Title" }, blockingMessage !== null && blockingMessage !== void 0 ? blockingMessage : isThreadDepthError(askAiError) ? threadDepthExceededMessage : "This conversation cannot continue."), showNewConversationLink && /* @__PURE__ */ En.createElement("p", null, /* @__PURE__ */ En.createElement("button", {
31482
31631
  type: "button",
31483
31632
  className: "DocSearch-ThreadDepthError-Link",
31484
31633
  onClick: props.onNewConversation
31485
- }, startNewConversationButtonText), " ", "to continue."))), /* @__PURE__ */ En.createElement(AskAiScreenDisclaimer, { disclaimerText }), /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Body" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-ExchangesList" }, exchanges.slice().reverse().map((exchange, index) => /* @__PURE__ */ En.createElement(AskAiExchangeCard, {
31634
+ }, startNewConversationButtonText), " ", "to continue.")))), /* @__PURE__ */ En.createElement(AskAiScreenDisclaimer, { disclaimerText }), /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-Body" }, /* @__PURE__ */ En.createElement("div", { className: "DocSearch-AskAiScreen-ExchangesList" }, exchanges.slice().reverse().map((exchange, index) => /* @__PURE__ */ En.createElement(AskAiExchangeCard, {
31486
31635
  key: exchange.id,
31487
31636
  exchange,
31488
31637
  askAiError: props.askAiError,
@@ -31627,10 +31776,10 @@ function AskAiSearchBox(_ref) {
31627
31776
  const origOnChange = baseInputProps.onChange;
31628
31777
  const isAskAiStreaming = props.askAiStatus === "streaming" || props.askAiStatus === "submitted";
31629
31778
  const renderMoreOptions = props.isAskAiActive && askAiState !== "conversation-history";
31630
- const isThreadDepthError = props.isThreadDepthError || false;
31779
+ const isPromptBlocked = Boolean(props.promptBlockingChrome);
31631
31780
  let searchPlaceholder = props.placeholder;
31632
31781
  if (askAiState === "new-conversation") searchPlaceholder = newConversationPlaceholder;
31633
- if (isThreadDepthError && props.isAskAiActive) searchPlaceholder = threadDepthErrorPlaceholder;
31782
+ if (props.promptBlockingChrome === "full" && props.isAskAiActive) searchPlaceholder = threadDepthErrorPlaceholder;
31634
31783
  let heading = null;
31635
31784
  if (isAskAiStreaming) heading = placeholderTextAskAiStreaming;
31636
31785
  if (askAiState === "conversation-history") heading = conversationHistoryTitle;
@@ -31648,6 +31797,11 @@ function AskAiSearchBox(_ref) {
31648
31797
  const inputProps = {
31649
31798
  enterKeyHint: props.isAskAiActive ? "enter" : "search",
31650
31799
  onKeyDown: (e) => {
31800
+ if (isPromptBlocked && props.isAskAiActive && blockedKeys.has(e.key)) {
31801
+ e.preventDefault();
31802
+ e.stopPropagation();
31803
+ return;
31804
+ }
31651
31805
  let askAiHandled = false;
31652
31806
  if (props.isAskAiActive && blockedKeys.has(e.key)) {
31653
31807
  if (e.key === "Enter" && !isAskAiStreaming && !isQueryEmpty(props.state.query)) props.onAskAgain(props.state.query);
@@ -31661,6 +31815,10 @@ function AskAiSearchBox(_ref) {
31661
31815
  origOnKeyDown === null || origOnKeyDown === void 0 || origOnKeyDown(e);
31662
31816
  },
31663
31817
  onChange: (e) => {
31818
+ if (isPromptBlocked && props.isAskAiActive) {
31819
+ e.preventDefault();
31820
+ return;
31821
+ }
31664
31822
  if (props.isAskAiActive) {
31665
31823
  props.setQuery(e.currentTarget.value);
31666
31824
  e.preventDefault();
@@ -31669,10 +31827,13 @@ function AskAiSearchBox(_ref) {
31669
31827
  }
31670
31828
  origOnChange === null || origOnChange === void 0 || origOnChange(e);
31671
31829
  },
31672
- disabled: isAskAiStreaming || isThreadDepthError && props.isAskAiActive
31830
+ disabled: isAskAiStreaming,
31831
+ readOnly: isPromptBlocked && props.isAskAiActive,
31832
+ "aria-disabled": isPromptBlocked && props.isAskAiActive,
31833
+ "aria-describedby": isPromptBlocked && props.isAskAiActive ? props.promptBlockingErrorId : void 0
31673
31834
  };
31674
31835
  const handleAskAiBackClick = En.useCallback(() => {
31675
- if (isThreadDepthError) {
31836
+ if (isPromptBlocked) {
31676
31837
  props.onNewConversation();
31677
31838
  return;
31678
31839
  }
@@ -31684,7 +31845,7 @@ function AskAiSearchBox(_ref) {
31684
31845
  onAskAiToggle(false);
31685
31846
  }, [
31686
31847
  askAiState,
31687
- isThreadDepthError,
31848
+ isPromptBlocked,
31688
31849
  onAskAiToggle,
31689
31850
  setAskAiState,
31690
31851
  props
@@ -31693,8 +31854,8 @@ function AskAiSearchBox(_ref) {
31693
31854
  type: "button",
31694
31855
  tabIndex: 0,
31695
31856
  className: "DocSearch-Action DocSearch-AskAi-Return",
31696
- title: backToKeywordSearchButtonText,
31697
- "aria-label": backToKeywordSearchButtonAriaLabel,
31857
+ title: isPromptBlocked ? startNewConversationText : backToKeywordSearchButtonText,
31858
+ "aria-label": isPromptBlocked ? startNewConversationText : backToKeywordSearchButtonAriaLabel,
31698
31859
  onClick: handleAskAiBackClick
31699
31860
  }, /* @__PURE__ */ En.createElement(BackIcon, null)) : void 0;
31700
31861
  const inputOverlay = heading ? /* @__PURE__ */ En.createElement(ModalHeading, {
@@ -31885,6 +32046,7 @@ function DocSearchAskAiModal(_ref) {
31885
32046
  placeholder = (translations === null || translations === void 0 || (_translations$searchB3 = translations.searchBox) === null || _translations$searchB3 === void 0 ? void 0 : _translations$searchB3.placeholderTextAskAi) || "Ask another question...";
31886
32047
  }
31887
32048
  const { containerRef, modalRef, formElementRef, dropdownRef, inputRef } = useModalRefs();
32049
+ const promptBlockingErrorId = En.useId();
31888
32050
  const { initialQuery, initialQueryFromSelection } = useInitialModalQuery(initialQueryFromProp);
31889
32051
  const searchClient = useSearchClient(appId, apiKey, transformSearchClient);
31890
32052
  const askAiConfig = typeof askAi === "object" ? askAi : null;
@@ -31941,9 +32103,17 @@ function DocSearchAskAiModal(_ref) {
31941
32103
  stoppedStream,
31942
32104
  chatId
31943
32105
  ]);
31944
- const hasThreadDepthError = En.useMemo(() => {
31945
- return status === "error" && isThreadDepthError(askAiError);
31946
- }, [status, askAiError]);
32106
+ const shouldBlockPrompt = En.useMemo(() => {
32107
+ return status === "error" && isAskAiPromptBlockingError(askAiError);
32108
+ }, [status, askAiError]) && (!isThreadDepthError(askAiError) || messages.some((message) => message.role === "assistant"));
32109
+ const promptBlockingChrome = En.useMemo(() => {
32110
+ if (!shouldBlockPrompt || askAiState === "new-conversation" || askAiState === "conversation-history") return;
32111
+ return isAgentStudioTokenOutputLimitError(askAiError) ? "minimal" : "full";
32112
+ }, [
32113
+ askAiError,
32114
+ askAiState,
32115
+ shouldBlockPrompt
32116
+ ]);
31947
32117
  const saveRecentSearch = useSaveRecentSearch({
31948
32118
  favoriteSearches,
31949
32119
  recentSearches,
@@ -32133,7 +32303,8 @@ function DocSearchAskAiModal(_ref) {
32133
32303
  askAiError,
32134
32304
  askAiState,
32135
32305
  setAskAiState,
32136
- isThreadDepthError: hasThreadDepthError && askAiState !== "new-conversation",
32306
+ promptBlockingChrome,
32307
+ promptBlockingErrorId,
32137
32308
  onClose,
32138
32309
  onAskAiToggle,
32139
32310
  onAskAgain: (query) => {
@@ -32175,6 +32346,7 @@ function DocSearchAskAiModal(_ref) {
32175
32346
  selectSuggestedQuestion,
32176
32347
  memoryEnabled,
32177
32348
  resultBadgeKey: props.resultBadgeKey,
32349
+ promptBlockingErrorId,
32178
32350
  onAskAiToggle,
32179
32351
  onNewConversation: handleNewConversation,
32180
32352
  onItemClick: (item, event) => {