Skip to content

Instantly share code, notes, and snippets.

@TosinAF
Created March 3, 2026 00:52
Show Gist options
  • Select an option

  • Save TosinAF/29f0f11f4c5b249ea68db63eb499f8a6 to your computer and use it in GitHub Desktop.

Select an option

Save TosinAF/29f0f11f4c5b249ea68db63eb499f8a6 to your computer and use it in GitHub Desktop.
Lingui unlocalized strings audit report — 1,657 warnings across 428 files

Lingui Unlocalized Strings Audit Report

Generated: 2026-03-03

Total warnings: 1657 across 428 files


Table of Contents


src/components/assistant (424 warnings)

src/components/assistant/utils/domain-specific-knowledge-sources.tsx (81)

Line Source
125 usageDisplayString: 'Argentina Legal',
136 usageDisplayString: 'Australia Extended',
147 usageDisplayString: 'Austria Legal',
158 usageDisplayString: 'Bahrain Legal',
169 usageDisplayString: 'Belgium Legal',
180 usageDisplayString: 'Bolivia Legal',
191 usageDisplayString: 'Brazil Legal',
202 usageDisplayString: 'British Virgin Islands Legal',
213 usageDisplayString: 'Canada Legal',
224 usageDisplayString: 'Cayman Islands Legal',
235 usageDisplayString: 'Chile Legal',
246 usageDisplayString: 'Colombia Legal',
257 usageDisplayString: 'Croatia Legal',
268 usageDisplayString: 'Costa Rica Legal',
279 usageDisplayString: 'Czech Republic Legal',
290 usageDisplayString: 'Denmark Legal',
301 usageDisplayString: 'Dominican Republic Legal',
312 usageDisplayString: 'Ecuador Legal',
323 usageDisplayString: 'Egypt Legal',
334 usageDisplayString: 'England & Wales Legal',
345 usageDisplayString: 'Estonia Legal',
356 usageDisplayString: 'European Union Legal',
367 usageDisplayString: 'Finland Legal',
378 usageDisplayString: 'France Legal',
389 usageDisplayString: 'Georgia Legal',
402 usageDisplayString: 'Germany Extended',
413 usageDisplayString: 'Germany Extended',
424 usageDisplayString: 'International Legal',
435 usageDisplayString: 'Guernsey Legal',
446 usageDisplayString: 'Greece Tax',
457 usageDisplayString: 'Hong Kong Legal',
468 usageDisplayString: 'Hungary Legal',
479 usageDisplayString: 'Iceland Legal',
490 usageDisplayString: 'India Legal',
501 usageDisplayString: 'India Extended',
512 usageDisplayString: 'Ireland Legal',
523 usageDisplayString: 'Israel Legal',
534 usageDisplayString: 'Italy Legal',
545 usageDisplayString: 'Japan Legal',
556 usageDisplayString: 'Jersey Legal',
567 usageDisplayString: 'Kuwait Legal',
578 usageDisplayString: 'Latvia Legal',
589 usageDisplayString: 'Liechtenstein Legal',
600 usageDisplayString: 'Lithuania Legal',
611 usageDisplayString: 'Luxembourg Legal',
622 usageDisplayString: 'Malta Legal',
633 usageDisplayString: 'Mexico Legal',
644 usageDisplayString: 'Netherlands Legal',
655 usageDisplayString: 'New Zealand Legal',
666 usageDisplayString: 'Nigeria Legal',
677 usageDisplayString: 'Northern Ireland Legal',
688 usageDisplayString: 'Norway Legal',
699 usageDisplayString: 'Panama Legal',
710 usageDisplayString: 'Paraguay Legal',
721 usageDisplayString: 'Peru Legal',
732 usageDisplayString: 'Poland Legal',
743 usageDisplayString: 'Portugal Legal',
754 usageDisplayString: 'Puerto Rico Legal',
765 usageDisplayString: 'Romania Legal',
776 usageDisplayString: 'Saudi Arabia Legal',
787 usageDisplayString: 'Scotland Legal',
798 usageDisplayString: 'Singapore Tax',
809 usageDisplayString: 'Slovakia Legal',
820 usageDisplayString: 'Slovenia Legal',
831 usageDisplayString: 'South Africa Legal',
842 usageDisplayString: 'South Korea Legal',
853 usageDisplayString: 'Spain Legal',
864 usageDisplayString: 'Sweden Regulations',
875 usageDisplayString: 'Switzerland Legal',
886 usageDisplayString: 'Taiwan Legal',
897 usageDisplayString: 'Turkey Legal',
908 usageDisplayString: 'Ukraine Legal',
919 usageDisplayString: 'United Arab Emirates Legal',
930 usageDisplayString: 'UK Legal',
941 usageDisplayString: 'United Nations Legal',
952 usageDisplayString: 'United States Legal',
963 usageDisplayString: 'Uruguay Legal',
1028 alt={'${descriptorToString(source.name)} Legal'}
1047 'Assist (${source.usageDisplayString})'
1063 parentLabelMapping[productLabelKey] = 'Assist'
1064 groupLabelMapping[productLabelKey] = 'Assistant'

src/components/assistant/doc-editor/use-office-editor-api.ts (37)

Line Source
100 if (node.closest?.('[role="search"], [role="searchbox"]')) return true
154 'Arial',
155 'Arial Black',
156 'Arial Narrow',
157 'Arial Rounded MT Bold',
158 'Baskerville Old Face',
159 'Bookman Old Style',
160 'Bookshelf Symbol 7',
161 'Brush Script MT',
162 'Calibri',
163 'Calibri Light',
164 'Cambria',
165 'Cambria Math',
166 'Century',
167 'Comic Sans MS',
168 'Consolas',
169 'Cooper Black',
170 'Copperplate Gothic Light',
171 'Courier',
172 'Courier New',
173 'Garamond',
174 'Georgia',
175 'Gill Sans MT',
176 'Gill Sans MT Condensed',
177 'Helvetica',
178 'Lucida Console',
179 'Malgun Gothic',
180 'Meiryo',
181 'Myriad Pro',
182 'SimSun',
183 'Symbol',
184 'Tahoma',
185 'Tahoma Bold',
186 'Times New Roman',
187 'Trebuchet MS',
188 'Verdana',
405 currentFont: 'Calibri',

src/components/assistant/utils/assistant-knowledge-sources.tsx (19)

Line Source
60 export const I_MANAGE_SEARCH_FILTER_ID = 'imanage_search.open_search'
219 name: 'Search from iManage',
220 label: 'Search from iManage',
282 name: 'Cuatrecasas',
283 label: 'Cuatrecasas',
306 name: 'Macfarlanes',
307 label: 'Macfarlanes',
312 name: 'Lefebvre',
313 label: 'Lefebvre',
324 name: 'Rettsdata',
325 label: 'Rettsdata',
330 name: 'Bredin Prat',
331 label: 'Bredin Prat',
342 name: 'Chiomenti',
343 label: 'Chiomenti',
354 name: 'Ask LexisNexis®',
355 label: 'Ask LexisNexis®',
391 name: 'FromCounsel',
392 label: 'FromCounsel',

src/components/assistant/workflows/workflow-export-container.tsx (13)

Line Source
200 headerContent = '## Response\n\n'
202 headerContent = '## Harvey\n\n'
211 headerContent = '## Harvey\n\n'
217 headerContent = '## Input\n\n'
220 headerContent = '## Query\n\n'
224 headerContent = '## Query\n\n'
226 headerContent = '## Input\n\n'
259 return '<li id="ref-${source.id}"><a href="${documentUrl}" target="_blank">${documentName}</a></li>'
270 return '<li id="ref-${source.id}">${firstHundredWords} (${documentName})</li>'
275 const sourcesString = '<h2>References</h2><ol>${sourceHtmls.join(
319 content: '## Files\n\n${documentNames
324 { content: '<br/>', type: 'html' },
340 '<h1>Harvey - ${fileName}</h1>',

src/components/assistant/utils/assistant-export.ts (12)

Line Source
57 const taskPrefix = taskType === TaskType.ASSISTANT_DRAFT ? 'Draft' : 'Assist'
57 const taskPrefix = taskType === TaskType.ASSISTANT_DRAFT ? 'Draft' : 'Assist'
62 content: '## Files\n\n${documents
67 { content: '<br/>', type: 'html' },
85 let queryContent = '## Query\n\n${getMessageQuery(message)}'
94 queryContent = '## Query\n\n- ${anchorQuery}'
96 queryContent += '\n- [${numIntermediateRevisions} Revision${
115 { content: '<br/>', type: WordSectionType.HTML },
117 content: '## Response\n\n${responseWithDiff}',
120 { content: '<br/>', type: WordSectionType.HTML },
206 '${EventKind.VAULT_REVIEW}_${reviewTableName}_${dateTime}.xlsx',
213 filename.replace(/\.[^/.]+$/, '') + '_with_review_table.zip'

src/components/assistant/workflows/blocks/mtd-planning/mtd-planning-input.tsx (11)

Line Source
23 <div className="p-4 text-sm text-red-500">
67 <div className="p-4 text-sm text-neutral-500">
129 <span className="text-xs font-semibold uppercase tracking-wider text-neutral-500">
182 >
190 >
207 placeholder="Research query"
231 placeholder="New counterargument title"
239 >
249 >
258 >
272 >

src/components/assistant/workflows/components/panel-layout/assistant-doc-editor-panel.tsx (11)

Line Source
467 style.textContent = '
986 home: 'Home Tab',
987 insert: 'Insert Tab',
988 layout: 'Layout Tab',
989 review: 'Review Tab',
1004 operationType === 'accept' ? 'Accept All' : 'Reject All'
1004 operationType === 'accept' ? 'Accept All' : 'Reject All'
1096 left: 'Align Left',
1097 center: 'Align Center',
1098 right: 'Align Right',
1099 both: 'Justify',

src/components/assistant/components/assistant-thread.tsx (10)

Line Source
179 { content: '<br/>', type: WordSectionType.HTML },
181 content: '## Disclaimer\n\n${PWC_DISCLAIMER_TEXT}',
188 { content: '<br/>', type: WordSectionType.HTML },
190 content: '<h2>Disclaimer</h2>${CUATRECASAS_HELP}',
202 ? ' All Revisions'
721 enter="transition-transform duration-250"
722 enterFrom="-translate-y-full"
724 leave="transition-transform transition-opacity duration-250"
725 leaveFrom="translate-y-0 opacity-100"
726 leaveTo="-translate-y-full opacity-0"

src/components/assistant/utils/assistant-helpers.ts (10)

Line Source
31 export const GPT_5_MODEL_NAME = 'GPT-5'
383 'Assistant Chat',
384 features.hasWebSearch && 'Web Search',
385 features.hasDocuments && 'Doc Search',
386 features.hasKnowledgeSource && 'Knowledge Source',
387 features.hasVault && 'Vault Search',
388 features.hasCitations && 'Citations',
404 productArea: 'Assistant',
405 subject: 'Issue with Assistant Query',
406 featureUsed: featuresUsed || 'None',

src/components/assistant/workflows/blocks/assistant-workflow-redline-change-selection-input.tsx (10)

Line Source
304 ' ~~<span style="color: red; font-size: 12px;">$1</span>~~ '
308 ' <span style="color: blue; font-size: 12px;">$1</span> '
1049 <li>
1056 <b>(Selected)</b>
1058 '(Not selected)'
1060 - {groupKey} (pg.{' '}
1072 <li>
1079 <b>(Selected)</b>
1081 '(Not selected)'
1083 - {groupKey} (pg.{' '}

src/components/assistant/workflows/components/table-select/table-select-export-button.tsx (10)

Line Source
80 const headerRow = columns.map((col) => '<th>${col.name}</th>')
84 '<tr>${columns
87 return '<td>${modelMarkdownToHtmlRemark(String(row.data[key] ?? ''))}</td>'
92 return '<table><thead><tr>${headerRow.join('')}</tr></thead><tbody>${bodyRows.join('')}</tbody></table>'
134 const fileName = 'Table_${dateTime}'
153 author: 'Harvey',
157 return saveAs(blob, '${fileName}.docx')
173 XLSX.utils.book_append_sheet(wb, ws, 'Table')
179 '${fileName}.xlsx'
185 '${fileName}.csv'

src/components/assistant/utils/strings.ts (8)

Line Source
1 export const ASSISTANT_V2_MODE_HELP = '<h3>Choosing a mode</h3>
10 export const ASSISTANT_V2_OPEN_ENDED_HELP_INTRO = '<p class="ql-align-justify">In Assistant, you can query Harvey with or without uploading
12 export const ASSISTANT_V2_OPEN_ENDED_HELP_REMINDERS = '<h3>Important reminders</h3>
20 export const ASSISTANT_V2_WITHOUT_OPEN_ENDED_HELP_INTRO = '<p class="ql-align-justify">In Assistant, you can query Harvey and generate a res
22 export const ASSISTANT_V2_WITHOUT_OPEN_ENDED_HELP_REMINDERS = '<h3>Important reminders</h3>
28 export const ASSISTANT_KNOWLEDGE_SOURCES_HEADER = '<h3>Knowledge Sources</h3>'
29 export const ASSISTANT_KNOWLEDGE_SOURCES_INTRO = '<p>Knowledge is designed to facilitate research across various domains, enabling users to
31 export const ASSISTANT_SAVE_PROMPT_TOOLTIP_HELP = 'Save a prompt to Library'

src/components/assistant/utils/filter-tooltip-formatter.ts (7)

Line Source
17 if (normalizedKey === 'publicationstatus') return 'All Primary Law'
18 if (normalizedKey === 'jurisdiction') return 'All'
19 if (normalizedKey === 'legalclassification') return 'Civil; Criminal'
20 return 'N/A'
25 if (value.length === 0) return key ? getDefaultValue(key) : 'N/A'
32 if (values.length === 0) return key ? getDefaultValue(key) : 'N/A'
35 return String(value || (key ? getDefaultValue(key) : 'N/A'))

src/components/assistant/utils/tax-knowledge-sources.tsx (7)

Line Source
103 countryId: 'worldwide_tax_summaries',
108 countryId: 'pillar_two',
123 countryId: 'saudi_arabia',
133 countryId: 'hong_kong',
264 return '${getDisplayName(source)} Tax AI Assistant'
268 return source.flagImage || '${source.countryId}.png'
335 '${getDisplayName(source)} tax legislation, case law, and guidance',

src/components/assistant/doc-editor/utils/inject-harvey-styles.ts (6)

Line Source
15 cut: 'url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='curre
17 copy: 'url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='curr
19 paste: 'url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='cur
21 pasteText: 'url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke=
23 delete: 'url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='cu
263 const shadowStyleId = '${CONTEXT_MENU_STYLE_ID}-shadow'

src/components/assistant/utils/assistant-nudge-routes.tsx (6)

Line Source
57 filterIds: ['web_browsing.open_search'],
103 name: 'Document',
121 name: 'Draft',
123 tipsText: 'Draft long-form content.',
127 name: 'Tool Nudge',
129 tipsText: 'Use a tool to answer the question.',

src/components/assistant/workflows/assistant-workflow-export-event.tsx (6)

Line Source
93 return '${base}.docx'
98 sanitizeFileName(caption, MAX_SAFE_FILENAME_LENGTH) || 'workflow_event'
99 return '${base}.docx'
103 return '${workflowName ?? 'workflow_event'}_${eventId}.docx'
103 return '${workflowName ?? 'workflow_event'}_${eventId}.docx'
106 return 'workflow_event.docx'

src/components/assistant/workflows/blocks/antitrust-filing-analysis/summary/utils.ts (6)

Line Source
8 return 'No merger control regime'
20 return '${metThresholds} Threshold${metThresholds > 1 ? 's' : ''} met'
24 return 'Thresholds not met'
27 return 'More information required'
146 partyType: 'General',
147 partyName: 'General',

src/components/assistant/workflows/blocks/assistant-workflow-answer-renderer.tsx (6)

Line Source
104 {showFull ? 'Show summary' : 'Show full research brief'}
104 {showFull ? 'Show summary' : 'Show full research brief'}
136 {showBrief ? 'Hide research brief' : 'Show full research brief'}
136 {showBrief ? 'Hide research brief' : 'Show full research brief'}
153 >
299 <div className="mb-3 text-xs font-medium uppercase tracking-wider text-neutral-400">

src/components/assistant/utils/datadog-helpers.ts (5)

Line Source
9 const DATADOG_ACTION_FILE_UPLOAD_STARTED = 'assistant_file_upload_started'
10 const DATADOG_ACTION_FILE_UPLOAD_SUCCESS = 'assistant_file_upload_success'
11 const DATADOG_ACTION_FILE_UPLOAD_FAILURE = 'assistant_file_upload_failure'
13 'assistant_file_processing_success'
15 'assistant_file_processing_failure'

src/components/assistant/workflows/blocks/assistant-workflow-file-upload-input.tsx (5)

Line Source
93 headerText: 'Upload a file',
500 description = '${getFileTypeReadableName()[fileType]} document • ${
504 description = 'Document • ${file.size ? bytesToReadable(file.size) : ''}'
529 text="Skipped"
545 text="Skipped"

src/components/assistant/workflows/components/panel-layout/sources-panel/workflow-source.tsx (5)

Line Source
100 trackCitationEvent('Citation Clicked')
104 trackCitationEvent('Citation Hovered')
266 headerText = removeWWWFromUrl(source.badges?.[0]?.text || '') || 'Web'
270 headerText = 'LexisNexis®'
274 headerText = 'Vault${folder ? ' - ${folder.name}' : ''}'

src/components/assistant/workflows/hooks/use-workflow-data.ts (5)

Line Source
23 'allen_and_overy',
24 'paul_weiss',
28 'financial_services',
82 return b.name.toUpperCase().localeCompare('M') >= 0 ? -1 : 1
89 return a.name.toUpperCase().localeCompare('M') >= 0 ? 1 : -1

src/components/assistant/components/assistant-editor/assistant-editor.tsx (4)

Line Source
57 const PLACEHOLDER_CONTENT = '<h1></h1><p></p>'
158 return 'Title'
160 const importCTA = isNew ? ' or import your first draft' : ''
161 return 'Write something' + importCTA

src/components/assistant/workflows/components/loading-state/workflow-progress-dashboard.tsx (4)

Line Source
251 {hidden} earlier step{hidden !== 1 ? 's' : ''}…
259 >
443 {subDone > 0 ? '${subDone}/${subTotal}' : '${subTotal} in progress'}
544 <span className="text-xs font-semibold uppercase tracking-wider text-neutral-500">

src/components/assistant/workflows/components/panel-layout/sources-panel/get-source-icon.tsx (4)

Line Source
60 <SourceIconContainer dataTestId={'${url.hostname}-favicon'}>
78 dataTestId={'${config.title}-icon'}
101 <SourceIconContainer color={bgColor} dataTestId={'${fileType}-icon'}>
117 dataTestId={'${config.title}-icon'}

src/components/assistant/workflows/components/workflow-step-eyebrow.tsx (4)

Line Source
28 return <Eyebrow icon={IconPencil} text="You made changes" />
32 return <Eyebrow icon={IconImport} text="You imported a draft" />
126 <Eyebrow icon={IconInputForm} text="You selected text">
157 text={'You restored Version ${revisionIdx + 1}'}

src/components/assistant/components/assistant-toolbar.tsx (3)

Line Source
314 trackDeleteEvent('Delete Message Initiated')
319 trackDeleteEvent('Delete Message Confirmed')
325 trackDeleteEvent('Delete Message Cancelled')

src/components/assistant/components/assistant-workflow-examples.tsx (3)

Line Source
48 header: 'PwC',
53 header: 'A&O Shearman',
58 header: 'Paul, Weiss',

src/components/assistant/features/composer/index.tsx (3)

Line Source
337 const eventSource = isReply ? 'assistant_follow_up' : 'assistant_home'
337 const eventSource = isReply ? 'assistant_follow_up' : 'assistant_home'
451 target.closest('[contenteditable="true"]') ||

src/components/assistant/features/composer/knowledge-source-filter-list.tsx (3)

Line Source
42 'button,a,input,[role="checkbox"],[role="menuitem"]'
67 '[data-radix-scroll-area-viewport]'
75 rootMargin: '-${offsetPx + 1}px 0px 0px 0px',

src/components/assistant/utils/doc-editor-api.ts (3)

Line Source
15 const DEFAULT_FILENAME = 'Document.docx'
69 return name.endsWith('.docx') ? name : '${name}.docx'
118 const path = 'assistant/generated-document/${existingDocumentId}'

src/components/assistant/workflows/blocks/antitrust-filing-analysis/summary/country-detail-card.tsx (3)

Line Source
28 return new Intl.NumberFormat('en-US', {
140 <p className="mb-1 text-xs">Local Turnover</p>
155 <p className="mb-1 text-xs">Worldwide Turnover</p>

src/components/assistant/workflows/blocks/antitrust-filing-analysis/summary/exception.tsx (3)

Line Source
18 <p className="mr-4 w-24 text-xs font-semibold">Exception {idx + 1}</p>
29 <DataRow label="Requirement" value={exception.exception} />
30 <DataRow label="Analysis" value={exception.exceptionAnalysis} />

src/components/assistant/workflows/blocks/antitrust-filing-analysis/summary/requirement.tsx (3)

Line Source
24 <p className="mr-4 w-24 text-xs font-semibold">Requirement {idx + 1}</p>
32 <DataRow label="Requirement" value={requirement.requirement} />
33 <DataRow label="Analysis" value={requirement.requirementAnalysis} />

src/components/assistant/workflows/blocks/antitrust-filing-analysis/summary/summary.tsx (3)

Line Source
94 title: 'Antitrust Filing Analysis - RFI',
164 content: '<h1>Requests for Information</h1>',
175 title: 'Antitrust Filing Analysis - Complete Report',

src/components/assistant/workflows/components/mode-tabs/mode-tabs.tsx (3)

Line Source
15 [WorkflowStreamRequestInputMode.ANSWER]: 'Harvey will answer without editing',
17 'Harvey will decide whether to edit or reply',
19 'Harvey will edit the draft based on your query',

src/components/assistant/workflows/components/workflow-header-actions.tsx (3)

Line Source
113 ? 'Cannot change Client Matter until query completes'
115 ? 'Not available for this query type'
157 ? 'Additional actions available once query has been submitted'

src/components/assistant/workflows/workflow-layout.tsx (3)

Line Source
127 const chatWorkflowDefaultTitle = 'Assist'
190 const source = el?.closest('[data-block-type]')
271 breadcrumbs={<RouterBreadcrumbs overridePath="assistant/workflows" />}

src/components/assistant/components/assistant-workflow-draft-reply-input.tsx (2)

Line Source
178 const placeholder = 'Describe how to change the draft'
182 return QUERY_MUST_HAVE_X_LEN_HELP_TEXT('at least ${MIN_QUERY_LENGTH}')

src/components/assistant/features/composer/config.tsx (2)

Line Source
176 icon: <img src="/img/logos/chiomenti.png" alt="Chiomenti" />,
215 title: 'FromCounsel',

src/components/assistant/hooks/use-filtered-review-tables.ts (2)

Line Source
9 export const UPLOADED_FILES_VALUE = 'uploaded_files'
127 const title = (reviewEvent.title || 'Untitled').toLowerCase()

src/components/assistant/pages/assistant-draft-page.tsx (2)

Line Source
207 if (!e.relatedTarget?.closest('#assistant-input')) {
494 leave="transition-opacity duration-100"

src/components/assistant/pages/assistant-review-artifact-page.tsx (2)

Line Source
92 event: 'AssistantReviewArtifactPage.page_opened',
95 route: 'assistant/review',

src/components/assistant/utils/assistant-tracking-utils.ts (2)

Line Source
13 return 'deep analysis'
15 return 'file upload'

src/components/assistant/utils/constants.ts (2)

Line Source
44 i18nKey: 'file_options.metadata.max_file_size_varies',
125 export const CUSTOMIZE_LABEL = 'Customize'

src/components/assistant/workflows/assistant-block-renderer.tsx (2)

Line Source
149 return <div>Error: Invalid block parameters.</div>
161 return <div>Error: Invalid output data.</div>

src/components/assistant/workflows/blocks/assistant-workflow-file-renderer.tsx (2)

Line Source
38 description = '${getFileTypeReadableName()[fileType]} document • ${
42 description = 'Document • ${file.size ? bytesToReadable(file.size) : ''}'

src/components/assistant/workflows/components/panel-layout/sources-panel/workflow-sources-panel.tsx (2)

Line Source
93 if (activeElement?.closest('[role="menu"]')) {
98 if (activeElement?.closest('[role="dialog"]')) {

src/components/assistant/workflows/components/review-tool-input-nudge.tsx (2)

Line Source
94 if (dataType === 'numeric') return 'Number'
95 if (dataType === 'extraction') return 'Verbatim'

src/components/assistant/workflows/components/text-input/text-input.tsx (2)

Line Source
50 srLabel = 'Text input',
57 const textareaId = '${id ?? 'textinput-${reactId}'}__textarea'

src/components/assistant/workflows/hooks/use-assistant-workflow.tsx (2)

Line Source
266 path: 'assistant/workflow',
394 ? { overrideEndpoint: 'assistant/agent' }

src/components/assistant/workflows/workflow-loader.ts (2)

Line Source
54 const route = 'assistant/workflows/${workflowId}${
140 const route = 'assistant/workflows?include_internal_admin_workflows=${includeInternalAdminWorkflows}'

src/components/assistant/assistant-index.tsx (1)

Line Source
37 path=":mode/:eventId?/:messageId?"

src/components/assistant/components/assistant-change-log.tsx (1)

Line Source
150 !relatedTarget?.closest?.('#assistant-change-log-${message.messageId}')

src/components/assistant/components/assistant-create-thread-dropdown.tsx (1)

Line Source
127 <p className="ml-2 hidden sm:block">New thread</p>

src/components/assistant/components/assistant-custom-tips.tsx (1)

Line Source
55 tipsText += '<h4>${translatedName}</h4>

src/components/assistant/components/assistant-draft-reply-input.tsx (1)

Line Source
198 return QUERY_MUST_HAVE_X_LEN_HELP_TEXT('at least ${MIN_QUERY_LENGTH}')

src/components/assistant/components/assistant-example-card-list.tsx (1)

Line Source
56 label="See all"

src/components/assistant/components/assistant-queries.tsx (1)

Line Source
113 const historyUrl = 'history?${historyFilterParams.toString()}'

src/components/assistant/components/assistant-review-table-picker-dialog.tsx (1)

Line Source
74 return reviewEvent.title || 'Untitled'

src/components/assistant/components/assistant-sources.tsx (1)

Line Source
182 title = 'Sources',

src/components/assistant/components/assistant-tips.tsx (1)

Line Source
50 tipsText += '<h4>${translatedName}</h4>

src/components/assistant/doc-editor/harvey-doc-toolbar.tsx (1)

Line Source
152 const modKey = isMac ? '⌘' : 'Ctrl+'

src/components/assistant/doc-editor/track-changes.ts (1)

Line Source
29 author: change.author ?? 'Unknown',

src/components/assistant/drafting-markdown-text-selection.tsx (1)

Line Source
52 const DELETE_QUERY = 'Delete this selected text'

src/components/assistant/features/composer/assistant-composer-utils.ts (1)

Line Source
15 const BLANK_DIRECTIVE = '_blank'

src/components/assistant/features/composer/assistant-research-selector-dialog.tsx (1)

Line Source
332 {knowledgeSourceInfo.isBeta && <Badge variant="beta">Beta</Badge>}

src/components/assistant/features/composer/assistant-vault-ks-picker.tsx (1)

Line Source
376 folderName: 'Untitled',

src/components/assistant/features/composer/components/deep-search-toggle/deep-search-followup-toggle.tsx (1)

Line Source
124 ? 'Deep analysis cannot be disabled while a stream is in progress'

src/components/assistant/features/composer/components/file-sources-selector/assistant-file-sources-selector.tsx (1)

Line Source
575 titlePrefix: 'Add from ',

src/components/assistant/features/composer/library-browse-dialog/library-browse-dialog.tsx (1)

Line Source
27 const WORKFLOW_DETAIL_DIALOG_SIZE = 'w-[900px] max-w-[900px]'

src/components/assistant/features/draft/assistant-draft-header-actions.tsx (1)

Line Source
65 exportValues.revisions === ExportRevision.ALL ? ' All Revisions' : ''

src/components/assistant/features/draft/assistant-draft-sidebar.tsx (1)

Line Source
120 if (!e.relatedTarget?.closest('#assistant-input')) {

src/components/assistant/hooks/use-assistant-draft-stream.ts (1)

Line Source
48 path: 'assistant/workflow_draft',

src/components/assistant/hooks/use-assistant-draft.tsx (1)

Line Source
106 path: 'assistant/draft',

src/components/assistant/hooks/use-create-review-table-for-assistant.ts (1)

Line Source
84 ? '${reviewTablePath}?openAddFiles=true'

src/components/assistant/hooks/use-web-search-acknowledgment.tsx (1)

Line Source
7 const SESSION_STORAGE_KEY_PREFIX = 'webSearchAcknowledgment_session'

src/components/assistant/pages/assistant-home-page.tsx (1)

Line Source
133 const ASSISTANT_HOMEPAGE_SOURCE = 'assistant_homepage'

src/components/assistant/stores/slices/draft-editor-slice.ts (1)

Line Source
5 export const LS_DRAFT_KEY = 'draft:'

src/components/assistant/utils/assistant-api.ts (1)

Line Source
186 ...(token ? { Authorization: 'Bearer ${token}' } : {}),

src/components/assistant/workflows/blocks/antitrust-filing-analysis/summary/country-card.tsx (1)

Line Source
31 value.trim().toLowerCase().replaceAll('likely to be', '').trim()

src/components/assistant/workflows/blocks/assistant-workflow-antitrust-filings-answer-renderer.tsx (1)

Line Source
101 const renderedText = isStreaming ? 'Working…' : headerText

src/components/assistant/workflows/blocks/assistant-workflow-draft-renderer.tsx (1)

Line Source
212 title: 'Redline Diff',

src/components/assistant/workflows/blocks/assistant-workflow-follow-ups-input.tsx (1)

Line Source
1714 {file.size ? bytesToReadable(file.size) : 'N/A'}

src/components/assistant/workflows/blocks/assistant-workflow-multiple-answer-renderer.tsx (1)

Line Source
75 return acc + '<br><br>' + current

src/components/assistant/workflows/blocks/assistant-workflow-nudge-input.tsx (1)

Line Source
141 if (nudgeType.includes('lexis_nexis')) return 'lexis_protege'

src/components/assistant/workflows/blocks/assistant-workflow-select-table-input.tsx (1)

Line Source
89 {'${orderedColumnNames.length} columns · ${rows.length} rows'}

src/components/assistant/workflows/blocks/assistant-workflow-table-renderer.tsx (1)

Line Source
179 const renderedText = isStreaming ? 'Working…' : headerText

src/components/assistant/workflows/components/assistant-workflow-thread.tsx (1)

Line Source
388 answerRef.current.style.minHeight = 'calc(100% + ${minHeightOffset}px)'

src/components/assistant/workflows/components/document-card/document-card.tsx (1)

Line Source
33 downloadLabel = 'Download',

src/components/assistant/workflows/components/follow-ups/follow-ups.tsx (1)

Line Source
79 matchKey: 'Deep Analysis',

src/components/assistant/workflows/components/lexis-nexis-draft-response.tsx (1)

Line Source
17 <span className="text-xs font-medium text-secondary">

src/components/assistant/workflows/components/loading-state/loading-state-helpers.ts (1)

Line Source
126 ? 'Searching for terms'

src/components/assistant/workflows/components/preview-modal/preview-modal.tsx (1)

Line Source
102 return ['Paste text or add up to']

src/components/assistant/workflows/components/render-block-toolbar/block-export-button.tsx (1)

Line Source
96 reviewTableKnowledgeSource?.name ?? historyItem?.title ?? 'review_table'

src/components/assistant/workflows/components/select-input/select-input.tsx (1)

Line Source
49 emptyText = 'No options found.',

src/components/assistant/workflows/components/table-select/table-select.tsx (1)

Line Source
480 return columnHelper.accessor('data.${camelCaseKey}', {

src/components/assistant/workflows/hooks/use-generated-doc-sync.ts (1)

Line Source
59 getGeneratedDocumentFileName(latestBlockParams) ?? 'Document'

src/components/assistant/workflows/utils/doc-version-utils.ts (1)

Line Source
27 export const LEGACY_ROOT_FILE_ID = '__legacy_generated_document_root__'

src/components/assistant/workflows/utils/utils.ts (1)

Line Source
144 let fileName = workflowName ?? 'Workflow'

src/utils (270 warnings)

src/utils/task-definitions.ts (82)

Line Source
45 label: 'Assist',
52 label: 'Assist',
59 label: 'Assist',
66 label: 'Assist',
73 label: 'Help Me',
80 label: 'Assist',
87 label: 'Assist',
94 label: 'Assist',
101 label: 'Assist',
108 label: 'Workflows',
115 label: 'Company Profile',
122 label: 'Assist', // TODO: Properly rename and migrate to a TaskType.UK_TAX, rather than just reusing HMRC_QA
129 label: 'Assist',
136 label: 'Assist',
143 label: 'Assist',
150 label: 'Assist',
157 label: 'Assist',
164 label: 'Assist',
171 label: 'Redline Q&A',
178 label: 'Redline Issues List',
185 label: 'Assist',
192 label: 'Assist',
199 label: 'Translation',
206 label: 'Assist',
213 label: 'Assist',
214 groupLabel: 'Assistant',
221 label: 'Draft',
222 groupLabel: 'Assistant',
229 label: 'OGC Contract Review',
237 label: 'Drafting',
244 label: 'Document Comparison',
251 label: 'Assist',
258 label: 'Assist',
265 label: 'Assist',
272 label: 'Transcripts',
279 label: 'Australia Breach Reporting',
286 label: 'Review Table',
287 groupLabel: userInfo?.IsVaultUser ? 'Vault' : '',
294 label: 'Assist',
301 label: 'Discovery',
308 label: 'Diligence Transcripts',
315 label: 'Competitive Analysis',
322 label: 'Word Add-In',
323 groupLabel: 'Other',
330 label: 'Outlook Add-In',
331 groupLabel: 'Other',
338 label: 'Playbook Creation',
339 groupLabel: 'Other',
346 label: 'Playbook Conversion',
347 groupLabel: 'Other',
354 label: 'Playbook Review',
355 groupLabel: 'Other',
443 [ProductLabel.ASSIST]: 'Assistant',
444 [ProductLabel.DRAFT]: 'Assistant',
445 [ProductLabel.VAULT_ASK]: 'Vault',
448 [ProductLabel.ASSIST__VAULT]: 'Assistant',
449 [ProductLabel.ASSIST__NO_UPLOADED_FILES]: 'Assistant',
450 [ProductLabel.ASSIST__USER_UPLOADED_FILES]: 'Assistant',
451 [ProductLabel.ASSIST__EDGAR]: 'Assistant',
452 [ProductLabel.ASSIST__FRENCH_CASE_LAW]: 'Assistant',
453 [ProductLabel.ASSIST__SWEDEN_CASE_LAW]: 'Assistant',
454 [ProductLabel.ASSIST__US_CASE_LAW]: 'Assistant',
455 [ProductLabel.ASSIST__SINGAPORE_CASE_LAW]: 'Assistant',
456 [ProductLabel.ASSIST__EUR_LEX]: 'Assistant',
457 [ProductLabel.ASSIST__MEMOS]: 'Assistant',
458 [ProductLabel.ASSIST__TAX]: 'Assistant',
459 [ProductLabel.ASSIST__CUATRECASAS]: 'Assistant',
460 [ProductLabel.ASSIST__MACFARLANES]: 'Assistant',
461 [ProductLabel.ASSIST__LEFEBVRE]: 'Assistant',
462 [ProductLabel.ASSIST__WEB_BROWSING]: 'Assistant',
463 [ProductLabel.ASSIST__BREDIN_PRAT]: 'Assistant',
464 [ProductLabel.ASSIST__AUSTRALIA_BREACH_REPORTING]: 'Assistant',
465 [ProductLabel.ASSIST__KNOWLEDGE_BASE]: 'Assistant',
466 [ProductLabel.ASSIST__LEXIS_NEXIS]: 'Assistant',
467 [ProductLabel.DRAFT__NO_UPLOADED_FILES]: 'Assistant',
468 [ProductLabel.DRAFT__USER_UPLOADED_FILES]: 'Assistant',
469 [ProductLabel.DRAFT__VAULT]: 'Assistant',
470 [ProductLabel.DRAFT__KNOWLEDGE_BASE]: 'Assistant',
471 [ProductLabel.VAULT_REVIEW]: 'Vault',
472 [ProductLabel.ASSIST__MULTI_SOURCE]: 'Assistant',
476 const ASSIST_PARENT_PRODUCT_LABEL = 'Assist'
477 const DRAFT_PARENT_PRODUCT_LABEL = 'Draft'

src/utils/date-utils.ts (18)

Line Source
42 import('date-fns/locale').then((locales) => {
199 return 'Today'
203 return 'Past week'
209 return 'Past month'
214 return 'Past quarter'
219 return 'Past half year'
223 return 'Past year'
227 return 'Past 3 years'
231 return 'Past 5 years'
236 return 'This week'
241 return 'This month'
247 return 'This year'
324 readable = 'Today'
382 const tempDate = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' }))
426 if (isToday(timestamp)) return 'Today'
427 if (isYesterday(timestamp)) return 'Yesterday'
532 const inputDate = dateHasTimezone ? new Date(date) : new Date('${date}Z')
557 return '${values.year}-${values.month}-${values.day}T${values.hour}:${values.minute}:${values.second}.${values.fractionalSecond} ${values.ti

src/utils/user-profile-helpers.ts (17)

Line Source
20 [LanguageCode.EN_US]: 'English (American)',
21 [LanguageCode.EN_GB]: 'English (British)',
22 [LanguageCode.EN_AU]: 'English (Australian)',
23 [LanguageCode.EN_CA]: 'English (Canadian)',
24 [LanguageCode.ES_ES]: 'Spanish (European)',
25 [LanguageCode.ES_419]: 'Spanish (Latin American)',
26 [LanguageCode.FR_CA]: 'French (Canadian)',
27 [LanguageCode.DE_CH]: 'German (Swiss)',
28 [LanguageCode.PT_BR]: 'Portuguese (Brazil)',
29 [LanguageCode.PT_PT]: 'Portuguese (Portugal)',
97 'Administrative, Innovation, IT or Other Business Role',
98 [Title.COUNSEL]: 'Of Counsel',
108 [PracticeArea.COMMERCIAL]: 'Commercial Law',
109 [PracticeArea.REAL_ESTATE_AND_REITS]: 'Real Estate and REITs',
110 [PracticeArea.MERGERS_AND_ACQUISITION]: 'Mergers and Acquisitions',
111 [PracticeArea.PRIVACY]: 'Data Privacy/Cybersecurity',
113 'White Collar & Investigations',

src/utils/utils.ts (17)

Line Source
61 : stringDateUpperCase + 'Z' // + 'Z' is to infer string as UTC
119 const suffixes = ['B', 'M', 'K']
119 const suffixes = ['B', 'M', 'K']
119 const suffixes = ['B', 'M', 'K']
178 const PRESERVE_KEYS_MARKER = '__preserveKeys'
241 displayErrorMessage({ message: 'No URL found for file download.' })
244 displayErrorMessage({ message: 'Error downloading file.' })
259 reject('No URL to download')
277 resolve('File downloaded successfully.')
281 reject('Failed to download from the URL: ${error.message}')
291 reject('No text to download')
304 resolve('File "${name}" downloaded successfully.')
307 reject('Failed to download the file: ${error.message}')
389 os = 'Mac'
393 os = 'Android'
395 os = 'Linux'
397 os = 'Windows'

src/utils/docx.ts (16)

Line Source
102 text: '[Could not export image.]',
221 const dataUrl = canvas.toDataURL('image/png')
304 merge({}, textProperties, { font: { name: 'Monospace' } })
341 style: 'Hyperlink',
370 author: 'Harvey AI',
422 author: 'Harvey AI',
495 font: { name: 'Monospace' },
745 '<body>${sourceText}</body>',
861 style: 'Hyperlink',
885 text: ' (${s.documentName}, Page ${(s.page + 1).toString()})',
892 text: '${removeMarkTag(truncatedText)} (${s.documentName}, Page ${(
935 text: 'References',
1204 author = 'Harvey',
1250 text: 'Harvey – ${title}',
1288 author = 'Harvey',
1301 text: 'Harvey – ${injectTitle}',

src/utils/file-failure-messages.ts (14)

Line Source
6 const DEFAULT_ERROR_MESSAGE = 'Something went wrong.'
92 return 'File is locked, please unlock and re-upload'
94 return 'File has no name'
97 return 'File type is incompatible with file content'
100 return 'Unsupported file type'
102 return 'Failed to process due to OCR issue'
105 return 'This file is too large or complex to process. Please split it into two or more smaller files and try uploading again'
107 return 'File path length exceeds system limit. Please shorten folder names or move files closer to the root directory.'
109 return 'Failed to upload due to server error'
111 return 'File is empty'
113 return 'Failed to process file due to embedding limit'
115 return 'Something went wrong. Please try again after a few minutes.'
117 return 'Failed to process due to file corruption'
119 return 'Image has no text'

src/utils/tooltip-texts.ts (14)

Line Source
1 export const EMPTY_QUERY_HELP_TEXT = 'Please enter a query'
3 'Query must have ${x} characters'
5 export const IS_LOADING_HELP_TEXT = 'Harvey is answering your previous query'
7 export const CLIENT_MATTER_QUERY_LOCK_HELP_TEXT = 'Please select a Client Matter before asking Harvey'
10 'Please add a document before asking Harvey'
12 'Please upload ${x} document'
14 export const SELECT_RESEARCH_DATABASE_HELP_TEXT = 'Select a research database'
16 export const COMPANY_PROFILE_EMPTY_HELP_TEXT = 'Please enter a stock ticker'
18 'Please select at least one field'
20 export const ISSUES_LIST_ADD_TOPIC_HELP_TEXT = 'Please add at least one topic'
22 'Harvey will choose the most relevant topics based on changes in the document.'
24 'Remove topics and choose Auto Generate to have Harvey choose the most relevant topics.'
27 'Please select a document type'
29 export const DOCUMENTS_UPLOADING_HELP_TEXT = 'Documents are uploading'

src/utils/use-harvey-socket-utils.ts (14)

Line Source
50 .replaceAll('{fileSize}', '')
51 .replaceAll('{maxFileSize}', '') ||
83 export const UPLOAD_ERROR = 'Sorry, Harvey was unable to upload your document. This may be caused by an unstable internet connection. Please
85 export const TOO_MANY_FILES = 'You can only upload {documentLimit} at a time.'
87 export const FILE_TOO_LARGE = 'The document you uploaded is too large ({fileSize}MB). Harvey currently requires documents to be less than ({
89 export const RATE_LIMIT = 'You have submitted more simultaneous requests than permitted by your organization (3 requests / minute). Please w
91 export const EMPTY_PROMPT_ERROR = 'It looks like you haven’t given Harvey a task to complete, please describe your task in the shaded area a
93 export const OVERFLOW_PROMPT_ERROR = 'It looks like your task request is too long, try limiting your request to fewer than 2000 characters f
95 export const UNCAUGHT_ERROR = 'An unexpected error occurred. This error (but no user data) has been provided to the team at Harvey and we ar
97 export const UNSAFE_ERROR = 'The task you have requested cannot be completed because it contains language that potentially requests an inapp
99 export const NETWORK_ERROR = 'Sorry, Harvey was unable to process this request due to a network issue. This may be caused by an unstable int
101 export const PASSWORD_PROTECTED_FILE_ERROR = 'The file you have uploaded is password protected. Harvey is unable to process password protect
103 export const LLM_ERROR = 'There was an error getting the response from the LLM. Please try again.'
105 export const FORCED_LOGOUT = 'Forced Logout'

src/utils/file-utils.ts (8)

Line Source
37 const allowedExtensions = ['.pdf', '.docx', '.xlsx']
37 const allowedExtensions = ['.pdf', '.docx', '.xlsx']
37 const allowedExtensions = ['.pdf', '.docx', '.xlsx']
556 return '${baseName}.pdf'
945 name: '${dmsFile.name}.docx',
950 name: '${dmsFile.name}.xlsx',
955 name: '${dmsFile.name}.pptx',
997 if (!fileType) return 'File'

src/utils/markdown-diff/index.ts (8)

Line Source
440 return '<ins>${(node as Text).value}</ins>'
467 return '<del>${(node as Text).value}</del>'
634 return '<ins>${change.value}</ins>'
637 return '<del>${change.value}</del>'
722 handleOpenSpecialAttribute(added, 'ins', '<ins>')
723 handleOpenSpecialAttribute(removed, 'del', '<del>')
733 handleCloseSpecialAttribute('ins', '</ins>')
734 handleCloseSpecialAttribute('del', '</del>')

src/utils/audio-recorder.ts (7)

Line Source
66 let errorMessage = 'Failed to start recording'
85 'Microphone blocked by security policy. Please contact support.'
88 'Microphone access denied. Please check browser settings.'
98 errorMessage = 'No microphone found. Please check your device.'
101 'Microphone is in use or unavailable. Please check other applications.'
104 'Microphone does not meet requirements. Please check your device.'
114 errorMessage = error.message || 'Failed to start recording'

src/utils/markdown.ts (7)

Line Source
233 sentryEvent(SentryEventType.USER_ACTION, 'export_response', {
261 html: '<body>${answerHtml}</body>',
421 content: '##Files\n\n${files.join('\n\n')}',
424 { content: '<br/>', type: WordSectionType.HTML },
427 { content: '##Query\n\n${query}', type: WordSectionType.MARKDOWN },
428 { content: '<br/>', type: WordSectionType.HTML },
430 content: '##Response\n\n${cleanedResponse}',

src/utils/download.ts (5)

Line Source
62 ? '${sanitizeFileName(zippedFileName)}.zip'
63 : 'downloaded_files.zip'
160 displayInfoMessage('Your download will start shortly.', 5)
188 const message = 'There are currently ${documentIdsNotReadyToDownload.length} files that are not available. Skipping these files.'
196 'There are currently no files that are available to download.'

src/utils/sentry.ts (5)

Line Source
70 ? 'Filtered AbortError: ${originalException.message}'
71 : 'Filtered AbortError',
77 event.fingerprint = ['{{ default }}'] // salt the stack trace based error grouping criteria
78 const errorType = event.exception?.values?.[0]?.type || '<no error type>'
79 event.fingerprint = [...event.fingerprint, 'errorType: ${errorType}']

src/utils/storage-connectivity-probe.ts (5)

Line Source
81 errorMessage = 'HTTP 403 Forbidden'
90 errorMessage = 'Expected "${expectedContent}", got "${content.slice(0, 50)}"'
99 errorMessage = 'Request timed out after 10s'
106 errorMessage = 'Unknown fetch error'
114 : 'Failed to get signed URL'

src/utils/toast.tsx (5)

Line Source
99 'Error message displayed',
150 {errMsg} You can enable them on the{' '}
154 >
163 message: fallbackMessage ?? (errMsg || 'Unknown error'),
182 trackUserFacingWarning('Warning message displayed', {

src/utils/use-harvey-socket.ts (4)

Line Source
309 const tooManyRequests = 'Too many requests'
314 'Too many requests sent to Harvey. Please try again in a minute.',
325 'Harvey was unable to process this request due to the combined length of the input and output, please reduce the length of your input.',
425 'Sorry, something went wrong. Please refresh the page.',

src/utils/auth/login-slug.ts (3)

Line Source
9 export const VANITY_REDIRECT_COOKIE = 'harvey_login_slug'
13 const SESSION_STORAGE_ATTEMPTS_KEY = 'login_slug_attempts'
66 const message = 'Login slug max attempts reached, clearing cookie'

src/utils/dropzone.ts (3)

Line Source
406 message: 'Upload failed. You can't upload more than a total of ${bytesToReadable(
579 const IGNORE_FILE_PREFIXES = ['._', '__MACOSX']
580 const IGNORE_FILE_SUFFIXES = ['.DS_Store']

src/utils/error-tracker.ts (3)

Line Source
101 constructor(message = 'Request aborted by client') {
102 super(message, 'AbortError')
225 trackEventRaw('Error Shown', {

src/utils/markdown-highlight/index.ts (3)

Line Source
120 const value = '<span class="font-inherit bg-highlight">${highlightInNode.slice(
156 const value = '<span class="font-inherit bg-highlight">${node.value.slice(
188 return { type: 'html', value: '<br />' } as Html

src/utils/assistant-workflow-file-upload-utils.ts (2)

Line Source
31 const UPLOAD_SOURCE_FILE_PICKER = 'file_picker'
87 const baseMessage = 'No files were accepted'

src/utils/copy-to-clipboard/index.ts (1)

Line Source
280 message: successMessage || 'Copied to clipboard',

src/utils/datadog.ts (1)

Line Source
167 'customer_segment',

src/utils/export.ts (1)

Line Source
8 '${base}_${backendFormat(new Date())}.docx'

src/utils/id.ts (1)

Line Source
5 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'

src/utils/lazy-exports.ts (1)

Line Source
41 docxUtilsPromise = import('./docx')

src/utils/local-store.ts (1)

Line Source
6 const testKey = '__testKey__'

src/utils/pspdfkit.ts (1)

Line Source
33 container: '#pspdfkit-container',

src/utils/server-data.ts (1)

Line Source
128 'ak_v1_vendor-301054ec-cef3-40c4-bf4a-de4df8433403_IdiUR_YzL9Oz2Skerh06t39iiZ2FUdL3QOI0muwLZk0_1764976102417'

src/utils/session-store.ts (1)

Line Source
8 const testKey = '__testKey__'

src/utils/sharing-helpers.ts (1)

Line Source
321 ? '?spaceId=${encodeURIComponent(resource.spaceId)}'

src/components/settings (199 warnings)

src/components/settings/library/settings-library-events-content-copier.tsx (21)

Line Source
62 message: 'Please acknowledge the action before proceeding.',
78 message: 'Content copied successfully from ${response.sourceEventIds.length} events.',
82 displaySuccessMessage({ message: 'Content copied successfully.' })
88 message: 'Error copying content: ${
102 <h2 className="text-lg font-semibold">
111 <Label className="mb-4">Source Event IDs</Label>
116 placeholder="Comma-separated IDs"
122 <Label className="mb-4">Target Event IDs</Label>
127 placeholder="Comma-separated IDs"
133 <Label className="mb-4">Fields to Copy</Label>
138 placeholder="Comma-separated fields"
144 {isSubmitting ? 'Copying…' : 'Copy Contents'}
144 {isSubmitting ? 'Copying…' : 'Copy Contents'}
153 <DialogTitle>Confirm Content Copy</DialogTitle>
157 <strong>From:</strong> {sourceEventIds}
160 <strong>To:</strong> {targetEventIds}
163 <strong>Fields:</strong> {fieldsToCopy}
166 <AlertTitle className="mr-2 flex justify-between">
183 >
190 {isSubmitting ? 'Copying…' : 'Confirm Copy'}
190 {isSubmitting ? 'Copying…' : 'Confirm Copy'}

src/components/settings/roles/role-bulk-add-users.tsx (17)

Line Source
79 displayErrorMessage({ message: 'Failed to fetch parent workspace' })
116 message: 'Cannot add users to guest role',
127 message: 'Exceeded maximum number of users (${MAX_NUM_USERS}) allowed',
177 message: 'Successfully added ${numAdded} users to role',
184 message: 'Failed to add users to role',
208 <p>Select users from dropdown to add them to role {role.roleId}</p>
213 placeholder="Select users"
236 placeholder={'Enter new user emails to add to role ${startCase(
253 >
266 {addedUsers} users have been added to role {role.roleId}
269 <Button variant="secondary" onClick={onClear}>
286 ? 'This will grant ${plural(rolePermCount, { one: '# permission', other: '# permissions' })} to ${plural(dialogUsersToAdd, { one: '# new use
291 <p>Users to add:</p>
312 <p>Duplicate users:</p>
335 <p>Mismatched domain users:</p>
357 <p>Invalid users:</p>
382 >

src/components/settings/roles/workspace-roles-table.tsx (15)

Line Source
76 return <DataTableSortHeader column={column} header="Role ID" />
86 return <DataTableSortHeader column={column} header="Name" />
96 return <DataTableSortHeader column={column} header="Description" />
109 header="Date added"
110 tooltipText="Date when this Client Matter was added"
127 return <DataTableSortHeader column={column} header="Deleted At" />
169 tooltip={'Remove ${row.getValue('name')}'}
263 <p>
264 Manage roles for <b>{workspaceName}</b>, add permissions to a role
273 <Icon icon={IconPlusLarge} className="mr-1" />
284 emptyStateText="No roles found"
299 title="Delete role"
300 description={'Are you sure you want to delete role "${confirmingDeleteRole.name}"?'}
302 label: 'Delete',
306 label: 'Cancel',

src/components/settings/roles/workspace-roles-inspector-page.tsx (11)

Line Source
70 return 'Are you sure you want to revoke ${workflowToDelete.name}'
75 return 'This will revoke this permission for ${roleId} tied to workspace ${workspace.clientName}'
92 displayErrorMessage({ message: 'Unable to delete workflow' })
114 >
181 displayErrorMessage({ message: 'Unable to fetch workflows' })
204 displayErrorMessage({ message: 'Role not found while adding workflows' })
223 displayErrorMessage({ message: 'Unable to add workflows' })
240 description={'The requested role ${roleId} you are trying to access does not exist.'}
242 text: 'Back to Settings',
296 placeholder="Add workflows"
319 >

src/components/settings/workflow-permissions/settings-workflow-permissions.tsx (11)

Line Source
43 displayErrorMessage({ message: 'Failed to fetch permissions' })
53 title={'Workflow Permissions (${getSiteName(site)})'}
57 defaultText="Select workflow"
68 <div className="mb-2 mt-4 text-lg">Users</div>
70 <div className="text-sm">Select a workflow to view users</div>
74 <Spinner size="xxs" className="shrink-0 fill-primary" /> Loading...
80 <div className="text-sm italic">No users</div>
89 <div className="mb-2 mt-4 text-lg">Roles</div>
91 <div className="text-sm">Select a workflow to view roles</div>
95 <Spinner size="xxs" className="shrink-0 fill-primary" /> Loading...
101 <div className="text-sm italic">No roles</div>

src/components/settings/workspace/workspace-details/workspace-perm-migration-status.tsx (11)

Line Source
30 message: 'Successfully cut over workspace to permission bundles!',
38 'An error occurred while cutting over the workspace to permission bundles.',
48 {migrated ? 'Cutover Complete!' : 'Confirm Cutover'}
48 {migrated ? 'Cutover Complete!' : 'Confirm Cutover'}
54 ? 'This workspace has been migrated to permission bundles. All workspace users should be seeing the new interfaces for roles and permissions
55 : 'This workspace has not been cut over to permission bundles. Use the button below to confirm this action after validating that roles and p
59 <DialogTrigger>Cutover workspace to perm bundles</DialogTrigger>
61 title="Confirm permission bundle cutover"
62 description="Are you sure you want to migrate this workspace to permission bundles? This action cannot be undone and will affect all workspa
64 label: 'Confirm cutover',
68 label: 'Cancel',

src/components/settings/roles/role-bulk-add-perms.tsx (9)

Line Source
103 message: 'Failed to add permissions to role ${role.roleId}',
121 <p>
131 placeholder={'Add permissions to ${role.roleId}'}
155 ? 'Add permissions'
164 {numAddedPerms} permissions have been added to role {role.roleId}
167 <Button variant="secondary" onClick={onClear}>
183 {'This will grant ${plural(numPermsToAdd, { one: '# new permission', other: '# new permissions' })} to ${plural(roleUserCount, { one: '# use
187 <p>Permissions to add:</p>
215 >

src/components/settings/workspace/workspace-details/delete-all-workspace-history-modal.tsx (9)

Line Source
48 <div className="text-destructive">Delete all history</div>
51 <p>
53 {requestResetUsage ? ', and reset usage, ' : ''} before the date:{' '}
53 {requestResetUsage ? ', and reset usage, ' : ''} before the date:{' '}
59 {'Please acknowledge you want to delete all workspace history data${
60 requestResetUsage ? ', and reset usage, ' : ''
75 <span>This operation could take up to a minute...</span>
88 >
96 >

src/components/settings/roles/role-perms-table.tsx (8)

Line Source
64 return <DataTableSortHeader column={column} header="Permission" />
73 return <DataTableSortHeader column={column} header="Perm ID" />
83 return <DataTableSortHeader column={column} header="Date granted" />
98 return <DataTableSortHeader column={column} header="Deleted At" />
124 tooltip={'Remove ${row.getValue('name')}'}
185 message: 'Removed ${rolePerm?.name} from role ${workspaceRole.roleId}',
191 message: 'Failed to remove permission from role ${rolePk}',
210 emptyStateText="No permissions found"

src/components/settings/export-templates/export-templates-mapping-modal.tsx (7)

Line Source
39 'Heading 1',
40 'Heading 2',
41 'Heading 3',
42 'Normal',
43 'List Number',
44 'List Bullet',
269 return new File([preview.data], '${template.name}.pdf', {

src/components/settings/roles/role-users-table.tsx (7)

Line Source
75 return <DataTableSortHeader column={column} header="Email" />
93 return <DataTableSortHeader column={column} header="Date added" />
114 return <DataTableSortHeader column={column} header="Deleted At" />
140 tooltip={'Remove ${row.getValue('userEmail')}'}
203 message: '${userEmail} removed from ${workspaceRole.roleId}',
209 message: 'Failed to remove ${userEmail} from ${workspaceRole.roleId}',
228 emptyStateText="No users found"

src/components/settings/workspace/workspace-details/workspace-perm-user-counts.tsx (7)

Line Source
109 return <DataTableSortHeader column={column} header="Perm Name" />
119 return <DataTableSortHeader column={column} header="Perm ID" />
132 return <DataTableSortHeader column={column} header="Count" />
189 <p>
191 <b>{selectedWorkspace.clientName}</b>. Permissions counts include
197 buttonText="Export"
214 emptyStateText="No perms found"

src/components/settings/client-matters/client-matters-add-edit-dialog.tsx (5)

Line Source
58 ['12345', 'Acme'],
59 ['56789', 'Harvey'],
62 ['12345', 'true', 'Acme'],
63 ['56789', 'false', 'Harvey'],
227 fileReader.readAsText(files[0], 'UTF-8')

src/components/settings/file-upload-debugger/file-upload-debugger-page.tsx (5)

Line Source
69 title="File upload debugger"
70 subtitle="Upload a file to verify it can be processed"
81 description="Select a file to test the upload_file endpoint"
82 mainText="Drag and drop files here or click to browse"
88 <p className="text-muted-foreground text-xs">

src/components/settings/workspace/workspace-projects-exporter.ts (5)

Line Source
47 Size: '${project.filesCount} files (${project.sizeBytes} bytes)',
58 ? 'Deleted'
59 : 'Active'
60 : 'Not Set',
69 XLSX.utils.book_append_sheet(workbook, projectsWorksheet, 'Projects')

src/components/settings/export-templates/export-template-dropdown.tsx (4)

Line Source
19 placeholder = 'Select template',
35 <div className="text-sm text-destructive">Failed to load templates</div>
51 inputPlaceholder="Search templates…"
52 emptyStateText="No templates found"

src/components/settings/roles/role-inspector.tsx (4)

Line Source
22 displayErrorMessage({ message: 'Role ID cannot be empty' })
37 <h2 className="text-lg font-semibold">Role inspector</h2>
41 <p>Role ID:</p>
47 <Button disabled={roleId.trim().length === 0}>Inspect</Button>

src/components/settings/workspace/workspace-details/bulk-delete-user-modal.tsx (4)

Line Source
36 <div className="text-destructive">Delete users</div>
39 <p>
44 <b>Users to be deleted:</b>
71 >

src/components/settings/playbooks/components/playbook-version-diff-modal.tsx (3)

Line Source
40 'prose prose-sm max-w-none [&_input]:pointer-events-auto [&_input[type=checkbox]]:cursor-pointer [&_del]:bg-red-100 [&_del]:text-red-800 [&_
42 'prose prose-sm max-w-none [&_input]:pointer-events-auto [&_input[type=checkbox]]:cursor-pointer [&_del]:hidden [&_ins]:px-1 [&_ins]:rounded
44 'prose prose-sm max-w-none [&_input]:pointer-events-auto [&_input[type=checkbox]]:cursor-pointer [&_ins]:hidden [&_del]:bg-red-100 [&_del]:t

src/components/settings/playbooks/playbook-rule-form/hooks/use-deviation-manager.ts (3)

Line Source
64 'rules.${index}.${fieldKey}' as FieldPath<PlaybookRuleFormValues>
81 'rules.${index}.${fieldKey}' as FieldPath<PlaybookRuleFormValues>
96 'rules.${index}.attributes.acceptableDeviations' as FieldPath<PlaybookRuleFormValues>,

src/components/settings/playbooks/use-nda-playbook-modal.ts (3)

Line Source
114 [TemplateType.NDA]: 'nda_template',
115 [TemplateType.MSA]: 'msa_template',
116 [TemplateType.COMMERCIAL_CONTRACTS]: 'commercial_contracts_template',

src/components/settings/roles/roles-perms-card.tsx (3)

Line Source
73 <CardTitle className="mb-3 ml-1">Permissions</CardTitle>
78 <TabsTrigger value={RolePermsTab.rolePerms}>
81 <TabsTrigger value={RolePermsTab.addPerms}>

src/components/settings/roles/roles-users-card.tsx (3)

Line Source
85 <CardTitle className="mb-3 ml-1">Users</CardTitle>
90 <TabsTrigger value={RoleUserTab.roleUsers}>
93 <TabsTrigger value={RoleUserTab.addUsers}>

src/components/settings/workspace/workspace-info/workspace-info-branding.tsx (3)

Line Source
208 'image/jpeg': ['.jpg', '.jpeg'],
208 'image/jpeg': ['.jpg', '.jpeg'],
209 'image/png': ['.png'],

src/components/settings/library/settings-library-events-manager.tsx (2)

Line Source
19 title="Library Events Manager"
20 subtitle="Manage library events content"

src/components/settings/playbooks/nda-playbook-modal.tsx (2)

Line Source
58 'hover:border-interactive flex h-auto w-full flex-col items-start justify-start gap-2 rounded-lg border p-4 text-left transition-colors hove
61 "border-border relative -mx-2 flex items-center justify-between px-2 py-[calc(1.5rem-2px)] pr-3 text-left transition-colors after:absolute a

src/components/settings/playbooks/playbook-rule-form/hooks/use-rule-form-fields.ts (2)

Line Source
34 name: 'rules.${index}' as FieldPath<PlaybookRuleFormValues>,
53 void trigger('rules.${index}')

src/components/settings/usage/use-usage-data.ts (2)

Line Source
47 return parse(timestamp, 'yyyy-MM-dd', new Date())
49 return parse(timestamp, 'yyyy-MM', new Date(0, 0, 1))

src/components/settings/workspace/workspace-projects-page.tsx (2)

Line Source
87 const TABLE_HEADER_TEXT_CLASS = 'text-xs font-semibold text-muted'
89 'text-xs font-semibold text-muted [&_*]:text-xs [&_*]:font-semibold [&_*]:text-muted'

src/components/settings/export-templates/export-template-preview-modal.tsx (1)

Line Source
39 ? new File([previewMutation.data], '${template?.name}.pdf', {

src/components/settings/knowledge/knowledge-page.tsx (1)

Line Source
95 <span className="rounded bg-secondary px-1.5 py-0.5 text-xs font-medium text-muted">

src/components/settings/playbooks/playbook-rule-form/components/tooltip-form-label.tsx (1)

Line Source
24 const tooltipContentId = '${id}-tooltip'

src/components/settings/playbooks/playbook-rule-form/sections/acceptable-deviation-row.tsx (1)

Line Source
55 'rules.${ruleIndex}.attributes.acceptableDeviations.${fieldIndex}' as FieldPath<PlaybookRuleFormValues>

src/components/settings/playbooks/playbooks-index.tsx (1)

Line Source
13 <Route path=":playbookId" element={<PlaybookDetailPage />} />

src/components/settings/playbooks/use-convert-playbook.ts (1)

Line Source
431 'uploadPlaybook-${playbookId}'

src/components/settings/playbooks/use-playbook-upload-v2.ts (1)

Line Source
458 'uploadPlaybook-${playbookId}'

src/components/settings/workspace/features/use-fetch-workspace-roles.ts (1)

Line Source
41 displayErrorMessage({ message: 'Failed to load workspace roles' })

src/components/settings/workspace/workspace-details/playbook-management/playbook-management.tsx (1)

Line Source
404 accept=".json"

src/components/settings/workspace/workspace-details/workspace-offboard/workspace-offboard.tsx (1)

Line Source
191 {isLoadingWorkspaceOffboardJobs && 'Loading…'}

src/components/settings/workspace/workspace-projects-export-button.tsx (1)

Line Source
56 a.download = '${type.toLowerCase()}_export_${

src/components/vault (137 warnings)

src/components/vault/components/progress-toast-v2/stories.tsx (23)

Line Source
86 name: 'failed-document.pdf',
88 failure_reason: 'File is corrupted or password protected',
174 name: 'corrupted-file.pdf',
176 failure_reason: 'File is corrupted or password protected',
180 name: 'large-file.zip',
182 failure_reason: 'File size exceeds 50MB limit',
203 name: 'failed-file-1.pdf',
205 failure_reason: 'File is corrupted',
209 name: 'failed-file-2.docx',
211 failure_reason: 'Unsupported format',
215 name: 'failed-file-3.xlsx',
217 failure_reason: 'Password protected',
253 title: 'Components/Vault/ProgressToastV2',
259 component: '
319 'Progress toast showing files currently being processed. Mix of completed, processing, and failed files.',
339 'Progress toast showing successful completion of all files. Will auto-dismiss after 30 seconds.',
359 'Progress toast showing completed batch with some failed files. Error state with detailed failure reasons.',
379 'Progress toast for large batch (1000+ files). Shows only failed files due to display threshold, with a message explaining the limitation.',
399 'Progress toast with batch filtering enabled. Only shows files from the specified batch UUIDs (set via store).',
419 'Progress toast with fast polling (2 seconds) for real-time updates during active processing.',
441 'Progress toast for large batch (1000+ files) with no failures. Shows only title with no expandable content because display_mode is failed_o
462 'Progress toast showing both server-side successful files and temporary failed files (e.g., files rejected during upload validation). Demons
483 'Progress toast with workflow builder integration. When workflow builder is open, the toast is normally hidden except when ignoreHideToastOn

src/components/vault/utils/vault.ts (15)

Line Source
39 export const folderIdSearchParamKey = 'folder_id'
40 export const fileIdSearchParamKey = 'file_id'
42 export const sourceIdSearchParamKey = 'source_id'
43 export const questionIdSearchParamKey = 'question_id'
44 export const rowIdSearchParamKey = 'row_id'
48 export const projectDetailPageTabSearchParamKey = 'project_detail_tab'
139 '\n\n<i>(response was cut-off due to the query answer being too long. This might be a better query to run in Vault Review instead)</i>'
150 export const EXAMPLES_USER_EMAIL = 'examples@harvey.ai'
423 [ReviewColumnDisplayFormat.MMMM_SPACE_DD_COMMA_SPACE_YYYY]: 'MMMM dd, yyyy',
424 [ReviewColumnDisplayFormat.DD_SPACE_MMMM_SPACE_YYYY]: 'dd MMMM yyyy',
425 [ReviewColumnDisplayFormat.MMM_SPACE_DD_SPACE_YYYY]: 'MMM dd yyyy',
426 [ReviewColumnDisplayFormat.DD_SPACE_MMM_SPACE_YYYY]: 'dd MMM yyyy',
427 [ReviewColumnDisplayFormat.DD_MM_YYYY]: 'dd/MM/yyyy',
428 [ReviewColumnDisplayFormat.MM_DD_YYYY]: 'MM/dd/yyyy',
429 [ReviewColumnDisplayFormat.YYYY_MM_DD]: 'yyyy/MM/dd',

src/components/vault/utils/vault-helpers.ts (10)

Line Source
1556 userFriendlyMessage: '${files.length} file(s) failed: ${error}',
3485 title: event.title || newRun?.query || 'Untitled query',
3615 query: 'Review on ${currentProjectContent.name}',
3867 return 'extra_files_and_columns'
3870 return 'extra_columns'
3873 return 'extra_files'
3879 return 'retry_empty'
3955 ? 'Review on ${currentProjectContent.name}'
3956 : 'New Review'
4612 const finalRootName = nameById.get(rootId) ?? rootName ?? 'Root'

src/components/vault/vault-project-layout.tsx (9)

Line Source
256 event: 'VaultProjectLayout.access_check_failed',
293 contextKey: '${userInfo.workspace.id}:${projectId}:access_level',
294 event: 'VaultProjectLayout.access_level_received',
346 contextKey: '${userInfo.workspace.id}:${projectId}:share_status',
347 event: 'VaultProjectLayout.share_status_fetched',
374 contextKey: '${userInfo.workspace.id}:${projectId}:share_fetch_error:${statusCode ?? 'unknown'}',
375 event: 'VaultProjectLayout.share_status_fetch_failed',
444 <Route path={'${filesPath}:fileId'} element={<VaultFilePreviewer />} />
450 path={'${queriesPath}:queryId'}

src/components/vault/hooks/use-vault-history-item.ts (8)

Line Source
73 category: 'vault_query',
74 message: 'Starting vault history request ${requestId}',
91 : 'no signal',
99 category: 'vault_query',
100 message: 'Vault history request ${requestId} was cancelled',
133 category: 'vault_query',
134 message: 'Vault history request ${requestId} failed',
158 : 'no signal',

src/components/vault/query-detail/data-grid/cells/vault-document-cell.tsx (8)

Line Source
900 const isDataCell = target.closest('.ag-row .ag-cell')
911 useKey('Escape', resetCellViewer)
949 const source = anchorEl?.closest('[data-review-content-type]')
1351 baseGradientColor="hsl(var(--neutral-200))"
1352 baseColor="hsl(var(--neutral-600))"
1938 const safeFileId = validateUuid(displayRowId) ? displayRowId : '[REDACTED]'
2391 baseGradientColor="hsl(var(--neutral-200))"
2392 baseColor="hsl(var(--neutral-600))"

src/components/vault/utils/datadog-helpers.ts (7)

Line Source
18 const DATADOG_ACTION_UPLOAD_ERROR = 'vault_upload_error'
76 let errorType = 'Unknown'
88 errorType = 'HTTPError'
100 errorType = 'TypeError'
125 const DATADOG_ACTION_FILE_SELECTION = 'vault_file_selection'
126 const DATADOG_ACTION_UPLOAD_BATCH_INITIATED = 'vault_upload_batch_initiated'
127 const DATADOG_ACTION_PROJECT_UPLOAD_STATE = 'vault_project_upload_state'

src/components/vault/utils/use-vault-pagination.ts (5)

Line Source
49 return 'content_type'
852 err instanceof Error ? err.message : 'Failed to load folder content'
1286 setError(err instanceof Error ? err.message : 'Failed to load project')
1387 err instanceof Error ? err.message : 'Failed to load more content'
1476 setError(err instanceof Error ? err.message : 'Failed to load folder')

src/components/vault/utils/vault-fetcher.ts (5)

Line Source
211 () => import('services/workers/upload/upload-worker')
1959 Authorization: 'Bearer ${authorizationToken}',
2479 ? 'vault/projects/${projectId}/queries/${queryId}'
2480 : 'vault/event/${queryId}'
2718 const url = 'vault/event/${eventId}/edit_cell'

src/components/vault/components/file-explorer/vault-file-explorer-utils.tsx (4)

Line Source
1288 const aDocType = a.tags[0]?.name || 'zzz_unknown'
1289 const bDocType = b.tags[0]?.name || 'zzz_unknown'
1301 a.contentType || 'zzz_unknown',
1302 b.contentType || 'zzz_unknown'

src/components/vault/query-detail/data-grid-helpers.ts (4)

Line Source
356 resizeElement.classList.add('after:bg-skeleton-dark')
373 'after:bg-skeleton-dark'
428 resizeElement.classList.remove('after:bg-skeleton-dark')
445 'after:bg-skeleton-dark'

src/components/vault/utils/get-sharing-status-for-vault-folder.ts (4)

Line Source
29 sharingStatusTooltip: 'Shared to everyone at ${workspaceClientName}',
37 sharingStatusTooltip: 'Created by you',
41 sharingStatusTooltip: 'Owned by ${sharedByUserEmail}',
46 sharingStatusTooltip: 'Private to you',

src/components/vault/query-detail/data-grid/cells/vault-column-editor.tsx (3)

Line Source
619 useKey('Escape', () => {
1820 return new Intl.NumberFormat('en-US').format(testNumber)
1823 return new Intl.NumberFormat('de-DE').format(testNumber)

src/components/vault/utils/constants.ts (3)

Line Source
14 DOCUMENT_TYPE: 'document_type',
15 UPDATED_AT: 'updated_at',
16 FILE_TYPE: 'file_type',

src/components/vault/components/new-project/vault-create-project-card.tsx (2)

Line Source
44 strokeColor="hsl(var(--neutral-300))"
49 strokeColor="hsl(var(--neutral-300))"

src/components/vault/hooks/use-vault-list-controls.tsx (2)

Line Source
44 const sortStorageKey = 'vault_home_sort_option_${userInfo.dbId}_${userInfo.workspace.id}'
45 const viewModeStorageKey = 'vault_home_view_mode_${userInfo.dbId}_${userInfo.workspace.id}'

src/components/vault/query-detail/data-grid/vault-data-grid.tsx (2)

Line Source
163 return 'border-b border-t-color'
165 return 'border-b no-top-border'

src/components/vault/utils/vlt-8047-review-permission-diagnostics.ts (2)

Line Source
124 return '[serialization_error=true]'
131 ): string => '[VLT-8047] ${event} ${serializePayload(payload)}'

src/components/vault/workflows/vault-assistant-thread-input.tsx (2)

Line Source
84 return QUERY_MUST_HAVE_X_LEN_HELP_TEXT('at least ${MIN_QUERY_LENGTH}')
86 return QUERY_MUST_HAVE_X_LEN_HELP_TEXT('fewer than ${queryLimit}')

src/components/vault/components/file-explorer/vault-cells.tsx (1)

Line Source
623 'animate-pulse stroke-background-accent'

src/components/vault/components/new-project/vault-uploaded-file-list.tsx (1)

Line Source
342 textClassNames="text-start text-xs"

src/components/vault/components/progress-toast-v2/component.tsx (1)

Line Source
993 analyticsMessage="vault_progress_toast_v2"

src/components/vault/components/set-example-project.tsx (1)

Line Source
36 'Control+h',

src/components/vault/components/vault-app-header/query-detail-breadcrumb.tsx (1)

Line Source
192 creatorUserEmail === EXAMPLES_USER_EMAIL ? 'Harvey' : creatorUserEmail

src/components/vault/components/vault-app-header/use-run-review.ts (1)

Line Source
549 return { error: 'Failed to run review query' }

src/components/vault/components/vault-progress-toast-legacy.tsx (1)

Line Source
761 analyticsMessage="vault_progress_toast"

src/components/vault/components/vault-query-row.tsx (1)

Line Source
220 const owner = userId === EXAMPLES_USER_EMAIL ? 'Harvey' : userId

src/components/vault/components/vault-suggestion-tags/index.tsx (1)

Line Source
55 const VAULT_STATIC_TAGS_SOURCE = 'vault_static_tags'

src/components/vault/dialogs/vault-export-dialog.tsx (1)

Line Source
960 const zipFileName = '${projectName}.zip'

src/components/vault/hooks/use-vault-progress-query.tsx (1)

Line Source
65 const basePath = 'vault/progress-summary/${projectId}'

src/components/vault/hooks/use-vault-projects.tsx (1)

Line Source
218 contextKey: '${userInfo.workspace.id}:vault_list_loaded',

src/components/vault/query-detail/vault-query-detail.tsx (1)

Line Source
104 export const CELL_LOADING_TEXT = 'Processing…'

src/components/vault/side-panel/vault-side-panel.tsx (1)

Line Source
496 textClassNames="my-auto text-sm"

src/components/vault/vault-index.tsx (1)

Line Source
43 path={'${projectsPath}:projectId/*'}

src/components/vault/workflows/vault-edit-workflow.tsx (1)

Line Source
251 accept=".csv"

src/components/vault/workflows/vault-new-workflow.tsx (1)

Line Source
201 accept=".csv"

src/components/vault/workflows/vault-workflow-builder.tsx (1)

Line Source
241 'Control+h',

src/components/vault/workflows/vault-workflow-list.tsx (1)

Line Source
360 'Control+h',

src/components/common (125 warnings)

src/components/common/document-title/helpers.ts (9)

Line Source
5 assistant: 'Assistant',
6 tax: 'Tax AI Assistant',
8 eurlex: 'EUR-Lex',
9 usacaselaw: 'US Case Law',
10 uscaselaw: 'US Case Law',
11 francecaselaw: 'French Case Law',
12 ausbreachreporting: 'Australia Breach Reporting',
14 cuatrecasas: 'Cuatrecasas',
15 spaces: 'Spaces',

src/components/common/markdown/table.tsx (9)

Line Source
92 label: 'Microsoft Word',
96 label: 'Microsoft Excel',
217 const fileName = 'Table_${dateTime}'
233 return saveAs(blob, '${fileName}.docx')
248 XLSX.utils.book_append_sheet(wb, ws, 'Table')
255 source.page ? ' , Page ' + source.page : ''
259 XLSX.utils.book_append_sheet(wb, rs, 'Citations')
266 '${fileName}.xlsx'
272 '${fileName}.csv'

src/components/common/integrations/file-picker-utils.ts (7)

Line Source
32 return 'iManage OnPrem'
35 return 'SharePoint'
37 return 'Google Drive'
39 return 'NetDocuments'
41 return 'Epona'
43 return 'Box'
45 return 'Outlook'

src/components/common/integrations/google-drive-file-picker.tsx (6)

Line Source
294 folderName: folder.name || 'Google Drive Folder',
295 folderPath: [folder.name || 'Google Drive Folder'],
500 myDriveView.setLabel('My drive only')
510 starredView.setLabel('Starred')
522 shouldEnableFolderSelection ? 'Select folder' : 'Select files'
522 shouldEnableFolderSelection ? 'Select folder' : 'Select files'

src/components/common/knowledge-sources/knowledge-source-attachment.tsx (6)

Line Source
149 dataTestId={'${contentType}-icon'}
163 'Publication Status',
164 'Jurisdiction',
165 'Legal Classification',
328 dataTestId={'${databaseSource}-icon'}
343 dataTestId={'${databaseSource}-icon'}

src/components/common/analytics/analytics-context.tsx (5)

Line Source
48 export const PAGE_VIEW_EVENT_NAME = 'Page Viewed'
49 export const FILTER_CHANGED_EVENT_NAME = 'Filter Changed'
183 devLog('MP Event buffer flushed')
188 engage: 'engage/',
189 groups: 'groups/',

src/components/common/export/export-location-options.tsx (5)

Line Source
105 label: 'iManage OnPrem',
114 label: 'Epona',
122 label: 'Google Drive',
130 label: 'Box',
138 label: 'SharePoint',

src/components/common/query-editor/utils.ts (5)

Line Source
78 state.write('<mention type="${type}">${label}</mention>')
99 open: '<u>',
100 close: '</u>',
217 const lead = /^\w/.test(raw) ? '\\b' : ''
218 const trail = /\w$/.test(raw) ? '\\b' : ''

src/components/common/sharing/shared-user-and-workspace-list.tsx (5)

Line Source
465 return 'Vault'
467 return 'Assistant thread'
469 return 'Playbook'
473 return 'Workflow'
475 return 'Resource'

src/components/common/beta-banner/beta-banner.tsx (3)

Line Source
12 <p className="rounded bg-accent-hover px-2.5 py-0.5 font-medium">Beta</p>
12 <p className="rounded bg-accent-hover px-2.5 py-0.5 font-medium">Beta</p>
20 >

src/components/common/editor/components/editor-toolbar.tsx (3)

Line Source
135 const blob = await item.getType('text/html')
145 const blob = await item.getType('text/plain')
153 const modKey = isMac ? '⌘' : 'Ctrl + '

src/components/common/editor/extensions/editable-link.tsx (3)

Line Source
23 declare module '@tiptap/core' {
38 content: 'inline*',
52 tag: 'a[href]',

src/components/common/integrations/imanage-file-picker.tsx (3)

Line Source
289 'ethical_walls'
401 const errorMessage = 'Missing configuration: iManageAppId=${!!iManageAppId}, iManageCustomerId=${!!iManageCustomerId}'
425 'Failed to obtain integration token after connect attempt'

src/components/common/user-icon-avatar-badge.tsx (3)

Line Source
23 small: 'text-2xs leading-3',
28 userEmail = 'O', // O is for owner
52 {(userEmail || 'O')[0].toUpperCase()}

src/components/common/add-workflows-dialog/workflow-card.tsx (2)

Line Source
52 ? 'bg-secondary opacity-60'
54 ? 'bg-secondary hover:cursor-pointer hover:bg-secondary-hover'

src/components/common/analytics/analytics-core.ts (2)

Line Source
16 const LS_SESSION_ID_KEY = 'session_id'
17 const LS_LAST_EVENT_KEY = 'session_last_event'

src/components/common/announcements/harvey-announcements.tsx (2)

Line Source
170 const cacheBustPath = '${path}?ts=${Date.now()}'
380 actionButtonLabel || 'Action',

src/components/common/ask-harvey-button.tsx (2)

Line Source
138 buttonTitle = 'Ask Harvey',
354 ? 'Select a Client Matter to submit your query'

src/components/common/feedback/feedback-with-comments.tsx (2)

Line Source
126 enter="transition-opacity duration-300"
129 leave="transition-opacity duration-100"

src/components/common/flows/profile-setup/hooks/use-skip-onboarding.ts (2)

Line Source
7 export const PROFILE_SETUP_SKIPPED_EVENT = 'profile_setup_skipped'
8 export const PROFILE_SETUP_STEP_SKIPPED_EVENT = 'profile_setup_step_skipped'

src/components/common/integrations/box-file-picker.tsx (2)

Line Source
299 folderName: folder.name || 'Box Folder',
300 folderPath: [folder.name || 'Box Folder'],

src/components/common/query-editor/suggestion.ts (2)

Line Source
261 editorContainerEl = dom.closest('#query-editor')
328 const clickedInsideDialog = target.closest('[role="dialog"]')

src/components/common/sharing/share-popover.tsx (2)

Line Source
258 '[role="menu"]'
356 void trackAssistantOrVaultEvent('remove all users clicked', {

src/components/common/space-header-logos.tsx (2)

Line Source
15 'text-[10px] font-medium border rounded border-hy-border-strong bg-hy-bg-subtle text-primary'
17 'text-sm font-medium border rounded-md border-hy-border-strong bg-hy-bg-subtle text-primary'

src/components/common/use-container-width.ts (2)

Line Source
29 getComputedStyle(container).getPropertyValue('--button-min-width')
63 if (element.classList.contains('@container')) return element

src/components/common/vault-project-client-matter-merged-button.tsx (2)

Line Source
63 {vaultProjectName || 'Vault'}
66 {clientMatterName || 'Client Matter'}

src/components/common/add-playbooks-dialog/add-playbooks-dialog.tsx (1)

Line Source
199 trackDialogSubmitted('Add Resources Dialog', {

src/components/common/add-vaults-dialog/add-vaults-dialog.tsx (1)

Line Source
250 trackDialogSubmitted('Add Resources Dialog', {

src/components/common/add-workflows-dialog/add-workflows-dialog.tsx (1)

Line Source
259 trackDialogSubmitted('Add Resources Dialog', {

src/components/common/announcements/data/content/unified-assistant-announcement.ts (1)

Line Source
4 return '

src/components/common/app-header-actions.tsx (1)

Line Source
43 <IconArrowRotateCounterClockwise className="mr-1 h-4 w-4" />

src/components/common/deprecated-tag-input/deprecated-tag-input.tsx (1)

Line Source
131 placeholder={inputPlaceholder || 'Add a tag'}

src/components/common/editor/use-editor.tsx (1)

Line Source
29 declare module '@tiptap/core' {

src/components/common/integrations/box-location-section.tsx (1)

Line Source
88 selectButtonText: 'Select…',

src/components/common/integrations/epona-file-picker.tsx (1)

Line Source
38 const EPONA_APP_NAME = 'Harvey'

src/components/common/integrations/file-picker-constants.ts (1)

Line Source
2 'IntegrationFilePickerBlockingTime'

src/components/common/integrations/google-drive-location-section.tsx (1)

Line Source
89 selectButtonText: 'Select…',

src/components/common/integrations/imanage-utils.tsx (1)

Line Source
179 typefilters: 'Supported file types@1|${typeFilters}',

src/components/common/integrations/integration-title.tsx (1)

Line Source
12 const BRAND_ONE_DRIVE = 'OneDrive'

src/components/common/integrations/integrations-logo.tsx (1)

Line Source
14 const WITH_ONE_DRIVE_LABEL = '(with OneDrive)'

src/components/common/integrations/sharepoint-location-section.tsx (1)

Line Source
89 selectButtonText: 'Select…',

src/components/common/markdown/markdown.helpers.tsx (1)

Line Source
301 style={{ width: 'calc(${width} - 32px)' }}

src/components/common/query-editor/nodes/placeholder-node.tsx (1)

Line Source
37 tag: 'span[data-placeholder]',

src/components/common/query-editor/nodes/suggested-source-node.tsx (1)

Line Source
39 tag: 'span[data-suggestedSource]',

src/components/common/query-editor/plugins/copy-as-markdown.tsx (1)

Line Source
32 event.clipboardData?.setData('text/plain', cleanedMarkdown)

src/components/common/sharing/resource-share-popover/resource-share-popover.tsx (1)

Line Source
230 '[role="menu"]'

src/components/common/sharing/resource-share-popover/users-tab-content.tsx (1)

Line Source
220 void trackAssistantOrVaultEvent('remove all users clicked', {

src/components/common/sharing/sharing-user-input.tsx (1)

Line Source
377 void trackAssistantOrVaultEvent('shared with users', {

src/components/common/sharing/track-share-event.tsx (1)

Line Source
41 const eventName = 'Assistant thread ${eventVerb}'

src/components/common/sharing/workspace-sharing-options.tsx (1)

Line Source
84 trackAssistantOrVaultEvent('share link copied', {

src/components/common/source-card/source-card-with-snippets.tsx (1)

Line Source
124 <p className="ml-0.5 shrink-0 text-xs text-muted">References</p>

src/components/common/source-popover.tsx (1)

Line Source
51 .replaceAll('\n\n', '<br /><br />')}

src/components/common/use-theme-switcher.ts (1)

Line Source
10 const DARK_MODE_MEDIA_QUERY = '(prefers-color-scheme: dark)'

src/components/common/vault-knowledge-source-picker.tsx (1)

Line Source
413 folderName: 'Untitled',

src/components/common/workspace-multi-select.tsx (1)

Line Source
23 placeholder = 'Select workspaces',

src/components/ui (105 warnings)

src/components/ui/badge.tsx (13)

Line Source
12 'border-transparent bg-interactive text-primary-inverse hover:bg-interactive-hover',
13 skeleton: 'border-transparent bg-secondary-hover font-normal text-primary',
15 'border-transparent bg-button-secondary text-primary hover:bg-button-secondary-hover',
17 'border-transparent bg-destructive text-destructive hover:bg-destructive/80',
18 outline: 'text-primary bg-primary',
19 ghost: 'text-primary bg-primary border-transparent',
21 'border border-primary bg-secondary hover:bg-secondary-hover text-primary rounded-md line-clamp-1 truncate',
22 warning: 'border-transparent bg-[#F1E7C9] text-[#C27A1D] font-normal',
24 'border-transparent bg-hy-warning-bg text-hy-warning-fg font-normal',
25 beta: 'border-transparent bg-hy-jade-bg text-hy-jade-fg font-medium px-1 py-px text-2xs',
26 group: 'border-transparent bg-data-jade-400 text-primary font-normal',
27 success: 'border-transparent bg-hy-success-bg text-hy-success-fg font-normal',
28 info: 'border-transparent bg-hy-blue-bg text-hy-blue-fg font-normal',

src/components/ui/calendar.tsx (11)

Line Source
50 months: 'flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0',
52 caption: 'flex justify-center pt-1 relative items-center',
54 nav: 'space-x-1 flex items-center',
61 table: 'w-full border-collapse space-y-1',
63 head_cell: 'text-muted rounded-md w-8 font-normal text-[0.8rem]',
64 row: 'flex w-full mt-2',
78 'bg-interactive text-primary-inverse hover:bg-interactive hover:text-primary-inverse focus:bg-interactive focus:text-primary-inverse',
79 day_today: 'bg-button-secondary text-primary',
81 'day-outside text-muted opacity-50 aria-selected:bg-button-secondary/50 aria-selected:text-muted aria-selected:opacity-30',
82 day_disabled: 'text-muted opacity-50',
84 'aria-selected:bg-button-secondary aria-selected:text-primary',

src/components/ui/sidebar/sidebar.tsx (11)

Line Source
246 ? 'left-[calc(var(--sidebar-width)_-_2px)]'
247 : 'left-[calc(var(--sidebar-width-icon)_-_2px)]'
445 'peer/menu-button cursor-pointer flex w-full gap-[--spacing-lg] overflow-hidden rounded-md p-[--spacing-lg]',
446 'text-left text-sm outline-none',
447 'hover:bg-tab-hover focus-visible:ring-2 focus-visible:ring-ring active:bg-tab-active',
448 'disabled:pointer-events-none disabled:opacity-50 disabled:cursor-default',
449 'aria-disabled:pointer-events-none aria-disabled:opacity-50',
450 'data-[active=true]:bg-tab-active',
451 'group-has-[[data-sidebar=menu-action]]/menu-item:pr-8',
453 '[&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&_span]:text-sm [&_div]:text-sm',
454 'group-data-[collapsible=icon]:w-[var(--sidebar-button-height)]',

src/components/ui/data-grid/cell-focus-scope.tsx (9)

Line Source
3 export const AG_GRID_HEADER_CELL_SELECTOR = '.ag-header-cell'
4 export const AG_GRID_CELL_SELECTOR = '.ag-cell'
5 export const AG_GRID_FULL_WIDTH_ROW_SELECTOR = '.ag-full-width-row'
8 'button:not([disabled]):not([tabindex="-1"])',
9 '[href]:not([tabindex="-1"])',
10 'input:not([disabled]):not([tabindex="-1"]):not([type="hidden"]):not([aria-disabled="true"])',
11 'select:not([disabled]):not([tabindex="-1"])',
12 'textarea:not([disabled]):not([tabindex="-1"])',
13 '[tabindex]:not([tabindex="-1"]):not([disabled]):not([aria-disabled="true"])',

src/components/ui/pulse-spinner.tsx (6)

Line Source
15 sm: { container: 'h-4 w-4', inner: 'h-1.5 w-1.5', outer: 'h-2 w-2' },
15 sm: { container: 'h-4 w-4', inner: 'h-1.5 w-1.5', outer: 'h-2 w-2' },
15 sm: { container: 'h-4 w-4', inner: 'h-1.5 w-1.5', outer: 'h-2 w-2' },
16 md: { container: 'h-6 w-6', inner: 'h-2 w-2', outer: 'h-3 w-3' },
16 md: { container: 'h-6 w-6', inner: 'h-2 w-2', outer: 'h-3 w-3' },
16 md: { container: 'h-6 w-6', inner: 'h-2 w-2', outer: 'h-3 w-3' },

src/components/ui/timeline/__fixtures__/timeline-items.tsx (6)

Line Source
6 title: 'Workflow created',
7 description: 'Annie S · 4/8/2025 11:15am',
12 title: 'Version 1 published',
13 description: 'Annie S · 4/9/2025, 12:06am',
18 title: 'Draft saved',
19 description: 'You · Just now',

src/components/ui/data-grid/data-grid.tsx (5)

Line Source
30 import('@ag-grid-enterprise/excel-export'),
31 import('@ag-grid-enterprise/row-grouping'),
36 await import('ag-grid-community/styles/ag-grid.css')
37 await import('ag-grid-community/styles/ag-theme-quartz.css')
38 await import('./data-grid.css')

src/components/ui/combobox/combobox.tsx (4)

Line Source
808 width: 'calc(100% - 8px)',
810 transform: 'translateY(${itemOrVirtualItem.start}px)',
815 width: 'calc(100% - 8px)',
1045 return '${listboxId}-option-${encodeURIComponent(optionValue)}'

src/components/ui/icon/badged-icon.tsx (4)

Line Source
26 return 'top-0 right-0'
28 return 'top-0 left-0'
30 return 'bottom-0 left-0'
33 return 'bottom-0 right-0'

src/components/ui/loading-text/index.tsx (4)

Line Source
20 skeleton: 'my-0.5 h-3 w-16',
24 skeleton: 'my-[3px] h-3.5 w-20',
28 skeleton: 'my-1 h-4 w-24',
32 skeleton: 'my-[5px] h-[18px] w-32',

src/components/ui/tooltip.tsx (4)

Line Source
67 top: 'border-t-0 border-l-0 border-r-0',
68 bottom: 'border-b-0 border-l-0 border-r-0',
69 left: 'border-t-0 border-b-0 border-r-0',
70 right: 'border-t-0 border-b-0 border-l-0',

src/components/ui/app-header.tsx (3)

Line Source
289 .getPropertyValue('--border-primary')
291 const borderColor = 'hsl(${borderColorHsl})'
292 const borderColorTransparent = 'hsl(${borderColorHsl} / 0%)'

src/components/ui/form/form.tsx (3)

Line Source
54 formItemId: '${id}-form-item',
55 formDescriptionId: '${id}-form-item-description',
56 formMessageId: '${id}-form-item-message',

src/components/ui/text-effect/text-shimmer.tsx (3)

Line Source
20 baseGradientColor = 'hsl(var(--text-primary))',
21 baseColor = 'hsl(var(--text-inactive))',
38 backgroundImage: 'linear-gradient(90deg, transparent calc(50% - var(--shimmer-spread)), var(--shimmer-gradient), transparent calc(50% + var(

src/components/ui/eyebrow.tsx (2)

Line Source
41 backgroundColor: isActive ? 'hsl(40 7% 19%)' : 'hsl(40 4% 54%)', // Need HSL values for animation
41 backgroundColor: isActive ? 'hsl(40 7% 19%)' : 'hsl(40 4% 54%)', // Need HSL values for animation

src/components/ui/icon/paged-file-icon.tsx (2)

Line Source
22 const iconSize = isPresentationIcon ? 'h-[55%] w-[55%]' : 'h-[75%] w-[75%]'
22 const iconSize = isPresentationIcon ? 'h-[55%] w-[55%]' : 'h-[75%] w-[75%]'

src/components/ui/scroll-area.tsx (2)

Line Source
82 {'
99 style={{ height: 'calc(100% - ${scrollBarTop}px)' }}

src/components/ui/segmented-progress-bar.tsx (2)

Line Source
79 'radial-gradient(circle at 0px 50%, transparent 3px, black 4px)',
81 'radial-gradient(circle at 0px 50%, transparent 3px, black 4px)',

src/components/ui/tag-input/tag-input.tsx (2)

Line Source
399 const listboxId = id ? '${id}-listbox' : '${generatedId}-listbox'
399 const listboxId = id ? '${id}-listbox' : '${generatedId}-listbox'

src/components/ui/checkbox.tsx (1)

Line Source
47 const labelId = hasDefaultLabel ? '${checkboxId}-label' : undefined

src/components/ui/icons/chiomenti-logo.tsx (1)

Line Source
20 alt="Chiomenti"

src/components/ui/icons/epona-icon.tsx (1)

Line Source
8 return <img className={className} src="/img/logos/epona.png" alt="Epona" />

src/components/ui/icons/google-drive-icon.tsx (1)

Line Source
14 alt="Google Drive"

src/components/ui/icons/netdocs-icon.tsx (1)

Line Source
12 alt="NetDocuments"

src/components/ui/icons/outlook-icon.tsx (1)

Line Source
9 <img className={className} src="/img/logos/outlook.svg" alt="Outlook" />

src/components/ui/icons/pw-logo.tsx (1)

Line Source
17 <style>{'.cls-1{fill:#54565a}'}</style>

src/components/ui/popover.tsx (1)

Line Source
81 const btn = sibling.matches('button:not([disabled])')

src/components/ui/progress.tsx (1)

Line Source
21 style={{ transform: 'translateX(-${100 - (value ?? 0)}%)' }}

src/components/workflows (70 warnings)

src/components/workflows/workflow/translation/translation-utils.ts (35)

Line Source
17 value: 'Arabic',
23 value: 'Cantonese',
28 value: 'Simplified Chinese',
33 value: 'Traditional Chinese',
38 value: 'Czech',
43 value: 'Danish',
48 value: 'Dutch',
53 value: 'English',
58 value: 'Finnish',
63 value: 'French',
68 value: 'German',
73 value: 'Greek',
78 value: 'Gujarati',
83 value: 'Hebrew',
89 value: 'Hindi',
94 value: 'Hungarian',
99 value: 'Italian',
104 value: 'Japanese',
109 value: 'Korean',
114 value: 'Malay',
119 value: 'Marathi',
124 value: 'Norwegian Bokmål',
129 value: 'Polish',
134 value: 'Brazilian Portuguese',
139 value: 'European Portuguese',
144 value: 'Romanian',
149 value: 'Russian',
154 value: 'Serbian',
159 value: 'Spanish (Latin America)',
164 value: 'Spanish (Spain)',
169 value: 'Swedish',
174 value: 'Thai',
179 value: 'Turkish',
184 value: 'Ukrainian',
189 value: 'Vietnamese',

src/components/workflows/workflow-types.ts (6)

Line Source
118 [WorkflowCategory.GENERAL]: 'General',
119 [WorkflowCategory.TRANSACTIONAL]: 'Transactional',
120 [WorkflowCategory.IN_HOUSE]: 'In-House',
121 [WorkflowCategory.LITIGATION]: 'Litigation',
122 [WorkflowCategory.FINANCIAL_SERVICES]: 'Financial Services',
123 [WorkflowCategory.OTHER]: 'Other',

src/components/workflows/workflow/transcripts/export.ts (5)

Line Source
15 content: '## Document: ${document.file.name}',
19 content: '### ${t.topic}\n#### Witness: ${t.witness}\n${t.summary}',
31 title: 'Transcripts',
37 content: '# Documents',
45 content: '# Questions and answers',

src/components/workflows/workflow/document-comparison/document-comparison-page.tsx (3)

Line Source
59 const ROUTE = 'document_compare'
335 return GET_UPLOAD_X_DOCUMENT_HELP_TEXT('the first')
337 return GET_UPLOAD_X_DOCUMENT_HELP_TEXT('the second')

src/components/workflows/hooks/use-workflow-visibility.ts (2)

Line Source
56 ? 'Visible to ${
61 : 'Visible to ${

src/components/workflows/workflow/contracts/utils/utils.ts (2)

Line Source
8 label: 'View all',
9 value: 'View all',

src/components/workflows/workflow/transcripts/util/util.ts (2)

Line Source
45 message: 'Unexpected: Couldn’t find matching document or source.',
59 message: 'Please wait for all files to finish loading',

src/components/workflows/workflows-with-ownership-tabs.tsx (2)

Line Source
67 { text: t'Review table', value: 'review_table' },
157 'Control+h',

src/components/workflows/workflow-browser-dialog.tsx (1)

Line Source
57 'Control+h',

src/components/workflows/workflow/company-profile/company-profile-page.tsx (1)

Line Source
28 const ROUTE = 'company_profile'

src/components/workflows/workflow/competitive-analysis/components/data-grid/cell-viewer.tsx (1)

Line Source
58 useKey('Escape', () => {

src/components/workflows/workflow/competitive-analysis/components/header.tsx (1)

Line Source
45 a.download = '${companyName}-competitive-analysis.xlsx'

src/components/workflows/workflow/contracts/config.ts (1)

Line Source
14 export const EXTRACT_NOT_AVAILABLE_VALUE = 'N/A'

src/components/workflows/workflow/contracts/utils/export-to-excel.ts (1)

Line Source
13 const fileName = 'CONTRACTS_${dateTime}.xlsx'

src/components/workflows/workflow/dialogs/delete-workflow-dialog.tsx (1)

Line Source
28 const CONFIRMATION_TEXT = 'DELETE WORKFLOW'

src/components/workflows/workflow/diligence-transcripts/diligence-transcripts-page.tsx (1)

Line Source
75 const SERVER_ROUTE = 'diligence/transcripts'

src/components/workflows/workflow/legacy_drafting/legacy-drafting-page.tsx (1)

Line Source
49 const ROUTE = 'legacy_drafting'

src/components/workflows/workflow/ogc/ogc-page.tsx (1)

Line Source
46 const ROUTE = 'ogc_review'

src/components/workflows/workflow/redlines/redlines-page.tsx (1)

Line Source
387 titleText: 'Redlines',

src/components/workflows/workflow/transcripts/transcripts-store.tsx (1)

Line Source
117 answer: { text: 'Loading…' },

src/components/workflows/workflows-helpers.ts (1)

Line Source
966 return 'review_table'

src/components/workflow-builder (57 warnings)

src/components/workflow-builder/dialogs/admin-file-management-dialog.tsx (9)

Line Source
95 ...matchingFiles.map(() => outputLabel ?? 'no output label'),
148 !target.closest('[data-radix-dropdown-content]') &&
149 !target.closest('[data-radix-dropdown-trigger]') &&
150 !target.closest('[role="menuitem"]') &&
151 !target.closest('[role="menu"]') &&
152 !target.closest('[data-testid*="dropdown"]') &&
153 !target.closest('.ks-input-dropdown')
292 'Diatype, InterVariable, Inter, ui-sans-serif, system-ui, sans-serif, “Apple Color Emoji” , “Segoe UI Emoji”, “Segoe UI Symbol”, “Noto Color
312 'Diatype, InterVariable, Inter, ui-sans-serif, system-ui, sans-serif, “Apple Color Emoji” , “Segoe UI Emoji”, “Segoe UI Symbol”, “Noto Color

src/components/workflow-builder/components/conditional-icon.ts (5)

Line Source
5 'FlippedSplitIcon',
22 ['path', { key: 'path1', d: 'M16 3h5v5', transform: 'rotate(180 12 12)' }],
23 ['path', { key: 'path2', d: 'M8 3H3v5', transform: 'rotate(180 12 12)' }],
29 transform: 'rotate(180 12 12)',
32 ['path', { key: 'path4', d: 'm15 9 6-6', transform: 'rotate(180 12 12)' }],

src/components/workflow-builder/utils/block-param-converters/selection-list-converter.ts (5)

Line Source
16 headerText: String(backendParams?.headerText) || 'Please select an option',
18 'Option 1',
19 'Option 2',
20 'Option 3',
22 inputLabel: String(backendParams?.inputLabel) || 'List 1',

src/components/workflow-builder/blocks/controls/workflow-builder-sources.tsx (4)

Line Source
263 knowledgeSources: '[[${reviewTableSource.label + '.metadata.knowledge_sources'}]]',
268 reviewEventId: '[[${reviewTableSource.label + '.metadata.event_id'}]]',
276 knowledgeSources: '[[${reviewTableSource!.label + '.metadata.knowledge_sources'}]]',
287 reviewEventId: '[[${reviewTableSource!.label + '.metadata.event_id'}]]',

src/components/workflow-builder/components/lexical/lexical-react-mentions-plugin.tsx (3)

Line Source
37 const NAME = '\\b[A-Z][^\\s' + PUNCTUATION + ']'
49 const VALID_CHARS = '[^' + TRIGGERS + PUNC + '\\s]'
220 (target as Element).closest('[data-mentions-dropdown]') !== null

src/components/workflow-builder/components/workflow-run-sharing/loading-states.tsx (3)

Line Source
13 sm: 'h-4 w-4',
14 md: 'h-6 w-6',
15 lg: 'h-8 w-8',

src/components/workflow-builder/blocks/controls/workflow-builder-prompt-text-editor-component.tsx (2)

Line Source
327 dialogName: 'Workflow Prompt Dialog',
490 editorName={'${editorName}-dialog'}

src/components/workflow-builder/blocks/index.tsx (2)

Line Source
254 outputLabel: 'knowledge_sources',
355 outputLabel: 'review_tables',

src/components/workflow-builder/components/lexical/html-to-markdown.ts (2)

Line Source
120 return inner.trim() ? '<u>${inner.trim()}</u>' : ''
331 const PLACEHOLDER_PREFIX = '<!--CODE_BLOCK_'

src/components/workflow-builder/hooks/use-import-workflow.ts (2)

Line Source
74 .post('workflow_builder/import_workflow', {
78 Authorization: 'Bearer ${token}',

src/components/workflow-builder/hooks/use-workflow-builder-nodes.ts (2)

Line Source
695 blockName: 'Add step',
721 blockName: 'Start by adding your first step', // Note that this is just naming; actual display text gets set in the component

src/components/workflow-builder/stores/utils.ts (2)

Line Source
38 export const GENERATED_STEP_PREFIX = 'gen_'
41 return 'stable_ref_${randUuid()}'

src/components/workflow-builder/blocks/conditional-switch-block.tsx (1)

Line Source
218 ? '.metadata.class_name'

src/components/workflow-builder/blocks/controls/workflow-builder-embedded-files.tsx (1)

Line Source
764 buttonName: 'Workflow Prompt Embedded Files Menu',

src/components/workflow-builder/blocks/controls/workflow-builder-knowledge-sources.tsx (1)

Line Source
828 buttonName: 'Workflow Prompt Add Knowledge Source',

src/components/workflow-builder/components/lexical/paste-formatting-plugin.tsx (1)

Line Source
39 const html = clipboardData.getData('text/html')

src/components/workflow-builder/components/workflow-bulk-actions.tsx (1)

Line Source
51 const shiftPressed = useKeyPress('Shift', {

src/components/workflow-builder/constants.ts (1)

Line Source
1 export const BACKEND_VERSION_CONFLICT_ERROR = 'BackendVersionConflict'

src/components/workflow-builder/hooks/use-export-workflow.ts (1)

Line Source
63 link.download = '${fileName}-workflow-export.json'

src/components/workflow-builder/pages/assistant-workflow-builder.tsx (1)

Line Source
71 theme === Theme.DARK ? 'rgba(255, 255, 255, 0.32)' : '#ccc'

src/components/workflow-builder/stores/hmr.ts (1)

Line Source
61 const stateKey = '${storeKey}State'

src/components/workflow-builder/utils/block-param-converters/conditional-block-converter.ts (1)

Line Source
31 selectList = '[[' + selectList + '.selected]]'

src/components/workflow-builder/utils/block-param-converters/file-upload-converter.ts (1)

Line Source
46 String(backendParams?.headerText) || 'Upload a file for processing',

src/components/workflow-builder/utils/block-param-converters/text-input-converter.ts (1)

Line Source
18 'Add a message to display to the user.',

src/components/workflow-builder/utils/block-param-converters/user-prompt-converter.ts (1)

Line Source
152 String(backendParams?.adminPrompt) || 'Enter your instructions here',

src/components/workflow-builder/utils/stable-hash.ts (1)

Line Source
158 stableId: 'step_${index}',

src/components/workflow-builder/utils/words-to-workflows/validate-generated-steps.ts (1)

Line Source
28 { stepIndex: -1, field: 'steps', message: 'steps array is required' },

src/components/workflow-builder/utils/workflow-builder-calculate-estimated-run-time.ts (1)

Line Source
269 return 'Runtime estimate: ${minutes}+ mins'

src/components/library (46 warnings)

src/components/library/bulk-upload/csv-parser.ts (17)

Line Source
24 name: ['name', 'title', 'prompt name', 'prompt_name'],
24 name: ['name', 'title', 'prompt name', 'prompt_name'],
25 query: ['query', 'prompt', 'prompt text', 'prompt_text', 'text', 'content'],
25 query: ['query', 'prompt', 'prompt text', 'prompt_text', 'text', 'content'],
28 'practice areas',
29 'practice_areas',
31 'practice area',
32 'practice_area',
50 return { rows: [], headers: [], errors: ['CSV file is empty'] }
276 const headers = ['Name', 'Query', 'Categories', 'Practice Areas']
276 const headers = ['Name', 'Query', 'Categories', 'Practice Areas']
276 const headers = ['Name', 'Query', 'Categories', 'Practice Areas']
276 const headers = ['Name', 'Query', 'Categories', 'Practice Areas']
278 'Sample Prompt Name',
279 'This is the prompt text that will be saved',
280 'Contract Review, Due Diligence',
281 'Corporate Law, M&A',

src/components/library/library-filter-options.ts (8)

Line Source
56 { text: 'Legal', value: 'legal' },
57 { text: 'Tax', value: 'tax' },
58 { text: 'Family law', value: 'family-law' },
59 { text: 'Corporate', value: 'corporate' },
60 { text: 'Real Estate', value: 'real-estate' },
61 { text: 'Intellectual Property', value: 'ip' },
62 { text: 'Employment', value: 'employment' },
63 { text: 'Immigration', value: 'immigration' },

src/components/library/examples-filter-components.tsx (5)

Line Source
120 entityName: 'library table',
129 entityName: 'library table',
138 entityName: 'library table',
147 entityName: 'library table',
156 entityName: 'library table',

src/components/library/save-prompt-button.tsx (4)

Line Source
437 defaultValue="Private"
443 value="Private"
451 value="Workspace"
461 value="Harvey"

src/components/library/bulk-upload/bulk-upload-content.tsx (2)

Line Source
111 accept: { 'text/csv': ['.csv'] },
122 link.download = 'prompt_upload_template.csv'

src/components/library/library-fetcher.ts (2)

Line Source
74 const path = 'library_v2/items${searchParams.size ? '?' + searchParams.toString() : ''}'
114 const route = 'library/${toLower(kind)}/export'

src/components/library/prompts-filter-components.tsx (2)

Line Source
94 entityName: 'library table',
106 entityName: 'library table',

src/components/library/hooks/use-library-search-results.ts (1)

Line Source
112 const effectiveSortBy = filters.sortBy ?? 'best_match'

src/components/library/library-index.tsx (1)

Line Source
66 <Route path=":tab" element={<LibraryTabPage />} />

src/components/library/load-prompt-button.tsx (1)

Line Source
56 const LOAD_PROMPT_MENU_ENTRY_POINT = 'library load prompt menu'

src/components/library/pages/library-search-page.tsx (1)

Line Source
75 defaultSort="best_match"

src/components/library/prompt-preview/prompt-preview.tsx (1)

Line Source
32 entryPoint: 'library_prompt_preview',

src/components/library/workflow-preview/workflow-preview.tsx (1)

Line Source
55 entryPoint: 'library_workflow_preview',

src/components/research (36 warnings)

src/components/research/constants.tsx (16)

Line Source
1 export const SEC_HELP_SHORT = '<h4>About</h4>
4 export const SEC_HELP = '<h4>About</h4>
41 export const MEMOS_HELP = '<h4>About</h4>
44 export const EURLEX_HELP = '<h4>About</h4>
47 export const USA_CASELAW_HELP_SHORT = '<h4>About</h4>
51 export const FRANCE_CASE_LAW_HELP_SHORT = '<h4>About</h4>
55 export const USA_CASELAW_HELP = '<h4>Tips for using Case Law</h4>
71 export const UK_TAX_HELP = '<h4>About</h4>
127 export const UK_TAX_HELP_PWC = '<h4>About</h4>
185 export const JAPAN_TAX_HELP = '<h4>About</h4>
232 export const PWC_DISCLAIMER_TEXT = 'Harvey outputs are intended to provide guidance only, do not constitute legal, tax or other professional
234 export const TAX_HELP_TEXT = '
237 export const TAX_AI_HELP_TEXT = '
244 export const AUS_BREACH_REPORTING_HELP = '<h4>About</h4>
247 export const LEXIS_NEXIS_DISCLAIMER_TEXT = 'AI generated content must be reviewed for accuracy. Unlinked citations in your response indicate
249 export const CUATRECASAS_HELP = '

src/components/research/artifact/artifact-page.tsx (7)

Line Source
53 const METRIC_PREFIX = '${EventKind.USA_CASELAW}_ARTIFACT'
232 .replaceAll(/^ *(\d+\.{0,1} *)\n/gm, '<p><b>$1</b></p>\n\n')
233 .replaceAll(/^ *([A-Z]{1}\.{0,1} *)\n/gm, '<p><b>$1</b></p>\n\n')
238 '<h2>$1</h2>\n\n'
261 .replaceAll(/-\d+-/g, '<p><b>$&</b></p>\n\n')
263 .replaceAll('\n\n', '<br /><br />')
323 <div className="invisible mb-2 shrink-0 truncate text-xs text-muted transition group-hover:visible lg:visible">

src/components/research/explorer-item.tsx (6)

Line Source
266 <Badge variant="beta">Beta</Badge>
278 jurisdiction: 'Select up to 3',
279 'legal classification': 'Select up to 1',
280 'publication status': 'Select up to 1',
289 : 'Select at least one'
304 <TooltipContent className="w-full">

src/components/research/research-helpers.ts (6)

Line Source
375 [ResearchArea.TAX]: 'Tax AI Assistant',
377 [ResearchArea.MEMOS]: 'Memos',
378 [ResearchArea.EURLEX]: 'EUR-Lex',
379 [ResearchArea.FRANCECASELAW]: 'French Case Law',
380 [ResearchArea.AUSBREACHREPORTING]: 'Australia Breach Reporting',
381 [ResearchArea.CUATRECASAS]: 'Cuatrecasas',

src/components/research/explorer-column.tsx (1)

Line Source
222 <p className="text-sm">Select all</p>

src/components/shared (33 warnings)

src/components/shared/metrics.ts (11)

Line Source
44 const trackSearchUsed = createEventTracker('Shared Spaces Search Used')
46 'Customize Space Color Selected'
49 'Add Resources Search Used'
52 'Add Resources Item Selected'
55 'Add Resources Access Level Changed'
58 'Add Resources Sort Option Changed'
61 'Add Resources View Mode Changed'
64 'Publish to Space Popover Opened'
67 'Publish to Space Search Used'
70 'Publish to Space Access Level Selector Opened'
73 'Publish to Space Access Level Changed'

src/components/shared/utils/space-color-utils.ts (10)

Line Source
31 light: 'bg-[hsl(var(--space-stone-100))]',
32 dark: 'bg-[hsl(var(--space-stone-900))]',
35 light: 'bg-[hsl(var(--space-mist-100))]',
36 dark: 'bg-[hsl(var(--space-mist-900))]',
39 light: 'bg-[hsl(var(--space-lilac-100))]',
40 dark: 'bg-[hsl(var(--space-lilac-900))]',
43 light: 'bg-[hsl(var(--space-rose-100))]',
44 dark: 'bg-[hsl(var(--space-rose-900))]',
47 light: 'bg-[hsl(var(--space-cream-100))]',
48 dark: 'bg-[hsl(var(--space-cream-900))]',

src/components/shared/pages/SpaceViewPage/customize-space-dialog.tsx (4)

Line Source
200 'image/jpeg': ['.jpg', '.jpeg'],
200 'image/jpeg': ['.jpg', '.jpeg'],
201 'image/png': ['.png'],
251 trackDialogSubmitted('Customize Space Dialog', {

src/components/shared/pages/SpaceViewPage/components/space-member-colors.ts (2)

Line Source
1 export const INTERNAL_MEMBER_COLOR = 'bg-[#333F40]'
2 export const EXTERNAL_MEMBER_COLOR = 'bg-[#755A24]'

src/components/shared/utils/resource-route-utils.ts (2)

Line Source
21 const WORKFLOW_RUN_PATTERN = '^${BaseAppPath.Assistant}/workflows/([^/]+)'
22 const ASSISTANT_EVENT_PATTERN = '^${BaseAppPath.Assistant}/(assist|draft|review)/([^/]+)'

src/components/shared/pages/SpaceViewPage/components/space-composer-panel.tsx (1)

Line Source
76 filterIds: ['harvey_guide'],

src/components/shared/pages/SpaceViewPage/hooks/use-add-resources-to-space.ts (1)

Line Source
26 'spaces/${spaceId}/resources'

src/components/shared/pages/SpaceViewPage/space-view-page.tsx (1)

Line Source
137 'grid grid-cols-1 gap-3 [@container_(min-width:480px)]:grid-cols-2 [@container_(min-width:720px)]:grid-cols-3 [@container_(min-width:960px)]

src/components/shared/shared-index.tsx (1)

Line Source
18 CREATE_SPACE: '${SPACES_PATHS.BASE}?${SPACES_QUERY_PARAMS.CREATE_SPACE}=true',

src/office (26 warnings)

src/office/services/backend-fetch.ts (7)

Line Source
71 const SSE_EVENT_PREFIX = 'data: '
123 Authorization: 'Bearer ${token}',
124 Accept: 'text/event-stream',
155 const defaultMessage = 'A problem occurred while querying the backend (status code ${response.status})'
289 Authorization: 'Bearer ${token}',
290 Accept: 'text/event-stream',
490 const defaultMessage = 'Request failed with status ${xhr.status}: ${xhr.statusText}'

src/office/hooks/use-file-operations.ts (4)

Line Source
156 const fileTypeLabel = hasUploadedFiles ? 'Uploaded' : 'Attached from Vault'
156 const fileTypeLabel = hasUploadedFiles ? 'Uploaded' : 'Attached from Vault'
157 const addMoreLabel = hasVaultFiles ? 'Add more' : 'Upload more'
157 const addMoreLabel = hasVaultFiles ? 'Add more' : 'Upload more'

src/office/utils/clipboard-utils.ts (2)

Line Source
22 div.style.left = '-9999px'
23 div.style.top = '-9999px'

src/office/utils/error-utils.ts (2)

Line Source
37 const message = '${data.message} (Code: ${
44 let stringified = '[Unable to stringify the thrown value]'

src/office/components/configurable-dropdown-menu.tsx (1)

Line Source
105 width = 'w-[300px]',

src/office/components/email-confirmation-screen.tsx (1)

Line Source
52 <span className="font-serif text-3xl text-primary-inverse">H</span>

src/office/components/info-banner.tsx (1)

Line Source
7 const CSS_VAR_NAME = '--info-banner-height'

src/office/components/layouts/chat-v2-layout.tsx (1)

Line Source
55 height: 'calc(100vh - var(--large-doc-warning-banner-height, 0px) - ${composerHeight + 48}px)',

src/office/controllers/office-client-matter-select-controller.tsx (1)

Line Source
138 prefix={<span className="text-[10px]">CM#</span>}

src/office/hooks/use-guidance.ts (1)

Line Source
17 const title = customGuidance?.title || 'Guidance'

src/office/hooks/use-theme-switcher.ts (1)

Line Source
5 const DARK_MODE_MEDIA_QUERY = '(prefers-color-scheme: dark)'

src/office/hooks/use-upload-vault.ts (1)

Line Source
72 'Failed to upload ${failedFiles.length} files',

src/office/integrations/imanage-callback.tsx (1)

Line Source
13 import('components/settings/integrations/pages/imanage-oauth-callback-page')

src/office/integrations/oauth-connect.tsx (1)

Line Source
67 error instanceof Error ? error.message : 'Unknown error'

src/office/utils/constants.ts (1)

Line Source
23 export const AUTH_UNAUTHORIZED_EVENT = 'auth:unauthorized'

src/models (24 warnings)

src/models/queries/use-client-refresh-query.ts (5)

Line Source
56 title: 'Update available',
58 'Includes enhancements, permission updates, and security fixes. Recommended for all users.',
59 message: 'New app enhancements are available',
60 secondaryCtaLabel: 'Refresh later',
61 ctaLabel: 'Refresh now',

src/models/user-info.ts (4)

Line Source
54 export const DYNAMIC_CSP_COOKIE_PREFIX = 'dynamic_csp_urls_'
138 document.cookie = '${cookieName}=${cookieValue}; path=/; secure; samesite=strict; max-age=${maxAge}'
143 document.cookie = '${cookieName}=; path=/; secure; samesite=strict; max-age=0'
1480 'david-baias.ro',

src/models/fetchers/event-fetcher.ts (3)

Line Source
9 const url = 'event/${eventId}/feedback_sentiments'
17 const url = 'event/${eventId}/feedback'
28 const url = 'event/${eventId}/feedback/${feedbackId}'

src/models/queries/lib/use-polling-and-older-query.ts (3)

Line Source
118 modifiedAfterKey = 'updated_after_exclusive',
121 createdBeforeKey = 'created_before_exclusive',
122 createdAfterKey = 'created_after_exclusive',

src/models/queries/use-history-polling-query.ts (3)

Line Source
54 modifiedAfterKey: 'updated_after_exclusive',
56 createdBeforeKey: 'created_before_exclusive',
57 createdAfterKey: 'created_after_exclusive',

src/models/fetchers/research-taxonomy-fetcher.ts (2)

Line Source
10 const path = area ? 'research/taxonomy?area=${area}' : 'research/taxonomy'
10 const path = area ? 'research/taxonomy?area=${area}' : 'research/taxonomy'

src/models/fetchers/usa-case-law-fetcher.ts (2)

Line Source
18 'research/usa_caselaw/${id}' +
31 const url = 'research/court_name_to_citation_string?${params.toString()}'

src/models/fetchers/library-v1-practice-areas-fetcher.ts (1)

Line Source
24 const path = 'library_v2/v1-practice-areas${searchParams.size ? '?${searchParams.toString()}' : ''}'

src/models/helpers/library-helper.ts (1)

Line Source
4 return userInfo.workspace.clientName || 'Team'

src/contexts (22 warnings)

src/contexts/recent-pages-context.tsx (22)

Line Source
25 [BaseAppPath.Assistant]: 'Assistant',
26 [BaseAppPath.Vault]: 'Vault',
27 [BaseAppPath.History]: 'History',
28 [BaseAppPath.Library]: 'Library',
29 [BaseAppPath.Settings]: 'Settings',
30 [BaseAppPath.Workflows]: 'Workflows',
35 [SettingsPath.Workspace]: 'Workspace',
36 [SettingsPath.ClientMatters]: 'Client Matters',
37 [SettingsPath.Sharing]: 'Sharing',
38 [SettingsPath.Models]: 'Models',
39 [SettingsPath.Knowledge]: 'Knowledge',
40 [SettingsPath.Profile]: 'Profile',
41 [SettingsPath.Users]: 'Users',
42 [SettingsPath.Roles]: 'Roles',
43 [SettingsPath.Usage]: 'Usage',
44 [SettingsPath.WorkspaceHistory]: 'Workspace History',
45 [SettingsPath.WorkspaceProjects]: 'Workspace Projects',
46 [SettingsPath.Integrations]: 'Integrations',
73 details: 'Run workflow: ${formattedWorkflowId}',
84 details: 'Artifact: ${title}',
111 details: 'Open project: ${title}',
226 details: 'Open vault: ${projectName}',

src/hooks (13 warnings)

src/hooks/use-voice-input.ts (10)

Line Source
125 title: 'Recording Time Limit',
126 message: 'You have ${remainingSeconds} second${remainingSeconds !== 1 ? 's' : ''} of recording time remaining.',
170 title: 'Recording Complete',
171 message: 'Recording time limit reached. Processing your ${Math.floor(RECORDING_LIMITS.MAX_DURATION_SECONDS / 60)}-minute recording…',
208 let errorMessage = 'An error occurred'
240 setError('Voice input permission required')
258 'Microphone access was denied. Please enable microphone permissions in your browser settings and refresh the page.'
261 options.onError?.(errorMsg, 'cancelled', 'PermissionDenied')
412 error instanceof Error ? error.message : 'Failed to start recording'
427 : 'Unknown'

src/hooks/use-searchable-dropdown-menu.ts (3)

Line Source
14 focusFirstItemKey = 'ArrowDown',
15 focusInputKey = 'ArrowUp',
16 selector = '[role="menuitem"]:not([data-disabled])',

src/components/client-matters (11 warnings)

src/components/client-matters/components/ClientDropdown/client-dropdown.tsx (5)

Line Source
18 { id: '1', clientName: 'Acme Corporation' },
19 { id: '2', clientName: 'Globex Industries' },
20 { id: '3', clientName: 'Initech' },
21 { id: '4', clientName: 'Umbrella Corporation' },
22 { id: '5', clientName: 'Stark Industries' },

src/components/client-matters/components/MatterSetupFlow/steps/define-matter-step.tsx (2)

Line Source
102 clientName: 'TODO: Placeholder',
104 clientMatterId: 'TODO: Placeholder',

src/components/client-matters/pages/MattersViewPage/hooks/use-title-markup.tsx (2)

Line Source
9 cmName: 'Investment Funds & Management',
11 clientName: 'Acme Inc.',

src/components/client-matters/client-matter-select.tsx (1)

Line Source
416 prefix={<span className="text-[10px]">CM#</span>}

src/components/client-matters/client-matter-selection-dialog.tsx (1)

Line Source
82 useKey('Escape', onClose)

src/components/ui-new (11 warnings)

src/components/ui-new/dialog/dialog.tsx (10)

Line Source
67 'dialogTitle-${titleId ?? generateRandomAlphaNumericId(4)}'
173 sm: 'max-h-[min(100%,320px)] w-[480px]',
174 md: 'max-h-[min(100%,432px)] w-[640px]',
175 lg: 'max-h-[min(100%,600px)] w-[960px]',
176 full: 'size-full max-h-full max-w-full',
188 sm: 'max-h-[min(80vh,320px,calc(100vh-2rem))] w-[480px]',
189 md: 'max-h-[min(80vh,432px,calc(100vh-2rem))] w-[640px]',
190 lg: 'max-h-[min(80vh,600px,calc(100vh-2rem))] w-[960px]',
191 full: 'max-h-[calc(100vh-2rem)] w-full max-w-full',
278 const openOverlay = target.closest('[data-state="open"]')

src/components/ui-new/button/button-group.tsx (1)

Line Source
11 'group-hover:[&_button]:bg-hy-bg-base-hover group-hover:[&_button]:hover:bg-hy-bg-input-hover',

src/components/dashboard (9 warnings)

src/components/dashboard/stat-card.tsx (5)

Line Source
56 const AGG_KEY = endpoint === 'queries/graph' ? '__total_queries__' : 'value'
198 <Tabs defaultValue="Month">
201 value="Day"
207 value="Month"
213 value="Year"

src/components/dashboard/dashboard-page.tsx (2)

Line Source
52 export const TOTAL_KEY = 'All types'
308 value: '__select_all__',

src/components/dashboard/user-stats-table.tsx (2)

Line Source
183 ? 'user_stats_${format(selectedDateRange.from, 'P')}-${format(
187 : 'user_stats.csv'

src/components/sidebar (7 warnings)

src/components/sidebar/command-palette.tsx (3)

Line Source
212 <DisplayButton className="w-8">Esc</DisplayButton>
480 {isMac ? '⌘ K' : 'Ctrl+K'}
480 {isMac ? '⌘ K' : 'Ctrl+K'}

src/components/sidebar/sidebar-footer-section.tsx (2)

Line Source
64 export const HELP_CENTER_CLICKED_EVENT = 'Help Center Clicked'
86 filterIds: ['harvey_guide'],

src/components/sidebar/sidebar-create-button.tsx (1)

Line Source
105 name: 'New Workflow',

src/components/sidebar/sidebar-header-section.tsx (1)

Line Source
30 'pointer-events-none absolute left-1/2 top-1/2 size-5 -translate-x-1/2 -translate-y-1/2 group-hover/sidebar:opacity-0'

src/components/compare (5 warnings)

src/components/compare/compare-page.tsx (5)

Line Source
87 const preference1 = isSwapped ? 'B' : 'A'
87 const preference1 = isSwapped ? 'B' : 'A'
88 const preference2 = isSwapped ? 'A' : 'B'
88 const preference2 = isSwapped ? 'A' : 'B'
259 newPreference = 'Tie'

src/providers (5 warnings)

src/providers/fullscreen-flow-provider/navigator-controls.tsx (4)

Line Source
24 <Button onClick={controlsConfig.onSkip} variant="ghost">
29 <Button onClick={controlsConfig.onClose} variant="ghost">
37 >
44 >

src/providers/fullscreen-flow-provider/fullscreen-flow-layout.tsx (1)

Line Source
38 <span className="sr-only">Close</span>

src/components/history (4 warnings)

src/components/history/history-metadata-store.tsx (4)

Line Source
245 ? 'vault/history/workspace/${eventId}'
246 : 'vault/history/user_async/${eventId}'
248 ? 'workspace/history/${eventId}'
249 : 'user/history/${eventId}'

src/constants (4 warnings)

src/constants/voice-input.ts (4)

Line Source
37 'audio/webm;codecs=opus',
38 'audio/webm',
39 'audio/ogg;codecs=opus',
40 'audio/mp4',

src/types (4 warnings)

src/types/sharing.ts (2)

Line Source
314 export const SHARE_SUCCESS_MESSAGE = 'Access updated successfully'
315 export const SHARE_ERROR_MESSAGE = 'Failed to update access'

src/types/perlego-text-highlighter.d.ts (1)

Line Source
1 declare module '@perlego/text-highlighter'

src/types/ui-constants.ts (1)

Line Source
7 export const MD_MEDIA_QUERY = '(min-width: 768px)'

src/components/filter (2 warnings)

src/components/filter/instances/source-filter.tsx (2)

Line Source
17 export const KNOWLEDGE_BASE_SOURCE_TYPE = 'Knowledge base'
18 export const VAULT_SOURCE_TYPE = 'Vault'

src/app.tsx (1 warnings)

src/app.tsx (1)

Line Source
40 const AppRouter = lazy(() => import('components/app-router'))

src/components/app-layout.tsx (1 warnings)

src/components/app-layout.tsx (1)

Line Source
197 void import('@ag-grid-enterprise/core').then(({ LicenseManager }) => {

src/components/general-store-listener.tsx (1 warnings)

src/components/general-store-listener.tsx (1)

Line Source
26 'Files are still uploading. Are you sure you want to leave?'

src/components/grouping (1 warnings)

src/components/grouping/history-grouping-def.tsx (1)

Line Source
53 label: 'Client Matter',

src/error (1 warnings)

src/error/mapper.ts (1)

Line Source
4 const unknownErrorMessage = 'Sorry, something went wrong with your operation'

src/index.tsx (1 warnings)

src/index.tsx (1)

Line Source
27 import('@axe-core/react')

src/statsig (1 warnings)

src/statsig/experiment-parameters.ts (1)

Line Source
11 parameter_a: z.string().catch('default_a'),

src/workers (1 warnings)

src/workers/audio-base64.worker.ts (1)

Line Source
34 error: error instanceof Error ? error.message : 'Unknown error',
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment