@frontera-sdk/chat-ui 1.52.19 → 1.52.20

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/chat.js CHANGED
@@ -1,21 +1,21 @@
1
1
  'use client';
2
2
  import { offset, flip, autoUpdate, computePosition } from './chunk-I7SXWUAN.js';
3
3
  import { isFullscreenHotkey, DeckNotesCard, deckOwnsArrowKeys } from './chunk-4FRTPVJT.js';
4
- import { ArtifactSkeleton, resolveStageWidth, zoomPercent, DECK_ZOOM_LEVELS, LazyThumb } from './chunk-LP5MVCRH.js';
5
- import { NewSessionPrompt, keepCaretOnTap } from './chunk-I3YAF6PS.js';
4
+ import { ArtifactSkeleton, resolveStageWidth, zoomPercent, DECK_ZOOM_LEVELS, LazyThumb } from './chunk-GQEBWNCP.js';
5
+ import { NewSessionPrompt, keepCaretOnTap } from './chunk-CYEEHVPE.js';
6
6
  import { PendingCards } from './chunk-UZ6RDWCT.js';
7
7
  import { themeToStyle } from './chunk-6HYPVNVA.js';
8
8
  import { useChatAgents } from './chunk-FLOAEPRU.js';
9
9
  import { subjectOfChatToken, capabilitiesOfChatToken } from './chunk-CCVPZVFK.js';
10
10
  import { useChatCredential } from './chunk-37G6MHWS.js';
11
11
  import './chunk-WDYCLC4F.js';
12
- import { chatSidePanelSessionKey, Chart1Icon, useTemplatePreviewStore, useHasTemplatePreviewHost, useChatSidePanelStore, ChatHeader, ChatHeaderActions, useRightPane, getChatOverviewAgentStatus, useChatOverviewVisible, useConversationArtifacts, PENDING_CHART_TAB_PREFIX, CHART_TAB_PREFIX, AGENT_WORK_TAB_ID, AGENT_ROUTINES_TAB_ID, SOURCES_TAB_ID, TEMPLATE_TAB_ID, OutputsSection, ChainLink1Icon, ChatOverviewContent, COMPUTER_TAB_PREFIX, SourceRow, motion, MAX_CHAT_SIDE_PANEL_SESSIONS, DEFAULT_CHAT_SIDE_PANEL_SIZE, TableIcon } from './chunk-ZFTMGEV5.js';
12
+ import { chatSidePanelSessionKey, Chart1Icon, useTemplatePreviewStore, useHasTemplatePreviewHost, useChatSidePanelStore, ChatHeader, ChatHeaderActions, useRightPane, getChatOverviewAgentStatus, useChatOverviewVisible, useConversationArtifacts, PENDING_CHART_TAB_PREFIX, CHART_TAB_PREFIX, AGENT_WORK_TAB_ID, AGENT_ROUTINES_TAB_ID, SOURCES_TAB_ID, TEMPLATE_TAB_ID, OutputsSection, ChainLink1Icon, ChatOverviewContent, COMPUTER_TAB_PREFIX, SourceRow, motion, MAX_CHAT_SIDE_PANEL_SESSIONS, DEFAULT_CHAT_SIDE_PANEL_SIZE, TableIcon } from './chunk-JYYH3AXV.js';
13
13
  import './chunk-X3QVICX7.js';
14
- import { dynamic, useChatStreamStore, useComposerStore, Message, Thinking, setPendingFiles, useLivePreviewUrl, ArrowRotateClockwiseIcon, useComputerFiles, useUploadComputerFile, CanvasWidget, isPlainTextLanguage, useUploadFile, COMPOSER_ID_MAIN, useContextWindowInfo, useIsCompacting, useQueuedMessages, VolumeFullIcon, WarningSignIcon, useComputer, csvTextToWorkbookJson, CSV_PREVIEW_MAX_ROWS, CopyButton, COMPOSER_ID_COPILOT, ModelIcon, modeToBrandRow, useBackDismiss, PdfViewer, brandLabel, Spinner } from './chunk-QABN6WBZ.js';
15
- import { Textarea, artifactFormatIcon, BookIcon, useAgentRoster, ShieldCheckIcon, useArtifactStore, useCanvasStore, useChatOverviewStore, setSdkConversationPath, setSdkDarkMode, AgentsProvider, PluginProvider, WorkspaceProvider, TooltipProvider, isToolPart, getToolState, getToolName, getToolInput, sourceKind, extractDomain, CitationViewerContext, MarkdownRenderer, ConnectRunnerContext, usePathname, usePaneFocusStore, useAgentPanelStore, Tooltip, TooltipTrigger, TooltipContent, StudioDisplayIcon, WorldIcon, SlidesWideIcon, ArtifactActionsMenu, DotGrid1x3HorizontalTightIcon, ArrowsShowIcon, useKeyboardInset, ExclamationCircleIcon, getToolOutput, useArtifact, useUpdateArtifact, useArtifactFileObjectUrl, resolveArtifactIconFormat, useSourcesEnrichment, LoaderIcon, FileDownloadIcon, Label, Input, renderPluginBlock, useArtifactVersion, useChatCapabilities, useChatOptInEnabled, useSessionPendingApprovals, tableToCsv, tableToXlsx, tableToMarkdown, DropdownMenu, DropdownMenuTrigger, StyledDropdownMenuContent, StyledDropdownMenuItem, useArtifactVersions, useClient, unwrapData, authFetch, getBearerHeadersForApi, EyeOpenIcon, EyeSlashIcon, useRestoreArtifactVersion, ZoomableImage, ChatImageLightbox, useDownloadArtifact, useArtifactFileBytes, useArtifactPreviewFileObjectUrl, useArtifactVersionPreviewFileObjectUrl, SpreadsheetIcon, FilePdfIcon, useOptionalWorkspaceContext, useAgentConnectionStatus, useArtifacts, useConversationDesktopStatus, isRequestHumanTool, appsKeys, useSession, useWorkspaceContext, errorText, unwrapDataDeep, useRouter, Images1Icon, ArrowUpIcon, VideoIcon, AudioIcon, useBrand, resolveBearerHeaders, subscribeSdkDarkMode, getSdkDarkMode, unwrap, useConnectRunner, useStartUserConnect, useUpsertGrant, useRevokeGrant, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, LayoutGrid1Icon, useCatalog, useInstalls, useWorkspaceSlug, buildTenantUrlAbsolute } from './chunk-QFVBVBUR.js';
14
+ import { dynamic, useChatStreamStore, useComposerStore, Message, Thinking, setPendingFiles, usePersonConfirmations, unshownPendingConfirmations, ConversationConfirmationCard, useLivePreviewUrl, ArrowRotateClockwiseIcon, useComputerFiles, useUploadComputerFile, CanvasWidget, isPlainTextLanguage, useUploadFile, COMPOSER_ID_MAIN, useContextWindowInfo, useIsCompacting, useQueuedMessages, VolumeFullIcon, WarningSignIcon, useComputer, csvTextToWorkbookJson, CSV_PREVIEW_MAX_ROWS, CopyButton, COMPOSER_ID_COPILOT, ModelIcon, modeToBrandRow, useBackDismiss, PdfViewer, brandLabel, Spinner } from './chunk-VCPYAMYP.js';
15
+ import { Textarea, artifactFormatIcon, BookIcon, useAgentRoster, ShieldCheckIcon, useArtifactStore, useCanvasStore, useChatOverviewStore, setSdkConversationPath, setSdkDarkMode, AgentsProvider, PluginProvider, WorkspaceProvider, TooltipProvider, getPersonConfirmation, isToolPart, getToolState, getToolName, getToolInput, sourceKind, extractDomain, CitationViewerContext, MarkdownRenderer, ConnectRunnerContext, usePathname, usePaneFocusStore, useAgentPanelStore, Tooltip, TooltipTrigger, TooltipContent, StudioDisplayIcon, WorldIcon, SlidesWideIcon, ArtifactActionsMenu, DotGrid1x3HorizontalTightIcon, ArrowsShowIcon, useKeyboardInset, ExclamationCircleIcon, getToolOutput, useArtifact, useUpdateArtifact, useArtifactFileObjectUrl, resolveArtifactIconFormat, useSourcesEnrichment, LoaderIcon, FileDownloadIcon, Label, Input, renderPluginBlock, useArtifactVersion, useChatCapabilities, useChatCapabilityEnabled, useChatOptInEnabled, useSessionPendingApprovals, tableToCsv, tableToXlsx, tableToMarkdown, DropdownMenu, DropdownMenuTrigger, StyledDropdownMenuContent, StyledDropdownMenuItem, useArtifactVersions, useClient, unwrapData, authFetch, getBearerHeadersForApi, EyeOpenIcon, EyeSlashIcon, useRestoreArtifactVersion, ZoomableImage, ChatImageLightbox, useDownloadArtifact, useArtifactFileBytes, useArtifactPreviewFileObjectUrl, useArtifactVersionPreviewFileObjectUrl, SpreadsheetIcon, FilePdfIcon, useOptionalWorkspaceContext, useAgentConnectionStatus, useArtifacts, useSession, useWorkspaceContext, useConversationDesktopStatus, isRequestHumanTool, appsKeys, errorText, unwrapDataDeep, useRouter, Images1Icon, ArrowUpIcon, VideoIcon, AudioIcon, useBrand, resolveBearerHeaders, subscribeSdkDarkMode, getSdkDarkMode, unwrap, useConnectRunner, useStartUserConnect, useUpsertGrant, useRevokeGrant, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, LayoutGrid1Icon, useCatalog, useInstalls, useWorkspaceSlug, buildTenantUrlAbsolute } from './chunk-OMOIIMNG.js';
16
16
  import { ChevronLeftIcon } from './chunk-CWAOLMFS.js';
17
17
  import { Popover, PopoverTrigger, PopoverContent, Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from './chunk-T5SANYSX.js';
18
- import { MOBILE_BREAKPOINT, useIsMobile, I18nProvider, useTranslation } from './chunk-I5NAI7HP.js';
18
+ import { MOBILE_BREAKPOINT, useIsMobile, I18nProvider, useTranslation } from './chunk-AVSAEPHS.js';
19
19
  import './chunk-QBV7MAFV.js';
20
20
  import { AppIcon, frontera_icon_default, PhotoIcon, Folder1Icon, FileTextIcon, describeToolRow, SquareArrowTopRightIcon, ClipboardIcon, getToolMeta, useStreamdownPlugins, AppIconFrame, MessageResponse } from './chunk-PKNEC4LJ.js';
21
21
  import { Skeleton, Button, ScrollArea, ChevronDownMediumIcon, buttonVariants } from './chunk-UWKO24VT.js';
@@ -42449,7 +42449,7 @@ function SheetEditor({ content, onSave, readOnly = false }) {
42449
42449
  );
42450
42450
  }
42451
42451
  var PdfDocumentViewInner = dynamic(
42452
- () => import('./pdf-document-view-inner-SBYZZQ6H.js'),
42452
+ () => import('./pdf-document-view-inner-RP6BBB7Y.js'),
42453
42453
  {
42454
42454
  ssr: false,
42455
42455
  loading: () => /* @__PURE__ */ jsx(ArtifactSkeleton, { format: "pdf" })
@@ -43266,7 +43266,7 @@ function HtmlDeckView({ content, inChat = false, versionSlot }) {
43266
43266
  !present && inChat && /* @__PURE__ */ jsx(DeckEditPanel, { currentIndex: sel, currentHtml: slides[sel]?.html ?? "" })
43267
43267
  ] });
43268
43268
  }
43269
- var Inner = dynamic(() => import('./pdf-deck-view-inner-ZINOYZOK.js'), {
43269
+ var Inner = dynamic(() => import('./pdf-deck-view-inner-RKFV3VK7.js'), {
43270
43270
  ssr: false,
43271
43271
  loading: () => /* @__PURE__ */ jsx(ArtifactSkeleton, { format: "htmldeck" })
43272
43272
  });
@@ -60393,6 +60393,7 @@ function ComposerOptionsSheet({
60393
60393
  }) {
60394
60394
  const [open, setOpen] = useState(false);
60395
60395
  const [view, setView] = useState("root");
60396
+ const pluginsEnabled = useChatCapabilityEnabled("plugins");
60396
60397
  const router = useRouter();
60397
60398
  const { t: t2 } = useTranslation();
60398
60399
  const close2 = () => {
@@ -60503,7 +60504,7 @@ function ComposerOptionsSheet({
60503
60504
  ]
60504
60505
  }
60505
60506
  ),
60506
- /* @__PURE__ */ jsxs(
60507
+ pluginsEnabled && /* @__PURE__ */ jsxs(
60507
60508
  "button",
60508
60509
  {
60509
60510
  type: "button",
@@ -61712,10 +61713,11 @@ var NOTE_FAILED = "Couldn\u2019t send your note. Try again.";
61712
61713
  var NOTE_SENT_DENY_FAILED = "Your note was sent, but the denial wasn\u2019t saved. Choose Deny to try again.";
61713
61714
  function useComposerApprovalPrompt({
61714
61715
  conversationId,
61715
- onDecision
61716
+ onDecision,
61717
+ running
61716
61718
  }) {
61717
61719
  const queryClient = useQueryClient();
61718
- const { data } = useSessionPendingApprovals(conversationId);
61720
+ const { data } = useSessionPendingApprovals(conversationId, { pollInBackground: !!running });
61719
61721
  const desktop = useConversationDesktopStatus(conversationId ?? null);
61720
61722
  const [decided, setDecided] = useState(() => /* @__PURE__ */ new Set());
61721
61723
  const [selectedId, setSelectedId] = useState(null);
@@ -61838,7 +61840,7 @@ function ChatInputBar({
61838
61840
  onToolApproval,
61839
61841
  placeholderTyping,
61840
61842
  placeholder,
61841
- enableFileUpload = true,
61843
+ enableFileUpload: enableFileUploadProp = true,
61842
61844
  optionsSlot,
61843
61845
  compact,
61844
61846
  sessionKey = "__new__",
@@ -61855,6 +61857,11 @@ function ChatInputBar({
61855
61857
  const subscriptionGovernance = chatGptSubscriptionGovernance ?? (isCopilotComposer ? "fde" : "session");
61856
61858
  const isCopilotPanel = isCopilotComposer && !isMobile && !compact;
61857
61859
  const capabilities = useChatCapabilities();
61860
+ const pluginsEnabled = useChatCapabilityEnabled("plugins");
61861
+ const approvalModesEnabled = useChatCapabilityEnabled("approvalModes");
61862
+ const modelChoiceEnabled = useChatCapabilityEnabled("modelChoice");
61863
+ const attachmentsEnabled = useChatCapabilityEnabled("attachments");
61864
+ const enableFileUpload = enableFileUploadProp && attachmentsEnabled;
61858
61865
  const [fileAttachments, setFileAttachments] = useState([]);
61859
61866
  const [uploadingFiles, setUploadingFiles] = useState(/* @__PURE__ */ new Map());
61860
61867
  const [fileError, setFileError] = useState(null);
@@ -62082,7 +62089,7 @@ function ChatInputBar({
62082
62089
  const { data: orgFlags } = useOrgFeatureFlags();
62083
62090
  const chatgptSubscriptionEnabled = orgFlags?.[subscriptionGovernance === "fde" ? "chatgptSubscription.enabled" : "chatgptSubscription.sessionsEnabled"] === true;
62084
62091
  const xaiSubscriptionEnabled = orgFlags?.[subscriptionGovernance === "fde" ? "xaiSubscription.enabled" : "xaiSubscription.sessionsEnabled"] === true;
62085
- const modeEntries = useMemo(() => {
62092
+ const manifestModeEntries = useMemo(() => {
62086
62093
  if (!modes) return void 0;
62087
62094
  const entries = Array.isArray(modes) ? modes : Object.entries(modes).map(([key2, config2]) => ({
62088
62095
  key: key2,
@@ -62100,13 +62107,45 @@ function ChatInputBar({
62100
62107
  (entry) => (entry.provider !== "openai-codex" || chatgptSubscriptionEnabled) && (entry.provider !== "xai" || xaiSubscriptionEnabled)
62101
62108
  );
62102
62109
  }, [modes, chatgptSubscriptionEnabled, xaiSubscriptionEnabled]);
62110
+ const hasSubscriptionMode = Boolean(
62111
+ manifestModeEntries?.some((m) => m.provider === "openai-codex")
62112
+ );
62113
+ const { data: subscriptionStatus } = useChatGptSubscriptionStatus(hasSubscriptionMode);
62114
+ const { data: subscriptionModels, isError: subscriptionModelsError } = useChatGptSubscriptionModels(
62115
+ hasSubscriptionMode && !!subscriptionStatus?.connected
62116
+ );
62117
+ const modeEntries = useMemo(() => {
62118
+ if (!manifestModeEntries || !subscriptionStatus?.connected || !subscriptionModels) {
62119
+ return manifestModeEntries;
62120
+ }
62121
+ const index = manifestModeEntries.findIndex(
62122
+ (entry) => entry.provider === "openai-codex"
62123
+ );
62124
+ if (index === -1) return manifestModeEntries;
62125
+ const live = subscriptionModels.map((model) => ({
62126
+ key: model.modeKey,
62127
+ name: model.name,
62128
+ style: "default",
62129
+ thinking: false,
62130
+ provider: "openai-codex",
62131
+ modelId: model.id,
62132
+ model: model.id,
62133
+ reasoning: model.reasoningConfig
62134
+ }));
62135
+ return [
62136
+ ...manifestModeEntries.slice(0, index),
62137
+ ...live,
62138
+ ...manifestModeEntries.slice(index).filter((entry) => entry.provider !== "openai-codex")
62139
+ ];
62140
+ }, [manifestModeEntries, subscriptionStatus?.connected, subscriptionModels]);
62103
62141
  const defaultPlaceholder = placeholder ?? t2("chat.input.placeholder");
62104
62142
  const typingEnabled = Boolean(
62105
62143
  placeholderTyping && composerModes.length === 0
62106
62144
  );
62107
62145
  const approvalPrompt = useComposerApprovalPrompt({
62108
62146
  conversationId: isNewConversation ? null : sessionKey,
62109
- onDecision: onToolApproval
62147
+ onDecision: onToolApproval,
62148
+ running: status === "submitted" || status === "streaming"
62110
62149
  });
62111
62150
  const askingApproval = approvalPrompt.current !== null;
62112
62151
  const composerPlaceholder = askingApproval ? "Or tell the agent what to do instead\u2026" : composerModes.length > 0 ? t2("shell.modePlaceholder") : defaultPlaceholder;
@@ -62126,16 +62165,9 @@ function ChatInputBar({
62126
62165
  const codexConnected = Boolean(
62127
62166
  codexStatusData?.connected
62128
62167
  );
62129
- const hasSubscriptionMode = Boolean(
62130
- modeEntries?.some((m) => m.provider === "openai-codex")
62131
- );
62132
- const { data: subscriptionStatus } = useChatGptSubscriptionStatus(hasSubscriptionMode);
62133
62168
  const hasXaiMode = Boolean(modeEntries?.some((m) => m.provider === "xai"));
62134
62169
  const { data: xaiSubscriptionStatus } = useXaiSubscriptionStatus(hasXaiMode);
62135
62170
  const [xaiDialogOpen, setXaiDialogOpen] = useState(false);
62136
- const { data: subscriptionModels, isError: subscriptionModelsError } = useChatGptSubscriptionModels(
62137
- hasSubscriptionMode && !!subscriptionStatus?.connected
62138
- );
62139
62171
  const eligibleSubscriptionModels = subscriptionStatus?.connected ? subscriptionModelsError ? null : subscriptionModels ? new Set(subscriptionModels.map((model) => model.id)) : void 0 : void 0;
62140
62172
  useEffect(() => {
62141
62173
  if (!orgFlags) return;
@@ -62178,7 +62210,7 @@ function ChatInputBar({
62178
62210
  },
62179
62211
  [isCopilotComposer, rememberComposerModel]
62180
62212
  );
62181
- const modelSelectorNode = showModelSelector && modeEntries ? /* @__PURE__ */ jsxs(Fragment, { children: [
62213
+ const modelSelectorNode = showModelSelector && modelChoiceEnabled && modeEntries ? /* @__PURE__ */ jsxs(Fragment, { children: [
62182
62214
  /* @__PURE__ */ jsx(
62183
62215
  ModelSelector,
62184
62216
  {
@@ -62398,7 +62430,7 @@ function ChatInputBar({
62398
62430
  const approvalOptions = modeOptions ?? capabilities.approvalModes?.options ?? DEFAULT_APPROVAL_MODE_OPTIONS;
62399
62431
  const approvalValue = capabilities.approvalModes?.value ?? approvalMode;
62400
62432
  const approvalChange = capabilities.approvalModes?.onChange ?? onApprovalModeChange;
62401
- const showApprovalSelector = Boolean(approvalChange);
62433
+ const showApprovalSelector = Boolean(approvalChange) && approvalModesEnabled;
62402
62434
  const readingHistory = useComposerStore((s) => s.readingHistory);
62403
62435
  const [editorFocused, setEditorFocused] = useState(false);
62404
62436
  const { data: pendingApprovalData } = useSessionPendingApprovals(
@@ -62558,7 +62590,7 @@ function ChatInputBar({
62558
62590
  ] }) : null;
62559
62591
  const desktopRailControls = /* @__PURE__ */ jsxs(Fragment, { children: [
62560
62592
  attachmentButton,
62561
- /* @__PURE__ */ jsx(AppsButton, { agentId, disabled: isDisabled })
62593
+ pluginsEnabled && /* @__PURE__ */ jsx(AppsButton, { agentId, disabled: isDisabled })
62562
62594
  ] });
62563
62595
  const compactRailControls = /* @__PURE__ */ jsxs("div", { className: "flex w-52 flex-col gap-0.5", children: [
62564
62596
  enableFileUpload && /* @__PURE__ */ jsxs(
@@ -62574,7 +62606,7 @@ function ChatInputBar({
62574
62606
  ]
62575
62607
  }
62576
62608
  ),
62577
- /* @__PURE__ */ jsx(
62609
+ pluginsEnabled && /* @__PURE__ */ jsx(
62578
62610
  AppsButton,
62579
62611
  {
62580
62612
  agentId,
@@ -63480,6 +63512,10 @@ function agentProcessingState(messages, status) {
63480
63512
  if (message.role !== "assistant") break;
63481
63513
  for (let p = message.parts.length - 1; p >= 0; p--) {
63482
63514
  const part = message.parts[p];
63515
+ if (part.type === "data-person-confirmation") {
63516
+ if (getPersonConfirmation(part)?.status === "pending") return "waiting";
63517
+ continue;
63518
+ }
63483
63519
  if (isToolPart(part)) {
63484
63520
  const state = getToolState(part);
63485
63521
  const name = getToolName(part);
@@ -63538,6 +63574,26 @@ function currentToolActivity(messages) {
63538
63574
  }
63539
63575
  return null;
63540
63576
  }
63577
+ function ThreadPendingConfirmations({
63578
+ conversationId,
63579
+ messages
63580
+ }) {
63581
+ const confirmations = usePersonConfirmations(conversationId, {
63582
+ poll: (all) => Object.values(all).some((confirmation) => confirmation.status === "pending")
63583
+ });
63584
+ const [kept, setKept] = useState(() => /* @__PURE__ */ new Set());
63585
+ const unshown = unshownPendingConfirmations(confirmations.data, messages, kept);
63586
+ const ids = unshown.map((c) => c.id).join(",");
63587
+ useEffect(() => {
63588
+ if (!ids) return;
63589
+ setKept((current) => {
63590
+ const missing = ids.split(",").filter((id) => !current.has(id));
63591
+ return missing.length === 0 ? current : /* @__PURE__ */ new Set([...current, ...missing]);
63592
+ });
63593
+ }, [ids]);
63594
+ if (unshown.length === 0) return null;
63595
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: unshown.map((confirmation) => /* @__PURE__ */ jsx(ConversationConfirmationCard, { confirmation, conversationId }, confirmation.id)) });
63596
+ }
63541
63597
  var REASONING_EFFORTS = ["max", "xhigh", "high", "medium", "low", "minimal", "none"];
63542
63598
  function isReasoningEffort(value) {
63543
63599
  return !!value && REASONING_EFFORTS.includes(value);
@@ -64121,6 +64177,7 @@ function FronteraChat({
64121
64177
  }
64122
64178
  ) }, message.id)
64123
64179
  )),
64180
+ /* @__PURE__ */ jsx(ThreadPendingConfirmations, { conversationId, messages }),
64124
64181
  showWaiting && /* @__PURE__ */ jsx(
64125
64182
  Thinking,
64126
64183
  {
@@ -41,8 +41,13 @@ var en_default = {
41
41
  "console.agents.counts.plugins.many": "{count} plugins",
42
42
  "console.agents.counts.knowledge.one": "1 knowledge base",
43
43
  "console.agents.counts.knowledge.many": "{count} knowledge bases",
44
- "agents.detail.navigation.capabilities": "Identity & Capabilities",
45
- "agents.detail.navigation.settings": "Settings",
44
+ "agents.detail.navigation.overview": "Overview",
45
+ "agents.detail.navigation.configure": "Configure",
46
+ "agents.detail.navigation.knowledge": "Knowledge",
47
+ "agents.detail.navigation.evaluations": "Evaluations",
48
+ "agents.detail.navigation.sessions": "Sessions",
49
+ "agents.detail.navigation.monitor": "Monitor",
50
+ "agents.detail.navigation.analysis": "Analysis",
46
51
  "agents.detail.navigation.test": "Test chat",
47
52
  "agents.detail.sidebar.back": "Back to all Agents",
48
53
  "console.agents.installedFromPacks.title": "Installed {noun}",
@@ -2078,6 +2083,7 @@ var en_default = {
2078
2083
  "admin.auditLog.verb.disabled": "Disabled",
2079
2084
  "admin.auditLog.verb.rotated": "Rotated",
2080
2085
  "admin.auditLog.verb.skipped": "Skipped",
2086
+ "admin.auditLog.verb.revealed": "Revealed",
2081
2087
  "admin.auditLog.verb.detected": "Detected",
2082
2088
  "admin.auditLog.outcome.success": "Success",
2083
2089
  "admin.auditLog.outcome.failure": "Failure",
@@ -2474,6 +2480,8 @@ var en_default = {
2474
2480
  "eval.datasetItems.loadingMore": "Loading\u2026",
2475
2481
  "eval.datasetItems.subjectAuthored": "authored",
2476
2482
  "eval.datasetItems.subjectAuthoredHint": "written by hand, imported from CSV",
2483
+ "eval.datasetItems.subjectScenario": "Scenario",
2484
+ "eval.datasetItems.subjectScenarioHint": "a whole conversation with a simulated customer",
2477
2485
  "eval.datasetItems.expectationsTitle": "Expectations",
2478
2486
  "eval.datasetItems.expectationsHint": "What the answer has to do, beyond matching the expected output. Each line is graded on its own, with evidence.",
2479
2487
  "eval.datasetItems.expectationsEmpty": "No expectations yet.",
@@ -3193,6 +3201,7 @@ var en_default = {
3193
3201
  "eval.runs.nameLabel": "Run name",
3194
3202
  "eval.runs.namePlaceholder": "Optional \u2014 a timestamp is used if left blank",
3195
3203
  "eval.runs.judgesLabel": "Judges",
3204
+ "eval.runs.judgeAddedForReference": "added: items have a reference answer",
3196
3205
  "eval.runs.judgesHint": "An item passes only when every selected judge passes it.",
3197
3206
  "eval.runs.startedToast": 'Run "{runName}" started',
3198
3207
  "eval.runs.startFailed": "Could not start the run",
@@ -3201,6 +3210,19 @@ var en_default = {
3201
3210
  "eval.runs.running": "Running {done}/{total}",
3202
3211
  "eval.runs.passCount": "{count} pass",
3203
3212
  "eval.runs.failCount": "{count} fail",
3213
+ "eval.runs.reliability": "All attempts passed: {passed} of {items} items",
3214
+ "eval.runs.reliabilityHint": "An item counts only when every one of its attempts passed.",
3215
+ "eval.runs.falseCompletions": "Ended resolved without the required action: {count} of {attempts} conversations",
3216
+ "eval.runs.deduplicated": "Repeated requests run once: {count}",
3217
+ "eval.runs.silentTurns": "A customer message got no reply: {count} of {attempts} conversations",
3218
+ "eval.runs.repeatedRequests": "The customer had to repeat a request: {count} of {attempts} conversations",
3219
+ "eval.runs.offTopicDeclined": "Declined off-topic messages: {count}",
3220
+ "eval.runs.endingsTitle": "How conversations ended",
3221
+ "eval.runs.ending.resolved": "Resolved",
3222
+ "eval.runs.ending.handed_off": "Handed off",
3223
+ "eval.runs.ending.unresolved": "Unresolved",
3224
+ "eval.runs.ending.abandoned": "Abandoned",
3225
+ "eval.runs.ending.none": "No outcome",
3204
3226
  "eval.runs.errorCount": "{count} error",
3205
3227
  "eval.runs.produced": "What the agent answered",
3206
3228
  "eval.runs.itemError": "Error",
@@ -3261,6 +3283,11 @@ var en_default = {
3261
3283
  "eval.runs.configHideCandidate": "Hide candidate",
3262
3284
  "eval.runs.trajectoryTitle": "What the agent did",
3263
3285
  "eval.runs.trajectorySkill": "skill: {name}",
3286
+ "eval.runs.trajectoryKnowledge": "knowledge: {count}",
3287
+ "eval.runs.knowledgeTitle": "Knowledge retrieved",
3288
+ "eval.runs.knowledgeQuery": "Searched for \u201C{query}\u201D",
3289
+ "eval.runs.knowledgeNothing": "Nothing relevant was found.",
3290
+ "eval.runs.knowledgeScore": "score {score}",
3264
3291
  "eval.runs.trajectoryViewRaw": "View raw",
3265
3292
  "eval.runs.trajectoryHideRaw": "Hide raw",
3266
3293
  "eval.runs.expectationsTitle": "Expectations",
@@ -3320,6 +3347,7 @@ var en_default = {
3320
3347
  "eval.datasetItems.detailQuestion": "Question",
3321
3348
  "eval.datasetItems.detailQuestionUnknown": "(no title recorded for this conversation)",
3322
3349
  "eval.datasetItems.detailExpectedMissing": "No expected answer. This item can check whether the reply reads well, but it cannot fail a wrong one \u2014 add a correction on the review it came from.",
3350
+ "eval.datasetItems.scenarioChecksHint": "This scenario's checks come from its definition and are not edited here.",
3323
3351
  "console.skillTest.rowResult": "Result",
3324
3352
  "console.skillTest.rowSkillLoaded": "Skill loaded",
3325
3353
  "blueprint.sidebar.media": "Media Sets",
@@ -3557,6 +3585,15 @@ var en_default = {
3557
3585
  "desktopAccess.approval.allowedOnceAt": "Allowed once \xB7 {time}",
3558
3586
  "desktopAccess.approval.deny": "Deny",
3559
3587
  "desktopAccess.approval.deniedShort": "Denied",
3588
+ "chat.personConfirmation.kind": "Confirmation",
3589
+ "chat.personConfirmation.confirm": "Confirm",
3590
+ "chat.personConfirmation.cancel": "Cancel",
3591
+ "chat.personConfirmation.sending": "Sending your answer\u2026",
3592
+ "chat.personConfirmation.expires": "Expires {when}",
3593
+ "chat.personConfirmation.chose": "Chose \u201C{label}\u201D",
3594
+ "chat.personConfirmation.choseAt": "Chose \u201C{label}\u201D at {time}",
3595
+ "chat.personConfirmation.expired": "Expired without an answer",
3596
+ "chat.personConfirmation.failed": "Your answer couldn\u2019t be sent. Try again.",
3560
3597
  "desktopAccess.waiting.kind": "Waiting for your desktop",
3561
3598
  "desktopAccess.waiting.failed": "Local operation failed",
3562
3599
  "desktopAccess.conflict.kind": "Changed since it was read",
@@ -5282,8 +5319,13 @@ var id_default = {
5282
5319
  "console.agents.counts.plugins.many": "{count} plugin",
5283
5320
  "console.agents.counts.knowledge.one": "1 basis pengetahuan",
5284
5321
  "console.agents.counts.knowledge.many": "{count} basis pengetahuan",
5285
- "agents.detail.navigation.capabilities": "Identitas & kapabilitas",
5286
- "agents.detail.navigation.settings": "Pengaturan",
5322
+ "agents.detail.navigation.overview": "Ikhtisar",
5323
+ "agents.detail.navigation.configure": "Konfigurasi",
5324
+ "agents.detail.navigation.knowledge": "Pengetahuan",
5325
+ "agents.detail.navigation.evaluations": "Evaluasi",
5326
+ "agents.detail.navigation.sessions": "Sesi",
5327
+ "agents.detail.navigation.monitor": "Pemantauan",
5328
+ "agents.detail.navigation.analysis": "Analisis",
5287
5329
  "agents.detail.navigation.test": "Chat pengujian",
5288
5330
  "agents.detail.sidebar.back": "Kembali ke semua Agen",
5289
5331
  "console.agents.installedFromPacks.title": "{noun} Terpasang",
@@ -7302,6 +7344,7 @@ var id_default = {
7302
7344
  "admin.auditLog.verb.disabled": "Dinonaktifkan",
7303
7345
  "admin.auditLog.verb.rotated": "Dirotasi",
7304
7346
  "admin.auditLog.verb.skipped": "Dilewati",
7347
+ "admin.auditLog.verb.revealed": "Ditampilkan",
7305
7348
  "admin.auditLog.verb.detected": "Terdeteksi",
7306
7349
  "admin.auditLog.outcome.success": "Berhasil",
7307
7350
  "admin.auditLog.outcome.failure": "Gagal",
@@ -7675,6 +7718,8 @@ var id_default = {
7675
7718
  "eval.datasetItems.loadingMore": "Memuat\u2026",
7676
7719
  "eval.datasetItems.subjectAuthored": "ditulis manual",
7677
7720
  "eval.datasetItems.subjectAuthoredHint": "ditulis manual, diimpor dari CSV",
7721
+ "eval.datasetItems.subjectScenario": "Skenario",
7722
+ "eval.datasetItems.subjectScenarioHint": "seluruh percakapan dengan pelanggan simulasi",
7678
7723
  "eval.datasetItems.expectationsTitle": "Ekspektasi",
7679
7724
  "eval.datasetItems.expectationsHint": "Hal yang harus dilakukan jawaban, di luar kecocokan dengan jawaban yang diharapkan. Tiap baris dinilai sendiri, disertai bukti.",
7680
7725
  "eval.datasetItems.expectationsEmpty": "Belum ada ekspektasi.",
@@ -8394,6 +8439,7 @@ var id_default = {
8394
8439
  "eval.runs.nameLabel": "Nama run",
8395
8440
  "eval.runs.namePlaceholder": "Opsional \u2014 memakai stempel waktu bila dikosongkan",
8396
8441
  "eval.runs.judgesLabel": "Penilai",
8442
+ "eval.runs.judgeAddedForReference": "ditambahkan: item memiliki jawaban acuan",
8397
8443
  "eval.runs.judgesHint": "Item lulus hanya bila semua penilai yang dipilih meluluskannya.",
8398
8444
  "eval.runs.startedToast": 'Run "{runName}" dimulai',
8399
8445
  "eval.runs.startFailed": "Tidak dapat memulai run",
@@ -8402,6 +8448,19 @@ var id_default = {
8402
8448
  "eval.runs.running": "Berjalan {done}/{total}",
8403
8449
  "eval.runs.passCount": "{count} lulus",
8404
8450
  "eval.runs.failCount": "{count} gagal",
8451
+ "eval.runs.reliability": "Semua percobaan lulus: {passed} dari {items} item",
8452
+ "eval.runs.reliabilityHint": "Item dihitung hanya jika setiap percobaannya lulus.",
8453
+ "eval.runs.falseCompletions": "Berakhir terselesaikan tanpa tindakan yang diwajibkan: {count} dari {attempts} percakapan",
8454
+ "eval.runs.deduplicated": "Permintaan berulang dijalankan sekali: {count}",
8455
+ "eval.runs.silentTurns": "Pesan pelanggan tidak dibalas: {count} dari {attempts} percakapan",
8456
+ "eval.runs.repeatedRequests": "Pelanggan harus mengulang permintaan: {count} dari {attempts} percakapan",
8457
+ "eval.runs.offTopicDeclined": "Pesan di luar topik yang ditolak: {count}",
8458
+ "eval.runs.endingsTitle": "Cara percakapan berakhir",
8459
+ "eval.runs.ending.resolved": "Terselesaikan",
8460
+ "eval.runs.ending.handed_off": "Dialihkan ke petugas",
8461
+ "eval.runs.ending.unresolved": "Tidak terselesaikan",
8462
+ "eval.runs.ending.abandoned": "Ditinggalkan",
8463
+ "eval.runs.ending.none": "Tanpa hasil",
8405
8464
  "eval.runs.errorCount": "{count} galat",
8406
8465
  "eval.runs.produced": "Jawaban agen",
8407
8466
  "eval.runs.itemError": "Galat",
@@ -8462,6 +8521,11 @@ var id_default = {
8462
8521
  "eval.runs.configHideCandidate": "Sembunyikan kandidat",
8463
8522
  "eval.runs.trajectoryTitle": "Yang dilakukan agen",
8464
8523
  "eval.runs.trajectorySkill": "skill: {name}",
8524
+ "eval.runs.trajectoryKnowledge": "pengetahuan: {count}",
8525
+ "eval.runs.knowledgeTitle": "Pengetahuan yang diambil",
8526
+ "eval.runs.knowledgeQuery": "Mencari \u201C{query}\u201D",
8527
+ "eval.runs.knowledgeNothing": "Tidak ada yang relevan.",
8528
+ "eval.runs.knowledgeScore": "skor {score}",
8465
8529
  "eval.runs.trajectoryViewRaw": "Lihat data mentah",
8466
8530
  "eval.runs.trajectoryHideRaw": "Sembunyikan data mentah",
8467
8531
  "eval.runs.expectationsTitle": "Ekspektasi",
@@ -8525,6 +8589,7 @@ var id_default = {
8525
8589
  "eval.datasetItems.detailQuestion": "Pertanyaan",
8526
8590
  "eval.datasetItems.detailQuestionUnknown": "(tidak ada judul untuk percakapan ini)",
8527
8591
  "eval.datasetItems.detailExpectedMissing": "Tidak ada jawaban yang diharapkan. Item ini bisa memeriksa apakah balasan enak dibaca, tetapi tidak bisa menggagalkan jawaban yang salah \u2014 tambahkan koreksi pada ulasan asalnya.",
8592
+ "eval.datasetItems.scenarioChecksHint": "Pemeriksaan skenario ini berasal dari definisinya dan tidak diubah di sini.",
8528
8593
  "console.skillTest.rowResult": "Hasil",
8529
8594
  "console.skillTest.rowSkillLoaded": "Skill dimuat",
8530
8595
  "blueprint.sidebar.media": "Set Media",
@@ -8762,6 +8827,15 @@ var id_default = {
8762
8827
  "desktopAccess.approval.allowedOnceAt": "Diizinkan sekali \xB7 {time}",
8763
8828
  "desktopAccess.approval.deny": "Tolak",
8764
8829
  "desktopAccess.approval.deniedShort": "Ditolak",
8830
+ "chat.personConfirmation.kind": "Konfirmasi",
8831
+ "chat.personConfirmation.confirm": "Konfirmasi",
8832
+ "chat.personConfirmation.cancel": "Batal",
8833
+ "chat.personConfirmation.sending": "Mengirim jawaban Anda\u2026",
8834
+ "chat.personConfirmation.expires": "Kedaluwarsa {when}",
8835
+ "chat.personConfirmation.chose": "Memilih \u201C{label}\u201D",
8836
+ "chat.personConfirmation.choseAt": "Memilih \u201C{label}\u201D pukul {time}",
8837
+ "chat.personConfirmation.expired": "Kedaluwarsa tanpa jawaban",
8838
+ "chat.personConfirmation.failed": "Jawaban Anda tidak terkirim. Coba lagi.",
8765
8839
  "desktopAccess.waiting.kind": "Menunggu desktop Anda",
8766
8840
  "desktopAccess.waiting.failed": "Operasi lokal gagal",
8767
8841
  "desktopAccess.conflict.kind": "Berubah sejak dibaca",
@@ -10451,6 +10525,13 @@ function getStoredLocale() {
10451
10525
  const stored = localStorage.getItem(STORAGE_KEY);
10452
10526
  return stored === "id" ? "id" : "en";
10453
10527
  }
10528
+ function interpolate(str, vars) {
10529
+ if (!vars) return str;
10530
+ for (const [k, v] of Object.entries(vars)) {
10531
+ str = str.replace(new RegExp(`\\{${k}\\}`, "g"), () => String(v));
10532
+ }
10533
+ return str;
10534
+ }
10454
10535
  var I18nContext = createContext(null);
10455
10536
  function I18nProvider({ children }) {
10456
10537
  const [locale, setLocaleState] = useState("en");
@@ -10463,13 +10544,7 @@ function I18nProvider({ children }) {
10463
10544
  }, []);
10464
10545
  const t = useCallback(
10465
10546
  (key, vars) => {
10466
- let str = locales[locale]?.[key] ?? locales.en[key] ?? key;
10467
- if (vars) {
10468
- for (const [k, v] of Object.entries(vars)) {
10469
- str = str.replace(new RegExp(`\\{${k}\\}`, "g"), String(v));
10470
- }
10471
- }
10472
- return str;
10547
+ return interpolate(locales[locale]?.[key] ?? locales.en[key] ?? key, vars);
10473
10548
  },
10474
10549
  [locale]
10475
10550
  );
@@ -10483,15 +10558,7 @@ function useTranslation() {
10483
10558
  locale: "en",
10484
10559
  setLocale: () => {
10485
10560
  },
10486
- t: (key, vars) => {
10487
- let str = locales.en[key] ?? key;
10488
- if (vars) {
10489
- for (const [k, v] of Object.entries(vars)) {
10490
- str = str.replace(new RegExp(`\\{${k}\\}`, "g"), String(v));
10491
- }
10492
- }
10493
- return str;
10494
- }
10561
+ t: (key, vars) => interpolate(locales.en[key] ?? key, vars)
10495
10562
  };
10496
10563
  }
10497
10564
  return ctx;
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { MagnifyingGlassIcon } from './chunk-X3QVICX7.js';
3
3
  import { Sheet, SheetContent, SheetHeader, SheetTitle, Popover, PopoverTrigger, PopoverContent } from './chunk-T5SANYSX.js';
4
- import { useIsMobile, useTranslation } from './chunk-I5NAI7HP.js';
4
+ import { useIsMobile, useTranslation } from './chunk-AVSAEPHS.js';
5
5
  import { CrossMediumIcon } from './chunk-2P4IEVOQ.js';
6
6
  import { AgentAvatar } from './chunk-PUMRNN3R.js';
7
7
  import { cn, Checkmark1Icon } from './chunk-LGVMMBL3.js';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { useTranslation } from './chunk-I5NAI7HP.js';
2
+ import { useTranslation } from './chunk-AVSAEPHS.js';
3
3
  import { Skeleton } from './chunk-UWKO24VT.js';
4
4
  import { useRef, useState, useEffect } from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { MagnifyingGlassIcon } from './chunk-X3QVICX7.js';
3
- import { requestPaneFocus, useArtifacts, usePlugins, useCanvasStore, useArtifactStore, useChatOverviewStore, useSourcesEnrichment, sourceKind, useCitationViewer, resolveSourceDisplay, extractDomain, canvasId, StudioDisplayIcon, LayoutDashboardIcon, useAgentPanelStore, SourceFavicon, dedup, useArtifactFileObjectUrl, resolveArtifactIconFormat, artifactFormatIcon, avatarMotionForStream, AGENT_AVATAR_SIZE, getFileCategory, FileThumbnail, formatFileSize, usePathname, artifactFormatSubtitle, artifactCategory, Input, MobileScreenSheet, TooltipTrigger, Tooltip, useChatCapabilities, TooltipContent, processMessageParts, GridSpinner, PanelEdgeRing, ArtifactActionsMenu, DotGrid1x3HorizontalTightIcon, extractCitationsFromSteps, resolvePluginLanguage, getMessageDisplayTimestampValue } from './chunk-QFVBVBUR.js';
3
+ import { requestPaneFocus, useArtifacts, usePlugins, useCanvasStore, useArtifactStore, useChatOverviewStore, useSourcesEnrichment, sourceKind, useCitationViewer, resolveSourceDisplay, extractDomain, canvasId, StudioDisplayIcon, LayoutDashboardIcon, useAgentPanelStore, SourceFavicon, dedup, useArtifactFileObjectUrl, resolveArtifactIconFormat, artifactFormatIcon, avatarMotionForStream, AGENT_AVATAR_SIZE, getFileCategory, FileThumbnail, formatFileSize, usePathname, artifactFormatSubtitle, artifactCategory, Input, MobileScreenSheet, TooltipTrigger, Tooltip, useChatCapabilities, TooltipContent, processMessageParts, GridSpinner, PanelEdgeRing, ArtifactActionsMenu, DotGrid1x3HorizontalTightIcon, extractCitationsFromSteps, resolvePluginLanguage, getMessageDisplayTimestampValue } from './chunk-OMOIIMNG.js';
4
4
  import { Popover, PopoverTrigger, PopoverContent, Sheet, SheetContent, SheetHeader, SheetTitle } from './chunk-T5SANYSX.js';
5
- import { useTranslation, useIsMobile } from './chunk-I5NAI7HP.js';
5
+ import { useTranslation, useIsMobile } from './chunk-AVSAEPHS.js';
6
6
  import { Collapsible, CollapsibleTrigger, CollapsibleContent, Shimmer, HoverCard, HoverCardTrigger, HoverCardContent } from './chunk-PKNEC4LJ.js';
7
7
  import { ChevronDownMediumIcon, ScrollArea, Skeleton, Button } from './chunk-UWKO24VT.js';
8
8
  import { Dialog, DialogContent, DialogHeader, DialogTitle, CrossMediumIcon } from './chunk-2P4IEVOQ.js';