@8wave/ai-elements 0.119.0-beta.1 → 0.119.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{PkStreamingMarkdown-kpEBZA4d.js → PkStreamingMarkdown-Bry3y6Ru.js} +3 -3
- package/dist/_chunks/PkStreamingMarkdown-Bry3y6Ru.js.map +1 -0
- package/dist/_chunks/{PkToolShowArtifact-B8TOTS6A.js → PkToolShowArtifact-CfJLe8vD.js} +2 -2
- package/dist/_chunks/{PkToolShowArtifact-B8TOTS6A.js.map → PkToolShowArtifact-CfJLe8vD.js.map} +1 -1
- package/dist/_chunks/{PkToolShowContactForm-B89p05XM.js → PkToolShowContactForm-CQQ6p4bJ.js} +2 -2
- package/dist/_chunks/{PkToolShowContactForm-B89p05XM.js.map → PkToolShowContactForm-CQQ6p4bJ.js.map} +1 -1
- package/dist/_chunks/{PkToolShowForm-DTKQtFij.js → PkToolShowForm-CGAc1O6K.js} +2 -2
- package/dist/_chunks/{PkToolShowForm-DTKQtFij.js.map → PkToolShowForm-CGAc1O6K.js.map} +1 -1
- package/dist/_chunks/{PkToolShowSources-CbwixpOb.js → PkToolShowSources-BJ-XFrLD.js} +3 -3
- package/dist/_chunks/{PkToolShowSources-CbwixpOb.js.map → PkToolShowSources-BJ-XFrLD.js.map} +1 -1
- package/dist/_chunks/{markdown-c59ir6tw.js → markdown-DpoAzJSk.js} +64 -61
- package/dist/_chunks/markdown-DpoAzJSk.js.map +1 -0
- package/dist/ai-elements.es.js +64 -10
- package/dist/ai-elements.es.js.map +1 -1
- package/dist-vue/PkChatbot.js +1 -1
- package/dist-vue/PkChatbotEmptyState.js +1 -1
- package/dist-vue/PkChatbotInput.js +1 -1
- package/dist-vue/PkChatbotMessages.js +1 -1
- package/dist-vue/PkChatbotStepPayload.js +1 -1
- package/dist-vue/PkChatbotStepToolDetail.js +1 -1
- package/dist-vue/PkChatbotSteps.js +1 -1
- package/dist-vue/PkChatbotViewChat.js +1 -1
- package/dist-vue/PkChatbotViewFiles.js +1 -1
- package/dist-vue/_chunks/{Document-B-oyVh7v.js → Document-CV-RJu_p.js} +64 -61
- package/dist-vue/_chunks/Document-CV-RJu_p.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbot-C_OzxC0s.js → PkChatbot-CcNC2r_E.js} +5 -5
- package/dist-vue/_chunks/{PkChatbot-C_OzxC0s.js.map → PkChatbot-CcNC2r_E.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotEmptyState-BEQCnqui.js → PkChatbotEmptyState-Toj4CqXV.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotEmptyState-BEQCnqui.js.map → PkChatbotEmptyState-Toj4CqXV.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotInput-KJxWrDIT.js → PkChatbotInput-BfZqRpQ2.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotInput-KJxWrDIT.js.map → PkChatbotInput-BfZqRpQ2.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotMessages-Zhuxom46.js → PkChatbotMessages-B6qYZsMZ.js} +14 -14
- package/dist-vue/_chunks/{PkChatbotMessages-Zhuxom46.js.map → PkChatbotMessages-B6qYZsMZ.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotStepPayload-Da4N5CKa.js → PkChatbotStepPayload-D0eoPBQ8.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotStepPayload-Da4N5CKa.js.map → PkChatbotStepPayload-D0eoPBQ8.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotStepToolDetail-rrtImvq5.js → PkChatbotStepToolDetail-CMx4cw1D.js} +3 -3
- package/dist-vue/_chunks/{PkChatbotStepToolDetail-rrtImvq5.js.map → PkChatbotStepToolDetail-CMx4cw1D.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotSteps-LEfOolAc.js → PkChatbotSteps-DeZQhGRU.js} +5 -5
- package/dist-vue/_chunks/{PkChatbotSteps-LEfOolAc.js.map → PkChatbotSteps-DeZQhGRU.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewChat-BJ0YHCvA.js → PkChatbotViewChat--Q90F_Kg.js} +6 -6
- package/dist-vue/_chunks/{PkChatbotViewChat-BJ0YHCvA.js.map → PkChatbotViewChat--Q90F_Kg.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewFiles-gqCumfod.js → PkChatbotViewFiles-CA20TBFY.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotViewFiles-gqCumfod.js.map → PkChatbotViewFiles-CA20TBFY.js.map} +1 -1
- package/dist-vue/_chunks/{PkStreamingMarkdown-BWEvuFZm.js → PkStreamingMarkdown-C55Fi0Pd.js} +2 -2
- package/dist-vue/_chunks/{PkStreamingMarkdown-BWEvuFZm.js.map → PkStreamingMarkdown-C55Fi0Pd.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowArtifact-tNEG6-r_.js → PkToolShowArtifact-z1qTnFkA.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowArtifact-tNEG6-r_.js.map → PkToolShowArtifact-z1qTnFkA.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowContactForm-DBC6f9gR.js → PkToolShowContactForm-BjNpnv6y.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowContactForm-DBC6f9gR.js.map → PkToolShowContactForm-BjNpnv6y.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowDiagram-Bbq0ETt1.js → PkToolShowDiagram-CqkabP0e.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowDiagram-Bbq0ETt1.js.map → PkToolShowDiagram-CqkabP0e.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowForm-BG-8aTHy.js → PkToolShowForm-CZFWZub7.js} +3 -3
- package/dist-vue/_chunks/{PkToolShowForm-BG-8aTHy.js.map → PkToolShowForm-CZFWZub7.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowImageGallery-DXn-bxHv.js → PkToolShowImageGallery-CkfXP_lD.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowImageGallery-DXn-bxHv.js.map → PkToolShowImageGallery-CkfXP_lD.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowProductList-BZ_fDRCq.js → PkToolShowProductList-De-PtmD-.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowProductList-BZ_fDRCq.js.map → PkToolShowProductList-De-PtmD-.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowSources-CUURb0PG.js → PkToolShowSources-CSN7S0zo.js} +3 -3
- package/dist-vue/_chunks/{PkToolShowSources-CUURb0PG.js.map → PkToolShowSources-CSN7S0zo.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowVideo-FNlPjswi.js → PkToolShowVideo-B_Q93E2y.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowVideo-FNlPjswi.js.map → PkToolShowVideo-B_Q93E2y.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowWebPages-CWV79tsb.js → PkToolShowWebPages-D3CdjJUc.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowWebPages-CWV79tsb.js.map → PkToolShowWebPages-D3CdjJUc.js.map} +1 -1
- package/dist-vue/_chunks/{utils-Dk2jFXR_.js → utils-CwIMEuAv.js} +3 -3
- package/dist-vue/_chunks/{utils-Dk2jFXR_.js.map → utils-CwIMEuAv.js.map} +1 -1
- package/dist-vue/composables.js +57 -3
- package/dist-vue/composables.js.map +1 -1
- package/dist-vue/index.js +4006 -3981
- package/dist-vue/index.js.map +1 -1
- package/dist-vue/locales.js +4 -0
- package/dist-vue/packages/models/src/schema/Document.d.ts +25 -0
- package/dist-vue/packages/models/src/schema/Notification.d.ts +2 -0
- package/dist-vue/packages/models/src/schema/Platform.d.ts +72 -0
- package/dist-vue/style.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/PkStreamingMarkdown-kpEBZA4d.js.map +0 -1
- package/dist/_chunks/markdown-c59ir6tw.js.map +0 -1
- package/dist-vue/_chunks/Document-B-oyVh7v.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils-Dk2jFXR_.js","names":["isPresentationTool","isTextPart","getToolPartName","isToolPart","isReasoningPart","mergeConsecutiveTextParts","merged","part","parts","prev","isWidgetPart","dropCorrectedWidgetErrors","lastDrawn","index","isStreamingPart","FILE_OUTPUT_PARTS","moveFileOutputsLast","files","feedPartKey","toolCallId","LIVE_REASONING_TAIL_LENGTH","FENCE_LINE","getMarkdownTail","markdown","maxLength","from","limit","boundary","length","cut","openFence","match","marker","rest","TOOL_APPROVAL_STATES","isToolApprovalPart","CONFIRM_TOOL_NAME","isToolConfirmPart","isConfirmationCardPart","getToolApprovalId","getPartState","isLoadingState","state","getContrast","hex","hexcolor","char","r","g","b","linearize","c","resolveContrastColor","textColor","mainColor","agentThemeStyle","contrastColor","formatDuration","ms","$n","stringifyPayload","value","json","hasPayload","formAnswerAsSpoken","input","answer","question","questionById","step","said","id","formStepOptions","option","formAnswerSlots","slots","output","steps","assign","list","WEB_SEARCH_TOOL_TYPES","RICH_DETAIL_TOOL_TYPES","hasRichToolDetail","asRecord","pickString","keys","key","record","getToolPartSummary","queries","valid","query","sheet","range","getPartIcon","getToolPartLabel","$t"],"sources":["../../../../packages/components/src/chat/utils.ts"],"sourcesContent":["import type { UIMessage } from 'ai'\nimport { isPresentationTool } from 'models'\nimport {\n isTextPart,\n isFilePart,\n isToolPart,\n isReasoningPart,\n hasPartText,\n hasTextPart,\n getTextPart,\n getMessageText,\n getToolPartName,\n} from 'utils'\n\nexport {\n isTextPart,\n isFilePart,\n isToolPart,\n isReasoningPart,\n hasPartText,\n hasTextPart,\n getTextPart,\n getMessageText,\n}\n\n/**\n * Merges consecutive text parts into a single text part.\n * Claude (and other models) often produce multiple text parts during streaming\n * that should logically be a single block of text.\n */\nexport function mergeConsecutiveTextParts(\n parts: UIMessage['parts'],\n): UIMessage['parts'] {\n const merged: UIMessage['parts'] = []\n for (const part of parts) {\n if (!isTextPart(part)) {\n merged.push(part)\n continue\n }\n const prev = merged[merged.length - 1]\n if (prev && isTextPart(prev)) {\n merged[merged.length - 1] = { ...prev, text: prev.text + part.text }\n } else {\n merged.push(part)\n }\n }\n return merged\n}\n\nconst isWidgetPart = (\n part: UIMessage['parts'][number],\n): part is Extract<UIMessage['parts'][number], { type: `tool-${string}` }> =>\n isToolPart(part) && isPresentationTool(getToolPartName(part))\n\n/**\n * Drops a widget call refused for its arguments when a later call of the same\n * widget in the message was drawn: the turn corrected it (the backend's\n * `correctableInputRefusals`), and the refusal would sit next to the working\n * widget, `showForm` drawing its render error above the form. A refusal with\n * nothing drawn after it stays. Only the feed reads this: the steps timeline\n * keeps every call, the refused one included.\n */\nexport function dropCorrectedWidgetErrors(\n parts: UIMessage['parts'],\n): UIMessage['parts'] {\n const lastDrawn = new Map<string, number>()\n for (const [index, part] of parts.entries()) {\n if (\n isWidgetPart(part) &&\n part.state !== 'output-error' &&\n !isStreamingPart(part)\n ) {\n lastDrawn.set(part.type, index)\n }\n }\n return parts.filter(\n (part, index) =>\n !(\n isWidgetPart(part) &&\n part.state === 'output-error' &&\n (lastDrawn.get(part.type) ?? -1) > index\n ),\n )\n}\n\n/**\n * Tool calls whose output is a file for the user to download. The feed draws\n * them after the answer, where the reader arrives, wherever in the message the\n * model made the call: a version written before a long answer sat above it,\n * out of sight.\n */\nconst FILE_OUTPUT_PARTS: ReadonlySet<string> = new Set(['tool-editSpreadsheet'])\n\n/** The parts with the file outputs moved last, in their own order. */\nexport function moveFileOutputsLast(\n parts: UIMessage['parts'],\n): UIMessage['parts'] {\n const files = parts.filter((part) => FILE_OUTPUT_PARTS.has(part.type))\n return files.length > 0\n ? [\n ...parts.filter((part) => !FILE_OUTPUT_PARTS.has(part.type)),\n ...files,\n ]\n : parts\n}\n\n/**\n * The key of a part in the feed. Its position, except for a file output: that\n * one is always last, so its position moves as the answer grows, and keyed by\n * it the card would be redrawn at every new part.\n */\nexport function feedPartKey(\n part: UIMessage['parts'][number],\n index: number,\n): string | number {\n const toolCallId = (part as { toolCallId?: string }).toolCallId\n return FILE_OUTPUT_PARTS.has(part.type) && toolCallId\n ? `file-${toolCallId}`\n : index\n}\n\nexport function isStreamingPart(\n part: UIMessage['parts'][number] | null | undefined,\n): part is Extract<UIMessage['parts'][number], { streaming?: boolean }> {\n if (!part) {\n return false\n }\n if ('state' in part) {\n return part.state === 'streaming' || part.state === 'input-streaming'\n }\n return false\n}\n\n/**\n * How much of a reasoning still being written its live box renders. The box is\n * a few lines tall and follows the bottom, while the reasoning of one turn runs\n * to tens of kilobytes: chat `st0Eg8iG0zUX0HQN` wrote 92KB, and parsing all of\n * it at every delta froze the tab. Four thousand characters leave a few screens\n * to scroll back through, and a finished step renders all of it.\n */\nexport const LIVE_REASONING_TAIL_LENGTH = 4000\n\n// A fence opener or closer, also inside a list item or a quote, whose markers\n// and indentation are skipped. The rest of the line tells them apart: a\n// closing fence carries no info string.\nconst FENCE_LINE =\n /^[ \\t]*(?:(?:[-*+]|\\d{1,9}[.)])[ \\t]+|>[ \\t]?)*(`{3,}|~{3,})(.*)$/gm\n\n/**\n * The end of a markdown text, at most `maxLength` characters long, cut on a\n * blank line (a line break when there is none) so it does not open on half a\n * paragraph. A table or a formula can still be cut in two. An ellipsis marks\n * the cut. A cut inside a fenced code block reopens the fence, or the rest of\n * the text would render as code and the code as prose.\n */\nexport function getMarkdownTail(markdown: string, maxLength: number): string {\n if (markdown.length <= maxLength) {\n return markdown\n }\n const from = markdown.length - maxLength\n // The boundary is looked for in the first half of the window only: the one\n // blank line of the window can be the last thing written, and cutting there\n // would leave nothing to render.\n const limit = from + maxLength / 2\n const boundary = (index: number, length: number) =>\n index !== -1 && index < limit ? index + length : undefined\n const cut =\n boundary(markdown.indexOf('\\n\\n', from), 2) ??\n boundary(markdown.indexOf('\\n', from), 1) ??\n from\n let openFence: string | undefined\n for (const match of markdown.matchAll(FENCE_LINE)) {\n if (match.index >= cut) {\n break\n }\n const [, marker, rest] = match\n if (!openFence) {\n // A backtick in a backtick fence's info string makes it inline\n // code, not a fence.\n if (marker[0] === '`' && rest.includes('`')) {\n continue\n }\n openFence = marker\n } else if (\n marker[0] === openFence[0] &&\n marker.length >= openFence.length &&\n !rest.trim()\n ) {\n openFence = undefined\n }\n }\n const reopen = openFence ? `${openFence}\\n` : ''\n return `…\\n\\n${reopen}${markdown.slice(cut)}`\n}\n\n/**\n * States a tool part goes through when it needs the user's approval. They are\n * rendered by `PkToolApprovalCard` whatever the tool is, so the decision (and\n * its outcome) stays visible in the transcript.\n */\nconst TOOL_APPROVAL_STATES = new Set([\n 'approval-requested',\n 'approval-responded',\n 'output-denied',\n])\n\nexport function isToolApprovalPart(\n part: UIMessage['parts'][number] | null | undefined,\n): boolean {\n if (!isToolPart(part)) {\n return false\n }\n if (TOOL_APPROVAL_STATES.has(part.state)) {\n return true\n }\n // An executed (or errored) call that went through the gate keeps its\n // verdict in `approval`: the card stays in the transcript, so the user's\n // decision remains visible in the chat and in the log viewers (parity\n // with requestConfirm, whose 'confirmed' output is persisted).\n return (part as { approval?: unknown }).approval != null\n}\n\n/**\n * The client-side tool the model uses to have an action it described approved.\n * It predates the SDK's approval gate and keeps its own round-trip (it resolves\n * through `addToolOutput`), but it asks the user the very same question, so it\n * shares `PkToolApprovalCard` instead of having a card of its own.\n */\nexport const CONFIRM_TOOL_NAME = 'requestConfirm'\n\nexport function isToolConfirmPart(\n part: UIMessage['parts'][number] | null | undefined,\n): boolean {\n return isToolPart(part) && part.type === `tool-${CONFIRM_TOOL_NAME}`\n}\n\n/** True for any part the confirmation card is responsible for. */\nexport function isConfirmationCardPart(\n part: UIMessage['parts'][number] | null | undefined,\n): boolean {\n return isToolApprovalPart(part) || isToolConfirmPart(part)\n}\n\n/** The id of the pending approval request on a tool part, if any. */\nexport function getToolApprovalId(\n part: UIMessage['parts'][number] | null | undefined,\n): string | undefined {\n if (!isToolPart(part)) {\n return undefined\n }\n return (part as { approval?: { id?: string } }).approval?.id\n}\n\nexport function getPartState(\n part: UIMessage['parts'][number] | null | undefined,\n): string | undefined {\n if (!part) {\n return undefined\n }\n if ('state' in part) {\n return part.state\n }\n return undefined\n}\n\nexport function isLoadingState(state?: string): boolean {\n if (!state) {\n return false\n }\n return ['streaming'].includes(state)\n}\n\nexport function getContrast(hexcolor: string = '000000'): 'black' | 'white' {\n let hex = hexcolor.replace('#', '')\n\n // Expand 3-character hex to 6-character (e.g., #ccc -> #cccccc)\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((char) => char + char)\n .join('')\n }\n\n // WCAG relative luminance\n const r = parseInt(hex.substring(0, 2), 16) / 255\n const g = parseInt(hex.substring(2, 4), 16) / 255\n const b = parseInt(hex.substring(4, 6), 16) / 255\n\n const linearize = (c: number) =>\n c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n\n const luminance =\n 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b)\n\n return luminance > 0.179 ? 'black' : 'white'\n}\n\n/**\n * Resolves the contrast color based on the user's `textColor` preference.\n * Falls back to WCAG auto-detection via `getContrast` when set to `'auto'` or `undefined`.\n */\nexport function resolveContrastColor(\n textColor: 'auto' | 'white' | 'black' | undefined,\n mainColor: string | undefined,\n): 'black' | 'white' {\n if (textColor === 'white' || textColor === 'black') {\n return textColor\n }\n return getContrast(mainColor)\n}\n\n/**\n * The style of a chat root (PkChatbot, the widget's shell): the agent's color\n * as the brand. Volver derives every role of the brand (graphic, readable,\n * contrast, tinted surface) on any element with `.theme`, which both roots\n * carry, so the focus ring, the primary buttons, the links and the checkboxes\n * take the agent's color with the contrast each theme needs, instead of the\n * platform's purple. The fields' focus takes the brand's graphic role in both\n * themes, since the dark theme's accent is the platform's too.\n */\nexport function agentThemeStyle(\n mainColor: string | undefined,\n contrastColor: 'black' | 'white',\n): Record<string, string> | undefined {\n if (!mainColor) {\n return undefined\n }\n return {\n '--chatbot-main-color': mainColor,\n '--chatbot-contrast-color': contrastColor,\n '--color-brand': mainColor,\n '--color-brand-contrast': contrastColor,\n '--input-focus-color': 'var(--color-brand-graphic)',\n }\n}\n\n/**\n * Formats a duration in milliseconds using the i18n `seconds` number format\n * (e.g. \"12,4 secondi\" / \"12.4 seconds\"). Returns undefined for durations\n * that would render as \"0 seconds\" (less than 0.05s).\n */\nexport function formatDuration(\n $n: (value: number, format: string) => string,\n ms?: number,\n): string | undefined {\n if (ms === undefined || ms < 50) {\n return undefined\n }\n return $n(ms / 1000, 'seconds')\n}\n\n/**\n * Stringifies a tool payload for the raw fallback view. Returns undefined for\n * empty values so the caller can skip rendering the block entirely.\n */\nexport function stringifyPayload(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined\n }\n if (typeof value === 'string') {\n return value.trim() || undefined\n }\n try {\n const json = JSON.stringify(value, null, 2)\n return json === '{}' || json === '[]' ? undefined : json\n } catch {\n return undefined\n }\n}\n\n/**\n * True when a tool payload carries something worth rendering, so a caller can\n * skip the block without stringifying the value twice.\n */\nexport function hasPayload(value: unknown): boolean {\n return stringifyPayload(value) !== undefined\n}\n\n/**\n * Turns the answers of a form into the sentence the caller would have said.\n *\n * On a call the tool loop is over by the time the form is on screen, so the\n * answers go back to the agent as a user message (see `sendUserMessage` in\n * `useVoiceSession`). Each answer is paired with its question, because that is\n * how a person would say it and because the agent hears it with no widget\n * attached.\n */\nexport function formAnswerAsSpoken(\n part: unknown,\n answer: string | { answers: { id: string; value: unknown }[] },\n): string {\n const input = (\n part as {\n input?: {\n steps?: { id: string; question?: string }[]\n question?: string\n }\n }\n )?.input\n\n if (typeof answer === 'string') {\n const question = input?.question ?? input?.steps?.[0]?.question\n return question ? `${question} ${answer}` : answer\n }\n\n const questionById = new Map(\n (input?.steps ?? []).map((step) => [step.id, step.question]),\n )\n const lines = answer.answers\n .filter(\n ({ value }) =>\n value !== null &&\n value !== '' &&\n !(Array.isArray(value) && !value.length),\n )\n .map(({ id, value }) => {\n const said = Array.isArray(value) ? value.join(', ') : String(value)\n const question = questionById.get(id)\n return question ? `${question} ${said}` : said\n })\n\n return lines.join('. ')\n}\n\n/**\n * The choices of a form step, as the radio and checkbox editors take them.\n *\n * The `value` is the LABEL and not the position, because it is what travels\n * back to the model as the answer: it reads the words it wrote, not an index.\n * Nothing here caps the list, and nothing should: the number of options an\n * agent configures is advice to the model, so a step can legitimately carry\n * more (see `showForm.tool.ts`).\n */\nexport function formStepOptions(\n step: { options?: { label: string; description?: string }[] } | undefined,\n): { label: string; value: string; description?: string }[] {\n if (!step?.options) {\n return []\n }\n return step.options.map((option) => ({\n label: option.label,\n value: option.label,\n description: option.description,\n }))\n}\n\n/**\n * Spreads the answers a form comes back with onto one slot PER STEP.\n *\n * A form's answers travel paired with step ids, and the tool schema does not\n * enforce that those ids are unique: a `.refine()` there would refuse the whole\n * form over a duplicate, which is the failure the schema was just cured of (see\n * the gotchas entry \"A configurable cap does not belong in an inputSchema\").\n * So the duplicate has to be survivable here. Keyed by id, two steps sharing\n * one collapsed onto a single answer: the second question showed the first\n * one's reply, and submitting sent that reply twice. Keyed by position, each\n * step keeps its own.\n *\n * A duplicated id restores the same incoming value to every step claiming it,\n * which is as much as the payload allows: the ids are all it says.\n */\nexport function formAnswerSlots(\n steps: { id: string }[],\n output: unknown,\n): Record<number, unknown> {\n const slots: Record<number, unknown> = {}\n if (output === undefined || output === null) {\n return slots\n }\n // A legacy single-choice answer is the plain string, and it can only\n // belong to a single-step form.\n if (typeof output === 'string') {\n if (steps.length === 1) {\n slots[0] = output\n }\n return slots\n }\n const assign = (id: string, value: unknown) => {\n steps.forEach((step, index) => {\n if (step.id === id) {\n slots[index] = value\n }\n })\n }\n const list = (output as { answers?: unknown }).answers\n if (Array.isArray(list)) {\n for (const answer of list as { id?: unknown; value?: unknown }[]) {\n if (typeof answer?.id === 'string') {\n assign(answer.id, answer.value)\n }\n }\n return slots\n }\n // Forms answered on a platform channel (the Teams modal) come back as a\n // flat record keyed by step id.\n for (const [id, value] of Object.entries(\n output as Record<string, unknown>,\n )) {\n if (value !== undefined) {\n assign(id, value)\n }\n }\n return slots\n}\n\n// Provider-native web search tool part types\nexport const WEB_SEARCH_TOOL_TYPES = [\n 'tool-perplexity_search',\n 'tool-parallel_search',\n 'tool-web_search',\n 'tool-google_search',\n]\n\n// Tool part types with a dedicated rich rendering in PkChatbotStepToolDetail\nconst RICH_DETAIL_TOOL_TYPES = new Set([\n 'tool-searchInKnowledgeBase',\n 'tool-retrieveRevisedAnswers',\n 'tool-expandChunkContext',\n 'tool-readDocumentFile',\n 'tool-getWeather',\n 'tool-geocode',\n 'tool-recallUserMemory',\n 'tool-saveUserMemory',\n ...WEB_SEARCH_TOOL_TYPES,\n])\n\nexport function hasRichToolDetail(\n part?: UIMessage['parts'][number] | null,\n): boolean {\n return isToolPart(part) && RICH_DETAIL_TOOL_TYPES.has(part.type)\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined\n\nconst pickString = (\n record: Record<string, unknown> | undefined,\n ...keys: string[]\n): string | undefined => {\n for (const key of keys) {\n const value = record?.[key]\n if (typeof value === 'string' && value.trim()) {\n return value\n }\n }\n return undefined\n}\n\n/**\n * Returns a short inline summary for a tool part (search queries, location,\n * document name, ...) to be shown next to the step label without expanding\n * the step body.\n */\nexport function getToolPartSummary(\n part?: UIMessage['parts'][number] | null,\n): string | undefined {\n if (!isToolPart(part)) {\n return undefined\n }\n const input = asRecord('input' in part ? part.input : undefined)\n const output = asRecord('output' in part ? part.output : undefined)\n if (\n part.type === 'tool-searchInKnowledgeBase' ||\n WEB_SEARCH_TOOL_TYPES.includes(part.type)\n ) {\n const queries = input?.queries\n if (Array.isArray(queries)) {\n const valid = queries.filter(\n (query): query is string =>\n typeof query === 'string' && Boolean(query.trim()),\n )\n return valid.length ? valid.join(' · ') : undefined\n }\n return pickString(input, 'query', 'objective')\n }\n if (part.type === 'tool-retrieveRevisedAnswers') {\n return pickString(input, 'query')\n }\n if (part.type === 'tool-getWeather') {\n return (\n pickString(output, 'location') ?? pickString(input, 'locationName')\n )\n }\n if (part.type === 'tool-geocode') {\n return pickString(input, 'locationName')\n }\n if (part.type === 'tool-expandChunkContext') {\n return pickString(output, 'documentName')\n }\n if (part.type === 'tool-readDocumentFile') {\n return pickString(output, 'name')\n }\n if (part.type === 'tool-readSpreadsheet') {\n const sheet = pickString(input, 'sheet')\n const range = pickString(input, 'range')\n return sheet && range ? `${sheet}!${range}` : sheet\n }\n if (part.type === 'tool-editSpreadsheet') {\n return pickString(output, 'filename')\n }\n if (part.type === 'tool-querySpreadsheet') {\n // The file when the step asked for the schema; a query has no name.\n return pickString(output, 'file')\n }\n if (part.type === 'tool-recallUserMemory') {\n return pickString(input, 'query')\n }\n if (part.type === 'tool-saveUserMemory') {\n return pickString(input, 'content', 'query')\n }\n return undefined\n}\n\n// Get part icon\nexport function getPartIcon(\n part?: UIMessage['parts'][number] | null,\n): string | undefined {\n if (isToolPart(part)) {\n if (part.type.includes('tool-subagent')) {\n return 'ri:robot-2-line'\n }\n if (part.type === 'tool-runWorker') {\n return 'ri:flow-chart'\n }\n if (part.type === 'tool-scheduleWakeup') {\n return 'ri:alarm-line'\n }\n if (part.type === 'tool-fetchTeamsChannelHistory') {\n return 'ri:chat-history-line'\n }\n if (part.type === 'tool-readEarlierMessages') {\n return 'ri:history-line'\n }\n if (part.type === 'tool-enableTools') {\n return 'ri:toggle-line'\n }\n if (part.type.includes('tool-mcp')) {\n return 'mcp'\n }\n if (part.type === 'tool-retrieveRevisedAnswers') {\n return 'ri:file-edit-line'\n }\n if (part.type === 'tool-searchInKnowledgeBase') {\n return 'ri:search-line'\n }\n if (part.type === 'tool-expandChunkContext') {\n return 'ri:file-search-line'\n }\n if (part.type === 'tool-readDocumentFile') {\n return 'ri:file-text-line'\n }\n if (part.type === 'tool-readSpreadsheet') {\n return 'ri:table-line'\n }\n if (part.type === 'tool-editSpreadsheet') {\n return 'ri:file-excel-2-line'\n }\n if (part.type === 'tool-querySpreadsheet') {\n return 'ri:database-2-line'\n }\n if (part.type === 'tool-geocode') {\n return 'ri:map-2-line'\n }\n if (part.type === 'tool-getWeather') {\n return 'ri:sun-cloudy-line'\n }\n if (part.type === 'tool-recallUserMemory') {\n return 'ri:brain-line'\n }\n if (part.type === 'tool-saveUserMemory') {\n return 'ri:save-3-line'\n }\n if (part.type === 'tool-showWeather') {\n return 'ri:sun-line'\n }\n if (part.type === 'tool-showDiagram') {\n return 'ri:flow-chart'\n }\n if (part.type === 'tool-showSources') {\n return 'ri:book-2-line'\n }\n if (part.type === 'tool-showForm') {\n return 'ri:survey-line'\n }\n if (part.type === 'tool-showMultipleChoice') {\n return 'ri:checkbox-multiple-line'\n }\n if (part.type === 'tool-showArtifact') {\n return 'ri:file-code-line'\n }\n if (part.type === 'tool-showEmail') {\n return 'ri:mail-line'\n }\n if (part.type === 'tool-showMessage') {\n return 'ri:chat-1-line'\n }\n if (part.type === 'tool-showWebPages') {\n return 'ri:pages-line'\n }\n if (part.type === 'tool-showProductList') {\n return 'ri:shopping-bag-line'\n }\n if (part.type === 'tool-showContactForm') {\n return 'ri:send-plane-2-line'\n }\n if (part.type === 'tool-showCalendarEvent') {\n return 'ri:calendar-event-line'\n }\n if (part.type === 'tool-showComparison') {\n return 'ri:scales-line'\n }\n if (part.type === 'tool-showLocation') {\n return 'ri:map-pin-line'\n }\n if (part.type === 'tool-showQrCode') {\n return 'ri:qr-code-line'\n }\n if (part.type === 'tool-showImageGallery') {\n return 'ri:image-line'\n }\n if (part.type === 'tool-showVideo') {\n return 'ri:film-line'\n }\n if (part.type === 'tool-showSuggestedReply') {\n return 'ri:corner-down-right-line'\n }\n if (part.type === 'tool-requestGeolocation') {\n return 'ri:map-pin-user-line'\n }\n if (part.type === 'tool-disconnectOAuthConnection') {\n return 'ri:link-unlink'\n }\n if (\n part.type === 'tool-perplexity_search' ||\n part.type === 'tool-parallel_search' ||\n part.type === 'tool-web_search' ||\n part.type === 'tool-google_search'\n ) {\n return 'ri:global-line'\n }\n return 'ri:tools-line'\n }\n if (isReasoningPart(part)) {\n return 'ri:lightbulb-line'\n }\n if (isTextPart(part)) {\n return 'ri:double-quotes-r'\n }\n return undefined\n}\n\n// Get part label\nexport function getToolPartLabel(\n $t: (key: string) => string,\n part?: UIMessage['parts'][number] | null,\n): string | undefined {\n if (isToolPart(part)) {\n if (part.type.includes('tool-subagent')) {\n return $t(`messagePart.runSubagent`)\n }\n if (part.type === 'tool-runWorker') {\n return $t(`messagePart.runWorker`)\n }\n if (part.type === 'tool-scheduleWakeup') {\n return $t(`messagePart.scheduleWakeup`)\n }\n if (part.type === 'tool-fetchTeamsChannelHistory') {\n return $t(`messagePart.fetchTeamsChannelHistory`)\n }\n if (part.type === 'tool-readEarlierMessages') {\n return $t(`messagePart.readEarlierMessages`)\n }\n if (part.type === 'tool-enableTools') {\n return $t(`messagePart.enableTools`)\n }\n if (part.type === 'tool-retrieveRevisedAnswers') {\n return $t(`messagePart.revisedAnswers`)\n }\n if (part.type === 'tool-searchInKnowledgeBase') {\n return $t(`messagePart.searchingDocuments`)\n }\n if (part.type === 'tool-expandChunkContext') {\n return $t(`messagePart.expandChunkContext`)\n }\n if (part.type === 'tool-readDocumentFile') {\n return $t(`messagePart.readDocumentFile`)\n }\n if (part.type === 'tool-readSpreadsheet') {\n return $t(`messagePart.readSpreadsheet`)\n }\n if (part.type === 'tool-editSpreadsheet') {\n return $t(`messagePart.editSpreadsheet`)\n }\n if (part.type === 'tool-querySpreadsheet') {\n return $t(`messagePart.querySpreadsheet`)\n }\n if (part.type === 'tool-geocode') {\n return $t(`messagePart.geocode`)\n }\n if (part.type === 'tool-getWeather') {\n return $t(`messagePart.getWeather`)\n }\n if (part.type === 'tool-recallUserMemory') {\n return $t(`messagePart.recallUserMemory`)\n }\n if (part.type === 'tool-saveUserMemory') {\n return $t(`messagePart.saveUserMemory`)\n }\n if (part.type === 'tool-showWeather') {\n return $t(`messagePart.showWeather`)\n }\n if (part.type === 'tool-showForm') {\n return $t(`messagePart.showForm`)\n }\n if (part.type === 'tool-showDiagram') {\n return $t(`messagePart.showDiagram`)\n }\n if (part.type === 'tool-showSources') {\n return $t(`messagePart.showSources`)\n }\n if (part.type === 'tool-showMultipleChoice') {\n return $t(`messagePart.showMultipleChoice`)\n }\n if (part.type === 'tool-showArtifact') {\n return $t(`messagePart.showArtifact`)\n }\n if (part.type === 'tool-showEmail') {\n return $t(`messagePart.showEmail`)\n }\n if (part.type === 'tool-showMessage') {\n return $t(`messagePart.showMessage`)\n }\n if (part.type === 'tool-showWebPages') {\n return $t(`messagePart.showWebPages`)\n }\n if (part.type === 'tool-showProducts') {\n return $t(`messagePart.showProducts`)\n }\n if (part.type === 'tool-showContactForm') {\n return $t(`messagePart.showContactForm`)\n }\n if (part.type === 'tool-showCalendarEvent') {\n return $t(`messagePart.showCalendarEvent`)\n }\n if (part.type === 'tool-showComparison') {\n return $t(`messagePart.showComparison`)\n }\n if (part.type === 'tool-showLocation') {\n return $t(`messagePart.showLocation`)\n }\n if (part.type === 'tool-showQrCode') {\n return $t(`messagePart.showQrCode`)\n }\n if (part.type === 'tool-showImageGallery') {\n return $t(`messagePart.showImageGallery`)\n }\n if (part.type === 'tool-showVideo') {\n return $t(`messagePart.showVideo`)\n }\n if (part.type === 'tool-showSuggestedReply') {\n return $t(`messagePart.showSuggestedReply`)\n }\n if (part.type === 'tool-requestGeolocation') {\n return $t(`messagePart.requestGeolocation`)\n }\n if (part.type === 'tool-disconnectOAuthConnection') {\n return $t(`messagePart.disconnectOAuthConnection`)\n }\n if (WEB_SEARCH_TOOL_TYPES.includes(part.type)) {\n return $t(`messagePart.webSearch`)\n }\n return $t(`messagePart.tool`)\n }\n if (isReasoningPart(part)) {\n return $t(`messagePart.reasoning`)\n }\n return $t(`messagePart.streaming`)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils-CwIMEuAv.js","names":["isPresentationTool","isTextPart","getToolPartName","isToolPart","isReasoningPart","mergeConsecutiveTextParts","merged","part","parts","prev","isWidgetPart","dropCorrectedWidgetErrors","lastDrawn","index","isStreamingPart","FILE_OUTPUT_PARTS","moveFileOutputsLast","files","feedPartKey","toolCallId","LIVE_REASONING_TAIL_LENGTH","FENCE_LINE","getMarkdownTail","markdown","maxLength","from","limit","boundary","length","cut","openFence","match","marker","rest","TOOL_APPROVAL_STATES","isToolApprovalPart","CONFIRM_TOOL_NAME","isToolConfirmPart","isConfirmationCardPart","getToolApprovalId","getPartState","isLoadingState","state","getContrast","hex","hexcolor","char","r","g","b","linearize","c","resolveContrastColor","textColor","mainColor","agentThemeStyle","contrastColor","formatDuration","ms","$n","stringifyPayload","value","json","hasPayload","formAnswerAsSpoken","input","answer","question","questionById","step","said","id","formStepOptions","option","formAnswerSlots","slots","output","steps","assign","list","WEB_SEARCH_TOOL_TYPES","RICH_DETAIL_TOOL_TYPES","hasRichToolDetail","asRecord","pickString","keys","key","record","getToolPartSummary","queries","valid","query","sheet","range","getPartIcon","getToolPartLabel","$t"],"sources":["../../../../packages/components/src/chat/utils.ts"],"sourcesContent":["import type { UIMessage } from 'ai'\nimport { isPresentationTool } from 'models'\nimport {\n isTextPart,\n isFilePart,\n isToolPart,\n isReasoningPart,\n hasPartText,\n hasTextPart,\n getTextPart,\n getMessageText,\n getToolPartName,\n} from 'utils'\n\nexport {\n isTextPart,\n isFilePart,\n isToolPart,\n isReasoningPart,\n hasPartText,\n hasTextPart,\n getTextPart,\n getMessageText,\n}\n\n/**\n * Merges consecutive text parts into a single text part.\n * Claude (and other models) often produce multiple text parts during streaming\n * that should logically be a single block of text.\n */\nexport function mergeConsecutiveTextParts(\n parts: UIMessage['parts'],\n): UIMessage['parts'] {\n const merged: UIMessage['parts'] = []\n for (const part of parts) {\n if (!isTextPart(part)) {\n merged.push(part)\n continue\n }\n const prev = merged[merged.length - 1]\n if (prev && isTextPart(prev)) {\n merged[merged.length - 1] = { ...prev, text: prev.text + part.text }\n } else {\n merged.push(part)\n }\n }\n return merged\n}\n\nconst isWidgetPart = (\n part: UIMessage['parts'][number],\n): part is Extract<UIMessage['parts'][number], { type: `tool-${string}` }> =>\n isToolPart(part) && isPresentationTool(getToolPartName(part))\n\n/**\n * Drops a widget call refused for its arguments when a later call of the same\n * widget in the message was drawn: the turn corrected it (the backend's\n * `correctableInputRefusals`), and the refusal would sit next to the working\n * widget, `showForm` drawing its render error above the form. A refusal with\n * nothing drawn after it stays. Only the feed reads this: the steps timeline\n * keeps every call, the refused one included.\n */\nexport function dropCorrectedWidgetErrors(\n parts: UIMessage['parts'],\n): UIMessage['parts'] {\n const lastDrawn = new Map<string, number>()\n for (const [index, part] of parts.entries()) {\n if (\n isWidgetPart(part) &&\n part.state !== 'output-error' &&\n !isStreamingPart(part)\n ) {\n lastDrawn.set(part.type, index)\n }\n }\n return parts.filter(\n (part, index) =>\n !(\n isWidgetPart(part) &&\n part.state === 'output-error' &&\n (lastDrawn.get(part.type) ?? -1) > index\n ),\n )\n}\n\n/**\n * Tool calls whose output is a file for the user to download. The feed draws\n * them after the answer, where the reader arrives, wherever in the message the\n * model made the call: a version written before a long answer sat above it,\n * out of sight.\n */\nconst FILE_OUTPUT_PARTS: ReadonlySet<string> = new Set(['tool-editSpreadsheet'])\n\n/** The parts with the file outputs moved last, in their own order. */\nexport function moveFileOutputsLast(\n parts: UIMessage['parts'],\n): UIMessage['parts'] {\n const files = parts.filter((part) => FILE_OUTPUT_PARTS.has(part.type))\n return files.length > 0\n ? [\n ...parts.filter((part) => !FILE_OUTPUT_PARTS.has(part.type)),\n ...files,\n ]\n : parts\n}\n\n/**\n * The key of a part in the feed. Its position, except for a file output: that\n * one is always last, so its position moves as the answer grows, and keyed by\n * it the card would be redrawn at every new part.\n */\nexport function feedPartKey(\n part: UIMessage['parts'][number],\n index: number,\n): string | number {\n const toolCallId = (part as { toolCallId?: string }).toolCallId\n return FILE_OUTPUT_PARTS.has(part.type) && toolCallId\n ? `file-${toolCallId}`\n : index\n}\n\nexport function isStreamingPart(\n part: UIMessage['parts'][number] | null | undefined,\n): part is Extract<UIMessage['parts'][number], { streaming?: boolean }> {\n if (!part) {\n return false\n }\n if ('state' in part) {\n return part.state === 'streaming' || part.state === 'input-streaming'\n }\n return false\n}\n\n/**\n * How much of a reasoning still being written its live box renders. The box is\n * a few lines tall and follows the bottom, while the reasoning of one turn runs\n * to tens of kilobytes: chat `st0Eg8iG0zUX0HQN` wrote 92KB, and parsing all of\n * it at every delta froze the tab. Four thousand characters leave a few screens\n * to scroll back through, and a finished step renders all of it.\n */\nexport const LIVE_REASONING_TAIL_LENGTH = 4000\n\n// A fence opener or closer, also inside a list item or a quote, whose markers\n// and indentation are skipped. The rest of the line tells them apart: a\n// closing fence carries no info string.\nconst FENCE_LINE =\n /^[ \\t]*(?:(?:[-*+]|\\d{1,9}[.)])[ \\t]+|>[ \\t]?)*(`{3,}|~{3,})(.*)$/gm\n\n/**\n * The end of a markdown text, at most `maxLength` characters long, cut on a\n * blank line (a line break when there is none) so it does not open on half a\n * paragraph. A table or a formula can still be cut in two. An ellipsis marks\n * the cut. A cut inside a fenced code block reopens the fence, or the rest of\n * the text would render as code and the code as prose.\n */\nexport function getMarkdownTail(markdown: string, maxLength: number): string {\n if (markdown.length <= maxLength) {\n return markdown\n }\n const from = markdown.length - maxLength\n // The boundary is looked for in the first half of the window only: the one\n // blank line of the window can be the last thing written, and cutting there\n // would leave nothing to render.\n const limit = from + maxLength / 2\n const boundary = (index: number, length: number) =>\n index !== -1 && index < limit ? index + length : undefined\n const cut =\n boundary(markdown.indexOf('\\n\\n', from), 2) ??\n boundary(markdown.indexOf('\\n', from), 1) ??\n from\n let openFence: string | undefined\n for (const match of markdown.matchAll(FENCE_LINE)) {\n if (match.index >= cut) {\n break\n }\n const [, marker, rest] = match\n if (!openFence) {\n // A backtick in a backtick fence's info string makes it inline\n // code, not a fence.\n if (marker[0] === '`' && rest.includes('`')) {\n continue\n }\n openFence = marker\n } else if (\n marker[0] === openFence[0] &&\n marker.length >= openFence.length &&\n !rest.trim()\n ) {\n openFence = undefined\n }\n }\n const reopen = openFence ? `${openFence}\\n` : ''\n return `…\\n\\n${reopen}${markdown.slice(cut)}`\n}\n\n/**\n * States a tool part goes through when it needs the user's approval. They are\n * rendered by `PkToolApprovalCard` whatever the tool is, so the decision (and\n * its outcome) stays visible in the transcript.\n */\nconst TOOL_APPROVAL_STATES = new Set([\n 'approval-requested',\n 'approval-responded',\n 'output-denied',\n])\n\nexport function isToolApprovalPart(\n part: UIMessage['parts'][number] | null | undefined,\n): boolean {\n if (!isToolPart(part)) {\n return false\n }\n if (TOOL_APPROVAL_STATES.has(part.state)) {\n return true\n }\n // An executed (or errored) call that went through the gate keeps its\n // verdict in `approval`: the card stays in the transcript, so the user's\n // decision remains visible in the chat and in the log viewers (parity\n // with requestConfirm, whose 'confirmed' output is persisted).\n return (part as { approval?: unknown }).approval != null\n}\n\n/**\n * The client-side tool the model uses to have an action it described approved.\n * It predates the SDK's approval gate and keeps its own round-trip (it resolves\n * through `addToolOutput`), but it asks the user the very same question, so it\n * shares `PkToolApprovalCard` instead of having a card of its own.\n */\nexport const CONFIRM_TOOL_NAME = 'requestConfirm'\n\nexport function isToolConfirmPart(\n part: UIMessage['parts'][number] | null | undefined,\n): boolean {\n return isToolPart(part) && part.type === `tool-${CONFIRM_TOOL_NAME}`\n}\n\n/** True for any part the confirmation card is responsible for. */\nexport function isConfirmationCardPart(\n part: UIMessage['parts'][number] | null | undefined,\n): boolean {\n return isToolApprovalPart(part) || isToolConfirmPart(part)\n}\n\n/** The id of the pending approval request on a tool part, if any. */\nexport function getToolApprovalId(\n part: UIMessage['parts'][number] | null | undefined,\n): string | undefined {\n if (!isToolPart(part)) {\n return undefined\n }\n return (part as { approval?: { id?: string } }).approval?.id\n}\n\nexport function getPartState(\n part: UIMessage['parts'][number] | null | undefined,\n): string | undefined {\n if (!part) {\n return undefined\n }\n if ('state' in part) {\n return part.state\n }\n return undefined\n}\n\nexport function isLoadingState(state?: string): boolean {\n if (!state) {\n return false\n }\n return ['streaming'].includes(state)\n}\n\nexport function getContrast(hexcolor: string = '000000'): 'black' | 'white' {\n let hex = hexcolor.replace('#', '')\n\n // Expand 3-character hex to 6-character (e.g., #ccc -> #cccccc)\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((char) => char + char)\n .join('')\n }\n\n // WCAG relative luminance\n const r = parseInt(hex.substring(0, 2), 16) / 255\n const g = parseInt(hex.substring(2, 4), 16) / 255\n const b = parseInt(hex.substring(4, 6), 16) / 255\n\n const linearize = (c: number) =>\n c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n\n const luminance =\n 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b)\n\n return luminance > 0.179 ? 'black' : 'white'\n}\n\n/**\n * Resolves the contrast color based on the user's `textColor` preference.\n * Falls back to WCAG auto-detection via `getContrast` when set to `'auto'` or `undefined`.\n */\nexport function resolveContrastColor(\n textColor: 'auto' | 'white' | 'black' | undefined,\n mainColor: string | undefined,\n): 'black' | 'white' {\n if (textColor === 'white' || textColor === 'black') {\n return textColor\n }\n return getContrast(mainColor)\n}\n\n/**\n * The style of a chat root (PkChatbot, the widget's shell): the agent's color\n * as the brand. Volver derives every role of the brand (graphic, readable,\n * contrast, tinted surface) on any element with `.theme`, which both roots\n * carry, so the focus ring, the primary buttons, the links and the checkboxes\n * take the agent's color with the contrast each theme needs, instead of the\n * platform's purple. The fields' focus takes the brand's graphic role in both\n * themes, since the dark theme's accent is the platform's too.\n */\nexport function agentThemeStyle(\n mainColor: string | undefined,\n contrastColor: 'black' | 'white',\n): Record<string, string> | undefined {\n if (!mainColor) {\n return undefined\n }\n return {\n '--chatbot-main-color': mainColor,\n '--chatbot-contrast-color': contrastColor,\n '--color-brand': mainColor,\n '--color-brand-contrast': contrastColor,\n '--input-focus-color': 'var(--color-brand-graphic)',\n }\n}\n\n/**\n * Formats a duration in milliseconds using the i18n `seconds` number format\n * (e.g. \"12,4 secondi\" / \"12.4 seconds\"). Returns undefined for durations\n * that would render as \"0 seconds\" (less than 0.05s).\n */\nexport function formatDuration(\n $n: (value: number, format: string) => string,\n ms?: number,\n): string | undefined {\n if (ms === undefined || ms < 50) {\n return undefined\n }\n return $n(ms / 1000, 'seconds')\n}\n\n/**\n * Stringifies a tool payload for the raw fallback view. Returns undefined for\n * empty values so the caller can skip rendering the block entirely.\n */\nexport function stringifyPayload(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined\n }\n if (typeof value === 'string') {\n return value.trim() || undefined\n }\n try {\n const json = JSON.stringify(value, null, 2)\n return json === '{}' || json === '[]' ? undefined : json\n } catch {\n return undefined\n }\n}\n\n/**\n * True when a tool payload carries something worth rendering, so a caller can\n * skip the block without stringifying the value twice.\n */\nexport function hasPayload(value: unknown): boolean {\n return stringifyPayload(value) !== undefined\n}\n\n/**\n * Turns the answers of a form into the sentence the caller would have said.\n *\n * On a call the tool loop is over by the time the form is on screen, so the\n * answers go back to the agent as a user message (see `sendUserMessage` in\n * `useVoiceSession`). Each answer is paired with its question, because that is\n * how a person would say it and because the agent hears it with no widget\n * attached.\n */\nexport function formAnswerAsSpoken(\n part: unknown,\n answer: string | { answers: { id: string; value: unknown }[] },\n): string {\n const input = (\n part as {\n input?: {\n steps?: { id: string; question?: string }[]\n question?: string\n }\n }\n )?.input\n\n if (typeof answer === 'string') {\n const question = input?.question ?? input?.steps?.[0]?.question\n return question ? `${question} ${answer}` : answer\n }\n\n const questionById = new Map(\n (input?.steps ?? []).map((step) => [step.id, step.question]),\n )\n const lines = answer.answers\n .filter(\n ({ value }) =>\n value !== null &&\n value !== '' &&\n !(Array.isArray(value) && !value.length),\n )\n .map(({ id, value }) => {\n const said = Array.isArray(value) ? value.join(', ') : String(value)\n const question = questionById.get(id)\n return question ? `${question} ${said}` : said\n })\n\n return lines.join('. ')\n}\n\n/**\n * The choices of a form step, as the radio and checkbox editors take them.\n *\n * The `value` is the LABEL and not the position, because it is what travels\n * back to the model as the answer: it reads the words it wrote, not an index.\n * Nothing here caps the list, and nothing should: the number of options an\n * agent configures is advice to the model, so a step can legitimately carry\n * more (see `showForm.tool.ts`).\n */\nexport function formStepOptions(\n step: { options?: { label: string; description?: string }[] } | undefined,\n): { label: string; value: string; description?: string }[] {\n if (!step?.options) {\n return []\n }\n return step.options.map((option) => ({\n label: option.label,\n value: option.label,\n description: option.description,\n }))\n}\n\n/**\n * Spreads the answers a form comes back with onto one slot PER STEP.\n *\n * A form's answers travel paired with step ids, and the tool schema does not\n * enforce that those ids are unique: a `.refine()` there would refuse the whole\n * form over a duplicate, which is the failure the schema was just cured of (see\n * the gotchas entry \"A configurable cap does not belong in an inputSchema\").\n * So the duplicate has to be survivable here. Keyed by id, two steps sharing\n * one collapsed onto a single answer: the second question showed the first\n * one's reply, and submitting sent that reply twice. Keyed by position, each\n * step keeps its own.\n *\n * A duplicated id restores the same incoming value to every step claiming it,\n * which is as much as the payload allows: the ids are all it says.\n */\nexport function formAnswerSlots(\n steps: { id: string }[],\n output: unknown,\n): Record<number, unknown> {\n const slots: Record<number, unknown> = {}\n if (output === undefined || output === null) {\n return slots\n }\n // A legacy single-choice answer is the plain string, and it can only\n // belong to a single-step form.\n if (typeof output === 'string') {\n if (steps.length === 1) {\n slots[0] = output\n }\n return slots\n }\n const assign = (id: string, value: unknown) => {\n steps.forEach((step, index) => {\n if (step.id === id) {\n slots[index] = value\n }\n })\n }\n const list = (output as { answers?: unknown }).answers\n if (Array.isArray(list)) {\n for (const answer of list as { id?: unknown; value?: unknown }[]) {\n if (typeof answer?.id === 'string') {\n assign(answer.id, answer.value)\n }\n }\n return slots\n }\n // Forms answered on a platform channel (the Teams modal) come back as a\n // flat record keyed by step id.\n for (const [id, value] of Object.entries(\n output as Record<string, unknown>,\n )) {\n if (value !== undefined) {\n assign(id, value)\n }\n }\n return slots\n}\n\n// Provider-native web search tool part types\nexport const WEB_SEARCH_TOOL_TYPES = [\n 'tool-perplexity_search',\n 'tool-parallel_search',\n 'tool-web_search',\n 'tool-google_search',\n]\n\n// Tool part types with a dedicated rich rendering in PkChatbotStepToolDetail\nconst RICH_DETAIL_TOOL_TYPES = new Set([\n 'tool-searchInKnowledgeBase',\n 'tool-retrieveRevisedAnswers',\n 'tool-expandChunkContext',\n 'tool-readDocumentFile',\n 'tool-getWeather',\n 'tool-geocode',\n 'tool-recallUserMemory',\n 'tool-saveUserMemory',\n ...WEB_SEARCH_TOOL_TYPES,\n])\n\nexport function hasRichToolDetail(\n part?: UIMessage['parts'][number] | null,\n): boolean {\n return isToolPart(part) && RICH_DETAIL_TOOL_TYPES.has(part.type)\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined\n\nconst pickString = (\n record: Record<string, unknown> | undefined,\n ...keys: string[]\n): string | undefined => {\n for (const key of keys) {\n const value = record?.[key]\n if (typeof value === 'string' && value.trim()) {\n return value\n }\n }\n return undefined\n}\n\n/**\n * Returns a short inline summary for a tool part (search queries, location,\n * document name, ...) to be shown next to the step label without expanding\n * the step body.\n */\nexport function getToolPartSummary(\n part?: UIMessage['parts'][number] | null,\n): string | undefined {\n if (!isToolPart(part)) {\n return undefined\n }\n const input = asRecord('input' in part ? part.input : undefined)\n const output = asRecord('output' in part ? part.output : undefined)\n if (\n part.type === 'tool-searchInKnowledgeBase' ||\n WEB_SEARCH_TOOL_TYPES.includes(part.type)\n ) {\n const queries = input?.queries\n if (Array.isArray(queries)) {\n const valid = queries.filter(\n (query): query is string =>\n typeof query === 'string' && Boolean(query.trim()),\n )\n return valid.length ? valid.join(' · ') : undefined\n }\n return pickString(input, 'query', 'objective')\n }\n if (part.type === 'tool-retrieveRevisedAnswers') {\n return pickString(input, 'query')\n }\n if (part.type === 'tool-getWeather') {\n return (\n pickString(output, 'location') ?? pickString(input, 'locationName')\n )\n }\n if (part.type === 'tool-geocode') {\n return pickString(input, 'locationName')\n }\n if (part.type === 'tool-expandChunkContext') {\n return pickString(output, 'documentName')\n }\n if (part.type === 'tool-readDocumentFile') {\n return pickString(output, 'name')\n }\n if (part.type === 'tool-readSpreadsheet') {\n const sheet = pickString(input, 'sheet')\n const range = pickString(input, 'range')\n return sheet && range ? `${sheet}!${range}` : sheet\n }\n if (part.type === 'tool-editSpreadsheet') {\n return pickString(output, 'filename')\n }\n if (part.type === 'tool-querySpreadsheet') {\n // The file when the step asked for the schema; a query has no name.\n return pickString(output, 'file')\n }\n if (part.type === 'tool-recallUserMemory') {\n return pickString(input, 'query')\n }\n if (part.type === 'tool-saveUserMemory') {\n return pickString(input, 'content', 'query')\n }\n return undefined\n}\n\n// Get part icon\nexport function getPartIcon(\n part?: UIMessage['parts'][number] | null,\n): string | undefined {\n if (isToolPart(part)) {\n if (part.type.includes('tool-subagent')) {\n return 'ri:robot-2-line'\n }\n if (part.type === 'tool-runWorker') {\n return 'ri:flow-chart'\n }\n if (part.type === 'tool-scheduleWakeup') {\n return 'ri:alarm-line'\n }\n if (part.type === 'tool-fetchTeamsChannelHistory') {\n return 'ri:chat-history-line'\n }\n if (part.type === 'tool-readEarlierMessages') {\n return 'ri:history-line'\n }\n if (part.type === 'tool-enableTools') {\n return 'ri:toggle-line'\n }\n if (part.type.includes('tool-mcp')) {\n return 'mcp'\n }\n if (part.type === 'tool-retrieveRevisedAnswers') {\n return 'ri:file-edit-line'\n }\n if (part.type === 'tool-searchInKnowledgeBase') {\n return 'ri:search-line'\n }\n if (part.type === 'tool-expandChunkContext') {\n return 'ri:file-search-line'\n }\n if (part.type === 'tool-readDocumentFile') {\n return 'ri:file-text-line'\n }\n if (part.type === 'tool-readSpreadsheet') {\n return 'ri:table-line'\n }\n if (part.type === 'tool-editSpreadsheet') {\n return 'ri:file-excel-2-line'\n }\n if (part.type === 'tool-querySpreadsheet') {\n return 'ri:database-2-line'\n }\n if (part.type === 'tool-geocode') {\n return 'ri:map-2-line'\n }\n if (part.type === 'tool-getWeather') {\n return 'ri:sun-cloudy-line'\n }\n if (part.type === 'tool-recallUserMemory') {\n return 'ri:brain-line'\n }\n if (part.type === 'tool-saveUserMemory') {\n return 'ri:save-3-line'\n }\n if (part.type === 'tool-showWeather') {\n return 'ri:sun-line'\n }\n if (part.type === 'tool-showDiagram') {\n return 'ri:flow-chart'\n }\n if (part.type === 'tool-showSources') {\n return 'ri:book-2-line'\n }\n if (part.type === 'tool-showForm') {\n return 'ri:survey-line'\n }\n if (part.type === 'tool-showMultipleChoice') {\n return 'ri:checkbox-multiple-line'\n }\n if (part.type === 'tool-showArtifact') {\n return 'ri:file-code-line'\n }\n if (part.type === 'tool-showEmail') {\n return 'ri:mail-line'\n }\n if (part.type === 'tool-showMessage') {\n return 'ri:chat-1-line'\n }\n if (part.type === 'tool-showWebPages') {\n return 'ri:pages-line'\n }\n if (part.type === 'tool-showProductList') {\n return 'ri:shopping-bag-line'\n }\n if (part.type === 'tool-showContactForm') {\n return 'ri:send-plane-2-line'\n }\n if (part.type === 'tool-showCalendarEvent') {\n return 'ri:calendar-event-line'\n }\n if (part.type === 'tool-showComparison') {\n return 'ri:scales-line'\n }\n if (part.type === 'tool-showLocation') {\n return 'ri:map-pin-line'\n }\n if (part.type === 'tool-showQrCode') {\n return 'ri:qr-code-line'\n }\n if (part.type === 'tool-showImageGallery') {\n return 'ri:image-line'\n }\n if (part.type === 'tool-showVideo') {\n return 'ri:film-line'\n }\n if (part.type === 'tool-showSuggestedReply') {\n return 'ri:corner-down-right-line'\n }\n if (part.type === 'tool-requestGeolocation') {\n return 'ri:map-pin-user-line'\n }\n if (part.type === 'tool-disconnectOAuthConnection') {\n return 'ri:link-unlink'\n }\n if (part.type === 'tool-requestAccountLink') {\n return 'ri:link'\n }\n if (part.type === 'tool-unlinkAccount') {\n return 'ri:link-unlink'\n }\n if (\n part.type === 'tool-perplexity_search' ||\n part.type === 'tool-parallel_search' ||\n part.type === 'tool-web_search' ||\n part.type === 'tool-google_search'\n ) {\n return 'ri:global-line'\n }\n return 'ri:tools-line'\n }\n if (isReasoningPart(part)) {\n return 'ri:lightbulb-line'\n }\n if (isTextPart(part)) {\n return 'ri:double-quotes-r'\n }\n return undefined\n}\n\n// Get part label\nexport function getToolPartLabel(\n $t: (key: string) => string,\n part?: UIMessage['parts'][number] | null,\n): string | undefined {\n if (isToolPart(part)) {\n if (part.type.includes('tool-subagent')) {\n return $t(`messagePart.runSubagent`)\n }\n if (part.type === 'tool-runWorker') {\n return $t(`messagePart.runWorker`)\n }\n if (part.type === 'tool-scheduleWakeup') {\n return $t(`messagePart.scheduleWakeup`)\n }\n if (part.type === 'tool-fetchTeamsChannelHistory') {\n return $t(`messagePart.fetchTeamsChannelHistory`)\n }\n if (part.type === 'tool-readEarlierMessages') {\n return $t(`messagePart.readEarlierMessages`)\n }\n if (part.type === 'tool-enableTools') {\n return $t(`messagePart.enableTools`)\n }\n if (part.type === 'tool-retrieveRevisedAnswers') {\n return $t(`messagePart.revisedAnswers`)\n }\n if (part.type === 'tool-searchInKnowledgeBase') {\n return $t(`messagePart.searchingDocuments`)\n }\n if (part.type === 'tool-expandChunkContext') {\n return $t(`messagePart.expandChunkContext`)\n }\n if (part.type === 'tool-readDocumentFile') {\n return $t(`messagePart.readDocumentFile`)\n }\n if (part.type === 'tool-readSpreadsheet') {\n return $t(`messagePart.readSpreadsheet`)\n }\n if (part.type === 'tool-editSpreadsheet') {\n return $t(`messagePart.editSpreadsheet`)\n }\n if (part.type === 'tool-querySpreadsheet') {\n return $t(`messagePart.querySpreadsheet`)\n }\n if (part.type === 'tool-geocode') {\n return $t(`messagePart.geocode`)\n }\n if (part.type === 'tool-getWeather') {\n return $t(`messagePart.getWeather`)\n }\n if (part.type === 'tool-recallUserMemory') {\n return $t(`messagePart.recallUserMemory`)\n }\n if (part.type === 'tool-saveUserMemory') {\n return $t(`messagePart.saveUserMemory`)\n }\n if (part.type === 'tool-showWeather') {\n return $t(`messagePart.showWeather`)\n }\n if (part.type === 'tool-showForm') {\n return $t(`messagePart.showForm`)\n }\n if (part.type === 'tool-showDiagram') {\n return $t(`messagePart.showDiagram`)\n }\n if (part.type === 'tool-showSources') {\n return $t(`messagePart.showSources`)\n }\n if (part.type === 'tool-showMultipleChoice') {\n return $t(`messagePart.showMultipleChoice`)\n }\n if (part.type === 'tool-showArtifact') {\n return $t(`messagePart.showArtifact`)\n }\n if (part.type === 'tool-showEmail') {\n return $t(`messagePart.showEmail`)\n }\n if (part.type === 'tool-showMessage') {\n return $t(`messagePart.showMessage`)\n }\n if (part.type === 'tool-showWebPages') {\n return $t(`messagePart.showWebPages`)\n }\n if (part.type === 'tool-showProducts') {\n return $t(`messagePart.showProducts`)\n }\n if (part.type === 'tool-showContactForm') {\n return $t(`messagePart.showContactForm`)\n }\n if (part.type === 'tool-showCalendarEvent') {\n return $t(`messagePart.showCalendarEvent`)\n }\n if (part.type === 'tool-showComparison') {\n return $t(`messagePart.showComparison`)\n }\n if (part.type === 'tool-showLocation') {\n return $t(`messagePart.showLocation`)\n }\n if (part.type === 'tool-showQrCode') {\n return $t(`messagePart.showQrCode`)\n }\n if (part.type === 'tool-showImageGallery') {\n return $t(`messagePart.showImageGallery`)\n }\n if (part.type === 'tool-showVideo') {\n return $t(`messagePart.showVideo`)\n }\n if (part.type === 'tool-showSuggestedReply') {\n return $t(`messagePart.showSuggestedReply`)\n }\n if (part.type === 'tool-requestGeolocation') {\n return $t(`messagePart.requestGeolocation`)\n }\n if (part.type === 'tool-disconnectOAuthConnection') {\n return $t(`messagePart.disconnectOAuthConnection`)\n }\n if (part.type === 'tool-requestAccountLink') {\n return $t(`messagePart.requestAccountLink`)\n }\n if (part.type === 'tool-unlinkAccount') {\n return $t(`messagePart.unlinkAccount`)\n }\n if (WEB_SEARCH_TOOL_TYPES.includes(part.type)) {\n return $t(`messagePart.webSearch`)\n }\n return $t(`messagePart.tool`)\n }\n if (isReasoningPart(part)) {\n return $t(`messagePart.reasoning`)\n }\n return $t(`messagePart.streaming`)\n}\n"],"mappings":";;;;AA8BA,SAAgBK,EACZ,GACkB;CAClB,IAAMC,IAA6B,CAAC;CACpC,KAAK,IAAMC,KAAQC,GAAO;EACtB,IAAI,CAACP,EAAWM,CAAI,GAAG;GACnB,EAAO,KAAKA,CAAI;GAChB;EACJ;EACA,IAAME,IAAOH,EAAOA,EAAO,SAAS;EACpC,AAAIG,KAAQR,EAAWQ,CAAI,IACvB,EAAOH,EAAO,SAAS,KAAK;GAAE,GAAGG;GAAM,MAAMA,EAAK,OAAOF,EAAK;EAAK,IAEnED,EAAO,KAAKC,CAAI;CAExB;CACA,OAAOD;AACX;AAEA,IAAMI,KACF,MAEAP,EAAWI,CAAI,KAAKP,EAAmBE,EAAgBK,CAAI,CAAC;AAUhE,SAAgBI,EACZ,GACkB;CAClB,IAAMC,oBAAY,IAAI,IAAoB;CAC1C,KAAK,IAAM,CAACC,GAAON,MAASC,EAAM,QAAQ,GACtC,AACIE,EAAaH,CAAI,KACjBA,EAAK,UAAU,kBACf,CAACO,EAAgBP,CAAI,KAErBK,EAAU,IAAIL,EAAK,MAAMM,CAAK;CAGtC,OAAOL,EAAM,QACR,GAAM,MACH,EACIE,EAAaH,CAAI,KACjBA,EAAK,UAAU,mBACdK,EAAU,IAAIL,EAAK,IAAI,KAAK,MAAMM,EAE/C;AACJ;AAQA,IAAME,oBAAyC,IAAI,IAAI,CAAC,sBAAsB,CAAC;AAG/E,SAAgBC,EACZ,GACkB;CAClB,IAAMC,IAAQT,EAAM,QAAQ,MAASO,EAAkB,IAAIR,EAAK,IAAI,CAAC;CACrE,OAAOU,EAAM,SAAS,IAChB,CACI,GAAGT,EAAM,QAAQ,MAAS,CAACO,EAAkB,IAAIR,EAAK,IAAI,CAAC,GAC3D,GAAGU,CACP,IACAT;AACV;AAOA,SAAgBU,EACZ,GACA,GACe;CACf,IAAMC,IAAcZ,EAAiC;CACrD,OAAOQ,EAAkB,IAAIR,EAAK,IAAI,KAAKY,IACrC,QAAQA,MACRN;AACV;AAEA,SAAgBC,EACZ,GACoE;CAOpE,OANKP,KAGD,WAAWA,IACJA,EAAK,UAAU,eAAeA,EAAK,UAAU,oBAH7C;AAMf;AASA,IAAaa,IAA6B,KAKpCC,IACF;AASJ,SAAgBC,EAAgB,GAAkB,GAA2B;CACzE,IAAIC,EAAS,UAAUC,GACnB,OAAOD;CAEX,IAAME,IAAOF,EAAS,SAASC,GAIzBE,IAAQD,IAAOD,IAAY,GAC3BG,KAAY,GAAe,MAC7Bd,MAAU,MAAMA,IAAQa,IAAQb,IAAQe,IAAS,KAAA,GAC/CC,IACFF,EAASJ,EAAS,QAAQ,QAAQE,CAAI,GAAG,CAAC,KAC1CE,EAASJ,EAAS,QAAQ,MAAME,CAAI,GAAG,CAAC,KACxCA,GACAK;CACJ,KAAK,IAAMC,KAASR,EAAS,SAASF,CAAU,GAAG;EAC/C,IAAIU,EAAM,SAASF,GACf;EAEJ,IAAM,GAAGG,GAAQC,KAAQF;EACzB,IAAKD,GAOE,AACHE,EAAO,OAAOF,EAAU,MACxBE,EAAO,UAAUF,EAAU,UAC3B,CAACG,EAAK,KAAK,MAEX,IAAY,KAAA;OAZA;GAGZ,IAAID,EAAO,OAAO,OAAOC,EAAK,SAAS,GAAG,GACtC;GAEJ,IAAYD;EAChB;CAOJ;CAEA,OAAO,QADQF,IAAY,GAAGA,EAAU,MAAM,KACtBP,EAAS,MAAMM,CAAG;AAC9C;AAOA,IAAMK,oBAAuB,IAAI,IAAI;CACjC;CACA;CACA;AACJ,CAAC;AAED,SAAgBC,EACZ,GACO;CAWP,OAVKhC,EAAWI,CAAI,IAGhB2B,EAAqB,IAAI3B,EAAK,KAAK,IAC5B,KAMHA,EAAgC,YAAY,OATzC;AAUf;AAQA,IAAa6B,IAAoB;AAEjC,SAAgBC,EACZ,GACO;CACP,OAAOlC,EAAWI,CAAI,KAAKA,EAAK,SAAS;AAC7C;AAGA,SAAgB+B,EACZ,GACO;CACP,OAAOH,EAAmB5B,CAAI,KAAK8B,EAAkB9B,CAAI;AAC7D;AAGA,SAAgBgC,EACZ,GACkB;CAClB,IAAKpC,EAAWI,CAAI,GAGpB,OAAQA,EAAwC,UAAU;AAC9D;AAEA,SAAgBiC,EACZ,GACkB;CAClB,IAAKjC,KAGD,WAAWA,GACX,OAAOA,EAAK;AAGpB;AAEA,SAAgBkC,EAAe,GAAyB;CAIpD,OAHKC,IAGE,CAAC,WAAW,CAAC,CAAC,SAASA,CAAK,IAFxB;AAGf;AAEA,SAAgBC,EAAY,IAAmB,UAA6B;CACxE,IAAIC,IAAMC,EAAS,QAAQ,KAAK,EAAE;CAGlC,AAAID,EAAI,WAAW,MACf,IAAMA,EACD,MAAM,EAAE,CAAC,CACT,KAAK,MAASE,IAAOA,CAAI,CAAC,CAC1B,KAAK,EAAE;CAIhB,IAAMC,IAAI,SAASH,EAAI,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI,KACxCI,IAAI,SAASJ,EAAI,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI,KACxCK,IAAI,SAASL,EAAI,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI,KAExCM,KAAa,MACfC,KAAK,SAAUA,IAAI,UAAUA,IAAI,QAAS,UAAU;CAKxD,OAFI,QAASD,EAAUH,CAAC,IAAI,QAASG,EAAUF,CAAC,IAAI,QAASE,EAAUD,CAAC,IAErD,OAAQ,UAAU;AACzC;AAMA,SAAgBG,EACZ,GACA,GACiB;CAIjB,OAHIC,MAAc,WAAWA,MAAc,UAChCA,IAEJV,EAAYW,CAAS;AAChC;AAWA,SAAgBC,EACZ,GACA,GACkC;CAClC,IAAKD,GAGL,OAAO;EACH,wBAAwBA;EACxB,4BAA4BE;EAC5B,iBAAiBF;EACjB,0BAA0BE;EAC1B,uBAAuB;CAC3B;AACJ;AAOA,SAAgBC,EACZ,GACA,GACkB;CAClB,IAAI,QAAO,KAAA,KAAaC,IAAK,KAG7B,OAAOC,EAAGD,IAAK,KAAM,SAAS;AAClC;AAMA,SAAgBE,EAAiB,GAAoC;CACjE,IAAIC,MAAU,KAAA,GAGd;MAAI,OAAOA,KAAU,UACjB,OAAOA,EAAM,KAAK,KAAK,KAAA;EAE3B,IAAI;GACA,IAAMC,IAAO,KAAK,UAAUD,GAAO,MAAM,CAAC;GAC1C,OAAOC,MAAS,QAAQA,MAAS,OAAO,KAAA,IAAYA;EACxD,QAAQ;GACJ;EACJ;CAP2B;AAQ/B;AAMA,SAAgBC,EAAW,GAAyB;CAChD,OAAOH,EAAiBC,CAAK,MAAM,KAAA;AACvC;AAWA,SAAgBG,EACZ,GACA,GACM;CACN,IAAMC,IACF1D,GAMD;CAEH,IAAI,OAAO2D,KAAW,UAAU;EAC5B,IAAMC,IAAWF,GAAO,YAAYA,GAAO,QAAQ,EAAE,EAAE;EACvD,OAAOE,IAAW,GAAGA,EAAS,GAAGD,MAAWA;CAChD;CAEA,IAAME,IAAe,IAAI,KACpBH,GAAO,SAAS,CAAC,EAAA,CAAG,KAAK,MAAS,CAACI,EAAK,IAAIA,EAAK,QAAQ,CAAC,CAC/D;CAcA,OAbcH,EAAO,QAChB,QACI,EAAE,eACCL,MAAU,QACVA,MAAU,MACV,EAAE,MAAM,QAAQA,CAAK,KAAK,CAACA,EAAM,OACzC,CAAC,CACA,KAAK,EAAE,OAAI,eAAY;EACpB,IAAMS,IAAO,MAAM,QAAQT,CAAK,IAAIA,EAAM,KAAK,IAAI,IAAI,OAAOA,CAAK,GAC7DM,IAAWC,EAAa,IAAIG,CAAE;EACpC,OAAOJ,IAAW,GAAGA,EAAS,GAAGG,MAASA;CAC9C,CAEG,CAAA,CAAM,KAAK,IAAI;AAC1B;AAWA,SAAgBE,EACZ,GACwD;CAIxD,OAHKH,GAAM,UAGJA,EAAK,QAAQ,KAAK,OAAY;EACjC,OAAOI,EAAO;EACd,OAAOA,EAAO;EACd,aAAaA,EAAO;CACxB,EAAE,IANS,CAAC;AAOhB;AAiBA,SAAgBC,EACZ,GACA,GACuB;CACvB,IAAMC,IAAiC,CAAC;CACxC,IAAIC,KAAmC,MACnC,OAAOD;CAIX,IAAI,OAAOC,KAAW,UAIlB,OAHIC,EAAM,WAAW,MACjB,EAAM,KAAKD,IAERD;CAEX,IAAMG,KAAU,GAAY,MAAmB;EAC3C,EAAM,SAAS,GAAM,MAAU;GAC3B,AAAIT,EAAK,OAAOE,MACZ,EAAM1D,KAASgD;EAEvB,CAAC;CACL,GACMkB,IAAQH,EAAiC;CAC/C,IAAI,MAAM,QAAQG,CAAI,GAAG;EACrB,KAAK,IAAMb,KAAUa,GACjB,AAAI,OAAOb,GAAQ,MAAO,YACtBY,EAAOZ,EAAO,IAAIA,EAAO,KAAK;EAGtC,OAAOS;CACX;CAGA,KAAK,IAAM,CAACJ,GAAIV,MAAU,OAAO,QAC7Be,CACJ,GACI,AAAIf,MAAU,KAAA,KACViB,EAAOP,GAAIV,CAAK;CAGxB,OAAOc;AACX;AAGA,IAAaK,IAAwB;CACjC;CACA;CACA;CACA;AACJ,GAGMC,oBAAyB,IAAI,IAAI;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,GAAGD;AACP,CAAC;AAED,SAAgBE,EACZ,GACO;CACP,OAAO/E,EAAWI,CAAI,KAAK0E,EAAuB,IAAI1E,EAAK,IAAI;AACnE;AAEA,IAAM4E,KAAY,MACdtB,KAAS,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK,IACnDA,IACD,KAAA,GAEJuB,KACF,GACA,GAAGC,MACkB;CACrB,KAAK,IAAMC,KAAOD,GAAM;EACpB,IAAMxB,IAAQ0B,IAASD;EACvB,IAAI,OAAOzB,KAAU,YAAYA,EAAM,KAAK,GACxC,OAAOA;CAEf;AAEJ;AAOA,SAAgB2B,EACZ,GACkB;CAClB,IAAI,CAACrF,EAAWI,CAAI,GAChB;CAEJ,IAAM0D,IAAQkB,EAAS,WAAW5E,IAAOA,EAAK,QAAQ,KAAA,CAAS,GACzDqE,IAASO,EAAS,YAAY5E,IAAOA,EAAK,SAAS,KAAA,CAAS;CAClE,IACIA,EAAK,SAAS,gCACdyE,EAAsB,SAASzE,EAAK,IAAI,GAC1C;EACE,IAAMkF,IAAUxB,GAAO;EACvB,IAAI,MAAM,QAAQwB,CAAO,GAAG;GACxB,IAAMC,IAAQD,EAAQ,QACjB,MACG,OAAOE,KAAU,YAAY,EAAQA,EAAM,KAAK,CACxD;GACA,OAAOD,EAAM,SAASA,EAAM,KAAK,KAAK,IAAI,KAAA;EAC9C;EACA,OAAON,EAAWnB,GAAO,SAAS,WAAW;CACjD;CACA,IAAI1D,EAAK,SAAS,+BACd,OAAO6E,EAAWnB,GAAO,OAAO;CAEpC,IAAI1D,EAAK,SAAS,mBACd,OACI6E,EAAWR,GAAQ,UAAU,KAAKQ,EAAWnB,GAAO,cAAc;CAG1E,IAAI1D,EAAK,SAAS,gBACd,OAAO6E,EAAWnB,GAAO,cAAc;CAE3C,IAAI1D,EAAK,SAAS,2BACd,OAAO6E,EAAWR,GAAQ,cAAc;CAE5C,IAAIrE,EAAK,SAAS,yBACd,OAAO6E,EAAWR,GAAQ,MAAM;CAEpC,IAAIrE,EAAK,SAAS,wBAAwB;EACtC,IAAMqF,IAAQR,EAAWnB,GAAO,OAAO,GACjC4B,IAAQT,EAAWnB,GAAO,OAAO;EACvC,OAAO2B,KAASC,IAAQ,GAAGD,EAAM,GAAGC,MAAUD;CAClD;CACA,IAAIrF,EAAK,SAAS,wBACd,OAAO6E,EAAWR,GAAQ,UAAU;CAExC,IAAIrE,EAAK,SAAS,yBAEd,OAAO6E,EAAWR,GAAQ,MAAM;CAEpC,IAAIrE,EAAK,SAAS,yBACd,OAAO6E,EAAWnB,GAAO,OAAO;CAEpC,IAAI1D,EAAK,SAAS,uBACd,OAAO6E,EAAWnB,GAAO,WAAW,OAAO;AAGnD;AAGA,SAAgB6B,EACZ,GACkB;CAClB,IAAI3F,EAAWI,CAAI,GAiIf,OAhIIA,EAAK,KAAK,SAAS,eAAe,IAC3B,oBAEPA,EAAK,SAAS,mBACP,kBAEPA,EAAK,SAAS,wBACP,kBAEPA,EAAK,SAAS,kCACP,yBAEPA,EAAK,SAAS,6BACP,oBAEPA,EAAK,SAAS,qBACP,mBAEPA,EAAK,KAAK,SAAS,UAAU,IACtB,QAEPA,EAAK,SAAS,gCACP,sBAEPA,EAAK,SAAS,+BACP,mBAEPA,EAAK,SAAS,4BACP,wBAEPA,EAAK,SAAS,0BACP,sBAEPA,EAAK,SAAS,yBACP,kBAEPA,EAAK,SAAS,yBACP,yBAEPA,EAAK,SAAS,0BACP,uBAEPA,EAAK,SAAS,iBACP,kBAEPA,EAAK,SAAS,oBACP,uBAEPA,EAAK,SAAS,0BACP,kBAEPA,EAAK,SAAS,wBACP,mBAEPA,EAAK,SAAS,qBACP,gBAEPA,EAAK,SAAS,qBACP,kBAEPA,EAAK,SAAS,qBACP,mBAEPA,EAAK,SAAS,kBACP,mBAEPA,EAAK,SAAS,4BACP,8BAEPA,EAAK,SAAS,sBACP,sBAEPA,EAAK,SAAS,mBACP,iBAEPA,EAAK,SAAS,qBACP,mBAEPA,EAAK,SAAS,sBACP,kBAEPA,EAAK,SAAS,yBACP,yBAEPA,EAAK,SAAS,yBACP,yBAEPA,EAAK,SAAS,2BACP,2BAEPA,EAAK,SAAS,wBACP,mBAEPA,EAAK,SAAS,sBACP,oBAEPA,EAAK,SAAS,oBACP,oBAEPA,EAAK,SAAS,0BACP,kBAEPA,EAAK,SAAS,mBACP,iBAEPA,EAAK,SAAS,4BACP,8BAEPA,EAAK,SAAS,4BACP,yBAEPA,EAAK,SAAS,mCACP,mBAEPA,EAAK,SAAS,4BACP,YAEPA,EAAK,SAAS,uBACP,mBAGPA,EAAK,SAAS,4BACdA,EAAK,SAAS,0BACdA,EAAK,SAAS,qBACdA,EAAK,SAAS,uBAEP,mBAEJ;CAEX,IAAIH,EAAgBG,CAAI,GACpB,OAAO;CAEX,IAAIN,EAAWM,CAAI,GACf,OAAO;AAGf;AAGA,SAAgBwF,EACZ,GACA,GACkB;CA+HlB,OA9HI5F,EAAWI,CAAI,IACXA,EAAK,KAAK,SAAS,eAAe,IAC3ByF,EAAG,yBAAyB,IAEnCzF,EAAK,SAAS,mBACPyF,EAAG,uBAAuB,IAEjCzF,EAAK,SAAS,wBACPyF,EAAG,4BAA4B,IAEtCzF,EAAK,SAAS,kCACPyF,EAAG,sCAAsC,IAEhDzF,EAAK,SAAS,6BACPyF,EAAG,iCAAiC,IAE3CzF,EAAK,SAAS,qBACPyF,EAAG,yBAAyB,IAEnCzF,EAAK,SAAS,gCACPyF,EAAG,4BAA4B,IAEtCzF,EAAK,SAAS,+BACPyF,EAAG,gCAAgC,IAE1CzF,EAAK,SAAS,4BACPyF,EAAG,gCAAgC,IAE1CzF,EAAK,SAAS,0BACPyF,EAAG,8BAA8B,IAExCzF,EAAK,SAAS,yBACPyF,EAAG,6BAA6B,IAEvCzF,EAAK,SAAS,yBACPyF,EAAG,6BAA6B,IAEvCzF,EAAK,SAAS,0BACPyF,EAAG,8BAA8B,IAExCzF,EAAK,SAAS,iBACPyF,EAAG,qBAAqB,IAE/BzF,EAAK,SAAS,oBACPyF,EAAG,wBAAwB,IAElCzF,EAAK,SAAS,0BACPyF,EAAG,8BAA8B,IAExCzF,EAAK,SAAS,wBACPyF,EAAG,4BAA4B,IAEtCzF,EAAK,SAAS,qBACPyF,EAAG,yBAAyB,IAEnCzF,EAAK,SAAS,kBACPyF,EAAG,sBAAsB,IAEhCzF,EAAK,SAAS,qBACPyF,EAAG,yBAAyB,IAEnCzF,EAAK,SAAS,qBACPyF,EAAG,yBAAyB,IAEnCzF,EAAK,SAAS,4BACPyF,EAAG,gCAAgC,IAE1CzF,EAAK,SAAS,sBACPyF,EAAG,0BAA0B,IAEpCzF,EAAK,SAAS,mBACPyF,EAAG,uBAAuB,IAEjCzF,EAAK,SAAS,qBACPyF,EAAG,yBAAyB,IAEnCzF,EAAK,SAAS,sBACPyF,EAAG,0BAA0B,IAEpCzF,EAAK,SAAS,sBACPyF,EAAG,0BAA0B,IAEpCzF,EAAK,SAAS,yBACPyF,EAAG,6BAA6B,IAEvCzF,EAAK,SAAS,2BACPyF,EAAG,+BAA+B,IAEzCzF,EAAK,SAAS,wBACPyF,EAAG,4BAA4B,IAEtCzF,EAAK,SAAS,sBACPyF,EAAG,0BAA0B,IAEpCzF,EAAK,SAAS,oBACPyF,EAAG,wBAAwB,IAElCzF,EAAK,SAAS,0BACPyF,EAAG,8BAA8B,IAExCzF,EAAK,SAAS,mBACPyF,EAAG,uBAAuB,IAEjCzF,EAAK,SAAS,4BACPyF,EAAG,gCAAgC,IAE1CzF,EAAK,SAAS,4BACPyF,EAAG,gCAAgC,IAE1CzF,EAAK,SAAS,mCACPyF,EAAG,uCAAuC,IAEjDzF,EAAK,SAAS,4BACPyF,EAAG,gCAAgC,IAE1CzF,EAAK,SAAS,uBACPyF,EAAG,2BAA2B,IAErChB,EAAsB,SAASzE,EAAK,IAAI,IACjCyF,EAAG,uBAAuB,IAE9BA,EAAG,kBAAkB,IAE5B5F,EAAgBG,CAAI,IACbyF,EAAG,uBAAuB,IAE9BA,EAAG,uBAAuB;AACrC"}
|
package/dist-vue/composables.js
CHANGED
|
@@ -2,7 +2,7 @@ import { t as e } from "./_chunks/createChatbotApiClient-DSLxswr4.js";
|
|
|
2
2
|
import { n as t } from "./_chunks/useChatbotStore-rtl-oKqU.js";
|
|
3
3
|
import { t as n } from "./_chunks/src-DCfvejyT.js";
|
|
4
4
|
import { t as r } from "./_chunks/useLocalizedString-PfaKjIQY.js";
|
|
5
|
-
import { T as i, i as a } from "./_chunks/utils-
|
|
5
|
+
import { T as i, i as a } from "./_chunks/utils-CwIMEuAv.js";
|
|
6
6
|
import { computed as o, getCurrentInstance as s, onBeforeUnmount as c, onMounted as l, ref as u, toValue as d, watch as f } from "vue";
|
|
7
7
|
import { createI18n as p } from "vue-i18n";
|
|
8
8
|
import { createAuthClient as m } from "better-auth/vue";
|
|
@@ -1088,7 +1088,7 @@ var j = {
|
|
|
1088
1088
|
explicit: "Esplicita | Esplicite",
|
|
1089
1089
|
extracted: "Estratta | Estratte"
|
|
1090
1090
|
},
|
|
1091
|
-
message: /* @__PURE__ */ JSON.parse("{\"accountLinkAlreadyLinked\":\"Questo account è già collegato a un altro utente. Accedi con quell'utente per scollegarlo prima.\",\"accountLinkCancelled\":\"Collegamento annullato sulla pagina del provider. Nulla è cambiato.\",\"accountLinkEmailMismatch\":\"Puoi collegare solo account che usano la stessa email del tuo profilo.\",\"accountLinkErrorWithCode\":\"Impossibile collegare l'account (codice: {code}). Riprova o segnala questo codice all'assistenza.\",\"accountLinkNotAllowed\":\"Questo provider non può essere collegato al tuo profilo: l'email dell'account non è verificata o il collegamento è disabilitato.\",\"accountLinkUserInfo\":\"Il provider non ha restituito un profilo utilizzabile, quindi nessun account è stato collegato. Riprova.\",\"accountUnlinked\":\"Account disconnesso\",\"agentAccessDenied\":\"Non hai accesso a questo agente\",\"agentAccessDeniedAction\":\"Vedi gli agenti disponibili\",\"agentActivated\":\"Agente attivato con successo\",\"agentDeactivated\":\"Agente disattivato con successo\",\"agentNotFound\":\"Agente non trovato\",\"agentsEmpty\":\"Nessun agente. Crea il primo per iniziare.\",\"analyzeChatError\":\"L'analisi non si è conclusa. Riprova fra qualche minuto.\",\"analyzeChatInProgress\":\"Analisi della conversazione in corso. Se la conversazione è lunga, può servire circa un minuto.\",\"analyzeChatSuccess\":\"Conversazione analizzata con successo\",\"apiKeyCreatedForUser\":\"Mostrata una volta sola: copiala e passala in sicurezza.\",\"apiKeysEmpty\":\"Le chiavi che crei per l’accesso programmatico compaiono qui.\",\"apiToolsEmpty\":\"Nessun API tool. Aggiungi il primo per far chiamare all'agente un servizio esterno.\",\"banSuccess\":\"Utente bannato con successo\",\"blockChatSuccess\":\"Conversazione bloccata con successo\",\"bulkUnlinkAllDeleteConfirm\":\"{count} documenti verranno eliminati definitivamente perché non hanno altri agenti collegati. Vuoi procedere?\",\"bulkUnlinkMixedConfirm\":\"{unlinkCount} documenti verranno disassociati e {deleteCount} verranno eliminati definitivamente (non hanno altri agenti collegati). Vuoi procedere?\",\"cancelInvitationConfirm\":\"Sei sicuro di voler annullare l'invito per {email}?\",\"cancelInvitationSuccess\":\"Invito annullato con successo\",\"chatActionError\":\"L'azione non si è conclusa. Riprova fra qualche minuto.\",\"chatAnonymized\":\"Il contenuto di questa conversazione è stato cancellato (GDPR): restano solo le metriche aggregate.\",\"chatErrorBadRequest\":\"Si è verificato un errore con la richiesta. Inizia una nuova chat per continuare.\",\"chatErrorContextWindow\":\"La conversazione è diventata troppo lunga. Inizia una nuova chat per continuare.\",\"chatErrorConversationBlocked\":\"Questa conversazione è stata bloccata per violazione delle policy.\",\"chatErrorCreditExhausted\":\"Servizio non disponibile. Riprova più tardi.\",\"chatErrorGatewayDisabled\":\"Il modello di questo agente non è disponibile: l’organizzazione non usa il gateway AI della piattaforma. Un amministratore può spostare l’agente su uno dei modelli dell’organizzazione.\",\"chatErrorGatewayPromptTraining\":\"Il modello \\\"{model}\\\" non supporta l'opzione \\\"Disabilita addestramento prompt\\\". Disattiva questa impostazione nella configurazione del gateway dell'agente oppure scegli un modello compatibile.\",\"chatErrorGatewayZdr\":\"Il modello \\\"{model}\\\" non supporta l'opzione \\\"Zero Data Retention\\\". Disattiva ZDR nella configurazione del gateway dell'agente oppure scegli un modello compatibile.\",\"chatErrorGeneric\":\"Errore durante la richiesta. Se il problema persiste inizia una nuova chat. Riprovo tra {seconds}…\",\"chatErrorInternalServer\":\"Si è verificato un errore del server. Inizia una nuova chat per continuare.\",\"chatErrorModelUnavailable\":\"Il modello di questo agente ora non è disponibile: l’endpoint su cui gira è spento o non lo serve più. Un amministratore può riaccenderlo o spostare l’agente su un altro modello.\",\"chatErrorNotFound\":\"La conversazione non è più disponibile. Inizia una nuova chat per continuare.\",\"chatErrorOriginNotAllowed\":\"L'origine della richiesta non è consentita. Contatta l'amministratore del sistema.\",\"chatErrorRateLimit\":\"Il limite di richieste è stato superato. Riprovo tra {seconds} secondi…\",\"chatErrorRetrying\":\"Riprovo tra {seconds} secondi…\",\"checkYourEmail\":\"Verifica la tua casella email\",\"confirm\":\"Sei sicuro di voler procedere?\",\"confirmRefillCredits\":\"Sei sicuro di voler ricaricare il credito di {amount}?\",\"contentTruncated\":\"Contenuto troncato. Totale caratteri: {total}\",\"copied\":\"Copiato negli appunti\",\"crawlError\":\"Errore durante il crawling\",\"createFolderSuccess\":\"Cartella creata con successo\",\"defaultAgentWelcome\":\"Ciao! Come posso aiutarti oggi?\",\"defaultPrivacyPolicyNotice\":\"Inviando la richiesta accetti la nostra [Privacy Policy](https://www.iubenda.com/privacy-policy/46350192).\",\"deleteAgentConfirm\":\"Le sue cartelle vengono eliminate. Un documento che nessun altro agente usa viene eliminato, uno condiviso resta agli altri agenti.\",\"deleteAllMemoriesConfirm\":\"Spariscono definitivamente, ricerca semantica compresa.\",\"deleteAllNotificationsConfirm\":\"Eliminare tutte le notifiche?\",\"deleteBulkDocumentConfirm\":\"Vengono rimossi da tutti gli agenti collegati e finiscono nel cestino, da cui si possono ripristinare.\",\"deleteDocumentConfirm\":\"Viene rimosso da tutti gli agenti collegati e finisce nel cestino, da cui si può ripristinare.\",\"deleteDocumentConfirmWithAgents\":\"Finisce nel cestino, da cui si può ripristinare, e viene rimosso dai seguenti agenti:{agents}\",\"deleteError\":\"Eliminazione non riuscita. Riprova.\",\"deleteFolderConfirm\":\"I documenti al suo interno vengono tolti da questo agente. Un documento che nessun altro agente usa viene eliminato.\",\"deleteFolderSuccess\":\"Cartella eliminata con successo\",\"deleteMyConversationsConfirm\":\"Non si può annullare.\",\"deleteNotificationConfirm\":\"Eliminare questa notifica?\",\"deleteProfileBlockedSoleOwner\":\"Sei l'unico proprietario di {organizations}. Trasferisci la proprietà o elimina le organizzazioni prima di poter eliminare l'account.\",\"deleteProfileConfirm\":\"Stai per eliminare definitivamente il tuo account: il profilo verrà anonimizzato e il contenuto delle tue conversazioni cancellato. Questa azione non può essere annullata.\",\"deleteProfileDescription\":\"Anonimizza il tuo account e cancella il contenuto delle tue conversazioni (diritto all'oblio).\",\"diagramRenderError\":\"Impossibile renderizzare il diagramma.\",\"documentRefreshPausedReason\":\"La pagina non risponde più, quindi l'aggiornamento automatico è in pausa. Aggiorna ora per riprovare.\",\"documentRefreshSet\":\"Aggiornamento automatico impostato su {updated} documenti, {skipped} saltati perché non sono pagine web\",\"documentRefreshStarted\":\"Aggiornamento avviato su {queued} documenti, {skipped} saltati\",\"documentsEmpty\":\"Questa cartella è ancora vuota. Aggiungi documenti dal menu Crea, oppure inizia con una cartella.\",\"documentsEmptyManaged\":\"Nessun file sincronizzato in questa cartella. Il contenuto arriva dalla sorgente collegata: se hai appena collegato la cartella, il primo import può richiedere qualche minuto.\",\"documentSourceLinked\":\"Cartella collegata. Il primo import parte tra poco.\",\"documentSourceNothingHere\":\"Non c’è nulla qui dentro.\",\"documentSourceStale\":\"Lo stato di questa cartella non è aggiornato: l’ultima lettura non è riuscita.\",\"documentSourceUnlinked\":\"Cartella scollegata. I documenti restano e ora si modificano come gli altri.\",\"embeddingActivated\":\"Embedding salvato: l’endpoint serve il modello dichiarato\",\"embeddingBackToPlatform\":\"I vettori si calcolano di nuovo sulla piattaforma\",\"embeddingIndexNotUpdated\":\"L’avanzamento non si aggiorna più.\",\"embeddingRemoved\":\"Embedding rimosso dall’endpoint\",\"empty\":\"Nessun elemento trovato\",\"endpointActivated\":\"Endpoint attivato con successo\",\"endpointDeactivated\":\"Endpoint disattivato con successo\",\"endpointsEmpty\":\"Nessun endpoint. Crea il primo per esporre l'agente via HTTP.\",\"error\":\"Errore\",\"errorRetry\":\"Qualcosa è andato storto. Riprova.\",\"exportError\":\"Errore durante l'esportazione dei dati\",\"exportFailed\":\"L'esportazione dei dati non è riuscita. Riprova più tardi.\",\"exportMyDataDescription\":\"Scarica una copia completa dei tuoi dati personali in formato ZIP (Art. 15 e 20 GDPR).\",\"exportRequested\":\"Stiamo preparando il tuo archivio: riceverai un'email con il link per scaricarlo.\",\"exportSuccess\":\"CSV esportato con successo\",\"feedbackSubmitError\":\"Invio fallito. Riprova per favore.\",\"feedbackSubmittedMessage\":\"Il tuo feedback è stato inviato con successo.\",\"feedbackSubmittedTitle\":\"Grazie!\",\"feedbacksEmpty\":\"I feedback che gli utenti lasciano sulle risposte dell'agente compariranno qui.\",\"fileAlreadyImported\":\"Già importato\",\"fileAlreadyImportedExistingList\":\"I seguenti file sono già presenti nell'organizzazione:\\n{names}\",\"fileAlreadyImportedLink\":\"Questo file è già stato importato. Vuoi collegarlo all'agente corrente o creare un nuovo documento?\",\"fileAlreadyImportedNewList\":\"I seguenti file sono nuovi e verranno importati normalmente:\\n{names}\",\"fileAlreadyImportedQuestion\":\"Vuoi collegare i file già presenti all'agente corrente?\",\"fileAlreadyLinkedToAgent\":\"I seguenti file sono già collegati all'agente corrente:\\n{names}\",\"fileLimitPerChat\":\"Hai raggiunto il limite di {max} file per questa conversazione.\",\"fileLimitPerMessage\":\"Puoi allegare al massimo {max} file per messaggio.\",\"foldersEmpty\":\"Nessuna cartella ancora. Crea la prima dalla pagina dei documenti per organizzarli.\",\"formRenderError\":\"Non è stato possibile mostrare il modulo. Chiedilo di nuovo e l'agente lo invierà.\",\"gdprRequestsEmpty\":\"Le richieste di esportazione o cancellazione dei dati di questo utente compaiono qui.\",\"geolocationPermissionDenied\":\"Accesso alla posizione negato. Consentilo nelle impostazioni del browser.\",\"geolocationUnavailable\":\"Posizione non disponibile. Riprova o inserisci la posizione manualmente.\",\"getMcpServerInfoError\":\"Un errore è avvenuto durante il caricamento dei tool.\",\"importError\":\"Errore durante l'importazione\",\"importSuccess\":\"{count} documenti importati con successo\",\"importing\":\"Importazione in corso…\",\"info\":\"Informazione\",\"insufficientCredit\":\"Credito insufficiente. Riprova più tardi.\",\"insufficientCreditMessage\":\"Il tuo credito è insufficiente per completare questa operazione. Contatta l'amministratore del sistema per ulteriori informazioni.\",\"integrationConnected\":\"Connessione riuscita.\",\"integrationCreated\":\"Integrazione creata con successo\",\"integrationDisabled\":\"Integrazione disabilitata\",\"integrationDisconnected\":\"Connessione rimossa.\",\"integrationDisconnectConfirm\":\"Le cartelle sincronizzate vengono scollegate.\",\"integrationEnabled\":\"Integrazione abilitata\",\"integrationOAuthDenied\":\"La connessione è stata rifiutata, o manca ancora l’approvazione di un amministratore Microsoft 365.\",\"integrationOAuthFailed\":\"La connessione non è andata a buon fine.\",\"integrationOAuthStartFailed\":\"Non è stato possibile avviare la connessione.\",\"integrationRemoveConfirm\":\"La configurazione di questa integrazione viene rimossa.\",\"integrationTestFailed\":\"Verifica connessione fallita: {error}\",\"integrationTestSuccess\":\"Connessione verificata con successo\",\"integrationUpdated\":\"Integrazione aggiornata con successo\",\"invalidJson\":\"L'input non è un JSON valido\",\"invitationAccepted\":\"Invito accettato\",\"invitationAlreadyHandled\":\"Invito già gestito\",\"invitationDeclined\":\"Invito declinato\",\"invitationToJoinOrganization\":\"Sei stato invitato a unirti a\",\"invitationsEmpty\":\"Nessun invito in sospeso. Invita le persone dalla pagina dei membri.\",\"leadSubmitError\":\"Invio fallito. Riprova per favore.\",\"leadSubmittedMessage\":\"La richiesta è stata inviata con successo.\",\"leadSubmittedTitle\":\"Grazie!\",\"leadsEmpty\":\"I lead raccolti dall'agente durante le conversazioni compariranno qui.\",\"leftOrganization\":\"Hai lasciato l'organizzazione con successo\",\"loadConversationsError\":\"Impossibile caricare le conversazioni\",\"loading\":\"Caricamento…\",\"loadingError\":\"Errore durante il caricamento\",\"mcpConnectionConnectedAt\":\"Accesso effettuato il {date}\",\"mcpConnectionDisconnectDescription\":\"Gli agenti non useranno più il tuo account {name}. La prossima volta che ti servirà, l'agente ti chiederà di accedere e potrai scegliere un altro account.\",\"mcpConnectionDisconnectQuestion\":\"Scollegare {name}?\",\"mcpConnectionDisconnected\":\"Account {name} scollegato\",\"mcpConnectionsDescription\":\"I servizi a cui hai effettuato l'accesso con il tuo account. Scollegane uno per impedire agli agenti di usarlo, o per accedere di nuovo con un account diverso.\",\"mcpConnectionsAvailableDescription\":\"Le integrazioni degli agenti che usi a cui non hai ancora effettuato l'accesso. Puoi collegarle ora, senza aspettare che l'agente te lo chieda.\",\"mcpConnectionConnected\":\"Account {name} collegato\",\"mcpConnectionConnectFailed\":\"Accesso a {name} non riuscito. Riprova: se l'errore si ripete, segnalalo a chi gestisce l'agente.\",\"mcpConnectionUsedBy\":\"Usata da {agents}\",\"mcpConnectionUsedByNone\":\"Nessun agente la usa\",\"noMcpConnections\":\"Nessuna integrazione collegata\",\"userMcpConnectionsEmpty\":\"Questo utente non ha effettuato l'accesso a nessuna integrazione con il proprio account.\",\"mcpConnectionRevokeQuestion\":\"Revocare l'accesso di {user} a {name}?\",\"mcpConnectionRevokeDescription\":\"Gli agenti non useranno più il suo account {name}. Chiediamo la revoca anche al fornitore, dove la supporta; altrimenti l'autorizzazione resta valida presso di lui fino alla scadenza. Per usarla di nuovo, {user} dovrà accedere di persona. Riceverà una notifica.\",\"mcpConnectionRevokedAtProvider\":\"Accesso a {name} revocato, anche presso il fornitore\",\"mcpConnectionRevokedHere\":\"Accesso a {name} revocato qui. Il fornitore non ha confermato la revoca: l'autorizzazione può restare valida presso di lui fino alla scadenza.\",\"mcpServerCheckError\":\"Errore durante la verifica del server MCP: {error}\",\"mcpServerCheckSuccess\":\"Verifica del server MCP riuscita\",\"mcpServerInvalidEndpoint\":\"Questo URL non punta a un endpoint MCP: il server ha risposto con una pagina web. Controlla il percorso, di solito i server MCP lo espongono sotto /mcp.\",\"mcpServersEmpty\":\"Nessun server MCP. Collega il primo per dare nuovi strumenti all'agente.\",\"membersEmpty\":\"Nessun membro. Invita il primo per iniziare.\",\"memoriesEmpty\":\"Le memorie che l'agente salva su questo utente durante le conversazioni compariranno qui.\",\"memoryNotSynced\":\"Memoria non sincronizzata con la ricerca semantica: non viene considerata nelle risposte finché lo sweep di riparazione non la ripristina.\",\"modelDiscoveryUnavailable\":\"Questo endpoint non fornisce l'elenco dei suoi modelli: inserisci gli id a mano.\",\"modelDiscoveryFailed\":\"Non siamo riusciti a leggere l'elenco dei modelli dall'endpoint: vedi solo quelli già salvati.\",\"modelPricesUnchanged\":\"Nessun prezzo è cambiato.\",\"modelPricesUpdated\":\"Aggiornato il prezzo di un modello: {models}. | Aggiornati i prezzi di {count} modelli: {models}.\",\"modelProviderDeleted\":\"Endpoint eliminato.\",\"moveDocumentSuccess\":\"Documento spostato con successo\",\"noActiveSessions\":\"Nessuna altra sessione attiva\",\"noApiKeys\":\"Nessuna chiave API\",\"noChats\":\"Nessuna chat disponibile\",\"noConnectedAccounts\":\"Nessun account collegato\",\"noConversations\":\"Nessuna conversazione trovata\",\"noConversationsHint\":\"Inizia una nuova chat per vederla comparire qui.\",\"noCreditsData\":\"Nessun dato crediti disponibile\",\"noEndpointLogs\":\"Ancora nessuna chiamata a questo endpoint\",\"noEndpointModels\":\"Nessun modello disponibile: l'endpoint non ne elenca nessuno.\",\"modelRemoved\":\"Modello rimosso.\",\"noGdprRequests\":\"Nessuna richiesta GDPR\",\"noLinkedAgents\":\"Nessun agente collegato\",\"noNotifications\":\"Nessuna notifica\",\"noOptions\":\"Nessun elemento\",\"noOrganizations\":\"Nessuna organizzazione\",\"noResults\":\"Nessun risultato trovato\",\"noSearchResults\":\"Nessun elemento corrisponde alla ricerca. Cancellala per vedere tutto.\",\"notificationsEmpty\":\"Nessuna notifica inviata. Crea la prima per raggiungere i tuoi utenti.\",\"oauthConfigIncomplete\":\"Configurazione OAuth incompleta. Imposta il Client ID nelle impostazioni del server MCP.\",\"oauthConnected\":\"Autorizzazione OAuth completata con successo\",\"oauthError\":\"Errore durante l'autorizzazione OAuth\",\"organizationDisconnected\":\"Né il gateway della piattaforma né un endpoint proprio servono questa organizzazione, quindi i suoi agenti non rispondono.\",\"organizationMembersEmpty\":\"Nessun membro. Aggiungi il primo per iniziare.\",\"organizationNotSelected\":\"Nessuna organizzazione selezionata\",\"organizationsEmpty\":\"Nessuna organizzazione. Crea la prima per iniziare.\",\"pageNotFound\":\"Pagina non trovata\",\"passwordChangeSuccess\":\"Password cambiata con successo\",\"passwordResetSuccess\":\"Password reimpostata. Tutte le sessioni dell'account sono state chiuse: accedi con la nuova password.\",\"profileOrganizationsEmpty\":\"Le organizzazioni di cui fai parte compaiono qui.\",\"readError\":\"Errore durante la lettura\",\"reasoningAgent\":\"Questo è un agente di ragionamento. Non è progettato per mantenere la storia della conversazione, ogni messaggio è processato indipendentemente.\",\"recoverPasswordSuccess\":\"Email di recupero inviata con successo\",\"refillFailed\":\"Ricarica fallita. Riprova più tardi.\",\"refillSuccess\":\"Ricarica completata con successo\",\"refreshSuccess\":\"Aggiornamento completato con successo\",\"releaseNotesEmpty\":\"Nessuna nota di rilascio pubblicata. Gli aggiornamenti compariranno qui man mano che escono.\",\"removeSuccess\":\"Eliminazione completata con successo\",\"renameFolderSuccess\":\"Cartella rinominata con successo\",\"revisedAnswersEmpty\":\"Nessuna risposta revisionata. Crea la prima per insegnare all'agente una risposta migliore.\",\"selectedCount\":\"{count} di {total} selezionati\",\"sendInvitationConfirm\":\"Sei sicuro di voler inviare nuovamente l'invito a {email}?\",\"sessionRevoked\":\"Sessione disconnessa\",\"sessionsEmpty\":\"Un accesso da un altro dispositivo o browser apre una nuova sessione, elencata qui.\",\"setPasswordDescription\":\"Per ora accedi solo tramite un account collegato. Imposta una password per entrare anche con email e password: ti inviamo un link per crearla. Crearla chiude tutte le sessioni aperte, anche questa.\",\"setPasswordLinkSent\":\"Ti abbiamo mandato il link a {email}.\",\"sharedSuccess\":\"Documento condiviso con successo\",\"sitemapUrlRequired\":\"L'URL della sitemap è richiesto\",\"startUrlRequired\":\"L'URL di partenza è richiesto\",\"subAgentsEmpty\":\"Collega un agente per delegargli una parte della conversazione.\",\"submitError\":\"Errore durante il salvataggio\",\"submitSuccess\":\"Salvataggio completato con successo\",\"success\":\"Successo\",\"testExecutionError\":\"Errore nell'esecuzione del test\",\"toolNameAutoGenerated\":\"Il nome del tool verrà generato in automatico\",\"typeToSearch\":\"Inizia a digitare per cercare…\",\"unauthorized\":\"Non hai i permessi per gestire i canali.\",\"unbanSuccess\":\"Utente sbannato con successo\",\"unblockChatSuccess\":\"Conversazione sbloccata con successo\",\"unlinkAgentConfirm\":\"Il documento resta disponibile per gli altri agenti collegati.\",\"unlinkDocumentConfirm\":\"Resta disponibile per gli altri agenti collegati.\",\"unlinkLastAgentDeleteConfirm\":\"Il documento viene eliminato definitivamente, perché nessun altro agente è collegato.\",\"unlinkSuccess\":\"Documento disassociato con successo\",\"unlinkSyncedFolderConfirm\":\"La sincronizzazione si ferma. La cartella e i suoi documenti restano all'agente e da ora si modificano come gli altri: per toglierli, elimina la cartella.\",\"unsavedChanges\":\"Salva o annulla le modifiche prima\",\"urlAlreadyImported\":\"Già importato\",\"urlAlreadyImportedLink\":\"Questo URL è già stato importato. Vuoi collegarlo all'agente corrente?\",\"userApiKeysEmpty\":\"Le chiavi che questo utente crea dal proprio profilo per l'accesso programmatico compariranno qui.\",\"userChatsEmpty\":\"Le conversazioni di questo utente con qualsiasi agente compariranno qui.\",\"userOrganizationsEmpty\":\"L'utente non appartiene ancora a nessuna organizzazione. Aggiungi la prima.\",\"userUpdateSuccess\":\"Profilo utente aggiornato con successo\",\"usersEmpty\":\"Nessun utente. Crea il primo per iniziare.\",\"voiceCancelled\":\"Ho annullato.\",\"voiceConfirmed\":\"Confermo.\",\"voiceConnecting\":\"Connessione…\",\"voiceConnectionDone\":\"Ho completato il collegamento.\",\"voiceFailed\":\"La sessione vocale si è interrotta\",\"voiceInterrupted\":\"Riprova, oppure continua per iscritto.\",\"voiceListening\":\"In ascolto\",\"voiceLocationRefused\":\"Preferisco non condividere la mia posizione.\",\"voiceLocationShared\":\"La mia posizione è {place}.\",\"voiceMuted\":\"Microfono disattivato\",\"voiceNoAnswer\":\"L'agente non è riuscito a produrre una risposta per questa chiamata. Riprova, oppure continua per iscritto.\",\"voiceSpeaking\":\"L'agente sta parlando\",\"voiceTookTooLong\":\"La risposta ha impiegato troppo tempo per la chiamata. Riprova, oppure continua per iscritto: la risposta comparirà qui appena pronta.\",\"warning\":\"Attenzione\",\"webSourceCreated\":\"Sorgente creata: la cartella «{name}» riceverà le pagine nuove.\",\"webSourceCreateError\":\"Non è stato possibile creare la sorgente, e nessuna pagina è stata importata.\",\"webSourceEditable\":\"Le pagine scoperte restano modificabili. Scollegare la sorgente le lascia dove sono, con il loro aggiornamento automatico.\",\"webSourceRemovalHeld\":\"La sitemap non elenca più {count} pagine: sono troppe in una volta per rimuoverle senza un controllo, e non è stato rimosso niente.\",\"webSourceConfirmRemovalQuestion\":\"Il prossimo controllo toglie dalla knowledge base le pagine che la sitemap non elenca più, fino a {count}. Il loro contenuto resta nel database.\",\"unlinkWebSourceConfirm\":\"La sorgente smette di cercare pagine nuove. La cartella e le sue pagine restano, con il loro aggiornamento automatico.\"}"),
|
|
1091
|
+
message: /* @__PURE__ */ JSON.parse("{\"accountLinkAlreadyLinked\":\"Questo account è già collegato a un altro utente. Accedi con quell'utente per scollegarlo prima.\",\"accountLinkCancelled\":\"Collegamento annullato sulla pagina del provider. Nulla è cambiato.\",\"accountLinkEmailMismatch\":\"Puoi collegare solo account che usano la stessa email del tuo profilo.\",\"accountLinkErrorWithCode\":\"Impossibile collegare l'account (codice: {code}). Riprova o segnala questo codice all'assistenza.\",\"accountLinkNotAllowed\":\"Questo provider non può essere collegato al tuo profilo: l'email dell'account non è verificata o il collegamento è disabilitato.\",\"accountLinkUserInfo\":\"Il provider non ha restituito un profilo utilizzabile, quindi nessun account è stato collegato. Riprova.\",\"accountUnlinked\":\"Account disconnesso\",\"agentAccessDenied\":\"Non hai accesso a questo agente\",\"agentAccessDeniedAction\":\"Vedi gli agenti disponibili\",\"agentActivated\":\"Agente attivato con successo\",\"agentDeactivated\":\"Agente disattivato con successo\",\"agentNotFound\":\"Agente non trovato\",\"agentsEmpty\":\"Nessun agente. Crea il primo per iniziare.\",\"analyzeChatError\":\"L'analisi non si è conclusa. Riprova fra qualche minuto.\",\"analyzeChatInProgress\":\"Analisi della conversazione in corso. Se la conversazione è lunga, può servire circa un minuto.\",\"analyzeChatSuccess\":\"Conversazione analizzata con successo\",\"apiKeyCreatedForUser\":\"Mostrata una volta sola: copiala e passala in sicurezza.\",\"apiKeysEmpty\":\"Le chiavi che crei per l’accesso programmatico compaiono qui.\",\"apiToolsEmpty\":\"Nessun API tool. Aggiungi il primo per far chiamare all'agente un servizio esterno.\",\"banSuccess\":\"Utente bannato con successo\",\"blockChatSuccess\":\"Conversazione bloccata con successo\",\"bulkUnlinkAllDeleteConfirm\":\"{count} documenti verranno eliminati definitivamente perché non hanno altri agenti collegati. Vuoi procedere?\",\"bulkUnlinkMixedConfirm\":\"{unlinkCount} documenti verranno disassociati e {deleteCount} verranno eliminati definitivamente (non hanno altri agenti collegati). Vuoi procedere?\",\"cancelInvitationConfirm\":\"Sei sicuro di voler annullare l'invito per {email}?\",\"cancelInvitationSuccess\":\"Invito annullato con successo\",\"chatActionError\":\"L'azione non si è conclusa. Riprova fra qualche minuto.\",\"chatAnonymized\":\"Il contenuto di questa conversazione è stato cancellato (GDPR): restano solo le metriche aggregate.\",\"chatErrorBadRequest\":\"Si è verificato un errore con la richiesta. Inizia una nuova chat per continuare.\",\"chatErrorContextWindow\":\"La conversazione è diventata troppo lunga. Inizia una nuova chat per continuare.\",\"chatErrorConversationBlocked\":\"Questa conversazione è stata bloccata per violazione delle policy.\",\"chatErrorCreditExhausted\":\"Servizio non disponibile. Riprova più tardi.\",\"chatErrorGatewayDisabled\":\"Il modello di questo agente non è disponibile: l’organizzazione non usa il gateway AI della piattaforma. Un amministratore può spostare l’agente su uno dei modelli dell’organizzazione.\",\"chatErrorGatewayPromptTraining\":\"Il modello \\\"{model}\\\" non supporta l'opzione \\\"Disabilita addestramento prompt\\\". Disattiva questa impostazione nella configurazione del gateway dell'agente oppure scegli un modello compatibile.\",\"chatErrorGatewayZdr\":\"Il modello \\\"{model}\\\" non supporta l'opzione \\\"Zero Data Retention\\\". Disattiva ZDR nella configurazione del gateway dell'agente oppure scegli un modello compatibile.\",\"chatErrorGeneric\":\"Errore durante la richiesta. Se il problema persiste inizia una nuova chat. Riprovo tra {seconds}…\",\"chatErrorInternalServer\":\"Si è verificato un errore del server. Inizia una nuova chat per continuare.\",\"chatErrorModelUnavailable\":\"Il modello di questo agente ora non è disponibile: l’endpoint su cui gira è spento o non lo serve più. Un amministratore può riaccenderlo o spostare l’agente su un altro modello.\",\"chatErrorNotFound\":\"La conversazione non è più disponibile. Inizia una nuova chat per continuare.\",\"chatErrorOriginNotAllowed\":\"L'origine della richiesta non è consentita. Contatta l'amministratore del sistema.\",\"chatErrorRateLimit\":\"Il limite di richieste è stato superato. Riprovo tra {seconds} secondi…\",\"chatErrorRetrying\":\"Riprovo tra {seconds} secondi…\",\"checkYourEmail\":\"Verifica la tua casella email\",\"confirm\":\"Sei sicuro di voler procedere?\",\"confirmRefillCredits\":\"Sei sicuro di voler ricaricare il credito di {amount}?\",\"contentTruncated\":\"Contenuto troncato. Totale caratteri: {total}\",\"copied\":\"Copiato negli appunti\",\"crawlError\":\"Errore durante il crawling\",\"createFolderSuccess\":\"Cartella creata con successo\",\"defaultAgentWelcome\":\"Ciao! Come posso aiutarti oggi?\",\"defaultPrivacyPolicyNotice\":\"Inviando la richiesta accetti la nostra [Privacy Policy](https://www.iubenda.com/privacy-policy/46350192).\",\"deleteAgentConfirm\":\"Le sue cartelle vengono eliminate. Un documento che nessun altro agente usa viene eliminato, uno condiviso resta agli altri agenti.\",\"deleteAllMemoriesConfirm\":\"Spariscono definitivamente, ricerca semantica compresa.\",\"deleteAllNotificationsConfirm\":\"Eliminare tutte le notifiche?\",\"deleteBulkDocumentConfirm\":\"Vengono rimossi da tutti gli agenti collegati e finiscono nel cestino, da cui si possono ripristinare.\",\"deleteDocumentConfirm\":\"Viene rimosso da tutti gli agenti collegati e finisce nel cestino, da cui si può ripristinare.\",\"deleteDocumentConfirmWithAgents\":\"Finisce nel cestino, da cui si può ripristinare, e viene rimosso dai seguenti agenti:{agents}\",\"deleteError\":\"Eliminazione non riuscita. Riprova.\",\"deleteFolderConfirm\":\"I documenti al suo interno vengono tolti da questo agente. Un documento che nessun altro agente usa viene eliminato.\",\"deleteFolderSuccess\":\"Cartella eliminata con successo\",\"deleteMyConversationsConfirm\":\"Non si può annullare.\",\"deleteNotificationConfirm\":\"Eliminare questa notifica?\",\"deleteProfileBlockedSoleOwner\":\"Sei l'unico proprietario di {organizations}. Trasferisci la proprietà o elimina le organizzazioni prima di poter eliminare l'account.\",\"deleteProfileConfirm\":\"Stai per eliminare definitivamente il tuo account: il profilo verrà anonimizzato e il contenuto delle tue conversazioni cancellato. Questa azione non può essere annullata.\",\"deleteProfileDescription\":\"Anonimizza il tuo account e cancella il contenuto delle tue conversazioni (diritto all'oblio).\",\"diagramRenderError\":\"Impossibile renderizzare il diagramma.\",\"documentRefreshPausedReason\":\"La pagina non risponde più, quindi l'aggiornamento automatico è in pausa. Aggiorna ora per riprovare.\",\"documentRefreshSet\":\"Aggiornamento automatico impostato su {updated} documenti, {skipped} saltati perché non sono pagine web\",\"documentRefreshStarted\":\"Aggiornamento avviato su {queued} documenti, {skipped} saltati\",\"documentsEmpty\":\"Questa cartella è ancora vuota. Aggiungi documenti dal menu Crea, oppure inizia con una cartella.\",\"documentsEmptyManaged\":\"Nessun file sincronizzato in questa cartella. Il contenuto arriva dalla sorgente collegata: se hai appena collegato la cartella, il primo import può richiedere qualche minuto.\",\"documentsNoMatch\":\"Nessun documento corrisponde alla ricerca o ai filtri. Azzerali per vedere tutto.\",\"documentSourceLinked\":\"Cartella collegata. Il primo import parte tra poco.\",\"documentSourceNothingHere\":\"Non c’è nulla qui dentro.\",\"documentSourceStale\":\"Lo stato di questa cartella non è aggiornato: l’ultima lettura non è riuscita.\",\"documentSourceUnlinked\":\"Cartella scollegata. I documenti restano e ora si modificano come gli altri.\",\"embeddingActivated\":\"Embedding salvato: l’endpoint serve il modello dichiarato\",\"embeddingBackToPlatform\":\"I vettori si calcolano di nuovo sulla piattaforma\",\"embeddingIndexNotUpdated\":\"L’avanzamento non si aggiorna più.\",\"embeddingRemoved\":\"Embedding rimosso dall’endpoint\",\"empty\":\"Nessun elemento trovato\",\"endpointActivated\":\"Endpoint attivato con successo\",\"endpointDeactivated\":\"Endpoint disattivato con successo\",\"endpointsEmpty\":\"Nessun endpoint. Crea il primo per esporre l'agente via HTTP.\",\"error\":\"Errore\",\"errorRetry\":\"Qualcosa è andato storto. Riprova.\",\"exportError\":\"Errore durante l'esportazione dei dati\",\"exportFailed\":\"L'esportazione dei dati non è riuscita. Riprova più tardi.\",\"exportMyDataDescription\":\"Scarica una copia completa dei tuoi dati personali in formato ZIP (Art. 15 e 20 GDPR).\",\"exportRequested\":\"Stiamo preparando il tuo archivio: riceverai un'email con il link per scaricarlo.\",\"exportSuccess\":\"CSV esportato con successo\",\"feedbackSubmitError\":\"Invio fallito. Riprova per favore.\",\"feedbackSubmittedMessage\":\"Il tuo feedback è stato inviato con successo.\",\"feedbackSubmittedTitle\":\"Grazie!\",\"feedbacksEmpty\":\"I feedback che gli utenti lasciano sulle risposte dell'agente compariranno qui.\",\"fileAlreadyImported\":\"Già importato\",\"fileAlreadyImportedExistingList\":\"I seguenti file sono già presenti nell'organizzazione:\\n{names}\",\"fileAlreadyImportedLink\":\"Questo file è già stato importato. Vuoi collegarlo all'agente corrente o creare un nuovo documento?\",\"fileAlreadyImportedNewList\":\"I seguenti file sono nuovi e verranno importati normalmente:\\n{names}\",\"fileAlreadyImportedQuestion\":\"Vuoi collegare i file già presenti all'agente corrente?\",\"fileAlreadyLinkedToAgent\":\"I seguenti file sono già collegati all'agente corrente:\\n{names}\",\"fileLimitPerChat\":\"Hai raggiunto il limite di {max} file per questa conversazione.\",\"fileLimitPerMessage\":\"Puoi allegare al massimo {max} file per messaggio.\",\"foldersEmpty\":\"Nessuna cartella ancora. Crea la prima dalla pagina dei documenti per organizzarli.\",\"formRenderError\":\"Non è stato possibile mostrare il modulo. Chiedilo di nuovo e l'agente lo invierà.\",\"gdprRequestsEmpty\":\"Le richieste di esportazione o cancellazione dei dati di questo utente compaiono qui.\",\"geolocationPermissionDenied\":\"Accesso alla posizione negato. Consentilo nelle impostazioni del browser.\",\"geolocationUnavailable\":\"Posizione non disponibile. Riprova o inserisci la posizione manualmente.\",\"getMcpServerInfoError\":\"Un errore è avvenuto durante il caricamento dei tool.\",\"importError\":\"Errore durante l'importazione\",\"importSuccess\":\"{count} documenti importati con successo\",\"importing\":\"Importazione in corso…\",\"info\":\"Informazione\",\"insufficientCredit\":\"Credito insufficiente. Riprova più tardi.\",\"insufficientCreditMessage\":\"Il tuo credito è insufficiente per completare questa operazione. Contatta l'amministratore del sistema per ulteriori informazioni.\",\"integrationConnected\":\"Connessione riuscita.\",\"integrationCreated\":\"Integrazione creata con successo\",\"integrationDisabled\":\"Integrazione disabilitata\",\"integrationDisconnected\":\"Connessione rimossa.\",\"integrationDisconnectConfirm\":\"Le cartelle sincronizzate vengono scollegate.\",\"integrationEnabled\":\"Integrazione abilitata\",\"integrationOAuthDenied\":\"La connessione è stata rifiutata, o manca ancora l’approvazione di un amministratore Microsoft 365.\",\"integrationOAuthFailed\":\"La connessione non è andata a buon fine.\",\"integrationOAuthStartFailed\":\"Non è stato possibile avviare la connessione.\",\"integrationRemoveConfirm\":\"La configurazione di questa integrazione viene rimossa.\",\"integrationTestFailed\":\"Verifica connessione fallita: {error}\",\"integrationTestSuccess\":\"Connessione verificata con successo\",\"integrationUpdated\":\"Integrazione aggiornata con successo\",\"invalidJson\":\"L'input non è un JSON valido\",\"invitationAccepted\":\"Invito accettato\",\"invitationAlreadyHandled\":\"Invito già gestito\",\"invitationDeclined\":\"Invito declinato\",\"invitationToJoinOrganization\":\"Sei stato invitato a unirti a\",\"invitationsEmpty\":\"Nessun invito in sospeso. Invita le persone dalla pagina dei membri.\",\"leadSubmitError\":\"Invio fallito. Riprova per favore.\",\"leadSubmittedMessage\":\"La richiesta è stata inviata con successo.\",\"leadSubmittedTitle\":\"Grazie!\",\"leadsEmpty\":\"I lead raccolti dall'agente durante le conversazioni compariranno qui.\",\"leftOrganization\":\"Hai lasciato l'organizzazione con successo\",\"loadConversationsError\":\"Impossibile caricare le conversazioni\",\"loading\":\"Caricamento…\",\"loadingError\":\"Errore durante il caricamento\",\"mcpConnectionConnectedAt\":\"Accesso effettuato il {date}\",\"mcpConnectionDisconnectDescription\":\"Gli agenti non useranno più il tuo account {name}. La prossima volta che ti servirà, l'agente ti chiederà di accedere e potrai scegliere un altro account.\",\"mcpConnectionDisconnectQuestion\":\"Scollegare {name}?\",\"mcpConnectionDisconnected\":\"Account {name} scollegato\",\"mcpConnectionsDescription\":\"I servizi a cui hai effettuato l'accesso con il tuo account. Scollegane uno per impedire agli agenti di usarlo, o per accedere di nuovo con un account diverso.\",\"mcpConnectionsAvailableDescription\":\"Le integrazioni degli agenti che usi a cui non hai ancora effettuato l'accesso. Puoi collegarle ora, senza aspettare che l'agente te lo chieda.\",\"mcpConnectionConnected\":\"Account {name} collegato\",\"mcpConnectionConnectFailed\":\"Accesso a {name} non riuscito. Riprova: se l'errore si ripete, segnalalo a chi gestisce l'agente.\",\"mcpConnectionUsedBy\":\"Usata da {agents}\",\"mcpConnectionUsedByNone\":\"Nessun agente la usa\",\"noMcpConnections\":\"Nessuna integrazione collegata\",\"userMcpConnectionsEmpty\":\"Questo utente non ha effettuato l'accesso a nessuna integrazione con il proprio account.\",\"mcpConnectionRevokeQuestion\":\"Revocare l'accesso di {user} a {name}?\",\"mcpConnectionRevokeDescription\":\"Gli agenti non useranno più il suo account {name}. Chiediamo la revoca anche al fornitore, dove la supporta; altrimenti l'autorizzazione resta valida presso di lui fino alla scadenza. Per usarla di nuovo, {user} dovrà accedere di persona. Riceverà una notifica.\",\"mcpConnectionRevokedAtProvider\":\"Accesso a {name} revocato, anche presso il fornitore\",\"mcpConnectionRevokedHere\":\"Accesso a {name} revocato qui. Il fornitore non ha confermato la revoca: l'autorizzazione può restare valida presso di lui fino alla scadenza.\",\"mcpServerCheckError\":\"Errore durante la verifica del server MCP: {error}\",\"mcpServerCheckSuccess\":\"Verifica del server MCP riuscita\",\"mcpServerInvalidEndpoint\":\"Questo URL non punta a un endpoint MCP: il server ha risposto con una pagina web. Controlla il percorso, di solito i server MCP lo espongono sotto /mcp.\",\"mcpServersEmpty\":\"Nessun server MCP. Collega il primo per dare nuovi strumenti all'agente.\",\"membersEmpty\":\"Nessun membro. Invita il primo per iniziare.\",\"memoriesEmpty\":\"Le memorie che l'agente salva su questo utente durante le conversazioni compariranno qui.\",\"memoryNotSynced\":\"Memoria non sincronizzata con la ricerca semantica: non viene considerata nelle risposte finché lo sweep di riparazione non la ripristina.\",\"modelDiscoveryUnavailable\":\"Questo endpoint non fornisce l'elenco dei suoi modelli: inserisci gli id a mano.\",\"modelDiscoveryFailed\":\"Non siamo riusciti a leggere l'elenco dei modelli dall'endpoint: vedi solo quelli già salvati.\",\"modelPricesUnchanged\":\"Nessun prezzo è cambiato.\",\"modelPricesUpdated\":\"Aggiornato il prezzo di un modello: {models}. | Aggiornati i prezzi di {count} modelli: {models}.\",\"modelProviderDeleted\":\"Endpoint eliminato.\",\"moveDocumentSuccess\":\"Documento spostato con successo\",\"noActiveSessions\":\"Nessuna altra sessione attiva\",\"noApiKeys\":\"Nessuna chiave API\",\"noChats\":\"Nessuna chat disponibile\",\"noConnectedAccounts\":\"Nessun account collegato\",\"noConversations\":\"Nessuna conversazione trovata\",\"noConversationsHint\":\"Inizia una nuova chat per vederla comparire qui.\",\"noCreditsData\":\"Nessun dato crediti disponibile\",\"noEndpointLogs\":\"Ancora nessuna chiamata a questo endpoint\",\"noEndpointModels\":\"Nessun modello disponibile: l'endpoint non ne elenca nessuno.\",\"modelRemoved\":\"Modello rimosso.\",\"noGdprRequests\":\"Nessuna richiesta GDPR\",\"noLinkedAgents\":\"Nessun agente collegato\",\"noNotifications\":\"Nessuna notifica\",\"noOptions\":\"Nessun elemento\",\"noOrganizations\":\"Nessuna organizzazione\",\"noResults\":\"Nessun risultato trovato\",\"noSearchResults\":\"Nessun elemento corrisponde alla ricerca. Cancellala per vedere tutto.\",\"notificationsEmpty\":\"Nessuna notifica inviata. Crea la prima per raggiungere i tuoi utenti.\",\"oauthConfigIncomplete\":\"Configurazione OAuth incompleta. Imposta il Client ID nelle impostazioni del server MCP.\",\"oauthConnected\":\"Autorizzazione OAuth completata con successo\",\"oauthError\":\"Errore durante l'autorizzazione OAuth\",\"organizationDisconnected\":\"Né il gateway della piattaforma né un endpoint proprio servono questa organizzazione, quindi i suoi agenti non rispondono.\",\"organizationMembersEmpty\":\"Nessun membro. Aggiungi il primo per iniziare.\",\"organizationNotSelected\":\"Nessuna organizzazione selezionata\",\"organizationsEmpty\":\"Nessuna organizzazione. Crea la prima per iniziare.\",\"pageNotFound\":\"Pagina non trovata\",\"passwordChangeSuccess\":\"Password cambiata con successo\",\"passwordResetSuccess\":\"Password reimpostata. Tutte le sessioni dell'account sono state chiuse: accedi con la nuova password.\",\"profileOrganizationsEmpty\":\"Le organizzazioni di cui fai parte compaiono qui.\",\"readError\":\"Errore durante la lettura\",\"reasoningAgent\":\"Questo è un agente di ragionamento. Non è progettato per mantenere la storia della conversazione, ogni messaggio è processato indipendentemente.\",\"recoverPasswordSuccess\":\"Email di recupero inviata con successo\",\"refillFailed\":\"Ricarica fallita. Riprova più tardi.\",\"refillSuccess\":\"Ricarica completata con successo\",\"refreshSuccess\":\"Aggiornamento completato con successo\",\"releaseNotesEmpty\":\"Nessuna nota di rilascio pubblicata. Gli aggiornamenti compariranno qui man mano che escono.\",\"removeSuccess\":\"Eliminazione completata con successo\",\"renameFolderSuccess\":\"Cartella rinominata con successo\",\"revisedAnswersEmpty\":\"Nessuna risposta revisionata. Crea la prima per insegnare all'agente una risposta migliore.\",\"selectedCount\":\"{count} di {total} selezionati\",\"sendInvitationConfirm\":\"Sei sicuro di voler inviare nuovamente l'invito a {email}?\",\"sessionRevoked\":\"Sessione disconnessa\",\"sessionsEmpty\":\"Un accesso da un altro dispositivo o browser apre una nuova sessione, elencata qui.\",\"setPasswordDescription\":\"Per ora accedi solo tramite un account collegato. Imposta una password per entrare anche con email e password: ti inviamo un link per crearla. Crearla chiude tutte le sessioni aperte, anche questa.\",\"setPasswordLinkSent\":\"Ti abbiamo mandato il link a {email}.\",\"sharedSuccess\":\"Documento condiviso con successo\",\"sitemapUrlRequired\":\"L'URL della sitemap è richiesto\",\"startUrlRequired\":\"L'URL di partenza è richiesto\",\"subAgentsEmpty\":\"Collega un agente per delegargli una parte della conversazione.\",\"submitError\":\"Errore durante il salvataggio\",\"submitSuccess\":\"Salvataggio completato con successo\",\"success\":\"Successo\",\"testExecutionError\":\"Errore nell'esecuzione del test\",\"toolNameAutoGenerated\":\"Il nome del tool verrà generato in automatico\",\"typeToSearch\":\"Inizia a digitare per cercare…\",\"unauthorized\":\"Non hai i permessi per gestire i canali.\",\"unbanSuccess\":\"Utente sbannato con successo\",\"unblockChatSuccess\":\"Conversazione sbloccata con successo\",\"unlinkAgentConfirm\":\"Il documento resta disponibile per gli altri agenti collegati.\",\"unlinkDocumentConfirm\":\"Resta disponibile per gli altri agenti collegati.\",\"unlinkLastAgentDeleteConfirm\":\"Il documento viene eliminato definitivamente, perché nessun altro agente è collegato.\",\"unlinkSuccess\":\"Documento disassociato con successo\",\"unlinkSyncedFolderConfirm\":\"La sincronizzazione si ferma. La cartella e i suoi documenti restano all'agente e da ora si modificano come gli altri: per toglierli, elimina la cartella.\",\"unsavedChanges\":\"Salva o annulla le modifiche prima\",\"urlAlreadyImported\":\"Già importato\",\"urlAlreadyImportedLink\":\"Questo URL è già stato importato. Vuoi collegarlo all'agente corrente?\",\"userApiKeysEmpty\":\"Le chiavi che questo utente crea dal proprio profilo per l'accesso programmatico compariranno qui.\",\"userChatsEmpty\":\"Le conversazioni di questo utente con qualsiasi agente compariranno qui.\",\"userOrganizationsEmpty\":\"L'utente non appartiene ancora a nessuna organizzazione. Aggiungi la prima.\",\"userUpdateSuccess\":\"Profilo utente aggiornato con successo\",\"usersEmpty\":\"Nessun utente. Crea il primo per iniziare.\",\"voiceCancelled\":\"Ho annullato.\",\"voiceConfirmed\":\"Confermo.\",\"voiceConnecting\":\"Connessione…\",\"voiceConnectionDone\":\"Ho completato il collegamento.\",\"voiceFailed\":\"La sessione vocale si è interrotta\",\"voiceInterrupted\":\"Riprova, oppure continua per iscritto.\",\"voiceListening\":\"In ascolto\",\"voiceLocationRefused\":\"Preferisco non condividere la mia posizione.\",\"voiceLocationShared\":\"La mia posizione è {place}.\",\"voiceMuted\":\"Microfono disattivato\",\"voiceNoAnswer\":\"L'agente non è riuscito a produrre una risposta per questa chiamata. Riprova, oppure continua per iscritto.\",\"voiceSpeaking\":\"L'agente sta parlando\",\"voiceTookTooLong\":\"La risposta ha impiegato troppo tempo per la chiamata. Riprova, oppure continua per iscritto: la risposta comparirà qui appena pronta.\",\"warning\":\"Attenzione\",\"webSourceCreated\":\"Sorgente creata: la cartella «{name}» riceverà le pagine nuove.\",\"webSourceCreateError\":\"Non è stato possibile creare la sorgente, e nessuna pagina è stata importata.\",\"webSourceEditable\":\"Le pagine scoperte restano modificabili. Scollegare la sorgente le lascia dove sono, con il loro aggiornamento automatico.\",\"webSourceRemovalHeld\":\"La sitemap non elenca più {count} pagine: sono troppe in una volta per rimuoverle senza un controllo, e non è stato rimosso niente.\",\"webSourceConfirmRemovalQuestion\":\"Il prossimo controllo toglie dalla knowledge base le pagine che la sitemap non elenca più, fino a {count}. Il loro contenuto resta nel database.\",\"unlinkWebSourceConfirm\":\"La sorgente smette di cercare pagine nuove. La cartella e le sue pagine restano, con il loro aggiornamento automatico.\"}"),
|
|
1092
1092
|
messagePart: {
|
|
1093
1093
|
audioTranscribing: "Trascrizione dell'audio…",
|
|
1094
1094
|
audioTranscript: "Trascrizione",
|
|
@@ -1096,6 +1096,8 @@ var j = {
|
|
|
1096
1096
|
audioTranscriptNoSpeech: "Non si sente nessun parlato",
|
|
1097
1097
|
audioTranscriptOff: "Non trascritto: la trascrizione è spenta per questa organizzazione",
|
|
1098
1098
|
disconnectOAuthConnection: "Disconnessione in corso…",
|
|
1099
|
+
requestAccountLink: "Invio del link di accesso…",
|
|
1100
|
+
unlinkAccount: "Scollegamento del numero…",
|
|
1099
1101
|
editSpreadsheet: "Modifica del foglio di calcolo…",
|
|
1100
1102
|
editSpreadsheetCells: "{count} cella modificata | {count} celle modificate",
|
|
1101
1103
|
enableTools: "Attivazione dei tool…",
|
|
@@ -1177,6 +1179,7 @@ var j = {
|
|
|
1177
1179
|
documentName: "Inserisci il nome del documento",
|
|
1178
1180
|
documentOriginAll: "Tutte le origini",
|
|
1179
1181
|
documentRefreshAll: "Tutti gli aggiornamenti",
|
|
1182
|
+
documentStatusAll: "Tutti gli stati",
|
|
1180
1183
|
documentUrl: "Inserisci l'URL della pagina web da importare",
|
|
1181
1184
|
email: "Inserisci l'indirizzo email",
|
|
1182
1185
|
endDate: "Seleziona data fine",
|
|
@@ -1219,6 +1222,30 @@ var j = {
|
|
|
1219
1222
|
uploadFile: "Carica un file",
|
|
1220
1223
|
emailAddress: "nome{'@'}azienda.it"
|
|
1221
1224
|
},
|
|
1225
|
+
platformLink: {
|
|
1226
|
+
title: "Collega WhatsApp",
|
|
1227
|
+
cardTitle: "Collega il tuo numero WhatsApp",
|
|
1228
|
+
description: "Chi scrive da questo numero su WhatsApp userà il tuo account, comprese le sue integrazioni: posta, calendario, file. Collega solo un numero tuo.",
|
|
1229
|
+
summaryAvailable: "Userà l'account {email}.",
|
|
1230
|
+
summaryReplaces: "Sostituirà {phone}, che oggi usa il tuo account.",
|
|
1231
|
+
summaryLinkedHere: "Usa già il tuo account.",
|
|
1232
|
+
summaryLinkedElsewhere: "Usa un altro account. Scollegalo prima da lì, oppure chiedi all'agente su WhatsApp di scollegarlo.",
|
|
1233
|
+
summaryExpired: "Questo link è scaduto. Chiedine uno nuovo all'agente su WhatsApp.",
|
|
1234
|
+
summaryInvalid: "Questo link non è valido, oppure è già stato usato. Chiedine uno nuovo all'agente su WhatsApp.",
|
|
1235
|
+
summaryLinked: "Collegato. Torna su WhatsApp: l'agente ti ha scritto lì.",
|
|
1236
|
+
requestedAt: "Link richiesto alle {issued}, valido fino alle {expires}.",
|
|
1237
|
+
doNotConfirm: "Se qualcuno ti ha mandato questo link, non confermare.",
|
|
1238
|
+
confirmOnlyIf: "Conferma solo se il link l'hai chiesto tu, dal telefono con questo numero, nell'ultima ora.",
|
|
1239
|
+
link: "Collega {phone} al mio account",
|
|
1240
|
+
replace: "Collega {phone} al posto di {current}",
|
|
1241
|
+
linked: "Il numero WhatsApp {phone} ora usa il tuo account.",
|
|
1242
|
+
identitiesTitle: "Numeri collegati",
|
|
1243
|
+
identitiesDescription: "I numeri di messaggistica che scrivono come il tuo account. Scollegane uno perché smetta di usare il tuo account e le sue integrazioni.",
|
|
1244
|
+
linkedAt: "Collegato il {date}",
|
|
1245
|
+
unlinkQuestion: "Scollegare {phone}?",
|
|
1246
|
+
unlinkDescription: "Chi scrive da questo numero non userà più il tuo account e le sue integrazioni. Le conversazioni restano nel tuo account.",
|
|
1247
|
+
unlinked: "{phone} non usa più il tuo account."
|
|
1248
|
+
},
|
|
1222
1249
|
problemReasons: {
|
|
1223
1250
|
"file-upload-validation": { "audio-too-large": "La registrazione supera 100 MB, il massimo che si trascrive: carica una copia più corta o più compressa, per esempio un m4a o un mp3." },
|
|
1224
1251
|
"gateway-disabled": {
|
|
@@ -2702,7 +2729,7 @@ var j = {
|
|
|
2702
2729
|
explicit: "Explicit | Explicit",
|
|
2703
2730
|
extracted: "Extracted | Extracted"
|
|
2704
2731
|
},
|
|
2705
|
-
message: /* @__PURE__ */ JSON.parse("{\"accountLinkAlreadyLinked\":\"This account is already linked to another user. Sign in with that user to unlink it first.\",\"accountLinkCancelled\":\"Linking was cancelled on the provider's page. Nothing was changed.\",\"accountLinkEmailMismatch\":\"You can only link accounts that use the same email as your profile.\",\"accountLinkErrorWithCode\":\"Unable to link the account (code: {code}). Try again or contact support with this code.\",\"accountLinkNotAllowed\":\"This provider cannot be linked to your profile: the account's email is not verified or linking is disabled.\",\"accountLinkUserInfo\":\"The provider did not return a usable profile, so no account was linked. Try again.\",\"accountUnlinked\":\"Account disconnected\",\"agentAccessDenied\":\"You do not have access to this agent\",\"agentAccessDeniedAction\":\"View available agents\",\"agentActivated\":\"Agent activated successfully\",\"agentDeactivated\":\"Agent deactivated successfully\",\"agentNotFound\":\"Agent not found\",\"agentsEmpty\":\"No agents yet. Create the first one to get started.\",\"analyzeChatError\":\"The analysis did not complete. Try again in a few minutes.\",\"analyzeChatInProgress\":\"Analyzing the conversation. A long conversation can take about a minute.\",\"analyzeChatSuccess\":\"Conversation analyzed successfully\",\"apiKeyCreatedForUser\":\"Shown only once: copy it and pass it on securely.\",\"apiKeysEmpty\":\"The keys you create for programmatic access appear here.\",\"apiToolsEmpty\":\"No API tools yet. Add the first one to let the agent call an external service.\",\"banSuccess\":\"User banned successfully\",\"blockChatSuccess\":\"Conversation blocked successfully\",\"bulkUnlinkAllDeleteConfirm\":\"{count} document(s) will be permanently deleted because they have no other linked agents. Do you want to proceed?\",\"bulkUnlinkMixedConfirm\":\"{unlinkCount} document(s) will be unlinked and {deleteCount} will be permanently deleted (they have no other linked agents). Do you want to proceed?\",\"cancelInvitationConfirm\":\"Are you sure you want to cancel the invitation for {email}?\",\"cancelInvitationSuccess\":\"Invitation cancelled successfully\",\"chatActionError\":\"The action did not complete. Try again in a few minutes.\",\"chatAnonymized\":\"The content of this conversation has been erased (GDPR): only aggregate metrics remain.\",\"chatErrorBadRequest\":\"An error occurred with the request. Start a new chat to continue.\",\"chatErrorContextWindow\":\"The conversation has become too long. Start a new chat to continue.\",\"chatErrorConversationBlocked\":\"This conversation has been blocked for policy violations.\",\"chatErrorCreditExhausted\":\"Service unavailable. Try again later.\",\"chatErrorGatewayDisabled\":\"This agent's model is not available: the organization does not use the platform AI gateway. An administrator can move the agent to one of the organization's own models.\",\"chatErrorGatewayPromptTraining\":\"Model \\\"{model}\\\" does not support the \\\"Disable prompt training\\\" option. Disable this setting in the agent's gateway configuration or choose a compatible model.\",\"chatErrorGatewayZdr\":\"Model \\\"{model}\\\" does not support the \\\"Zero Data Retention\\\" option. Disable ZDR in the agent's gateway configuration or choose a compatible model.\",\"chatErrorGeneric\":\"An error occurred. Start a new chat if the problem persists. Retrying in {seconds}…\",\"chatErrorInternalServer\":\"A server error occurred. Start a new chat to continue.\",\"chatErrorModelUnavailable\":\"This agent's model is not available right now: the endpoint it runs on is switched off or no longer serves it. An administrator can switch it back on or move the agent to another model.\",\"chatErrorNotFound\":\"The conversation is no longer available. Start a new chat to continue.\",\"chatErrorOriginNotAllowed\":\"The request origin is not allowed. Contact the system administrator.\",\"chatErrorRateLimit\":\"The rate limit has been exceeded. Retrying in {seconds} seconds…\",\"chatErrorRetrying\":\"Retrying in {seconds} seconds…\",\"checkYourEmail\":\"Check your email inbox\",\"confirm\":\"Are you sure you want to proceed?\",\"confirmRefillCredits\":\"Are you sure you want to refill the credit of {amount} €?\",\"contentTruncated\":\"Content truncated. Total characters: {total}\",\"copied\":\"Copied to clipboard\",\"crawlError\":\"Error during crawling\",\"createFolderSuccess\":\"Folder created successfully\",\"defaultAgentWelcome\":\"Hello! How can I help you today?\",\"defaultPrivacyPolicyNotice\":\"By sending the request you accept our [Privacy Policy](https://www.iubenda.com/privacy-policy/46350192).\",\"deleteAgentConfirm\":\"Its folders are deleted. A document no other agent uses is deleted, a shared one stays with the other agents.\",\"deleteAllMemoriesConfirm\":\"They go for good, semantic search included.\",\"deleteAllNotificationsConfirm\":\"Delete every notification?\",\"deleteBulkDocumentConfirm\":\"They are removed from every agent linked to them and go to the trash, where they can be restored.\",\"deleteDocumentConfirm\":\"It is removed from every agent linked to it and goes to the trash, where it can be restored.\",\"deleteDocumentConfirmWithAgents\":\"It goes to the trash, where it can be restored, and is removed from the following agents:{agents}\",\"deleteError\":\"The deletion failed. Try again.\",\"deleteFolderConfirm\":\"Its documents are removed from this agent. A document no other agent uses is deleted.\",\"deleteFolderSuccess\":\"Folder deleted successfully\",\"deleteMyConversationsConfirm\":\"This cannot be undone.\",\"deleteNotificationConfirm\":\"Delete this notification?\",\"deleteProfileBlockedSoleOwner\":\"You are the sole owner of {organizations}. Transfer ownership or delete the organizations before deleting your account.\",\"deleteProfileConfirm\":\"You are about to permanently delete your account: your profile will be anonymized and the content of your conversations erased. This action cannot be undone.\",\"deleteProfileDescription\":\"Anonymize your account and erase the content of your conversations (right to be forgotten).\",\"diagramRenderError\":\"Could not render diagram.\",\"documentRefreshPausedReason\":\"The page no longer responds, so the automatic update is paused. Update now to try again.\",\"documentRefreshSet\":\"Automatic update set on {updated} documents, {skipped} skipped because they are not web pages\",\"documentRefreshStarted\":\"Update started on {queued} documents, {skipped} skipped\",\"documentsEmpty\":\"Nothing in this folder yet. Add documents from the Create menu, or start with a folder.\",\"documentsEmptyManaged\":\"No synced files in this folder. Its content comes from the connected source: if you have just linked it, the first import can take a few minutes.\",\"documentSourceLinked\":\"Folder linked. The first import starts shortly.\",\"documentSourceNothingHere\":\"Nothing in here.\",\"documentSourceStale\":\"The state of this folder is not up to date: the last read failed.\",\"documentSourceUnlinked\":\"Folder unlinked. Its documents stay, and can now be edited like any other.\",\"embeddingActivated\":\"Embedding saved: the endpoint serves the declared model\",\"embeddingBackToPlatform\":\"The vectors are computed on the platform again\",\"embeddingIndexNotUpdated\":\"The progress stopped updating.\",\"embeddingRemoved\":\"Embedding removed from the endpoint\",\"empty\":\"No items found\",\"endpointActivated\":\"Endpoint activated successfully\",\"endpointDeactivated\":\"Endpoint deactivated successfully\",\"endpointsEmpty\":\"No endpoints yet. Create the first one to expose the agent over HTTP.\",\"error\":\"Error\",\"errorRetry\":\"Something went wrong. Try again.\",\"exportError\":\"Error while exporting data\",\"exportFailed\":\"The data export failed. Try again later.\",\"exportMyDataDescription\":\"Download a complete copy of your personal data as a ZIP archive (GDPR Art. 15 and 20).\",\"exportRequested\":\"We are preparing your archive: you will receive an email with the download link.\",\"exportSuccess\":\"CSV exported successfully\",\"feedbackSubmitError\":\"Submission failed. Try again.\",\"feedbackSubmittedMessage\":\"Your feedback has been submitted successfully.\",\"feedbackSubmittedTitle\":\"Thank you!\",\"feedbacksEmpty\":\"Feedback that users leave on the agent's answers will appear here.\",\"fileAlreadyImported\":\"Already imported\",\"fileAlreadyImportedExistingList\":\"The following files are already present in the organization:\\n{names}\",\"fileAlreadyImportedLink\":\"This file has already been imported. Do you want to link the existing document to the current agent or create a new one?\",\"fileAlreadyImportedNewList\":\"The following files are new and will be imported normally:\\n{names}\",\"fileAlreadyImportedQuestion\":\"Do you want to link the existing files to the current agent?\",\"fileAlreadyLinkedToAgent\":\"The following files are already linked to the current agent:\\n{names}\",\"fileLimitPerChat\":\"You have reached the limit of {max} files for this conversation.\",\"fileLimitPerMessage\":\"You can attach at most {max} files per message.\",\"foldersEmpty\":\"No folders yet. Create the first one from the documents page to organize them.\",\"formRenderError\":\"The form could not be shown. Ask again and the agent will send it.\",\"gdprRequestsEmpty\":\"Export or deletion requests for this user appear here.\",\"geolocationPermissionDenied\":\"Location access denied. Allow it in your browser settings.\",\"geolocationUnavailable\":\"Location unavailable. Try again or enter your location manually.\",\"getMcpServerInfoError\":\"An error occurred while loading the tools.\",\"importError\":\"Error during import\",\"importSuccess\":\"{count} documents imported successfully\",\"importing\":\"Importing…\",\"info\":\"Information\",\"insufficientCredit\":\"Insufficient credit. Try again later.\",\"insufficientCreditMessage\":\"Your credit is insufficient to complete this operation. Contact the system administrator for more information.\",\"integrationConnected\":\"Connected successfully.\",\"integrationCreated\":\"Integration created successfully\",\"integrationDisabled\":\"Integration disabled\",\"integrationDisconnected\":\"Connection removed.\",\"integrationDisconnectConfirm\":\"The folders it keeps in sync are unlinked.\",\"integrationEnabled\":\"Integration enabled\",\"integrationOAuthDenied\":\"The connection was refused, or a Microsoft 365 administrator has not approved it yet.\",\"integrationOAuthFailed\":\"The connection did not succeed.\",\"integrationOAuthStartFailed\":\"The connection could not be started.\",\"integrationRemoveConfirm\":\"This integration's configuration is removed.\",\"integrationTestFailed\":\"Connection test failed: {error}\",\"integrationTestSuccess\":\"Connection verified successfully\",\"integrationUpdated\":\"Integration updated successfully\",\"invalidJson\":\"The input is not valid JSON\",\"invitationAccepted\":\"Invitation accepted\",\"invitationAlreadyHandled\":\"Invitation already handled\",\"invitationDeclined\":\"Invitation declined\",\"invitationToJoinOrganization\":\"You have been invited to join\",\"invitationsEmpty\":\"No pending invitations. Invite people from the members page.\",\"leadSubmitError\":\"Failed to submit. Try again.\",\"leadSubmittedMessage\":\"Your information has been submitted successfully.\",\"leadSubmittedTitle\":\"Thank you!\",\"leadsEmpty\":\"Leads collected by the agent during conversations will appear here.\",\"leftOrganization\":\"You have successfully left the organization\",\"loadConversationsError\":\"Failed to load conversations\",\"loading\":\"Loading…\",\"loadingError\":\"Error while loading\",\"mcpConnectionConnectedAt\":\"Signed in on {date}\",\"mcpConnectionDisconnectDescription\":\"The agents will no longer use your {name} account. The next time you need it, the agent will ask you to sign in, and you can choose a different account.\",\"mcpConnectionDisconnectQuestion\":\"Disconnect {name}?\",\"mcpConnectionDisconnected\":\"{name} account disconnected\",\"mcpConnectionsDescription\":\"The services you signed in to with your account. Disconnect one to stop the agents from using it, or to sign in again with a different account.\",\"mcpConnectionsAvailableDescription\":\"The integrations of the agents you use that you have not signed in to yet. You can connect them now, without waiting for the agent to ask.\",\"mcpConnectionConnected\":\"{name} account connected\",\"mcpConnectionConnectFailed\":\"Signing in to {name} did not work. Try again, and if it keeps failing, tell whoever runs the agent.\",\"mcpConnectionUsedBy\":\"Used by {agents}\",\"mcpConnectionUsedByNone\":\"No agent uses it\",\"noMcpConnections\":\"No connected integrations\",\"userMcpConnectionsEmpty\":\"This user has not signed in to any integration with their own account.\",\"mcpConnectionRevokeQuestion\":\"Revoke {user}'s sign-in to {name}?\",\"mcpConnectionRevokeDescription\":\"The agents will no longer use their {name} account. The provider is asked to revoke it too, where it supports that; otherwise the authorization stays valid there until it expires. To use it again, {user} has to sign in themselves. They will receive a notification.\",\"mcpConnectionRevokedAtProvider\":\"Sign-in to {name} revoked, at the provider too\",\"mcpConnectionRevokedHere\":\"Sign-in to {name} revoked here. The provider did not confirm the revocation: the authorization may stay valid there until it expires.\",\"mcpServerCheckError\":\"Error while checking MCP Server: {error}\",\"mcpServerCheckSuccess\":\"MCP Server check successful\",\"mcpServerInvalidEndpoint\":\"This URL does not point to an MCP endpoint: the server replied with a web page. Check the path, MCP servers usually expose it under /mcp.\",\"mcpServersEmpty\":\"No MCP servers yet. Connect the first one to give the agent new tools.\",\"membersEmpty\":\"No members yet. Invite the first one to get started.\",\"memoriesEmpty\":\"Memories the agent saves about this user during conversations will appear here.\",\"memoryNotSynced\":\"Memory not synced with semantic search: it is not considered in answers until the repair sweep heals it.\",\"modelDiscoveryUnavailable\":\"This endpoint does not provide the list of its models: enter the ids by hand.\",\"modelDiscoveryFailed\":\"We could not read the list of models from the endpoint: only the models already saved are shown.\",\"modelPricesUnchanged\":\"No price changed.\",\"modelPricesUpdated\":\"Updated the price of one model: {models}. | Updated the prices of {count} models: {models}.\",\"modelProviderDeleted\":\"Endpoint deleted.\",\"moveDocumentSuccess\":\"Document moved successfully\",\"noActiveSessions\":\"No other active sessions\",\"noApiKeys\":\"No API keys\",\"noChats\":\"No chat available\",\"noConnectedAccounts\":\"No connected accounts\",\"noConversations\":\"No conversations found\",\"noConversationsHint\":\"Start a new chat to see it appear here.\",\"noCreditsData\":\"No credit data available\",\"noEndpointLogs\":\"No calls to this endpoint yet\",\"noEndpointModels\":\"No model available: the endpoint listed none.\",\"modelRemoved\":\"Model removed.\",\"noGdprRequests\":\"No GDPR requests\",\"noLinkedAgents\":\"No linked agents\",\"noNotifications\":\"No notifications\",\"noOptions\":\"No options\",\"noOrganizations\":\"No organizations\",\"noResults\":\"No results\",\"noSearchResults\":\"Nothing matches your search. Clear it to see everything.\",\"notificationsEmpty\":\"No notifications sent yet. Create the first one to reach your users.\",\"oauthConfigIncomplete\":\"OAuth configuration incomplete. Set the Client ID in the MCP server settings.\",\"oauthConnected\":\"OAuth authorization completed successfully\",\"oauthError\":\"Error during OAuth authorization\",\"organizationDisconnected\":\"Neither the platform gateway nor an endpoint of its own serves this organization, so its agents do not answer.\",\"organizationMembersEmpty\":\"No members yet. Add the first one to get started.\",\"organizationNotSelected\":\"No organization selected\",\"organizationsEmpty\":\"No organizations yet. Create the first one to get started.\",\"pageNotFound\":\"Page not found\",\"passwordChangeSuccess\":\"Password changed successfully\",\"passwordResetSuccess\":\"Password reset. Every session of the account has been closed: sign in with the new password.\",\"profileOrganizationsEmpty\":\"The organizations you belong to appear here.\",\"readError\":\"Error while reading\",\"reasoningAgent\":\"This is a reasoning agent. It is not designed to maintain the conversation history, each message is processed independently.\",\"recoverPasswordSuccess\":\"Recovery email sent successfully\",\"refillFailed\":\"Refill failed. Try again later.\",\"refillSuccess\":\"Refill completed successfully\",\"refreshSuccess\":\"Refresh completed successfully\",\"releaseNotesEmpty\":\"No release notes published yet. Updates will be listed here as they ship.\",\"removeSuccess\":\"Removal completed successfully\",\"renameFolderSuccess\":\"Folder renamed successfully\",\"revisedAnswersEmpty\":\"No revised answers yet. Create the first one to teach the agent a better reply.\",\"selectedCount\":\"{count} of {total} selected\",\"sendInvitationConfirm\":\"Are you sure you want to resend the invitation to {email}?\",\"sessionRevoked\":\"Session signed out\",\"sessionsEmpty\":\"Signing in from another device or browser opens a new session, listed here.\",\"setPasswordDescription\":\"For now you sign in only through a connected account. Set a password to sign in with email and password too: we will email you a link to create it. Creating it closes every open session, this one included.\",\"setPasswordLinkSent\":\"We sent the link to {email}.\",\"sharedSuccess\":\"Document shared successfully\",\"sitemapUrlRequired\":\"Sitemap URL is required\",\"startUrlRequired\":\"Start URL is required\",\"subAgentsEmpty\":\"Connect an agent to delegate part of the conversation to it.\",\"submitError\":\"Error while saving\",\"submitSuccess\":\"Save completed successfully\",\"success\":\"Success\",\"testExecutionError\":\"Error executing test\",\"toolNameAutoGenerated\":\"The tool name will be generated automatically\",\"typeToSearch\":\"Start typing to search…\",\"unauthorized\":\"You do not have permission to manage channels.\",\"unbanSuccess\":\"User unbanned successfully\",\"unblockChatSuccess\":\"Conversation unblocked successfully\",\"unlinkAgentConfirm\":\"The document stays available to the other agents linked to it.\",\"unlinkDocumentConfirm\":\"It stays available to the other agents linked to it.\",\"unlinkLastAgentDeleteConfirm\":\"The document is permanently deleted, because no other agent is linked to it.\",\"unlinkSuccess\":\"Document unlinked successfully\",\"unlinkSyncedFolderConfirm\":\"Syncing stops. The folder and its documents stay with the agent and can be edited like any other from now on: to remove them, delete the folder.\",\"unsavedChanges\":\"Save or discard your changes first\",\"urlAlreadyImported\":\"Already imported\",\"urlAlreadyImportedLink\":\"This URL has already been imported. Do you want to link it to the current agent?\",\"userApiKeysEmpty\":\"Keys this user creates from their profile for programmatic access will appear here.\",\"userChatsEmpty\":\"Conversations this user has with any agent will appear here.\",\"userOrganizationsEmpty\":\"This user does not belong to any organization yet. Add the first one.\",\"userUpdateSuccess\":\"User profile updated successfully\",\"usersEmpty\":\"No users yet. Create the first one to get started.\",\"voiceCancelled\":\"I have cancelled.\",\"voiceConfirmed\":\"I confirm.\",\"voiceConnecting\":\"Connecting…\",\"voiceConnectionDone\":\"I have completed the connection.\",\"voiceFailed\":\"The voice session stopped\",\"voiceInterrupted\":\"Try again, or continue in writing.\",\"voiceListening\":\"Listening\",\"voiceLocationRefused\":\"I would rather not share my location.\",\"voiceLocationShared\":\"My location is {place}.\",\"voiceMuted\":\"Microphone muted\",\"voiceNoAnswer\":\"The agent could not produce an answer for this call. Try again, or continue in writing.\",\"voiceSpeaking\":\"The agent is speaking\",\"voiceTookTooLong\":\"The answer took too long for the call. Try again, or continue in writing: the answer will appear here as soon as it is ready.\",\"warning\":\"Warning\",\"webSourceCreated\":\"Source created: the folder “{name}” will receive new pages.\",\"webSourceCreateError\":\"The source could not be created, and no page was imported.\",\"webSourceEditable\":\"Discovered pages stay editable. Unlinking the source leaves them where they are, with their automatic refresh.\",\"webSourceRemovalHeld\":\"The sitemap no longer lists {count} pages: too many at once to remove without a check, so nothing was removed.\",\"webSourceConfirmRemovalQuestion\":\"The next check takes out of the knowledge base the pages the sitemap no longer lists, up to {count}. Their content stays in the database.\",\"unlinkWebSourceConfirm\":\"The source stops looking for new pages. The folder and its pages stay, with their automatic refresh.\"}"),
|
|
2732
|
+
message: /* @__PURE__ */ JSON.parse("{\"accountLinkAlreadyLinked\":\"This account is already linked to another user. Sign in with that user to unlink it first.\",\"accountLinkCancelled\":\"Linking was cancelled on the provider's page. Nothing was changed.\",\"accountLinkEmailMismatch\":\"You can only link accounts that use the same email as your profile.\",\"accountLinkErrorWithCode\":\"Unable to link the account (code: {code}). Try again or contact support with this code.\",\"accountLinkNotAllowed\":\"This provider cannot be linked to your profile: the account's email is not verified or linking is disabled.\",\"accountLinkUserInfo\":\"The provider did not return a usable profile, so no account was linked. Try again.\",\"accountUnlinked\":\"Account disconnected\",\"agentAccessDenied\":\"You do not have access to this agent\",\"agentAccessDeniedAction\":\"View available agents\",\"agentActivated\":\"Agent activated successfully\",\"agentDeactivated\":\"Agent deactivated successfully\",\"agentNotFound\":\"Agent not found\",\"agentsEmpty\":\"No agents yet. Create the first one to get started.\",\"analyzeChatError\":\"The analysis did not complete. Try again in a few minutes.\",\"analyzeChatInProgress\":\"Analyzing the conversation. A long conversation can take about a minute.\",\"analyzeChatSuccess\":\"Conversation analyzed successfully\",\"apiKeyCreatedForUser\":\"Shown only once: copy it and pass it on securely.\",\"apiKeysEmpty\":\"The keys you create for programmatic access appear here.\",\"apiToolsEmpty\":\"No API tools yet. Add the first one to let the agent call an external service.\",\"banSuccess\":\"User banned successfully\",\"blockChatSuccess\":\"Conversation blocked successfully\",\"bulkUnlinkAllDeleteConfirm\":\"{count} document(s) will be permanently deleted because they have no other linked agents. Do you want to proceed?\",\"bulkUnlinkMixedConfirm\":\"{unlinkCount} document(s) will be unlinked and {deleteCount} will be permanently deleted (they have no other linked agents). Do you want to proceed?\",\"cancelInvitationConfirm\":\"Are you sure you want to cancel the invitation for {email}?\",\"cancelInvitationSuccess\":\"Invitation cancelled successfully\",\"chatActionError\":\"The action did not complete. Try again in a few minutes.\",\"chatAnonymized\":\"The content of this conversation has been erased (GDPR): only aggregate metrics remain.\",\"chatErrorBadRequest\":\"An error occurred with the request. Start a new chat to continue.\",\"chatErrorContextWindow\":\"The conversation has become too long. Start a new chat to continue.\",\"chatErrorConversationBlocked\":\"This conversation has been blocked for policy violations.\",\"chatErrorCreditExhausted\":\"Service unavailable. Try again later.\",\"chatErrorGatewayDisabled\":\"This agent's model is not available: the organization does not use the platform AI gateway. An administrator can move the agent to one of the organization's own models.\",\"chatErrorGatewayPromptTraining\":\"Model \\\"{model}\\\" does not support the \\\"Disable prompt training\\\" option. Disable this setting in the agent's gateway configuration or choose a compatible model.\",\"chatErrorGatewayZdr\":\"Model \\\"{model}\\\" does not support the \\\"Zero Data Retention\\\" option. Disable ZDR in the agent's gateway configuration or choose a compatible model.\",\"chatErrorGeneric\":\"An error occurred. Start a new chat if the problem persists. Retrying in {seconds}…\",\"chatErrorInternalServer\":\"A server error occurred. Start a new chat to continue.\",\"chatErrorModelUnavailable\":\"This agent's model is not available right now: the endpoint it runs on is switched off or no longer serves it. An administrator can switch it back on or move the agent to another model.\",\"chatErrorNotFound\":\"The conversation is no longer available. Start a new chat to continue.\",\"chatErrorOriginNotAllowed\":\"The request origin is not allowed. Contact the system administrator.\",\"chatErrorRateLimit\":\"The rate limit has been exceeded. Retrying in {seconds} seconds…\",\"chatErrorRetrying\":\"Retrying in {seconds} seconds…\",\"checkYourEmail\":\"Check your email inbox\",\"confirm\":\"Are you sure you want to proceed?\",\"confirmRefillCredits\":\"Are you sure you want to refill the credit of {amount} €?\",\"contentTruncated\":\"Content truncated. Total characters: {total}\",\"copied\":\"Copied to clipboard\",\"crawlError\":\"Error during crawling\",\"createFolderSuccess\":\"Folder created successfully\",\"defaultAgentWelcome\":\"Hello! How can I help you today?\",\"defaultPrivacyPolicyNotice\":\"By sending the request you accept our [Privacy Policy](https://www.iubenda.com/privacy-policy/46350192).\",\"deleteAgentConfirm\":\"Its folders are deleted. A document no other agent uses is deleted, a shared one stays with the other agents.\",\"deleteAllMemoriesConfirm\":\"They go for good, semantic search included.\",\"deleteAllNotificationsConfirm\":\"Delete every notification?\",\"deleteBulkDocumentConfirm\":\"They are removed from every agent linked to them and go to the trash, where they can be restored.\",\"deleteDocumentConfirm\":\"It is removed from every agent linked to it and goes to the trash, where it can be restored.\",\"deleteDocumentConfirmWithAgents\":\"It goes to the trash, where it can be restored, and is removed from the following agents:{agents}\",\"deleteError\":\"The deletion failed. Try again.\",\"deleteFolderConfirm\":\"Its documents are removed from this agent. A document no other agent uses is deleted.\",\"deleteFolderSuccess\":\"Folder deleted successfully\",\"deleteMyConversationsConfirm\":\"This cannot be undone.\",\"deleteNotificationConfirm\":\"Delete this notification?\",\"deleteProfileBlockedSoleOwner\":\"You are the sole owner of {organizations}. Transfer ownership or delete the organizations before deleting your account.\",\"deleteProfileConfirm\":\"You are about to permanently delete your account: your profile will be anonymized and the content of your conversations erased. This action cannot be undone.\",\"deleteProfileDescription\":\"Anonymize your account and erase the content of your conversations (right to be forgotten).\",\"diagramRenderError\":\"Could not render diagram.\",\"documentRefreshPausedReason\":\"The page no longer responds, so the automatic update is paused. Update now to try again.\",\"documentRefreshSet\":\"Automatic update set on {updated} documents, {skipped} skipped because they are not web pages\",\"documentRefreshStarted\":\"Update started on {queued} documents, {skipped} skipped\",\"documentsEmpty\":\"Nothing in this folder yet. Add documents from the Create menu, or start with a folder.\",\"documentsEmptyManaged\":\"No synced files in this folder. Its content comes from the connected source: if you have just linked it, the first import can take a few minutes.\",\"documentsNoMatch\":\"No document matches the search or the filters. Reset them to see everything.\",\"documentSourceLinked\":\"Folder linked. The first import starts shortly.\",\"documentSourceNothingHere\":\"Nothing in here.\",\"documentSourceStale\":\"The state of this folder is not up to date: the last read failed.\",\"documentSourceUnlinked\":\"Folder unlinked. Its documents stay, and can now be edited like any other.\",\"embeddingActivated\":\"Embedding saved: the endpoint serves the declared model\",\"embeddingBackToPlatform\":\"The vectors are computed on the platform again\",\"embeddingIndexNotUpdated\":\"The progress stopped updating.\",\"embeddingRemoved\":\"Embedding removed from the endpoint\",\"empty\":\"No items found\",\"endpointActivated\":\"Endpoint activated successfully\",\"endpointDeactivated\":\"Endpoint deactivated successfully\",\"endpointsEmpty\":\"No endpoints yet. Create the first one to expose the agent over HTTP.\",\"error\":\"Error\",\"errorRetry\":\"Something went wrong. Try again.\",\"exportError\":\"Error while exporting data\",\"exportFailed\":\"The data export failed. Try again later.\",\"exportMyDataDescription\":\"Download a complete copy of your personal data as a ZIP archive (GDPR Art. 15 and 20).\",\"exportRequested\":\"We are preparing your archive: you will receive an email with the download link.\",\"exportSuccess\":\"CSV exported successfully\",\"feedbackSubmitError\":\"Submission failed. Try again.\",\"feedbackSubmittedMessage\":\"Your feedback has been submitted successfully.\",\"feedbackSubmittedTitle\":\"Thank you!\",\"feedbacksEmpty\":\"Feedback that users leave on the agent's answers will appear here.\",\"fileAlreadyImported\":\"Already imported\",\"fileAlreadyImportedExistingList\":\"The following files are already present in the organization:\\n{names}\",\"fileAlreadyImportedLink\":\"This file has already been imported. Do you want to link the existing document to the current agent or create a new one?\",\"fileAlreadyImportedNewList\":\"The following files are new and will be imported normally:\\n{names}\",\"fileAlreadyImportedQuestion\":\"Do you want to link the existing files to the current agent?\",\"fileAlreadyLinkedToAgent\":\"The following files are already linked to the current agent:\\n{names}\",\"fileLimitPerChat\":\"You have reached the limit of {max} files for this conversation.\",\"fileLimitPerMessage\":\"You can attach at most {max} files per message.\",\"foldersEmpty\":\"No folders yet. Create the first one from the documents page to organize them.\",\"formRenderError\":\"The form could not be shown. Ask again and the agent will send it.\",\"gdprRequestsEmpty\":\"Export or deletion requests for this user appear here.\",\"geolocationPermissionDenied\":\"Location access denied. Allow it in your browser settings.\",\"geolocationUnavailable\":\"Location unavailable. Try again or enter your location manually.\",\"getMcpServerInfoError\":\"An error occurred while loading the tools.\",\"importError\":\"Error during import\",\"importSuccess\":\"{count} documents imported successfully\",\"importing\":\"Importing…\",\"info\":\"Information\",\"insufficientCredit\":\"Insufficient credit. Try again later.\",\"insufficientCreditMessage\":\"Your credit is insufficient to complete this operation. Contact the system administrator for more information.\",\"integrationConnected\":\"Connected successfully.\",\"integrationCreated\":\"Integration created successfully\",\"integrationDisabled\":\"Integration disabled\",\"integrationDisconnected\":\"Connection removed.\",\"integrationDisconnectConfirm\":\"The folders it keeps in sync are unlinked.\",\"integrationEnabled\":\"Integration enabled\",\"integrationOAuthDenied\":\"The connection was refused, or a Microsoft 365 administrator has not approved it yet.\",\"integrationOAuthFailed\":\"The connection did not succeed.\",\"integrationOAuthStartFailed\":\"The connection could not be started.\",\"integrationRemoveConfirm\":\"This integration's configuration is removed.\",\"integrationTestFailed\":\"Connection test failed: {error}\",\"integrationTestSuccess\":\"Connection verified successfully\",\"integrationUpdated\":\"Integration updated successfully\",\"invalidJson\":\"The input is not valid JSON\",\"invitationAccepted\":\"Invitation accepted\",\"invitationAlreadyHandled\":\"Invitation already handled\",\"invitationDeclined\":\"Invitation declined\",\"invitationToJoinOrganization\":\"You have been invited to join\",\"invitationsEmpty\":\"No pending invitations. Invite people from the members page.\",\"leadSubmitError\":\"Failed to submit. Try again.\",\"leadSubmittedMessage\":\"Your information has been submitted successfully.\",\"leadSubmittedTitle\":\"Thank you!\",\"leadsEmpty\":\"Leads collected by the agent during conversations will appear here.\",\"leftOrganization\":\"You have successfully left the organization\",\"loadConversationsError\":\"Failed to load conversations\",\"loading\":\"Loading…\",\"loadingError\":\"Error while loading\",\"mcpConnectionConnectedAt\":\"Signed in on {date}\",\"mcpConnectionDisconnectDescription\":\"The agents will no longer use your {name} account. The next time you need it, the agent will ask you to sign in, and you can choose a different account.\",\"mcpConnectionDisconnectQuestion\":\"Disconnect {name}?\",\"mcpConnectionDisconnected\":\"{name} account disconnected\",\"mcpConnectionsDescription\":\"The services you signed in to with your account. Disconnect one to stop the agents from using it, or to sign in again with a different account.\",\"mcpConnectionsAvailableDescription\":\"The integrations of the agents you use that you have not signed in to yet. You can connect them now, without waiting for the agent to ask.\",\"mcpConnectionConnected\":\"{name} account connected\",\"mcpConnectionConnectFailed\":\"Signing in to {name} did not work. Try again, and if it keeps failing, tell whoever runs the agent.\",\"mcpConnectionUsedBy\":\"Used by {agents}\",\"mcpConnectionUsedByNone\":\"No agent uses it\",\"noMcpConnections\":\"No connected integrations\",\"userMcpConnectionsEmpty\":\"This user has not signed in to any integration with their own account.\",\"mcpConnectionRevokeQuestion\":\"Revoke {user}'s sign-in to {name}?\",\"mcpConnectionRevokeDescription\":\"The agents will no longer use their {name} account. The provider is asked to revoke it too, where it supports that; otherwise the authorization stays valid there until it expires. To use it again, {user} has to sign in themselves. They will receive a notification.\",\"mcpConnectionRevokedAtProvider\":\"Sign-in to {name} revoked, at the provider too\",\"mcpConnectionRevokedHere\":\"Sign-in to {name} revoked here. The provider did not confirm the revocation: the authorization may stay valid there until it expires.\",\"mcpServerCheckError\":\"Error while checking MCP Server: {error}\",\"mcpServerCheckSuccess\":\"MCP Server check successful\",\"mcpServerInvalidEndpoint\":\"This URL does not point to an MCP endpoint: the server replied with a web page. Check the path, MCP servers usually expose it under /mcp.\",\"mcpServersEmpty\":\"No MCP servers yet. Connect the first one to give the agent new tools.\",\"membersEmpty\":\"No members yet. Invite the first one to get started.\",\"memoriesEmpty\":\"Memories the agent saves about this user during conversations will appear here.\",\"memoryNotSynced\":\"Memory not synced with semantic search: it is not considered in answers until the repair sweep heals it.\",\"modelDiscoveryUnavailable\":\"This endpoint does not provide the list of its models: enter the ids by hand.\",\"modelDiscoveryFailed\":\"We could not read the list of models from the endpoint: only the models already saved are shown.\",\"modelPricesUnchanged\":\"No price changed.\",\"modelPricesUpdated\":\"Updated the price of one model: {models}. | Updated the prices of {count} models: {models}.\",\"modelProviderDeleted\":\"Endpoint deleted.\",\"moveDocumentSuccess\":\"Document moved successfully\",\"noActiveSessions\":\"No other active sessions\",\"noApiKeys\":\"No API keys\",\"noChats\":\"No chat available\",\"noConnectedAccounts\":\"No connected accounts\",\"noConversations\":\"No conversations found\",\"noConversationsHint\":\"Start a new chat to see it appear here.\",\"noCreditsData\":\"No credit data available\",\"noEndpointLogs\":\"No calls to this endpoint yet\",\"noEndpointModels\":\"No model available: the endpoint listed none.\",\"modelRemoved\":\"Model removed.\",\"noGdprRequests\":\"No GDPR requests\",\"noLinkedAgents\":\"No linked agents\",\"noNotifications\":\"No notifications\",\"noOptions\":\"No options\",\"noOrganizations\":\"No organizations\",\"noResults\":\"No results\",\"noSearchResults\":\"Nothing matches your search. Clear it to see everything.\",\"notificationsEmpty\":\"No notifications sent yet. Create the first one to reach your users.\",\"oauthConfigIncomplete\":\"OAuth configuration incomplete. Set the Client ID in the MCP server settings.\",\"oauthConnected\":\"OAuth authorization completed successfully\",\"oauthError\":\"Error during OAuth authorization\",\"organizationDisconnected\":\"Neither the platform gateway nor an endpoint of its own serves this organization, so its agents do not answer.\",\"organizationMembersEmpty\":\"No members yet. Add the first one to get started.\",\"organizationNotSelected\":\"No organization selected\",\"organizationsEmpty\":\"No organizations yet. Create the first one to get started.\",\"pageNotFound\":\"Page not found\",\"passwordChangeSuccess\":\"Password changed successfully\",\"passwordResetSuccess\":\"Password reset. Every session of the account has been closed: sign in with the new password.\",\"profileOrganizationsEmpty\":\"The organizations you belong to appear here.\",\"readError\":\"Error while reading\",\"reasoningAgent\":\"This is a reasoning agent. It is not designed to maintain the conversation history, each message is processed independently.\",\"recoverPasswordSuccess\":\"Recovery email sent successfully\",\"refillFailed\":\"Refill failed. Try again later.\",\"refillSuccess\":\"Refill completed successfully\",\"refreshSuccess\":\"Refresh completed successfully\",\"releaseNotesEmpty\":\"No release notes published yet. Updates will be listed here as they ship.\",\"removeSuccess\":\"Removal completed successfully\",\"renameFolderSuccess\":\"Folder renamed successfully\",\"revisedAnswersEmpty\":\"No revised answers yet. Create the first one to teach the agent a better reply.\",\"selectedCount\":\"{count} of {total} selected\",\"sendInvitationConfirm\":\"Are you sure you want to resend the invitation to {email}?\",\"sessionRevoked\":\"Session signed out\",\"sessionsEmpty\":\"Signing in from another device or browser opens a new session, listed here.\",\"setPasswordDescription\":\"For now you sign in only through a connected account. Set a password to sign in with email and password too: we will email you a link to create it. Creating it closes every open session, this one included.\",\"setPasswordLinkSent\":\"We sent the link to {email}.\",\"sharedSuccess\":\"Document shared successfully\",\"sitemapUrlRequired\":\"Sitemap URL is required\",\"startUrlRequired\":\"Start URL is required\",\"subAgentsEmpty\":\"Connect an agent to delegate part of the conversation to it.\",\"submitError\":\"Error while saving\",\"submitSuccess\":\"Save completed successfully\",\"success\":\"Success\",\"testExecutionError\":\"Error executing test\",\"toolNameAutoGenerated\":\"The tool name will be generated automatically\",\"typeToSearch\":\"Start typing to search…\",\"unauthorized\":\"You do not have permission to manage channels.\",\"unbanSuccess\":\"User unbanned successfully\",\"unblockChatSuccess\":\"Conversation unblocked successfully\",\"unlinkAgentConfirm\":\"The document stays available to the other agents linked to it.\",\"unlinkDocumentConfirm\":\"It stays available to the other agents linked to it.\",\"unlinkLastAgentDeleteConfirm\":\"The document is permanently deleted, because no other agent is linked to it.\",\"unlinkSuccess\":\"Document unlinked successfully\",\"unlinkSyncedFolderConfirm\":\"Syncing stops. The folder and its documents stay with the agent and can be edited like any other from now on: to remove them, delete the folder.\",\"unsavedChanges\":\"Save or discard your changes first\",\"urlAlreadyImported\":\"Already imported\",\"urlAlreadyImportedLink\":\"This URL has already been imported. Do you want to link it to the current agent?\",\"userApiKeysEmpty\":\"Keys this user creates from their profile for programmatic access will appear here.\",\"userChatsEmpty\":\"Conversations this user has with any agent will appear here.\",\"userOrganizationsEmpty\":\"This user does not belong to any organization yet. Add the first one.\",\"userUpdateSuccess\":\"User profile updated successfully\",\"usersEmpty\":\"No users yet. Create the first one to get started.\",\"voiceCancelled\":\"I have cancelled.\",\"voiceConfirmed\":\"I confirm.\",\"voiceConnecting\":\"Connecting…\",\"voiceConnectionDone\":\"I have completed the connection.\",\"voiceFailed\":\"The voice session stopped\",\"voiceInterrupted\":\"Try again, or continue in writing.\",\"voiceListening\":\"Listening\",\"voiceLocationRefused\":\"I would rather not share my location.\",\"voiceLocationShared\":\"My location is {place}.\",\"voiceMuted\":\"Microphone muted\",\"voiceNoAnswer\":\"The agent could not produce an answer for this call. Try again, or continue in writing.\",\"voiceSpeaking\":\"The agent is speaking\",\"voiceTookTooLong\":\"The answer took too long for the call. Try again, or continue in writing: the answer will appear here as soon as it is ready.\",\"warning\":\"Warning\",\"webSourceCreated\":\"Source created: the folder “{name}” will receive new pages.\",\"webSourceCreateError\":\"The source could not be created, and no page was imported.\",\"webSourceEditable\":\"Discovered pages stay editable. Unlinking the source leaves them where they are, with their automatic refresh.\",\"webSourceRemovalHeld\":\"The sitemap no longer lists {count} pages: too many at once to remove without a check, so nothing was removed.\",\"webSourceConfirmRemovalQuestion\":\"The next check takes out of the knowledge base the pages the sitemap no longer lists, up to {count}. Their content stays in the database.\",\"unlinkWebSourceConfirm\":\"The source stops looking for new pages. The folder and its pages stay, with their automatic refresh.\"}"),
|
|
2706
2733
|
messagePart: {
|
|
2707
2734
|
audioTranscribing: "Transcribing the audio…",
|
|
2708
2735
|
audioTranscript: "Transcript",
|
|
@@ -2710,6 +2737,8 @@ var j = {
|
|
|
2710
2737
|
audioTranscriptNoSpeech: "No speech could be heard in it",
|
|
2711
2738
|
audioTranscriptOff: "Not transcribed: transcription is off for this organization",
|
|
2712
2739
|
disconnectOAuthConnection: "Disconnecting…",
|
|
2740
|
+
requestAccountLink: "Sending the sign-in link…",
|
|
2741
|
+
unlinkAccount: "Unlinking the number…",
|
|
2713
2742
|
editSpreadsheet: "Editing the spreadsheet…",
|
|
2714
2743
|
editSpreadsheetCells: "{count} cell changed | {count} cells changed",
|
|
2715
2744
|
enableTools: "Enabling tools…",
|
|
@@ -2791,6 +2820,7 @@ var j = {
|
|
|
2791
2820
|
documentName: "Enter document name",
|
|
2792
2821
|
documentOriginAll: "All origins",
|
|
2793
2822
|
documentRefreshAll: "All updates",
|
|
2823
|
+
documentStatusAll: "All statuses",
|
|
2794
2824
|
documentUrl: "Enter the URL of the web page to import",
|
|
2795
2825
|
email: "Enter your email address",
|
|
2796
2826
|
endDate: "Select end date",
|
|
@@ -2833,6 +2863,30 @@ var j = {
|
|
|
2833
2863
|
uploadFile: "Upload a file",
|
|
2834
2864
|
emailAddress: "name{'@'}company.com"
|
|
2835
2865
|
},
|
|
2866
|
+
platformLink: {
|
|
2867
|
+
title: "Link WhatsApp",
|
|
2868
|
+
cardTitle: "Link your WhatsApp number",
|
|
2869
|
+
description: "Whoever writes from this number on WhatsApp will use your account, its integrations included: mail, calendar, files. Link only a number that is yours.",
|
|
2870
|
+
summaryAvailable: "It will use the account {email}.",
|
|
2871
|
+
summaryReplaces: "It will replace {phone}, which uses your account today.",
|
|
2872
|
+
summaryLinkedHere: "It already uses your account.",
|
|
2873
|
+
summaryLinkedElsewhere: "It uses another account. Unlink it there first, or ask the agent on WhatsApp to unlink it.",
|
|
2874
|
+
summaryExpired: "This link has expired. Ask the agent on WhatsApp for a new one.",
|
|
2875
|
+
summaryInvalid: "This link is not valid, or it was already used. Ask the agent on WhatsApp for a new one.",
|
|
2876
|
+
summaryLinked: "Linked. Go back to WhatsApp: the agent has written to you there.",
|
|
2877
|
+
requestedAt: "Link requested at {issued}, valid until {expires}.",
|
|
2878
|
+
doNotConfirm: "If someone sent you this link, do not confirm.",
|
|
2879
|
+
confirmOnlyIf: "Confirm only if you asked for this link yourself, from the phone with this number, in the last hour.",
|
|
2880
|
+
link: "Link {phone} to my account",
|
|
2881
|
+
replace: "Link {phone} instead of {current}",
|
|
2882
|
+
linked: "The WhatsApp number {phone} now uses your account.",
|
|
2883
|
+
identitiesTitle: "Linked numbers",
|
|
2884
|
+
identitiesDescription: "The messaging numbers that write as your account. Unlink one to stop it from using your account and its integrations.",
|
|
2885
|
+
linkedAt: "Linked on {date}",
|
|
2886
|
+
unlinkQuestion: "Unlink {phone}?",
|
|
2887
|
+
unlinkDescription: "Whoever writes from this number will no longer use your account and its integrations. The conversations stay in your account.",
|
|
2888
|
+
unlinked: "{phone} no longer uses your account."
|
|
2889
|
+
},
|
|
2836
2890
|
problemReasons: {
|
|
2837
2891
|
"file-upload-validation": { "audio-too-large": "The recording is over 100 MB, the most that is transcribed: upload a shorter or more compressed copy, for example an m4a or an mp3." },
|
|
2838
2892
|
"gateway-disabled": {
|