@kortix/ui 0.14.4 → 0.14.5

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.
Files changed (118) hide show
  1. package/README.md +8 -4
  2. package/dist/customize/sections/llm-provider/constants.d.ts +0 -1
  3. package/dist/customize/sections/llm-provider/constants.js +0 -2
  4. package/dist/customize/sections/llm-provider/models-tab-group.d.ts +1 -1
  5. package/dist/customize/sections/llm-provider/models-tab-group.js +7 -4
  6. package/dist/customize/sections/llm-provider/models-tab-row.d.ts +2 -18
  7. package/dist/customize/sections/llm-provider/models-tab-row.js +6 -30
  8. package/dist/customize/sections/llm-provider/models-tab.d.ts +0 -1
  9. package/dist/customize/sections/llm-provider/models-tab.js +1 -10
  10. package/dist/customize/sections/llm-provider/use-connected-providers.js +2 -2
  11. package/dist/customize/sections/llm-provider/utils.d.ts +1 -1
  12. package/dist/customize/sections/llm-provider/utils.js +7 -14
  13. package/dist/customize/sections/view/gateway/_shared.js +1 -2
  14. package/dist/customize/sections/view/gateway/gateway-routing.js +3 -2
  15. package/dist/customize/sections/view/sandbox-provider-coverage.d.ts +3 -18
  16. package/dist/customize/sections/view/sandbox-provider-coverage.js +7 -27
  17. package/dist/customize/settings/tabs/sandbox-tab.d.ts +2 -27
  18. package/dist/customize/settings/tabs/sandbox-tab.js +13 -112
  19. package/dist/customize/shared/entity/entity-modal.d.ts +5 -1
  20. package/dist/customize/shared/entity/entity-modal.js +7 -4
  21. package/dist/customize/skills/remove-skill-button.d.ts +16 -0
  22. package/dist/customize/skills/remove-skill-button.js +42 -0
  23. package/dist/customize/skills/skills-page.js +1 -1
  24. package/dist/customize/triggers/schedule/trigger-list.d.ts +0 -2
  25. package/dist/customize/triggers/schedule/trigger-list.js +1 -18
  26. package/dist/customize/triggers/schedule/trigger-tile.d.ts +1 -32
  27. package/dist/customize/triggers/schedule/trigger-tile.js +1 -16
  28. package/dist/files/project/hooks/use-change-requests.d.ts +14 -1
  29. package/dist/files/project/hooks/use-change-requests.js +44 -25
  30. package/dist/files/renderers/docx/docx-viewer.js +4 -1
  31. package/dist/files/renderers/pdf/pdf-renderer.d.ts +3 -1
  32. package/dist/files/renderers/pdf/pdf-renderer.js +2 -2
  33. package/dist/files/renderers/pdf/pdf-viewer.d.ts +3 -0
  34. package/dist/files/renderers/pdf/pdf-viewer.js +15 -6
  35. package/dist/files/viewer/file-content-renderer.d.ts +4 -1
  36. package/dist/files/viewer/file-content-renderer.js +2 -2
  37. package/dist/i18n/en.d.ts +26 -35
  38. package/dist/i18n/en.js +35 -44
  39. package/dist/index.d.ts +1 -1
  40. package/dist/internal/hooks/use-notification-center.js +21 -15
  41. package/dist/internal/hooks/use-review-session-summary.d.ts +6 -0
  42. package/dist/internal/hooks/use-review-session-summary.js +11 -0
  43. package/dist/internal/lib/browser-error-noise.d.ts +1 -1
  44. package/dist/internal/lib/browser-error-noise.js +1 -1
  45. package/dist/internal/lib/browser-noise/rules/rejections.d.ts +10 -0
  46. package/dist/internal/lib/browser-noise/rules/rejections.js +27 -1
  47. package/dist/internal/lib/provider-branding.js +14 -3
  48. package/dist/internal/lib/trigger-clock.d.ts +42 -0
  49. package/dist/internal/lib/trigger-clock.js +34 -0
  50. package/dist/internal/lib/web-notifications.d.ts +6 -0
  51. package/dist/internal/lib/web-notifications.js +57 -7
  52. package/dist/internal/notifications/notification-bell.d.ts +13 -0
  53. package/dist/internal/notifications/notification-bell.js +1 -1
  54. package/dist/internal/reminders/reminder-filter.d.ts +12 -0
  55. package/dist/internal/reminders/reminder-filter.js +34 -0
  56. package/dist/internal/reminders/reminder-format.d.ts +6 -0
  57. package/dist/internal/reminders/reminder-format.js +20 -2
  58. package/dist/internal/stores/kortix-computer-store.d.ts +1 -1
  59. package/dist/internal/stores/session-hover-store.d.ts +20 -5
  60. package/dist/internal/stores/session-hover-store.js +31 -13
  61. package/dist/internal/stores/session-panel-memory-store.js +2 -0
  62. package/dist/primitives/count-badge.d.ts +3 -1
  63. package/dist/primitives/count-badge.js +3 -3
  64. package/dist/primitives/glyph-paths-source.js +1 -1
  65. package/dist/primitives/glyph-paths.generated.js +1 -1
  66. package/dist/providers/ui-provider.d.ts +57 -0
  67. package/dist/providers/ui-provider.js +4 -0
  68. package/dist/session/composer/ComposerCard.d.ts +2 -0
  69. package/dist/session/composer/ComposerCard.js +5 -1
  70. package/dist/session/composer/agent-selector.js +12 -5
  71. package/dist/session/composer/composer-toolbar.js +4 -2
  72. package/dist/session/composer/composer-underbar.js +3 -1
  73. package/dist/session/composer/composer.js +34 -5
  74. package/dist/session/composer/menus/slash-actions.d.ts +22 -2
  75. package/dist/session/composer/menus/slash-actions.js +20 -0
  76. package/dist/session/composer/menus/slash-items.js +19 -3
  77. package/dist/session/header/reminder-parts.d.ts +285 -0
  78. package/dist/session/header/reminder-parts.js +115 -0
  79. package/dist/session/header/session-reminders-indicator.d.ts +13 -0
  80. package/dist/session/header/session-reminders-indicator.js +142 -35
  81. package/dist/session/models/model-availability.d.ts +23 -0
  82. package/dist/session/models/model-availability.js +20 -0
  83. package/dist/session/models/model-grouping.js +1 -4
  84. package/dist/session/models/model-selector.js +23 -14
  85. package/dist/session/models/use-model-connection-gate.js +4 -1
  86. package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
  87. package/dist/session/outcomes/session-outcomes-provider.js +31 -3
  88. package/dist/session/overrides/session-overrides-composer.d.ts +1 -1
  89. package/dist/session/overrides/session-overrides-composer.js +5 -1
  90. package/dist/session/panel/mobile-tool-drawer.js +4 -2
  91. package/dist/session/panel/open-session-quick-view.js +2 -1
  92. package/dist/session/panel/panel-fallback.js +8 -4
  93. package/dist/session/panel/session-panel-provider.d.ts +1 -0
  94. package/dist/session/panel/session-panel-provider.js +13 -1
  95. package/dist/session/panel/session-reminders-panel.d.ts +4 -0
  96. package/dist/session/panel/session-reminders-panel.js +109 -0
  97. package/dist/session/panel/shared/use-panel-handoffs.d.ts +2 -2
  98. package/dist/session/panel/shared/use-panel-handoffs.js +5 -1
  99. package/dist/session/print/session-print-header.d.ts +0 -10
  100. package/dist/session/print/session-print-header.js +16 -1
  101. package/dist/session/status/session-surface.js +1 -1
  102. package/dist/session/thread/optimistic-turn.d.ts +5 -1
  103. package/dist/session/thread/optimistic-turn.js +8 -6
  104. package/dist/session/thread/session-chat.d.ts +6 -1
  105. package/dist/session/thread/session-chat.js +22 -3
  106. package/dist/session/thread/session-thread.d.ts +10 -1
  107. package/dist/session/thread/session-thread.js +2 -2
  108. package/dist/session/turn/burst-step-body.js +4 -0
  109. package/dist/styles.css +1 -1
  110. package/dist/workspace/sidebar/project-session-list.js +52 -55
  111. package/dist/workspace/sidebar/session-brief-hover-card.d.ts +35 -18
  112. package/dist/workspace/sidebar/session-brief-hover-card.js +114 -37
  113. package/dist/workspace/sidebar/session-status-mark.d.ts +15 -1
  114. package/dist/workspace/sidebar/session-status-mark.js +63 -17
  115. package/package.json +7 -3
  116. package/skills/kortix-ui/SKILL.md +1 -1
  117. package/dist/customize/sections/view/sandbox-provider-result.d.ts +0 -47
  118. package/dist/customize/sections/view/sandbox-provider-result.js +0 -79
@@ -45,6 +45,9 @@ const ZOOM_OPTIONS = [10, 25, 50, 75, 100, 125, 150, 175, 200, 400];
45
45
  const DOCX_PADDING_WARNING_TEXT = 'a style property during rerender';
46
46
  const DOCX_THUMBNAIL_FOCUS_RING_CLASS = 'group-focus-visible/docx-thumbnail-sidebar:ring-2 group-focus-visible/docx-thumbnail-sidebar:ring-ring group-focus-visible/docx-thumbnail-sidebar:ring-offset-1 group-focus-visible/docx-thumbnail-sidebar:ring-offset-background';
47
47
  const DOCX_THUMBNAIL_PREFETCH_ROWS = 4;
48
+ // Night reader: the inverted page content's default text is black, so the
49
+ // inversion makes it light (see the <style> in the page shell below).
50
+ const NIGHT_READER_TEXT_STYLE = '.docx-night-reader-shell [style*="hue-rotate(180deg)"]{color:#000}';
48
51
  function createDocxActivePageStore() {
49
52
  let activePage = 1;
50
53
  const listeners = new Set();
@@ -617,5 +620,5 @@ function DocxViewerContent({ className, defaultZoom, effectiveIsDark, fileName,
617
620
  event.currentTarget.focus({ preventScroll: true });
618
621
  },
619
622
  tabIndex: 0,
620
- }, viewportRef: setViewportRef, children: !url && !activeUploadedDocxFile ? (_jsx("div", { className: "grid h-full min-h-96 place-items-center p-6 text-center", children: _jsxs("div", { className: "bg-background max-w-md rounded-lg border p-4 text-sm shadow-xs", children: [_jsx("div", { className: "font-medium", children: tI18nComplete.raw('text53c247b8cf06') }), _jsxs("div", { className: "text-muted-foreground mt-1", children: [tI18nComplete.raw('text46800e585f61'), " ", _jsx("code", { children: "src" }), ' ', tI18nComplete.raw('text37056f2381e2')] }), _jsxs("div", { className: "text-muted-foreground mt-1", children: [tI18nComplete.raw('text1432897a6136'), " ", _jsx("code", { children: ".doc" }), ' ', tI18nComplete.raw('text73a2f5159338')] }), _jsxs(Button, { type: "button", variant: "outline", size: "sm", className: "mt-4", onClick: () => fileInputRef.current?.click(), children: [_jsx(Upload, { className: "size-4" }), tI18nComplete.raw('textdc0451eb46ce')] })] }) })) : loadError ? (_jsx("div", { className: "grid h-full min-h-96 place-items-center p-6 text-center", children: _jsxs("div", { className: "bg-background text-destructive max-w-md rounded-lg border p-4 text-sm shadow-xs", children: [_jsx("div", { className: "font-medium", children: tI18nComplete.raw('text2a5502b48b14') }), _jsx("div", { className: "text-muted-foreground mt-1", children: loadError })] }) })) : isLoadingDocument ? (loadingState) : (_jsx("div", { className: "flex min-h-full w-max min-w-full justify-center", children: _jsx("div", { className: cn('origin-top', effectiveIsDark && 'docx-night-reader-shell'), style: { zoom: zoomScale / 100 }, children: _jsx(DocxEditorViewer, { editor: editor, mode: "read-only", showTrackedChanges: showTrackedChanges, renderTrackedChangeCard: renderTrackedChangeCard, showComments: showComments, renderCommentCard: renderCommentCard, loadingState: loadingState, pageBackgroundColor: effectiveIsDark ? 'var(--background)' : undefined, pageGapBackgroundColor: viewerBackgroundColor, pageVirtualization: pageVirtualization, deferInitialPaginationPaint: false, onPageCountChange: handlePageCountChange }) }) })) })] })] }));
623
+ }, viewportRef: setViewportRef, children: !url && !activeUploadedDocxFile ? (_jsx("div", { className: "grid h-full min-h-96 place-items-center p-6 text-center", children: _jsxs("div", { className: "bg-background max-w-md rounded-lg border p-4 text-sm shadow-xs", children: [_jsx("div", { className: "font-medium", children: tI18nComplete.raw('text53c247b8cf06') }), _jsxs("div", { className: "text-muted-foreground mt-1", children: [tI18nComplete.raw('text46800e585f61'), " ", _jsx("code", { children: "src" }), ' ', tI18nComplete.raw('text37056f2381e2')] }), _jsxs("div", { className: "text-muted-foreground mt-1", children: [tI18nComplete.raw('text1432897a6136'), " ", _jsx("code", { children: ".doc" }), ' ', tI18nComplete.raw('text73a2f5159338')] }), _jsxs(Button, { type: "button", variant: "outline", size: "sm", className: "mt-4", onClick: () => fileInputRef.current?.click(), children: [_jsx(Upload, { className: "size-4" }), tI18nComplete.raw('textdc0451eb46ce')] })] }) })) : loadError ? (_jsx("div", { className: "grid h-full min-h-96 place-items-center p-6 text-center", children: _jsxs("div", { className: "bg-background text-destructive max-w-md rounded-lg border p-4 text-sm shadow-xs", children: [_jsx("div", { className: "font-medium", children: tI18nComplete.raw('text2a5502b48b14') }), _jsx("div", { className: "text-muted-foreground mt-1", children: loadError })] }) })) : isLoadingDocument ? (loadingState) : (_jsx("div", { className: "flex min-h-full w-max min-w-full justify-center", children: _jsxs("div", { className: cn('origin-top', effectiveIsDark && 'docx-night-reader-shell'), style: { zoom: zoomScale / 100 }, children: [effectiveIsDark && (_jsx("style", { children: NIGHT_READER_TEXT_STYLE })), _jsx(DocxEditorViewer, { editor: editor, mode: "read-only", showTrackedChanges: showTrackedChanges, renderTrackedChangeCard: renderTrackedChangeCard, showComments: showComments, renderCommentCard: renderCommentCard, loadingState: loadingState, pageBackgroundColor: effectiveIsDark ? 'var(--background)' : undefined, pageGapBackgroundColor: viewerBackgroundColor, pageVirtualization: pageVirtualization, deferInitialPaginationPaint: false, onPageCountChange: handlePageCountChange })] }) })) })] })] }));
621
624
  }
@@ -13,9 +13,11 @@ interface PdfRendererProps {
13
13
  toolbarActions?: React.ReactNode;
14
14
  /** Start the zoom plugin at fit-to-page instead of the numeric default. */
15
15
  fitOnOpen?: boolean;
16
+ /** Search for this text once the document opens: highlighted, first hit in view. */
17
+ findText?: string;
16
18
  /** False when the host's own toolbar already has the Download button, so the
17
19
  * viewer does not show a second one. */
18
20
  showDownload?: boolean;
19
21
  }
20
- export declare function PdfRenderer({ fileContent, url, className, compact, fileName, toolbarActions, fitOnOpen, showDownload, }: PdfRendererProps): import("react").JSX.Element;
22
+ export declare function PdfRenderer({ fileContent, url, className, compact, fileName, toolbarActions, fitOnOpen, findText, showDownload, }: PdfRendererProps): import("react").JSX.Element;
21
23
  export {};
@@ -14,7 +14,7 @@ export function base64PdfContentToBlob(fileContent) {
14
14
  }
15
15
  return new Blob([bytes], { type: 'application/pdf' });
16
16
  }
17
- export function PdfRenderer({ fileContent, url, className, compact = false, fileName, toolbarActions, fitOnOpen, showDownload = true, }) {
17
+ export function PdfRenderer({ fileContent, url, className, compact = false, fileName, toolbarActions, fitOnOpen, findText, showDownload = true, }) {
18
18
  const tHardcodedUi = useTranslations('hardcodedUi');
19
19
  const [pdfUrl, setPdfUrl] = useState(null);
20
20
  const [status, setStatus] = useState('loading');
@@ -50,5 +50,5 @@ export function PdfRenderer({ fileContent, url, className, compact = false, file
50
50
  if (status === 'error' || !pdfUrl) {
51
51
  return (_jsxs("div", { className: cn('flex h-full w-full flex-col items-center justify-center gap-3 p-8 text-center', className), children: [_jsx("div", { className: "bg-muted flex h-10 w-10 items-center justify-center rounded-full", children: _jsx(AlertTriangle, { className: "text-muted-foreground h-4 w-4" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: tHardcodedUi.raw('componentsFileRenderersPdfRenderer.line277JsxTextFailedToLoadPdf') }), !compact && (_jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: tHardcodedUi.raw('componentsFileRenderersPdfRenderer.line278JsxTextTheFileMayBeCorruptedOrInaccessible') }))] })] }));
52
52
  }
53
- return (_jsx(PDFViewer, { src: pdfUrl, fileName: fileName, showToolbar: !compact, showDownload: showDownload, showUpload: false, className: cn('h-full w-full', className), toolbarActions: toolbarActions, fitOnOpen: fitOnOpen }));
53
+ return (_jsx(PDFViewer, { src: pdfUrl, fileName: fileName, showToolbar: !compact, showDownload: showDownload, showUpload: false, className: cn('h-full w-full', className), toolbarActions: toolbarActions, fitOnOpen: fitOnOpen, findText: findText }));
54
54
  }
@@ -31,6 +31,9 @@ export type PDFViewerProps = {
31
31
  showUpload?: boolean;
32
32
  src?: string;
33
33
  toolbarActions?: React.ReactNode;
34
+ /** Search the document for this text once it opens: hits are highlighted and the
35
+ * first is scrolled into view, as if typed into the toolbar's search. */
36
+ findText?: string;
34
37
  pageClassName?: (pageNumber: number) => string | undefined;
35
38
  renderPageOverlay?: (props: PDFViewerPageOverlayProps) => React.ReactNode;
36
39
  onActivePageChange?: (pageNumber: number) => void;
@@ -282,7 +282,7 @@ function PDFViewerPageNumberControl({ activePage, controlsDisabled, numPages, on
282
282
  setIsEditing(true);
283
283
  }, children: displayPage })), _jsxs("span", { children: [tI18nComplete.raw('text28391d3bc64e'), " ", numPages || '–'] })] }));
284
284
  }
285
- function PDFViewerSearchControl({ documentId, controlsDisabled, }) {
285
+ function PDFViewerSearchControl({ documentId, controlsDisabled, initialSearch, }) {
286
286
  const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
287
287
  const { state, provides } = useSearch(documentId);
288
288
  const { provides: scroll } = useScroll(documentId);
@@ -323,6 +323,12 @@ function PDFViewerSearchControl({ documentId, controlsDisabled, }) {
323
323
  providesRef.current = provides;
324
324
  scrollRef.current = scroll;
325
325
  }, [provides, scroll]);
326
+ // A host's `findText`: search once the plugin is ready, and again when the text changes.
327
+ React.useEffect(() => {
328
+ const text = initialSearch?.trim();
329
+ if (text && provides && scroll)
330
+ setSearchDraft(text);
331
+ }, [initialSearch, provides, scroll]);
326
332
  const runSearch = React.useCallback((rawQuery) => {
327
333
  const query = rawQuery.trim();
328
334
  const requestId = searchRequestIdRef.current + 1;
@@ -922,7 +928,7 @@ function PDFViewerScroller({ documentId, pageRotationDeltas, basePageRotations,
922
928
  width: '100%',
923
929
  } })] }));
924
930
  }
925
- function PDFViewerInner({ viewerRef, pdfFile, documentId, document: pdfDocument, defaultZoom, className, fileName, showDownload, showToolbar, showRotateControls, showUpload, toolbarActions, pageClassName, renderPageOverlay, onActivePageChange, onPdfUpload, onPagePointerDown, onPagePointerMove, onPagePointerUp, onPagePointerCancel, onUploadFile, }) {
931
+ function PDFViewerInner({ viewerRef, pdfFile, documentId, document: pdfDocument, defaultZoom, className, fileName, showDownload, showToolbar, showRotateControls, showUpload, toolbarActions, findText, pageClassName, renderPageOverlay, onActivePageChange, onPdfUpload, onPagePointerDown, onPagePointerMove, onPagePointerUp, onPagePointerCancel, onUploadFile, }) {
926
932
  const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
927
933
  const { registry } = useRegistry();
928
934
  const { state: scrollState, provides: scroll } = useScroll(documentId);
@@ -1184,7 +1190,7 @@ function PDFViewerInner({ viewerRef, pdfFile, documentId, document: pdfDocument,
1184
1190
  pdfDocument?.pages[page.pageIndex]?.rotation ??
1185
1191
  normalizeRotation(0);
1186
1192
  const pageRotation = normalizeRotation(basePageRotation + (pageRotationDeltas.get(page.pageIndex) ?? 0));
1187
- return (_jsx(Rotate, { documentId: documentId, pageIndex: page.pageIndex, rotation: pageRotation, children: _jsxs(PagePointerProvider, { documentId: documentId, pageIndex: page.pageIndex, rotation: pageRotation, "data-pdf-viewer-page": pageNumber, className: cn('relative border border-transparent bg-transparent shadow-xs select-none selection:bg-transparent selection:text-inherit', pageClassName?.(pageNumber)), style: { backgroundColor: 'transparent' }, onPointerDown: (event) => onPagePointerDown?.(event, pageNumber), onPointerMove: (event) => onPagePointerMove?.(event, pageNumber), onPointerUp: (event) => onPagePointerUp?.(event, pageNumber), onPointerCancel: (event) => onPagePointerCancel?.(event, pageNumber), children: [_jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-0 bg-white" }), _jsx(RenderLayer, { documentId: documentId, pageIndex: page.pageIndex, scale: Math.min(currentZoomLevel, PAGE_BASE_RENDER_MAX_SCALE), dpr: PAGE_BASE_RENDER_DPR, className: "pointer-events-none absolute inset-0 h-full w-full object-fill opacity-100 blur-[0.35px] transition-none" }), _jsx(TilingLayer, { documentId: documentId, pageIndex: page.pageIndex, className: "pointer-events-none opacity-100 transition-none [&_img]:opacity-100 [&_img]:transition-none" }, `tiles-${page.pageIndex}-${pageRotation}`), _jsx(SearchLayer, { documentId: documentId, pageIndex: page.pageIndex, className: "pointer-events-none", highlightColor: "color-mix(in srgb, var(--kortix-yellow) 45%, transparent)", activeHighlightColor: "color-mix(in srgb, var(--kortix-orange) 55%, transparent)" }), _jsx(PDFViewerTextSelectionLayer, { documentId: documentId, pageIndex: page.pageIndex, scale: currentZoomLevel }), renderPageOverlay?.({
1193
+ return (_jsx(Rotate, { documentId: documentId, pageIndex: page.pageIndex, rotation: pageRotation, children: _jsxs(PagePointerProvider, { documentId: documentId, pageIndex: page.pageIndex, rotation: pageRotation, "data-pdf-viewer-page": pageNumber, className: cn('relative border border-transparent bg-transparent shadow-xs select-none selection:bg-transparent selection:text-inherit', pageClassName?.(pageNumber)), style: { backgroundColor: 'transparent' }, onPointerDown: (event) => onPagePointerDown?.(event, pageNumber), onPointerMove: (event) => onPagePointerMove?.(event, pageNumber), onPointerUp: (event) => onPagePointerUp?.(event, pageNumber), onPointerCancel: (event) => onPagePointerCancel?.(event, pageNumber), children: [_jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-0 grid place-items-center bg-white text-neutral-400", children: _jsx(Spinner, { className: "size-5" }) }), _jsx(RenderLayer, { documentId: documentId, pageIndex: page.pageIndex, scale: Math.min(currentZoomLevel, PAGE_BASE_RENDER_MAX_SCALE), dpr: PAGE_BASE_RENDER_DPR, className: "pointer-events-none absolute inset-0 h-full w-full object-fill opacity-100 blur-[0.35px] transition-none" }), _jsx(TilingLayer, { documentId: documentId, pageIndex: page.pageIndex, className: "pointer-events-none opacity-100 transition-none [&_img]:opacity-100 [&_img]:transition-none" }, `tiles-${page.pageIndex}-${pageRotation}`), _jsx(SearchLayer, { documentId: documentId, pageIndex: page.pageIndex, className: "pointer-events-none", highlightColor: "color-mix(in srgb, var(--kortix-yellow) 45%, transparent)", activeHighlightColor: "color-mix(in srgb, var(--kortix-orange) 55%, transparent)" }), _jsx(PDFViewerTextSelectionLayer, { documentId: documentId, pageIndex: page.pageIndex, scale: currentZoomLevel }), renderPageOverlay?.({
1188
1194
  pageNumber,
1189
1195
  pageWidth: page.width,
1190
1196
  pageHeight: page.height,
@@ -1212,7 +1218,7 @@ function PDFViewerInner({ viewerRef, pdfFile, documentId, document: pdfDocument,
1212
1218
  }, children: _jsx(CircleMinus, { className: "size-4" }) }) }), _jsxs(Select, { value: String(currentZoomLevel), onValueChange: (value) => zoom?.requestZoom(Number(value)), disabled: controlsDisabled, modal: false, children: [_jsx(SelectTrigger, { size: "sm", className: "w-[84px] min-w-[84px] tabular-nums", children: _jsxs(SelectValue, { placeholder: tI18nComplete.raw('text509c517ede79'), children: [Math.round(currentZoomLevel * 100), "%"] }) }), _jsx(SelectContent, { alignItemWithTrigger: false, children: ZOOM_OPTIONS.map((option) => (_jsxs(SelectItem, { value: String(option), children: [Math.round(option * 100), "%"] }, option))) })] }), _jsx(ToolbarTooltip, { label: tI18nComplete.raw('text0e47f09a748f'), children: _jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", className: "transition-transform active:scale-[0.96]", "aria-label": tI18nComplete.raw('text0e47f09a748f'), disabled: controlsDisabled || currentZoomLevel >= ZOOM_OPTIONS[ZOOM_OPTIONS.length - 1], onClick: () => {
1213
1219
  const nextZoom = ZOOM_OPTIONS.find((option) => option > currentZoomLevel);
1214
1220
  zoom?.requestZoom(nextZoom ?? ZOOM_OPTIONS[ZOOM_OPTIONS.length - 1]);
1215
- }, children: _jsx(CirclePlus, { className: "size-4" }) }) })] }), _jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), _jsx(PDFViewerSearchControl, { documentId: documentId, controlsDisabled: controlsDisabled }, documentId), toolbarActions ? (_jsxs(_Fragment, { children: [_jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), toolbarActions] })) : null, showDownload || showUpload ? (_jsxs(_Fragment, { children: [_jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), _jsx(PDFViewerFileActionsMenu, { onUploadFile: handleUpload, showUpload: showUpload }), showDownload ? (_jsx(ViewerDownloadButton, { disabled: controlsDisabled, pending: isPreparingDownload, onDownload: () => void handleDownload() })) : null] })) : null] }) })] })) : null, _jsxs("div", { ref: viewerShellRef, className: "bg-muted/30 relative flex min-h-0 flex-1 overflow-hidden", children: [isLoading ? (_jsx(PDFViewerLoadingSkeleton, { sidebarInline: sidebarInline, sidebarOpen: sidebarOpen })) : null, _jsxs("div", { className: "flex h-full max-h-full min-h-0 w-full flex-1 overflow-hidden", children: [_jsx(DocumentViewerThumbnailSidebar, { closedInlineClassName: THUMBNAIL_SIDEBAR_CLOSED_CLASS, inline: sidebarInline, open: thumbnailSidebarVisible, widthClassName: THUMBNAIL_SIDEBAR_WIDTH_CLASS, children: thumbnailSidebarVisible ? (_jsx(PDFViewerThumbnails, { basePageRotations: basePageRotations, documentId: documentId, activePage: activePage, pageCount: numPages, pageRotationDeltas: pageRotationDeltas, pdfDocument: pdfDocument, selectedPageIndexes: selectedPageIndexes, onSelectPage: selectThumbnailPage })) : null }), _jsxs(PDFViewerScrollAreaViewport, { documentId: documentId, className: "relative h-full max-h-full min-h-0 min-w-0 flex-1", children: [_jsx(PDFViewerViewportBridge, { viewportElementRef: viewportElementRef }), _jsx(PDFViewerSelectionCopyShortcut, { documentId: documentId }), _jsx(PDFViewerSelectionReleaseGuard, { documentId: documentId }), _jsx(GlobalPointerProvider, { documentId: documentId, children: _jsx(PDFViewerScroller, { basePageRotations: basePageRotations, documentId: documentId, pageRotationDeltas: pageRotationDeltas, renderPage: renderPage }) }), _jsx(CopyToClipboard, {})] })] })] })] }));
1221
+ }, children: _jsx(CirclePlus, { className: "size-4" }) }) })] }), _jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), _jsx(PDFViewerSearchControl, { documentId: documentId, controlsDisabled: controlsDisabled, initialSearch: findText }, documentId), toolbarActions ? (_jsxs(_Fragment, { children: [_jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), toolbarActions] })) : null, showDownload || showUpload ? (_jsxs(_Fragment, { children: [_jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), _jsx(PDFViewerFileActionsMenu, { onUploadFile: handleUpload, showUpload: showUpload }), showDownload ? (_jsx(ViewerDownloadButton, { disabled: controlsDisabled, pending: isPreparingDownload, onDownload: () => void handleDownload() })) : null] })) : null] }) })] })) : null, _jsxs("div", { ref: viewerShellRef, className: "bg-muted/30 relative flex min-h-0 flex-1 overflow-hidden", children: [isLoading ? (_jsx(PDFViewerLoadingSkeleton, { sidebarInline: sidebarInline, sidebarOpen: sidebarOpen })) : null, _jsxs("div", { className: "flex h-full max-h-full min-h-0 w-full flex-1 overflow-hidden", children: [_jsx(DocumentViewerThumbnailSidebar, { closedInlineClassName: THUMBNAIL_SIDEBAR_CLOSED_CLASS, inline: sidebarInline, open: thumbnailSidebarVisible, widthClassName: THUMBNAIL_SIDEBAR_WIDTH_CLASS, children: thumbnailSidebarVisible ? (_jsx(PDFViewerThumbnails, { basePageRotations: basePageRotations, documentId: documentId, activePage: activePage, pageCount: numPages, pageRotationDeltas: pageRotationDeltas, pdfDocument: pdfDocument, selectedPageIndexes: selectedPageIndexes, onSelectPage: selectThumbnailPage })) : null }), _jsxs(PDFViewerScrollAreaViewport, { documentId: documentId, className: "relative h-full max-h-full min-h-0 min-w-0 flex-1", children: [_jsx(PDFViewerViewportBridge, { viewportElementRef: viewportElementRef }), _jsx(PDFViewerSelectionCopyShortcut, { documentId: documentId }), _jsx(PDFViewerSelectionReleaseGuard, { documentId: documentId }), _jsx(GlobalPointerProvider, { documentId: documentId, children: _jsx(PDFViewerScroller, { basePageRotations: basePageRotations, documentId: documentId, pageRotationDeltas: pageRotationDeltas, renderPage: renderPage }) }), _jsx(CopyToClipboard, {})] })] })] })] }));
1216
1222
  }
1217
1223
  function PDFViewerDocumentLoader({ pdfFile, onDocumentLoadSuccess, ...innerProps }) {
1218
1224
  const { provides: documentManager } = useDocumentManagerCapability();
@@ -1288,7 +1294,7 @@ function PDFViewerDocumentLoader({ pdfFile, onDocumentLoadSuccess, ...innerProps
1288
1294
  }
1289
1295
  return (_jsx(PDFViewerInner, { ...innerProps, pdfFile: pdfFile, documentId: activeDocumentId, document: document }, activeDocumentId));
1290
1296
  }
1291
- export const PDFViewer = React.forwardRef(function PDFViewer({ className, defaultZoom = DEFAULT_ZOOM, fitOnOpen, fileName, showDownload = true, showRotateControls = true, showToolbar = true, showUpload = true, src, toolbarActions, pageClassName, renderPageOverlay, onActivePageChange, onDocumentLoadSuccess, onPdfUpload, onPagePointerDown, onPagePointerMove, onPagePointerUp, onPagePointerCancel, }, ref) {
1297
+ export const PDFViewer = React.forwardRef(function PDFViewer({ className, defaultZoom = DEFAULT_ZOOM, fitOnOpen, fileName, showDownload = true, showRotateControls = true, showToolbar = true, showUpload = true, src, toolbarActions, findText, pageClassName, renderPageOverlay, onActivePageChange, onDocumentLoadSuccess, onPdfUpload, onPagePointerDown, onPagePointerMove, onPagePointerUp, onPagePointerCancel, }, ref) {
1292
1298
  const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
1293
1299
  const { engine, error: engineError } = useSharedPdfEngine();
1294
1300
  const [uploadedPdfFile, setUploadedPdfFile] = React.useState(() => ({ src, url: null }));
@@ -1348,5 +1354,8 @@ export const PDFViewer = React.forwardRef(function PDFViewer({ className, defaul
1348
1354
  if (!engine) {
1349
1355
  return (_jsxs("div", { "data-slot": "pdf-viewer", className: cn('bg-background relative flex h-full max-h-full min-h-0 w-full flex-col overflow-hidden', className), children: [showToolbar ? _jsx("div", { className: "bg-background min-h-12 border-b" }) : null, _jsx("div", { className: "relative min-h-0 flex-1", children: _jsx(PDFViewerLoadingSkeleton, { sidebarInline: true, sidebarOpen: false }) })] }));
1350
1356
  }
1351
- return (_jsx(EmbedPDF, { engine: engine, plugins: plugins, children: _jsx(PDFViewerDocumentLoader, { viewerRef: ref, pdfFile: pdfFile, defaultZoom: defaultZoom, className: className, fileName: fileName, showDownload: showDownload, showToolbar: showToolbar, showRotateControls: showRotateControls, showUpload: showUpload, toolbarActions: toolbarActions, pageClassName: pageClassName, renderPageOverlay: renderPageOverlay, onActivePageChange: onActivePageChange, onDocumentLoadSuccess: onDocumentLoadSuccess, onPdfUpload: onPdfUpload, onPagePointerDown: onPagePointerDown, onPagePointerMove: onPagePointerMove, onPagePointerUp: onPagePointerUp, onPagePointerCancel: onPagePointerCancel, onUploadFile: handleUploadFile }) }));
1357
+ return (_jsx(EmbedPDF, { engine: engine, plugins: plugins, children: _jsx(PDFViewerDocumentLoader, { viewerRef: ref, pdfFile: pdfFile,
1358
+ // The same level the plugin starts at: a numeric default here would undo `fitOnOpen`
1359
+ // as soon as the document loads (the page opened at 100% and overflowed a narrow pane).
1360
+ defaultZoom: selectPdfZoomLevel(fitOnOpen, defaultZoom), className: className, fileName: fileName, showDownload: showDownload, showToolbar: showToolbar, showRotateControls: showRotateControls, showUpload: showUpload, toolbarActions: toolbarActions, findText: findText, pageClassName: pageClassName, renderPageOverlay: renderPageOverlay, onActivePageChange: onActivePageChange, onDocumentLoadSuccess: onDocumentLoadSuccess, onPdfUpload: onPdfUpload, onPagePointerDown: onPagePointerDown, onPagePointerMove: onPagePointerMove, onPagePointerUp: onPagePointerUp, onPagePointerCancel: onPagePointerCancel, onUploadFile: handleUploadFile }) }));
1352
1361
  });
@@ -35,6 +35,9 @@ export interface FileContentRendererProps {
35
35
  /** PDF only: start the zoom plugin at fit-to-page instead of the numeric
36
36
  * default. No effect on any other file category. */
37
37
  fitOnOpen?: boolean;
38
+ /** PDF only: search for this text once the file opens. Hits are highlighted and
39
+ * the first one is scrolled into view (a citation's quote, for example). */
40
+ findText?: string;
38
41
  /** Additional class name for the code editor */
39
42
  codeEditorEditorClassName?: string;
40
43
  /** Bumped by the surface's Refresh control. Remounts the renderers that read
@@ -42,4 +45,4 @@ export interface FileContentRendererProps {
42
45
  * cannot reach. */
43
46
  reloadKey?: number;
44
47
  }
45
- export declare function FileContentRenderer({ filePath, showHeader, headerActions, onUnsavedChange, onSaved, className, errorFallback, targetLine, readOnly, markdownPreview, onMarkdownPreviewChange, onStatusChange, imageControls, fitOnOpen, codeEditorEditorClassName, reloadKey, }: FileContentRendererProps): React.JSX.Element;
48
+ export declare function FileContentRenderer({ filePath, showHeader, headerActions, onUnsavedChange, onSaved, className, errorFallback, targetLine, readOnly, markdownPreview, onMarkdownPreviewChange, onStatusChange, imageControls, fitOnOpen, findText, codeEditorEditorClassName, reloadKey, }: FileContentRendererProps): React.JSX.Element;
@@ -44,7 +44,7 @@ function FileNotFoundState({ filePath }) {
44
44
  const tHardcodedUi = useTranslations('hardcodedUi');
45
45
  return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-3 p-8 text-center", children: [_jsx("div", { className: "bg-muted/50 flex h-12 w-12 items-center justify-center rounded-sm", children: _jsx(FileX, { className: "text-muted-foreground/40 h-6 w-6" }) }), _jsx("p", { className: "text-muted-foreground text-sm font-medium", children: tHardcodedUi.raw('featuresFilesComponentsFileContentRenderer.line195JsxTextFileNotFound') }), _jsx("p", { className: "text-muted-foreground/50 max-w-sm font-mono text-xs break-all", children: filePath }), _jsx("p", { className: "text-muted-foreground/40 max-w-xs text-xs", children: tHardcodedUi.raw('featuresFilesComponentsFileContentRenderer.line201JsxTextThisFileDoesNotExistOrMayHave') })] }));
46
46
  }
47
- export function FileContentRenderer({ filePath, showHeader = true, headerActions, onUnsavedChange, onSaved, className, errorFallback, targetLine, readOnly = false, markdownPreview, onMarkdownPreviewChange, onStatusChange, imageControls, fitOnOpen = false, codeEditorEditorClassName, reloadKey = 0, }) {
47
+ export function FileContentRenderer({ filePath, showHeader = true, headerActions, onUnsavedChange, onSaved, className, errorFallback, targetLine, readOnly = false, markdownPreview, onMarkdownPreviewChange, onStatusChange, imageControls, fitOnOpen = false, findText, codeEditorEditorClassName, reloadKey = 0, }) {
48
48
  const { source, Breadcrumbs, fileContent, isLoading, error, contentRevision, fetchRevision, hasUnsavedChanges, setHasUnsavedChanges, isSaving, saveFlash, latestContentRef, discardKey, fileName, isHeicImage, language, fileCategory, isMarkdownFile, isMermaidFile, hasPreviewToggle, isJsonFile, isHtmlFile, isMarkdownPreview, setIsMarkdownPreview, isJsonTreeView, setIsJsonTreeView, isHtmlPreview, setIsHtmlPreview, fileDiagErrorCount, fileDiagWarningCount, fileDiagnostics, tHardcodedUi, tI18nHardcoded, blobUrl, rawBlob, blobLoading, blobError, heicImageUrl, heicConverting, displayContent, handleDownload, handleSave, handleDiscard, handleEditorChange, imageDataUrl, needsBlob, isContentReady, contentError, showLoadingState, isSandboxWaking, isNotFound, } = useFileContentState({
49
49
  filePath,
50
50
  onUnsavedChange,
@@ -89,7 +89,7 @@ export function FileContentRenderer({ filePath, showHeader = true, headerActions
89
89
  return (_jsxs("div", { className: cn('flex h-full flex-col', className), children: [_jsx(FileHeader, { showHeader, Breadcrumbs, filePath, readOnly, hasUnsavedChanges, saveFlash, fileDiagErrorCount, fileDiagWarningCount, fileContent, isSaving, handleSave, latestContentRef, discardLabel, handleDiscard, isHtmlFile, isHtmlPreview, setIsHtmlPreview, isJsonFile, isJsonTreeView, setIsJsonTreeView, hasPreviewToggle, isMarkdownPreview, setIsMarkdownPreview, headerActions, handleDownload, blobUrl, rawBlob, tI18nHardcoded, tHardcodedUi }), _jsx("div", { className: cn('flex-1', readOnly ? 'overflow-auto' : 'overflow-hidden'), children: _jsxs(ErrorBoundary, { fallback: () => (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-3 p-8 text-center", children: [_jsx("div", { className: "bg-destructive/10 flex h-12 w-12 items-center justify-center rounded-sm", children: _jsx(FileWarning, { className: "text-destructive/50 h-6 w-6" }) }), _jsx("p", { className: "text-muted-foreground text-sm font-medium", children: tI18nHardcoded.raw('autoFeaturesFileViewerFileContentRendererJsxTextCouldnT794ae800') }), _jsx("p", { className: "text-muted-foreground/50 max-w-sm font-mono text-xs break-all", children: filePath }), _jsxs(Button, { variant: "outline", size: "sm", onClick: handleDownload, children: [_jsx(Download, { className: "mr-1.5 h-3.5 w-3.5" }), tI18nHardcoded.raw('i18nComplete.textd6eafe823591')] })] })), children: [showLoadingState && (_jsx("div", { className: "flex h-full items-center justify-center", children: _jsx(Loading, { className: "text-muted-foreground/40 h-4 w-4" }) })), contentError && !showLoadingState && isSandboxWaking && (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-3 p-8 text-center", children: [_jsx(Loading, { className: "text-muted-foreground/40 h-4 w-4" }), _jsx("p", { className: "text-muted-foreground text-sm font-medium", children: tI18nHardcoded.raw('i18nComplete.text5e3de76869f3') }), _jsx("p", { className: "text-muted-foreground/50 max-w-sm font-mono text-xs break-all", children: filePath }), _jsx("p", { className: "text-muted-foreground/40 max-w-xs text-xs", children: tI18nHardcoded.raw('i18nComplete.textd4707c58c4a4') })] })), contentError &&
90
90
  !showLoadingState &&
91
91
  !isSandboxWaking &&
92
- (errorFallback ? (errorFallback(contentError, filePath)) : isNotFound ? (_jsx(FileNotFoundState, { filePath: filePath })) : (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-3 p-8 text-center", children: [_jsx("div", { className: "bg-destructive/10 flex h-12 w-12 items-center justify-center rounded-sm", children: _jsx(FileWarning, { className: "text-destructive/50 h-6 w-6" }) }), _jsx("p", { className: "text-muted-foreground text-sm font-medium", children: tHardcodedUi.raw('featuresFilesComponentsFileContentRenderer.line692JsxTextFailedToLoadFile') }), _jsx("p", { className: "text-muted-foreground/50 max-w-sm font-mono text-xs break-all", children: filePath }), _jsx("p", { className: "text-muted-foreground/60 max-w-sm text-xs", children: contentError })] }))), !isLoading && !error && imageDataUrl && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(ImageRenderer, { url: imageDataUrl, className: "h-full", fileName: fileName, controls: imageControls }) })), isHeicImage && (blobLoading || heicConverting) && _jsx(RendererFallback, {}), isHeicImage && !blobLoading && !blobError && heicImageUrl && !heicConverting && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(ImageRenderer, { url: heicImageUrl, className: "h-full", fileName: fileName, controls: imageControls }) })), isContentReady && fileCategory === 'pdf' && fileContent?.content && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(PdfRenderer, { fileContent: fileContent.content, fileName: fileName, className: "h-full", fitOnOpen: fitOnOpen, showDownload: false }) })), isContentReady && fileCategory === 'docx' && rawBlob && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(DocxRenderer, { blob: rawBlob, fileName: fileName, className: "h-full", showDownload: false }) })), isContentReady && fileCategory === 'zip' && rawBlob && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(ZipRenderer, { blob: rawBlob, fileName: fileName, className: "h-full" }, filePath) })), !isLoading && !error && !isNotFound && fileCategory === 'xlsx' && (!bytesOnly || blobUrl) && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(XlsxRenderer, {
92
+ (errorFallback ? (errorFallback(contentError, filePath)) : isNotFound ? (_jsx(FileNotFoundState, { filePath: filePath })) : (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-3 p-8 text-center", children: [_jsx("div", { className: "bg-destructive/10 flex h-12 w-12 items-center justify-center rounded-sm", children: _jsx(FileWarning, { className: "text-destructive/50 h-6 w-6" }) }), _jsx("p", { className: "text-muted-foreground text-sm font-medium", children: tHardcodedUi.raw('featuresFilesComponentsFileContentRenderer.line692JsxTextFailedToLoadFile') }), _jsx("p", { className: "text-muted-foreground/50 max-w-sm font-mono text-xs break-all", children: filePath }), _jsx("p", { className: "text-muted-foreground/60 max-w-sm text-xs", children: contentError })] }))), !isLoading && !error && imageDataUrl && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(ImageRenderer, { url: imageDataUrl, className: "h-full", fileName: fileName, controls: imageControls }) })), isHeicImage && (blobLoading || heicConverting) && _jsx(RendererFallback, {}), isHeicImage && !blobLoading && !blobError && heicImageUrl && !heicConverting && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(ImageRenderer, { url: heicImageUrl, className: "h-full", fileName: fileName, controls: imageControls }) })), isContentReady && fileCategory === 'pdf' && fileContent?.content && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(PdfRenderer, { fileContent: fileContent.content, fileName: fileName, className: "h-full", fitOnOpen: fitOnOpen, findText: findText, showDownload: false }) })), isContentReady && fileCategory === 'docx' && rawBlob && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(DocxRenderer, { blob: rawBlob, fileName: fileName, className: "h-full", showDownload: false }) })), isContentReady && fileCategory === 'zip' && rawBlob && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(ZipRenderer, { blob: rawBlob, fileName: fileName, className: "h-full" }, filePath) })), !isLoading && !error && !isNotFound && fileCategory === 'xlsx' && (!bytesOnly || blobUrl) && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(XlsxRenderer, {
93
93
  // A bytes-only source hands the workbook over as a blob URL;
94
94
  // the renderer reads a sandbox path only for a session.
95
95
  filePath: bytesOnly ? blobUrl : filePath, fileName: fileName, className: "h-full", showDownload: false }, `xlsx-${filePath}-${contentRevision}-${reloadKey}`) })), !isLoading && !error && !isNotFound && fileCategory === 'sqlite' && (!bytesOnly || rawBlob) && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(SqliteRenderer, { filePath: filePath, fileName: fileName, className: "h-full", readOnly: readOnly, ...(bytesOnly ? { bytes: rawBlob, onSave: saveThroughSource } : {}) }, `sqlite-${filePath}-${contentRevision}-${reloadKey}`) })), !isLoading && !error && csvAsTable && fileContent && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(CsvRenderer, { content: fileContent.content, fileName: fileName, className: "h-full", showDownload: false }) })), isContentReady && fileCategory === 'video' && blobUrl && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(VideoRenderer, { url: blobUrl, className: "h-full" }) })), isContentReady && fileCategory === 'audio' && blobUrl && (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-5 p-8", children: [_jsx("div", { className: "bg-muted/50 flex h-14 w-14 items-center justify-center rounded-sm", children: _jsxs("svg", { className: "text-muted-foreground/40 h-6 w-6", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("path", { d: "M9 18V5l12-2v13" }), _jsx("circle", { cx: "6", cy: "18", r: "3" }), _jsx("circle", { cx: "18", cy: "16", r: "3" })] }) }), _jsx("p", { className: "text-muted-foreground/60 text-sm", children: fileName }), _jsx("audio", { controls: true, src: blobUrl, className: "w-full max-w-sm" })] })), isContentReady && fileCategory === 'pptx' && rawBlob && (_jsx(Suspense, { fallback: _jsx(RendererFallback, {}), children: _jsx(PptxRenderer, { blob: rawBlob, binaryUrl: blobUrl, filePath: filePath, fileName: fileName, className: "h-full", onDownload: handleDownload }) })), isHtmlFile && isHtmlPreview && (_jsx(HtmlPreview, { path: toSandboxAbsolutePath(filePath), reloadKey: `${fetchRevision}-${reloadKey}`, fileName: fileName, pendingLabel: tHardcodedUi.raw('featuresFilesComponentsFileContentRenderer.line805JsxTextStartingPreviewServer') }, `html-preview-${filePath}`)), isHtmlFile && !isHtmlPreview && !isLoading && !error && fileContent?.type === 'text' && (_jsx(CodeEditor, { editorClassName: codeEditorEditorClassName, ...codeEditorProps, className: readOnly ? 'min-h-full' : 'h-full' }, `html-source-${filePath}-${discardKey}`)), !isLoading &&
package/dist/i18n/en.d.ts CHANGED
@@ -423,12 +423,6 @@ declare const catalog: {
423
423
  kortixDefault: string;
424
424
  definedIn: string;
425
425
  };
426
- routing: {
427
- title: string;
428
- automatic: string;
429
- pinned: string;
430
- pinnedWithProvider: string;
431
- };
432
426
  toasts: {
433
427
  rebuildStarted: string;
434
428
  buildFailed: string;
@@ -447,8 +441,6 @@ declare const catalog: {
447
441
  failed: string;
448
442
  notReady: string;
449
443
  unavailable: string;
450
- selected: string;
451
- selectedAria: string;
452
444
  };
453
445
  defaultBadge: string;
454
446
  runtime: string;
@@ -459,14 +451,6 @@ declare const catalog: {
459
451
  confirm: string;
460
452
  };
461
453
  provider: {
462
- label: string;
463
- experimental: string;
464
- description: string;
465
- preparing: string;
466
- fallback: string;
467
- switched: string;
468
- switchFailed: string;
469
- updateFailed: string;
470
454
  legacy: string;
471
455
  legacyNote: string;
472
456
  };
@@ -679,6 +663,7 @@ declare const catalog: {
679
663
  };
680
664
  credits: {
681
665
  loadFailed: string;
666
+ resetAt: string;
682
667
  availableBalance: string;
683
668
  creditCount: string;
684
669
  owed: string;
@@ -927,6 +912,10 @@ declare const catalog: {
927
912
  showMore: string;
928
913
  brief: {
929
914
  status: string;
915
+ subAgent: string;
916
+ spawned: string;
917
+ subAgentCount: string;
918
+ spawnedCount: string;
930
919
  created: string;
931
920
  source: string;
932
921
  changeRequests: string;
@@ -941,6 +930,7 @@ declare const catalog: {
941
930
  };
942
931
  status: {
943
932
  needsYou: string;
933
+ needsInput: string;
944
934
  starting: string;
945
935
  running: string;
946
936
  done: string;
@@ -2442,7 +2432,6 @@ declare const catalog: {
2442
2432
  text1bbab8923e0a: string;
2443
2433
  text1bc7a47dada1: string;
2444
2434
  text1bfa15228ca8: string;
2445
- text1c145081eddd: string;
2446
2435
  text1c57f31d6315: string;
2447
2436
  text1c6225ec7092: string;
2448
2437
  text1c791e8c04de: string;
@@ -2519,7 +2508,6 @@ declare const catalog: {
2519
2508
  text221ff19c904c: string;
2520
2509
  text22206bc67806: string;
2521
2510
  text222b8d57e366: string;
2522
- text22412aa281cb: string;
2523
2511
  text226f2b1f08a3: string;
2524
2512
  text2283269ca150: string;
2525
2513
  text22965568d22a: string;
@@ -2715,7 +2703,6 @@ declare const catalog: {
2715
2703
  text32ae9b80f832: string;
2716
2704
  text32c6817c8380: string;
2717
2705
  text32d61a2331fe: string;
2718
- text32f14aa9ea33: string;
2719
2706
  text330010f40240: string;
2720
2707
  text331551b0de41: string;
2721
2708
  text3329a9bb48b9: string;
@@ -2807,7 +2794,6 @@ declare const catalog: {
2807
2794
  text3af0e55ccc96: string;
2808
2795
  text3af4d559fa0a: string;
2809
2796
  text3b13192b9d88: string;
2810
- text3b3c31642567: string;
2811
2797
  text3b4153c0d3c8: string;
2812
2798
  text3b41ba9c7cb8: string;
2813
2799
  text3b61c181f516: string;
@@ -3840,7 +3826,6 @@ declare const catalog: {
3840
3826
  text910ab2c6e011: string;
3841
3827
  text911a1cde90bc: string;
3842
3828
  text91273d498d36: string;
3843
- text914be6d9bb89: string;
3844
3829
  text914d43beac26: string;
3845
3830
  text91721aa63069: string;
3846
3831
  text9173e2705c5b: string;
@@ -4649,7 +4634,6 @@ declare const catalog: {
4649
4634
  textd432610668ee: string;
4650
4635
  textd440cfc72edc: string;
4651
4636
  textd45336ed23b4: string;
4652
- textd461a493a375: string;
4653
4637
  textd4673300c1d2: string;
4654
4638
  textd46dc6f5e3e3: string;
4655
4639
  textd4707c58c4a4: string;
@@ -4963,7 +4947,6 @@ declare const catalog: {
4963
4947
  texte99baf469ca8: string;
4964
4948
  texte9b7cf835375: string;
4965
4949
  texte9bef0b0f3c2: string;
4966
- texte9ca8360a34d: string;
4967
4950
  texte9d6212ef873: string;
4968
4951
  texte9ec6c0ad396: string;
4969
4952
  textea13cd34d9e0: string;
@@ -5586,6 +5569,10 @@ declare const catalog: {
5586
5569
  textdfea5351a743: string;
5587
5570
  text2f95b1c9ee2b: string;
5588
5571
  text7971dd752669: string;
5572
+ text57f57edb6f16: string;
5573
+ texta8597db6f24b: string;
5574
+ text5f6ba69d66d1: string;
5575
+ textcb8d6b0c94c9: string;
5589
5576
  };
5590
5577
  publicShareConfirm: {
5591
5578
  title: string;
@@ -5855,14 +5842,7 @@ declare const catalog: {
5855
5842
  };
5856
5843
  modelsList: {
5857
5844
  onCount: string;
5858
- perMillion: string;
5859
- estimate: string;
5860
- route: string;
5861
- input: string;
5862
- cached: string;
5863
- output: string;
5864
5845
  context: string;
5865
- fromPrice: string;
5866
5846
  price: string;
5867
5847
  hiddenLine: string;
5868
5848
  blockedLine: string;
@@ -5943,15 +5923,10 @@ declare const catalog: {
5943
5923
  managedTitle: string;
5944
5924
  managedDescription: string;
5945
5925
  managedUpgradeHint: string;
5946
- pricingEstimate: string;
5947
- pricingRoute: string;
5948
- pricingPreferred: string;
5949
5926
  textImage: string;
5950
5927
  textOnly: string;
5951
5928
  zdrTitle: string;
5952
5929
  zdrDescription: string;
5953
- usProvidersTitle: string;
5954
- usProvidersDescription: string;
5955
5930
  hiddenHint: string;
5956
5931
  hidden: string;
5957
5932
  disableModel: string;
@@ -6284,6 +6259,22 @@ declare const catalog: {
6284
6259
  chipLabel: string;
6285
6260
  chipTitle: string;
6286
6261
  manage: string;
6262
+ openInReminders: string;
6263
+ nextRun: string;
6264
+ repeats: string;
6265
+ timeZone: string;
6266
+ lastRun: string;
6267
+ lastRunFailed: string;
6268
+ neverRun: string;
6269
+ searchPlaceholder: string;
6270
+ statusAll: string;
6271
+ timeFilterLabel: string;
6272
+ timeAny: string;
6273
+ timeHour: string;
6274
+ timeDay: string;
6275
+ timeWeek: string;
6276
+ timeLater: string;
6277
+ noMatch: string;
6287
6278
  cardLabel: string;
6288
6279
  cardOneTime: string;
6289
6280
  cardRecurring: string;
package/dist/i18n/en.js CHANGED
@@ -424,12 +424,6 @@ const catalog = {
424
424
  "kortixDefault": "Kortix default",
425
425
  "definedIn": "Defined in"
426
426
  },
427
- "routing": {
428
- "title": "Routing",
429
- "automatic": "Automatic",
430
- "pinned": "Pinned",
431
- "pinnedWithProvider": "Pinned · {provider}"
432
- },
433
427
  "toasts": {
434
428
  "rebuildStarted": "Rebuild started for “{name}”",
435
429
  "buildFailed": "Failed to start build",
@@ -447,9 +441,7 @@ const catalog = {
447
441
  "building": "Building",
448
442
  "failed": "Failed",
449
443
  "notReady": "Not ready",
450
- "unavailable": "Unavailable",
451
- "selected": "Selected",
452
- "selectedAria": "selected"
444
+ "unavailable": "Unavailable"
453
445
  },
454
446
  "defaultBadge": "Default",
455
447
  "runtime": "Session runtime",
@@ -460,14 +452,6 @@ const catalog = {
460
452
  "confirm": "Delete"
461
453
  },
462
454
  "provider": {
463
- "label": "Sandbox provider",
464
- "experimental": "Experimental",
465
- "description": "Pin this project to a specific sandbox provider, overriding the platform default. New sessions here run on the chosen provider — “Automatic” follows the platform default.",
466
- "preparing": "Preparing {provider}… this can take a few minutes",
467
- "fallback": "the sandbox provider",
468
- "switched": "Switched to {provider}",
469
- "switchFailed": "Sandbox provider switch failed",
470
- "updateFailed": "Failed to update sandbox provider",
471
455
  "legacy": "Legacy",
472
456
  "legacyNote": "Daytona is a legacy fallback provider. Its removal is scheduled. Existing Daytona sessions keep working for now, but Daytona gets no new features and no support guarantee. Use Platinum."
473
457
  },
@@ -680,6 +664,7 @@ const catalog = {
680
664
  },
681
665
  "credits": {
682
666
  "loadFailed": "Could not load this account.",
667
+ "resetAt": "Plan credits reset on",
683
668
  "availableBalance": "Available balance",
684
669
  "creditCount": "{count, plural, one {{formatted} credit} other {{formatted} credits}}",
685
670
  "owed": "owed",
@@ -928,6 +913,10 @@ const catalog = {
928
913
  "showMore": "Show more",
929
914
  "brief": {
930
915
  "status": "Status",
916
+ "subAgent": "Sub-agent",
917
+ "spawned": "Spawned session",
918
+ "subAgentCount": "{count, plural, one {# sub-agent} other {# sub-agents}}",
919
+ "spawnedCount": "{count, plural, one {# spawned session} other {# spawned sessions}}",
931
920
  "created": "Created",
932
921
  "source": "Source",
933
922
  "changeRequests": "Change requests",
@@ -941,11 +930,12 @@ const catalog = {
941
930
  }
942
931
  },
943
932
  "status": {
944
- "needsYou": "Needs you",
945
- "starting": "Starting",
946
- "running": "Running",
947
- "done": "Done",
948
- "stopped": "Stopped",
933
+ "needsYou": "Needs review",
934
+ "needsInput": "Needs input",
935
+ "starting": "Waking",
936
+ "running": "Working",
937
+ "done": "Ready",
938
+ "stopped": "Asleep",
949
939
  "failed": "Failed",
950
940
  "legacy": "Legacy"
951
941
  }
@@ -2443,7 +2433,6 @@ const catalog = {
2443
2433
  "text1bbab8923e0a": "/path/to/folder",
2444
2434
  "text1bc7a47dada1": "Dockerfile.ml",
2445
2435
  "text1bfa15228ca8": "Slack connected",
2446
- "text1c145081eddd": "Switched to {provider}",
2447
2436
  "text1c57f31d6315": "Hidden credential",
2448
2437
  "text1c6225ec7092": "Budget",
2449
2438
  "text1c791e8c04de": "Audit logs are an Enterprise feature",
@@ -2520,7 +2509,6 @@ const catalog = {
2520
2509
  "text221ff19c904c": "Schedules",
2521
2510
  "text22206bc67806": "Exit selection",
2522
2511
  "text222b8d57e366": "Failed to save overrides",
2523
- "text22412aa281cb": "the sandbox provider",
2524
2512
  "text226f2b1f08a3": "An open runtime today, pluggable by design. The sandbox is yours to read and replace.",
2525
2513
  "text2283269ca150": "Channel connection",
2526
2514
  "text22965568d22a": "Connected",
@@ -2716,7 +2704,6 @@ const catalog = {
2716
2704
  "text32ae9b80f832": "No skills yet",
2717
2705
  "text32c6817c8380": "Review the exact parameters. Your decision applies to this call only.",
2718
2706
  "text32d61a2331fe": "Product deck",
2719
- "text32f14aa9ea33": "Preparing {provider}… this can take a few minutes",
2720
2707
  "text330010f40240": "Not ready",
2721
2708
  "text331551b0de41": "Pending",
2722
2709
  "text3329a9bb48b9": "Applying…",
@@ -2808,7 +2795,6 @@ const catalog = {
2808
2795
  "text3af0e55ccc96": "OpenCode",
2809
2796
  "text3af4d559fa0a": "Loading schema…",
2810
2797
  "text3b13192b9d88": "Discard your changes?",
2811
- "text3b3c31642567": "Pinned provider",
2812
2798
  "text3b4153c0d3c8": "Pick a date and time",
2813
2799
  "text3b41ba9c7cb8": "No data",
2814
2800
  "text3b61c181f516": "Add a separate AgentMail inbox connection for support, sales, founders, or any mailbox the agent should run.",
@@ -3841,7 +3827,6 @@ const catalog = {
3841
3827
  "text910ab2c6e011": "Per provider",
3842
3828
  "text911a1cde90bc": "OAuth 2.0 device connection failed",
3843
3829
  "text91273d498d36": "These",
3844
- "text914be6d9bb89": "Failed to update sandbox provider",
3845
3830
  "text914d43beac26": "Remove access?",
3846
3831
  "text91721aa63069": "Service errors",
3847
3832
  "text9173e2705c5b": "You need the manage-keys permission to view gateway keys.",
@@ -4650,7 +4635,6 @@ const catalog = {
4650
4635
  "textd432610668ee": "The identifier selects this credential. Access decides whether agent code can read the value, and who else may spend it.",
4651
4636
  "textd440cfc72edc": "branding logo icon favicon product name app name white label whitelabel theme identity",
4652
4637
  "textd45336ed23b4": "We couldn't reach the runtime to ask whether a turn is running. Reloading restarts it, and if one is in flight it will be lost.",
4653
- "textd461a493a375": "Automatic",
4654
4638
  "textd4673300c1d2": "Notifications are working correctly!",
4655
4639
  "textd46dc6f5e3e3": "Copied \"{value0}\" to clipboard",
4656
4640
  "textd4707c58c4a4": "The sandbox is starting. This file will load automatically.",
@@ -4964,7 +4948,6 @@ const catalog = {
4964
4948
  "texte99baf469ca8": "to this project. You connect an account right after.",
4965
4949
  "texte9b7cf835375": "In your words",
4966
4950
  "texte9bef0b0f3c2": "Keyboard shortcuts",
4967
- "texte9ca8360a34d": "Sandbox provider switch failed",
4968
4951
  "texte9d6212ef873": "Setting up...",
4969
4952
  "texte9ec6c0ad396": "Managed by Kortix",
4970
4953
  "textea13cd34d9e0": "billed as Kortix credits",
@@ -5586,7 +5569,11 @@ const catalog = {
5586
5569
  "text815464994ec4": "Telegram connected",
5587
5570
  "textdfea5351a743": "Telegram disconnected",
5588
5571
  "text2f95b1c9ee2b": "Allowed users saved",
5589
- "text7971dd752669": "Reminders"
5572
+ "text7971dd752669": "Reminders",
5573
+ "text57f57edb6f16": "Change request #{number} is ready to review.",
5574
+ "texta8597db6f24b": "Remove skill",
5575
+ "text5f6ba69d66d1": "Skill removed",
5576
+ "textcb8d6b0c94c9": " and every file in it, edits included, and removes the skill from every agent that lists it. One commit on the default branch."
5590
5577
  },
5591
5578
  "publicShareConfirm": {
5592
5579
  "title": "Create a public link?",
@@ -5788,7 +5775,7 @@ const catalog = {
5788
5775
  "metaKey": "API key",
5789
5776
  "metaSignIn": "Sign in",
5790
5777
  "metaSignInOrKey": "Sign in or API key",
5791
- "metaIncluded": "Paid from credits",
5778
+ "metaIncluded": "Paid from credits · Platinum Inference",
5792
5779
  "apiKey": "API key",
5793
5780
  "savedKey": "Saved key",
5794
5781
  "replace": "Replace",
@@ -5856,14 +5843,7 @@ const catalog = {
5856
5843
  },
5857
5844
  "modelsList": {
5858
5845
  "onCount": "{on} of {total} on",
5859
- "perMillion": "{model} · per 1M",
5860
- "estimate": "estimate",
5861
- "route": "Route",
5862
- "input": "In",
5863
- "cached": "Cached",
5864
- "output": "Out",
5865
5846
  "context": "{value} context",
5866
- "fromPrice": "from {input} / {output} per 1M",
5867
5847
  "price": "{input} / {output} per 1M",
5868
5848
  "hiddenLine": "Not in the model picker · direct requests still work",
5869
5849
  "blockedLine": "Requests to this model are blocked",
@@ -5942,17 +5922,12 @@ const catalog = {
5942
5922
  "credentialsHint": "Disable inference without removing credentials.",
5943
5923
  "providerError": "Could not update provider access.",
5944
5924
  "managedTitle": "Kortix Managed Models",
5945
- "managedDescription": "Provider base price plus a {fee}% platform fee, paid from credits. No API key needed.",
5925
+ "managedDescription": "Models from Platinum Inference, at its price plus a {fee}% platform fee, paid from credits. No API key needed.",
5946
5926
  "managedUpgradeHint": "Upgrade to use Kortix's managed models, or connect your own provider.",
5947
- "pricingEstimate": "Provider base price, before the platform fee. The serving route determines the charge.",
5948
- "pricingRoute": "{route}: {input} input / {cacheRead} cached / {output} output per 1M tokens",
5949
- "pricingPreferred": "Preferred",
5950
5927
  "textImage": "Text + image",
5951
5928
  "textOnly": "Text only",
5952
5929
  "zdrTitle": "Zero data retention",
5953
5930
  "zdrDescription": "Zero data retention (ZDR) means the model provider processes your text and images, then does not keep the input or reply after the request. Kortix stores your project and conversation history separately.",
5954
- "usProvidersTitle": "Hosted in the US",
5955
- "usProvidersDescription": "Kortix models run in US data centers. We only partner with American inference providers.",
5956
5931
  "hiddenHint": "Hidden from the picker. Direct requests are still allowed; use the model menu to disable them.",
5957
5932
  "hidden": "Hidden from picker",
5958
5933
  "disableModel": "Disable model",
@@ -6285,6 +6260,22 @@ const catalog = {
6285
6260
  "chipLabel": "{count, plural, one {# active reminder} other {# active reminders}}",
6286
6261
  "chipTitle": "Reminders on this session",
6287
6262
  "manage": "Manage reminders",
6263
+ "openInReminders": "Open in Reminders",
6264
+ "nextRun": "Next run {time}",
6265
+ "repeats": "Repeats",
6266
+ "timeZone": "Time zone",
6267
+ "lastRun": "Last run",
6268
+ "lastRunFailed": "Last run failed",
6269
+ "neverRun": "Not run yet",
6270
+ "searchPlaceholder": "Search reminders",
6271
+ "statusAll": "All",
6272
+ "timeFilterLabel": "Next run",
6273
+ "timeAny": "Any time",
6274
+ "timeHour": "Next hour",
6275
+ "timeDay": "Next 24 hours",
6276
+ "timeWeek": "Next 7 days",
6277
+ "timeLater": "Later",
6278
+ "noMatch": "No reminders match",
6288
6279
  "cardLabel": "Reminder",
6289
6280
  "cardOneTime": "One-time",
6290
6281
  "cardRecurring": "Recurring",
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { cn } from './lib/utils.js';
2
- export { UiProvider, defaultUiHostConfig, defaultUiNavigation, defaultUiStrings, useUiBrand, useUiHostConfig, useUiImage, useUiLink, useUiParams, useUiPathname, useUiRouter, useUiShallowNavigate, useUiSearchParams, useUiStrings, useUiViewerId, type UiBrand, type UiHostConfig, type UiImageComponent, type UiImageProps, type UiLinkComponent, type UiLinkProps, type UiNavigation, type UiRouteParams, type UiRouter, type UiSearchParams, type UiShallowNavigate, type UiStrings, type UiStringsInput, type UseUiBrand, } from './providers/ui-provider.js';
2
+ export { UiProvider, defaultUiHostConfig, defaultUiNavigation, defaultUiStrings, useUiBrand, useUiHostConfig, useUiImage, useUiLink, useUiParams, useUiPathname, useUiRouter, useUiShallowNavigate, useUiSearchParams, useUiStrings, useUiViewerId, type UiBrand, type UiHostConfig, type UiImageComponent, type UiImageProps, type UiLinkComponent, type UiLinkProps, type UiNavigation, type UiRouteParams, type UiRouter, type UiSearchParams, type UiShallowNavigate, type UiSlashAction, type UiStrings, type UiStringsInput, type UseUiBrand, } from './providers/ui-provider.js';
3
3
  export { SessionIdsProvider, useSessionIds, type UiSessionIds } from './providers/session-ids.js';
4
4
  export { useIsDark } from './hooks/use-is-dark.js';
5
5
  export { Button, buttonVariants, type ButtonProps, } from './primitives/button.js';