@vertesia/ui 1.5.0-dev.20260826.064249Z → 1.5.0-dev.20260901.033115Z

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/lib/core/components/FormItem.d.ts.map +1 -1
  2. package/lib/core/components/FormItem.js +2 -3
  3. package/lib/core/components/FormItem.js.map +1 -1
  4. package/lib/core/components/InfoTip.d.ts +20 -0
  5. package/lib/core/components/InfoTip.d.ts.map +1 -0
  6. package/lib/core/components/InfoTip.js +18 -0
  7. package/lib/core/components/InfoTip.js.map +1 -0
  8. package/lib/core/components/index.d.ts +1 -0
  9. package/lib/core/components/index.d.ts.map +1 -1
  10. package/lib/core/components/index.js +1 -0
  11. package/lib/core/components/index.js.map +1 -1
  12. package/lib/core/components/shadcn/Panel.d.ts.map +1 -1
  13. package/lib/core/components/shadcn/Panel.js +3 -3
  14. package/lib/core/components/shadcn/Panel.js.map +1 -1
  15. package/lib/features/store/objects/search/DocumentSearchContext.d.ts +15 -0
  16. package/lib/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  17. package/lib/features/store/objects/search/DocumentSearchContext.js +45 -2
  18. package/lib/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  19. package/lib/features/store/objects/selection/actions/DeleteObjectsAction.d.ts.map +1 -1
  20. package/lib/features/store/objects/selection/actions/DeleteObjectsAction.js +5 -0
  21. package/lib/features/store/objects/selection/actions/DeleteObjectsAction.js.map +1 -1
  22. package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
  23. package/lib/features/store/types/IntakePolicyEditor.js +1 -1
  24. package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
  25. package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -1
  26. package/lib/features/store/types/IntakePolicyForm.js +15 -15
  27. package/lib/features/store/types/IntakePolicyForm.js.map +1 -1
  28. package/lib/features/store/types/TypeRegistry.d.ts +10 -0
  29. package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
  30. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +10 -0
  31. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
  32. package/lib/i18n/locales/ar.json +35 -0
  33. package/lib/i18n/locales/de.json +35 -0
  34. package/lib/i18n/locales/en.json +35 -0
  35. package/lib/i18n/locales/es.json +35 -0
  36. package/lib/i18n/locales/fr.json +35 -0
  37. package/lib/i18n/locales/it.json +35 -0
  38. package/lib/i18n/locales/ja.json +35 -0
  39. package/lib/i18n/locales/ko.json +35 -0
  40. package/lib/i18n/locales/pt.json +35 -0
  41. package/lib/i18n/locales/ru.json +35 -0
  42. package/lib/i18n/locales/tr.json +35 -0
  43. package/lib/i18n/locales/zh-TW.json +35 -0
  44. package/lib/i18n/locales/zh.json +35 -0
  45. package/lib/router/RouteComponent.d.ts +8 -0
  46. package/lib/router/RouteComponent.d.ts.map +1 -1
  47. package/lib/router/RouteComponent.js +41 -9
  48. package/lib/router/RouteComponent.js.map +1 -1
  49. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  50. package/lib/session/UserSessionProvider.js +12 -13
  51. package/lib/session/UserSessionProvider.js.map +1 -1
  52. package/lib/session/auth/domainRouting.d.ts +11 -0
  53. package/lib/session/auth/domainRouting.d.ts.map +1 -1
  54. package/lib/session/auth/domainRouting.js +13 -0
  55. package/lib/session/auth/domainRouting.js.map +1 -1
  56. package/lib/session/useUXTracking.d.ts.map +1 -1
  57. package/lib/session/useUXTracking.js +6 -1
  58. package/lib/session/useUXTracking.js.map +1 -1
  59. package/lib/vertesia-ui-core.js +199 -4
  60. package/lib/vertesia-ui-core.js.map +1 -1
  61. package/lib/vertesia-ui-features.js +975 -33
  62. package/lib/vertesia-ui-features.js.map +1 -1
  63. package/lib/vertesia-ui-i18n.BJBGsq-8.chunk.js +5 -0
  64. package/lib/vertesia-ui-i18n.BJBGsq-8.chunk.js.map +1 -0
  65. package/lib/vertesia-ui-i18n.BY5YG5cX.chunk.js +5 -0
  66. package/lib/vertesia-ui-i18n.BY5YG5cX.chunk.js.map +1 -0
  67. package/lib/vertesia-ui-i18n.Bd5_1BXO.chunk.js +5 -0
  68. package/lib/vertesia-ui-i18n.Bd5_1BXO.chunk.js.map +1 -0
  69. package/lib/vertesia-ui-i18n.Bvwej2HH.chunk.js +5 -0
  70. package/lib/vertesia-ui-i18n.Bvwej2HH.chunk.js.map +1 -0
  71. package/lib/vertesia-ui-i18n.CMT3f4gf.chunk.js +5 -0
  72. package/lib/vertesia-ui-i18n.CMT3f4gf.chunk.js.map +1 -0
  73. package/lib/vertesia-ui-i18n.D56DNPJW.chunk.js +5 -0
  74. package/lib/vertesia-ui-i18n.D56DNPJW.chunk.js.map +1 -0
  75. package/lib/vertesia-ui-i18n.DDzKLNx6.chunk.js +5 -0
  76. package/lib/vertesia-ui-i18n.DDzKLNx6.chunk.js.map +1 -0
  77. package/lib/vertesia-ui-i18n.D_Am1LpF.chunk.js +5 -0
  78. package/lib/vertesia-ui-i18n.D_Am1LpF.chunk.js.map +1 -0
  79. package/lib/vertesia-ui-i18n.DrZizgGV.chunk.js +5 -0
  80. package/lib/vertesia-ui-i18n.DrZizgGV.chunk.js.map +1 -0
  81. package/lib/vertesia-ui-i18n.DwHsq86z.chunk.js +5 -0
  82. package/lib/vertesia-ui-i18n.DwHsq86z.chunk.js.map +1 -0
  83. package/lib/vertesia-ui-i18n.PLpo0Bbz.chunk.js +5 -0
  84. package/lib/vertesia-ui-i18n.PLpo0Bbz.chunk.js.map +1 -0
  85. package/lib/vertesia-ui-i18n.js +2 -38
  86. package/lib/vertesia-ui-i18n.js.map +1 -1
  87. package/lib/vertesia-ui-i18n.xVbXALqz.chunk.js +5 -0
  88. package/lib/vertesia-ui-i18n.xVbXALqz.chunk.js.map +1 -0
  89. package/lib/vertesia-ui-layout.js +80 -1
  90. package/lib/vertesia-ui-layout.js.map +1 -1
  91. package/lib/vertesia-ui-rich-text.js +278 -4
  92. package/lib/vertesia-ui-rich-text.js.map +1 -1
  93. package/lib/vertesia-ui-router.js +1 -1
  94. package/lib/vertesia-ui-router.js.map +1 -1
  95. package/lib/vertesia-ui-session.js +1 -1
  96. package/lib/vertesia-ui-session.js.map +1 -1
  97. package/lib/vertesia-ui-shell.js +118 -1
  98. package/lib/vertesia-ui-shell.js.map +1 -1
  99. package/lib/vertesia-ui-widgets.js +336 -20
  100. package/lib/vertesia-ui-widgets.js.map +1 -1
  101. package/package.json +7 -7
  102. package/src/core/components/FormItem.tsx +2 -5
  103. package/src/core/components/InfoTip.test.tsx +33 -0
  104. package/src/core/components/InfoTip.tsx +32 -0
  105. package/src/core/components/index.ts +1 -0
  106. package/src/core/components/shadcn/Panel.tsx +3 -7
  107. package/src/features/store/objects/search/DocumentSearchContext.test.ts +45 -0
  108. package/src/features/store/objects/search/DocumentSearchContext.ts +50 -2
  109. package/src/features/store/objects/selection/actions/DeleteObjectsAction.tsx +5 -0
  110. package/src/features/store/types/IntakePolicyEditor.tsx +3 -4
  111. package/src/features/store/types/IntakePolicyForm.tsx +120 -20
  112. package/src/i18n/locales/ar.json +35 -0
  113. package/src/i18n/locales/de.json +35 -0
  114. package/src/i18n/locales/en.json +35 -0
  115. package/src/i18n/locales/es.json +35 -0
  116. package/src/i18n/locales/fr.json +35 -0
  117. package/src/i18n/locales/it.json +35 -0
  118. package/src/i18n/locales/ja.json +35 -0
  119. package/src/i18n/locales/ko.json +35 -0
  120. package/src/i18n/locales/pt.json +35 -0
  121. package/src/i18n/locales/ru.json +35 -0
  122. package/src/i18n/locales/tr.json +35 -0
  123. package/src/i18n/locales/zh-TW.json +35 -0
  124. package/src/i18n/locales/zh.json +35 -0
  125. package/src/router/RouteComponent.test.tsx +139 -0
  126. package/src/router/RouteComponent.tsx +54 -9
  127. package/src/session/UserSessionProvider.tsx +12 -11
  128. package/src/session/auth/domainRouting.test.ts +24 -1
  129. package/src/session/auth/domainRouting.ts +29 -0
  130. package/src/session/useUXTracking.tsx +6 -1
@@ -4,7 +4,17 @@ import type {
4
4
  IntakeVisionDetail,
5
5
  InteractionExecutionConfiguration,
6
6
  } from '@vertesia/common';
7
- import { Button, FormItem, Input, NumberInput, SelectBox, TagsInput, Textarea, VTooltip } from '@vertesia/ui/core';
7
+ import {
8
+ Button,
9
+ FormItem,
10
+ InfoTip,
11
+ Input,
12
+ NumberInput,
13
+ SelectBox,
14
+ TagsInput,
15
+ Textarea,
16
+ VTooltip,
17
+ } from '@vertesia/ui/core';
8
18
  import { useUITranslation } from '@vertesia/ui/i18n';
9
19
  import { Plus, Trash2 } from 'lucide-react';
10
20
  import type { ReactNode } from 'react';
@@ -38,7 +48,10 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
38
48
  if (section === 'overview') {
39
49
  return (
40
50
  <FormSurface>
41
- <FormSection title={t('intakePolicy.section.classification')}>
51
+ <FormSection
52
+ title={t('intakePolicy.section.classification')}
53
+ description={t('intakePolicy.help.section.classification')}
54
+ >
42
55
  <div className="grid gap-4 md:grid-cols-2">
43
56
  <SelectField
44
57
  label={t('intakePolicy.field.mode')}
@@ -65,6 +78,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
65
78
  />
66
79
  <TextAreaField
67
80
  label={t('intakePolicy.field.distinguishFrom')}
81
+ description={t('intakePolicy.help.distinguishFrom')}
68
82
  value={policy.identification?.distinguish_from}
69
83
  onChange={(value) => setValue(['identification', 'distinguish_from'], value)}
70
84
  readonly={readonly}
@@ -86,7 +100,11 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
86
100
  </FormItem>
87
101
  </FormSection>
88
102
 
89
- <FormSection title={t('intakePolicy.section.locate')} last>
103
+ <FormSection
104
+ title={t('intakePolicy.section.locate')}
105
+ description={t('intakePolicy.help.section.locate')}
106
+ last
107
+ >
90
108
  <TextAreaField
91
109
  label={t('intakePolicy.field.locateInstructions')}
92
110
  description={t('intakePolicy.help.locateInstructions')}
@@ -99,6 +117,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
99
117
  <div className="grid gap-4 md:grid-cols-2">
100
118
  <SelectField
101
119
  label={t('intakePolicy.field.contactSheetDetail')}
120
+ description={t('intakePolicy.help.contactSheetDetail')}
102
121
  value={policy.locate?.detail}
103
122
  options={[
104
123
  { value: 8, label: t('intakePolicy.option.pagesPerSheet', { count: 8 }) },
@@ -109,6 +128,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
109
128
  />
110
129
  <NumberField
111
130
  label={t('intakePolicy.field.locateMinPages')}
131
+ description={t('intakePolicy.help.locateMinPages')}
112
132
  value={policy.locate?.min_pages}
113
133
  min={0}
114
134
  onChange={(value) => setValue(['locate', 'min_pages'], value)}
@@ -123,7 +143,10 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
123
143
  if (section === 'conversion') {
124
144
  return (
125
145
  <FormSurface>
126
- <FormSection title={t('intakePolicy.section.conversion')}>
146
+ <FormSection
147
+ title={t('intakePolicy.section.conversion')}
148
+ description={t('intakePolicy.help.section.conversion')}
149
+ >
127
150
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
128
151
  <TriStateField
129
152
  label={t('intakePolicy.field.enabled')}
@@ -133,6 +156,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
133
156
  />
134
157
  <SelectField
135
158
  label={t('intakePolicy.field.method')}
159
+ description={t('intakePolicy.help.method')}
136
160
  value={policy.text_conversion?.method}
137
161
  options={options(t, ['auto', 'basic', 'llm', 'custom'])}
138
162
  onChange={(value) => setValue(['text_conversion', 'method'], value)}
@@ -147,6 +171,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
147
171
  />
148
172
  <SelectField
149
173
  label={t('intakePolicy.field.pageScope')}
174
+ description={t('intakePolicy.help.pageScope')}
150
175
  value={policy.text_conversion?.scope}
151
176
  options={options(t, ['all', 'located'])}
152
177
  onChange={(value) => setValue(['text_conversion', 'scope'], value)}
@@ -154,6 +179,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
154
179
  />
155
180
  <NumberField
156
181
  label={t('intakePolicy.field.renderDpi')}
182
+ description={t('intakePolicy.help.renderDpi')}
157
183
  value={policy.text_conversion?.render_dpi}
158
184
  min={72}
159
185
  onChange={(value) => setValue(['text_conversion', 'render_dpi'], value)}
@@ -168,7 +194,10 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
168
194
  />
169
195
  </FormSection>
170
196
 
171
- <FormSection title={t('intakePolicy.section.conversionModel')}>
197
+ <FormSection
198
+ title={t('intakePolicy.section.conversionModel')}
199
+ description={t('intakePolicy.help.section.conversionModel')}
200
+ >
172
201
  <ModelConfigFields
173
202
  title={t('intakePolicy.field.model')}
174
203
  config={policy.text_conversion?.config}
@@ -178,7 +207,10 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
178
207
  </FormSection>
179
208
 
180
209
  {policy.text_conversion?.method === 'custom' && (
181
- <FormSection title={t('intakePolicy.section.customConversion')}>
210
+ <FormSection
211
+ title={t('intakePolicy.section.customConversion')}
212
+ description={t('intakePolicy.help.section.customConversion')}
213
+ >
182
214
  <div className="grid gap-4 md:grid-cols-2">
183
215
  <InputField
184
216
  label={t('intakePolicy.field.interaction')}
@@ -196,7 +228,11 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
196
228
  </FormSection>
197
229
  )}
198
230
 
199
- <FormSection title={t('intakePolicy.section.pageRanges')} last>
231
+ <FormSection
232
+ title={t('intakePolicy.section.pageRanges')}
233
+ description={t('intakePolicy.help.section.pageRanges')}
234
+ last
235
+ >
200
236
  <PageRangesField
201
237
  value={policy.text_conversion?.page_ranges}
202
238
  onChange={(value) => setValue(['text_conversion', 'page_ranges'], value)}
@@ -210,7 +246,10 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
210
246
  if (section === 'extraction') {
211
247
  return (
212
248
  <FormSurface>
213
- <FormSection title={t('intakePolicy.section.extraction')}>
249
+ <FormSection
250
+ title={t('intakePolicy.section.extraction')}
251
+ description={t('intakePolicy.help.section.extraction')}
252
+ >
214
253
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
215
254
  <TriStateField
216
255
  label={t('intakePolicy.field.enabled')}
@@ -220,6 +259,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
220
259
  />
221
260
  <SelectField
222
261
  label={t('intakePolicy.field.source')}
262
+ description={t('intakePolicy.help.extractionSource')}
223
263
  value={policy.extraction?.source}
224
264
  options={options(t, ['auto', 'text', 'vision', 'mixed'])}
225
265
  onChange={(value) => setValue(['extraction', 'source'], value)}
@@ -227,6 +267,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
227
267
  />
228
268
  <SelectField
229
269
  label={t('intakePolicy.field.pageScope')}
270
+ description={t('intakePolicy.help.pageScope')}
230
271
  value={policy.extraction?.scope}
231
272
  options={options(t, ['all', 'located'])}
232
273
  onChange={(value) => setValue(['extraction', 'scope'], value)}
@@ -234,6 +275,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
234
275
  />
235
276
  <NumberField
236
277
  label={t('intakePolicy.field.maxPages')}
278
+ description={t('intakePolicy.help.extractionMaxPages')}
237
279
  value={policy.extraction?.max_pages}
238
280
  min={1}
239
281
  onChange={(value) => setValue(['extraction', 'max_pages'], value)}
@@ -242,6 +284,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
242
284
  </div>
243
285
  <InputField
244
286
  label={t('intakePolicy.field.interaction')}
287
+ description={t('intakePolicy.help.extractionInteraction')}
245
288
  value={policy.extraction?.interaction}
246
289
  onChange={(value) => setValue(['extraction', 'interaction'], value)}
247
290
  readonly={readonly}
@@ -259,7 +302,10 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
259
302
  />
260
303
  </FormSection>
261
304
 
262
- <FormSection title={t('intakePolicy.section.extractionModel')}>
305
+ <FormSection
306
+ title={t('intakePolicy.section.extractionModel')}
307
+ description={t('intakePolicy.help.section.extractionModel')}
308
+ >
263
309
  <ModelConfigFields
264
310
  title={t('intakePolicy.field.model')}
265
311
  config={policy.extraction?.config}
@@ -268,22 +314,28 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
268
314
  />
269
315
  </FormSection>
270
316
 
271
- <FormSection title={t('intakePolicy.section.visionBudget')}>
317
+ <FormSection
318
+ title={t('intakePolicy.section.visionBudget')}
319
+ description={t('intakePolicy.help.section.visionBudget')}
320
+ >
272
321
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
273
322
  <SelectField
274
323
  label={t('intakePolicy.field.defaultDetail')}
324
+ description={t('intakePolicy.help.visionDetail')}
275
325
  value={policy.extraction?.vision?.default_detail}
276
326
  options={options(t, ['low', 'standard', 'high'])}
277
327
  onChange={(value) => setValue(['extraction', 'vision', 'default_detail'], value)}
278
328
  readonly={readonly}
279
329
  />
280
330
  <VisionDetailsField
331
+ description={t('intakePolicy.help.visionDetail')}
281
332
  value={policy.extraction?.vision?.allowed_details}
282
333
  onChange={(value) => setValue(['extraction', 'vision', 'allowed_details'], value)}
283
334
  readonly={readonly}
284
335
  />
285
336
  <NumberField
286
337
  label={t('intakePolicy.field.maxImageTokens')}
338
+ description={t('intakePolicy.help.maxImageTokens')}
287
339
  value={policy.extraction?.vision?.max_image_tokens}
288
340
  min={1}
289
341
  onChange={(value) => setValue(['extraction', 'vision', 'max_image_tokens'], value)}
@@ -291,6 +343,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
291
343
  />
292
344
  <NumberField
293
345
  label={t('intakePolicy.field.maxPayloadMb')}
346
+ description={t('intakePolicy.help.maxPayloadMb')}
294
347
  value={policy.extraction?.vision?.max_payload_mb}
295
348
  min={1}
296
349
  onChange={(value) => setValue(['extraction', 'vision', 'max_payload_mb'], value)}
@@ -366,7 +419,10 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
366
419
  const review = grounding?.review;
367
420
  return (
368
421
  <FormSurface>
369
- <FormSection title={t('intakePolicy.section.grounding')}>
422
+ <FormSection
423
+ title={t('intakePolicy.section.grounding')}
424
+ description={t('intakePolicy.help.section.grounding')}
425
+ >
370
426
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
371
427
  <TriStateField
372
428
  label={t('intakePolicy.field.enabled')}
@@ -383,6 +439,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
383
439
  />
384
440
  <NumberField
385
441
  label={t('intakePolicy.field.windowPages')}
442
+ description={t('intakePolicy.help.windowPages')}
386
443
  value={grounding?.window_pages}
387
444
  min={1}
388
445
  onChange={(value) => setValue(['extraction', 'grounding', 'window_pages'], value)}
@@ -398,30 +455,35 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
398
455
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
399
456
  <TriStateField
400
457
  label={t('intakePolicy.field.useVision')}
458
+ description={t('intakePolicy.help.useVision')}
401
459
  value={grounding?.use_vision}
402
460
  onChange={(value) => setValue(['extraction', 'grounding', 'use_vision'], value)}
403
461
  readonly={readonly}
404
462
  />
405
463
  <TriStateField
406
464
  label={t('intakePolicy.field.forceOcr')}
465
+ description={t('intakePolicy.help.forceOcr')}
407
466
  value={grounding?.force_ocr}
408
467
  onChange={(value) => setValue(['extraction', 'grounding', 'force_ocr'], value)}
409
468
  readonly={readonly}
410
469
  />
411
470
  <TriStateField
412
471
  label={t('intakePolicy.field.refreshOcr')}
472
+ description={t('intakePolicy.help.refreshOcr')}
413
473
  value={grounding?.refresh_ocr}
414
474
  onChange={(value) => setValue(['extraction', 'grounding', 'refresh_ocr'], value)}
415
475
  readonly={readonly}
416
476
  />
417
477
  <TriStateField
418
478
  label={t('intakePolicy.field.omitBlockBoxes')}
479
+ description={t('intakePolicy.help.omitBlockBoxes')}
419
480
  value={grounding?.omit_block_boxes}
420
481
  onChange={(value) => setValue(['extraction', 'grounding', 'omit_block_boxes'], value)}
421
482
  readonly={readonly}
422
483
  />
423
484
  <TriStateField
424
485
  label={t('intakePolicy.field.updateProperties')}
486
+ description={t('intakePolicy.help.updateProperties')}
425
487
  value={grounding?.update_properties}
426
488
  onChange={(value) => setValue(['extraction', 'grounding', 'update_properties'], value)}
427
489
  readonly={readonly}
@@ -429,7 +491,10 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
429
491
  </div>
430
492
  </FormSection>
431
493
 
432
- <FormSection title={t('intakePolicy.section.models')}>
494
+ <FormSection
495
+ title={t('intakePolicy.section.models')}
496
+ description={t('intakePolicy.help.section.models')}
497
+ >
433
498
  <ModelConfigFields
434
499
  title={t('intakePolicy.field.primaryModel')}
435
500
  config={grounding?.config}
@@ -445,6 +510,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
445
510
  <div className="grid gap-4 md:grid-cols-2">
446
511
  <NumberField
447
512
  label={t('intakePolicy.field.hardnessThreshold')}
513
+ description={t('intakePolicy.help.hardnessThreshold')}
448
514
  value={grounding?.hardness_threshold}
449
515
  min={0}
450
516
  max={1}
@@ -454,6 +520,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
454
520
  />
455
521
  <NumberField
456
522
  label={t('intakePolicy.field.minCitationDensity')}
523
+ description={t('intakePolicy.help.minCitationDensity')}
457
524
  value={grounding?.min_citation_density}
458
525
  min={0}
459
526
  max={1}
@@ -464,7 +531,11 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
464
531
  </div>
465
532
  </FormSection>
466
533
 
467
- <FormSection title={t('intakePolicy.section.review')} last>
534
+ <FormSection
535
+ title={t('intakePolicy.section.review')}
536
+ description={t('intakePolicy.help.section.review')}
537
+ last
538
+ >
468
539
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
469
540
  <TriStateField
470
541
  label={t('intakePolicy.field.enabled')}
@@ -474,6 +545,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
474
545
  />
475
546
  <TriStateField
476
547
  label={t('intakePolicy.field.forceReview')}
548
+ description={t('intakePolicy.help.forceReview')}
477
549
  value={review?.force}
478
550
  onChange={(value) => setValue(['extraction', 'grounding', 'review', 'force'], value)}
479
551
  readonly={readonly}
@@ -489,6 +561,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
489
561
  />
490
562
  <NumberField
491
563
  label={t('intakePolicy.field.coverageThreshold')}
564
+ description={t('intakePolicy.help.coverageThreshold')}
492
565
  value={review?.coverage_threshold}
493
566
  min={0}
494
567
  max={1}
@@ -512,7 +585,10 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
512
585
 
513
586
  return (
514
587
  <FormSurface>
515
- <FormSection title={t('intakePolicy.section.rendering')}>
588
+ <FormSection
589
+ title={t('intakePolicy.section.rendering')}
590
+ description={t('intakePolicy.help.section.rendering')}
591
+ >
516
592
  <TextAreaField
517
593
  label={t('intakePolicy.field.renderingTemplate')}
518
594
  description={t('intakePolicy.help.renderingTemplate')}
@@ -523,7 +599,11 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
523
599
  minLines={8}
524
600
  />
525
601
  </FormSection>
526
- <FormSection title={t('intakePolicy.section.embeddings')} last>
602
+ <FormSection
603
+ title={t('intakePolicy.section.embeddings')}
604
+ description={t('intakePolicy.help.section.embeddings')}
605
+ last
606
+ >
527
607
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
528
608
  <TriStateField
529
609
  label={t('intakePolicy.field.textEmbedding')}
@@ -559,10 +639,24 @@ function FormSurface({ children }: { children: ReactNode }) {
559
639
  return <div className="mx-auto w-full max-w-6xl px-1 py-4">{children}</div>;
560
640
  }
561
641
 
562
- function FormSection({ title, children, last = false }: { title: string; children: ReactNode; last?: boolean }) {
642
+ function FormSection({
643
+ title,
644
+ description,
645
+ children,
646
+ last = false,
647
+ }: {
648
+ title: string;
649
+ /** Tooltip on an Info icon beside the heading. Hover-only, like every `InfoTip`. */
650
+ description?: ReactNode;
651
+ children: ReactNode;
652
+ last?: boolean;
653
+ }) {
563
654
  return (
564
655
  <section className={last ? 'pb-3' : 'mb-6 border-b pb-6'}>
565
- <h3 className="mb-4 text-sm font-semibold">{title}</h3>
656
+ <div className="mb-4 flex items-center gap-2">
657
+ <h3 className="text-sm font-semibold">{title}</h3>
658
+ <InfoTip description={description} />
659
+ </div>
566
660
  <div className="space-y-4">{children}</div>
567
661
  </section>
568
662
  );
@@ -621,6 +715,7 @@ function TextAreaField({
621
715
 
622
716
  function NumberField({
623
717
  label,
718
+ description,
624
719
  value,
625
720
  onChange,
626
721
  readonly,
@@ -629,6 +724,7 @@ function NumberField({
629
724
  step,
630
725
  }: {
631
726
  label: string;
727
+ description?: string;
632
728
  value?: number;
633
729
  onChange: (value: number | undefined) => void;
634
730
  readonly: boolean;
@@ -637,7 +733,7 @@ function NumberField({
637
733
  step?: number;
638
734
  }) {
639
735
  return (
640
- <FormItem label={label}>
736
+ <FormItem label={label} description={description}>
641
737
  <NumberInput
642
738
  value={value}
643
739
  onChange={(value) => onChange(value === undefined || Number.isFinite(value) ? value : undefined)}
@@ -688,11 +784,13 @@ function SelectField<T extends string | number>({
688
784
 
689
785
  function TriStateField({
690
786
  label,
787
+ description,
691
788
  value,
692
789
  onChange,
693
790
  readonly,
694
791
  }: {
695
792
  label: string;
793
+ description?: string;
696
794
  value?: boolean;
697
795
  onChange: (value: boolean | undefined) => void;
698
796
  readonly: boolean;
@@ -705,7 +803,7 @@ function TriStateField({
705
803
  ] as const;
706
804
  const selectedValue = value === undefined ? 'inherit' : value ? 'enabled' : 'disabled';
707
805
  return (
708
- <FormItem label={label}>
806
+ <FormItem label={label} description={description}>
709
807
  <SelectBox
710
808
  options={[...choices]}
711
809
  value={choices.find((option) => option.value === selectedValue)}
@@ -719,10 +817,12 @@ function TriStateField({
719
817
  }
720
818
 
721
819
  function VisionDetailsField({
820
+ description,
722
821
  value,
723
822
  onChange,
724
823
  readonly,
725
824
  }: {
825
+ description?: string;
726
826
  value?: IntakeVisionDetail[];
727
827
  onChange: (value: IntakeVisionDetail[] | undefined) => void;
728
828
  readonly: boolean;
@@ -730,7 +830,7 @@ function VisionDetailsField({
730
830
  const { t } = useUITranslation();
731
831
  const choices = options(t, ['low', 'standard', 'high'] as const);
732
832
  return (
733
- <FormItem label={t('intakePolicy.field.allowedDetails')}>
833
+ <FormItem label={t('intakePolicy.field.allowedDetails')} description={description}>
734
834
  <SelectBox<SelectOption<IntakeVisionDetail>>
735
835
  multiple
736
836
  options={choices}
@@ -1063,20 +1063,55 @@
1063
1063
  "intakePolicy.field.updateProperties": "تحديث الخصائص",
1064
1064
  "intakePolicy.field.useVision": "استخدام الرؤية",
1065
1065
  "intakePolicy.field.windowPages": "الصفحات لكل نافذة",
1066
+ "intakePolicy.help.contactSheetDetail": "عدد الصفحات في ورقة المصغرات. صفحات أقل تعني مصغرات أكبر وأسهل قراءة.",
1067
+ "intakePolicy.help.coverageThreshold": "راجع عندما تنخفض تغطية الاستشهادات في صفحة عن هذا الحد، وهو مؤشر على احتمال إغفال محتوى.",
1066
1068
  "intakePolicy.help.defaultView": "العرض الأولي المفضل لكائنات هذا النوع.",
1069
+ "intakePolicy.help.distinguishFrom": "الأنواع التي يسهل الخلط بينها وبين هذا النوع.",
1067
1070
  "intakePolicy.help.embeddings": "مفاتيح اختيارية حسب النوع لتضمين النص والصورة والخصائص.",
1068
1071
  "intakePolicy.help.examples": "معرّفات كائنات الأمثلة المؤكدة بشرياً لهذا النوع من المحتوى.",
1072
+ "intakePolicy.help.extractionInteraction": "استبدل المستخرج المدمج بتفاعلك الخاص.",
1073
+ "intakePolicy.help.extractionMaxPages": "حد أقصى لعدد الصفحات التي تصل إلى الاستخراج.",
1069
1074
  "intakePolicy.help.extractionSource": "اختر أدلة نصية أو مرئية أو مجمعة للاستخراج.",
1075
+ "intakePolicy.help.forceOcr": "تطبيق OCR على كل صفحة، حتى الصفحات التي تحتوي طبقة نص.",
1076
+ "intakePolicy.help.forceReview": "راجع كل مستند مهما كانت درجة صعوبته.",
1070
1077
  "intakePolicy.help.grounding": "أنشئ استشهادات على مستوى الكتلة وأدلة مشروحة لاستخراج الخصائص.",
1078
+ "intakePolicy.help.hardnessThreshold": "الدرجة التي يتولى عندها نموذج المحتوى الصعب المهمة.",
1071
1079
  "intakePolicy.help.identification": "إرشادات اختيار النوع تلقائياً قبل الاستخراج.",
1072
1080
  "intakePolicy.help.identificationGuidance": "صف نوع المحتوى هذا ومتى يجب اختياره.",
1073
1081
  "intakePolicy.help.locateInstructions": "فعّل هذا لتحديد الصفحات ذات الصلة قبل التحويل والاستخراج.",
1082
+ "intakePolicy.help.locateMinPages": "يُتخطى تحديد الصفحات في المستندات الأقصر من ذلك.",
1083
+ "intakePolicy.help.maxImageTokens": "الميزانية التي تقيّد فعليًا: تقدير رموز الصورة لكل استدعاء.",
1084
+ "intakePolicy.help.maxPayloadMb": "حد للنقل، وليس إعداد جودة.",
1085
+ "intakePolicy.help.method": "ما إذا كان النص يأتي من التحليل المدمج أو من نموذج أو من تفاعلك الخاص.",
1086
+ "intakePolicy.help.minCitationDensity": "إذا قلّت الاستشهادات لكل قيمة مستخرجة، تُعاد المحاولة.",
1074
1087
  "intakePolicy.help.mode": "الإدخال البرمجي هو الافتراضي؛ يفوض الإدخال الوكيلي التنسيق إلى وكيل.",
1088
+ "intakePolicy.help.omitBlockBoxes": "إزالة إطارات الكتل من الموجّه. آمن فقط عند تفعيل استخدام الرؤية.",
1075
1089
  "intakePolicy.help.pageRanges": "صفحتا البداية والنهاية مشمولتان. تُحسب القيم السالبة من نهاية المستند.",
1090
+ "intakePolicy.help.pageScope": "كل الصفحات، أو الصفحات التي حددها المحدد فقط.",
1091
+ "intakePolicy.help.refreshOcr": "إعادة تشغيل OCR بدلاً من استخدام النتيجة المخزّنة.",
1092
+ "intakePolicy.help.renderDpi": "الدقة التي تُعرض بها كل صفحة للنموذج. القيمة 150 تناسب معظم الحالات؛ ارفعها فقط مع الخط الدقيق جدًا.",
1076
1093
  "intakePolicy.help.renderingTemplate": "قالب Handlebars لتحويل الخصائص المستخرجة إلى نص الكائن.",
1077
1094
  "intakePolicy.help.review": "مراجعة اختيارية بالنموذج للصفحات الصعبة أو منخفضة التغطية.",
1095
+ "intakePolicy.help.section.classification": "كيف يتعرّف Vertesia على هذا النوع، وكيف تُفتح كائناته افتراضيًا.",
1096
+ "intakePolicy.help.section.conversion": "يحوّل الملف المصدر إلى نص قابل للقراءة قبل استخراج أي شيء.",
1097
+ "intakePolicy.help.section.conversionModel": "النموذج الذي يحوّل الصفحات إلى نص. غالبًا أرخص من نموذج الاستخراج.",
1098
+ "intakePolicy.help.section.customConversion": "تفاعلك الخاص أو وكيلك بدلًا من المحوّل المدمج.",
1099
+ "intakePolicy.help.section.embeddings": "ما تتم فهرسته للبحث، وما إذا كانت قائمة محتويات ستُنشأ.",
1100
+ "intakePolicy.help.section.extraction": "كيف تُعبَّأ خصائص مخطط هذا النوع من المستندات.",
1101
+ "intakePolicy.help.section.extractionModel": "النموذج الذي يقرأ المستند ويعبّئ الخصائص.",
1102
+ "intakePolicy.help.section.grounding": "يربط كل قيمة مستخرجة بالكتلة أو الموضع المرئي في الصفحة التي جاءت منها.",
1103
+ "intakePolicy.help.section.locate": "مسح بصري سريع يحدّد الصفحات المهمة قبل بدء العمل الفعلي.",
1104
+ "intakePolicy.help.section.models": "النموذج المستخدم بحسب صعوبة قراءة صفحات المستند.",
1105
+ "intakePolicy.help.section.pageRanges": "صفحات ثابتة للتحويل. لها الأولوية على نطاق الصفحات؛ وتُحسب القيم السالبة من النهاية.",
1106
+ "intakePolicy.help.section.rendering": "القالب الذي يحوّل الخصائص المستخرجة إلى نص الكائن.",
1107
+ "intakePolicy.help.section.review": "تمريرة إضافية على الصفحات قليلة الاستشهاد أو الصعبة القراءة.",
1108
+ "intakePolicy.help.section.visionBudget": "مقدار صور الصفحات الذي يمكن أن يحمله استدعاء استخراج واحد.",
1078
1109
  "intakePolicy.help.textConversion": "يتحكم في إنشاء Markdown أو النص قبل الاستخراج والتضمين.",
1079
1110
  "intakePolicy.help.title": "دليل الحقول",
1111
+ "intakePolicy.help.updateProperties": "كتابة النتائج المسنَدة في خصائص الكائن.",
1112
+ "intakePolicy.help.useVision": "إرسال صور الصفحات المشروحة مع النص.",
1113
+ "intakePolicy.help.visionDetail": "ملفات تعريف جودة الصورة المتاحة لهذا النوع. تحدد المنصة الملفات نفسها.",
1114
+ "intakePolicy.help.windowPages": "عدد الصفحات في استدعاء إسناد واحد قبل التقسيم.",
1080
1115
  "intakePolicy.option.agentic": "وكيلي",
1081
1116
  "intakePolicy.option.all": "كل الصفحات",
1082
1117
  "intakePolicy.option.auto": "تلقائي",
@@ -1019,20 +1019,55 @@
1019
1019
  "intakePolicy.field.updateProperties": "Eigenschaften aktualisieren",
1020
1020
  "intakePolicy.field.useVision": "Vision verwenden",
1021
1021
  "intakePolicy.field.windowPages": "Seiten pro Fenster",
1022
+ "intakePolicy.help.contactSheetDetail": "Seiten pro Miniaturbogen. Weniger Seiten bedeuten größere, besser lesbare Kacheln.",
1023
+ "intakePolicy.help.coverageThreshold": "Prüfen, wenn die Zitatabdeckung einer Seite darunter fällt — ein Hinweis, dass Inhalt übersehen worden sein könnte.",
1022
1024
  "intakePolicy.help.defaultView": "Bevorzugte erste Ansicht für Objekte dieses Typs.",
1025
+ "intakePolicy.help.distinguishFrom": "Typen, mit denen dieser leicht verwechselt wird.",
1023
1026
  "intakePolicy.help.embeddings": "Optionale typspezifische Schalter für Text-, Bild- und Eigenschaften-Embeddings.",
1024
1027
  "intakePolicy.help.examples": "Objekt-IDs von menschlich bestätigten Beispielen dieses Inhaltstyps.",
1028
+ "intakePolicy.help.extractionInteraction": "Ersetzen Sie den integrierten Extraktor durch Ihre eigene Interaktion.",
1029
+ "intakePolicy.help.extractionMaxPages": "Obergrenze für die Anzahl der Seiten, die zur Extraktion gelangen.",
1025
1030
  "intakePolicy.help.extractionSource": "Wählt Text-, Bild- oder kombinierte Belege für die Extraktion.",
1031
+ "intakePolicy.help.forceOcr": "Jede Seite per OCR lesen, auch Seiten mit vorhandener Textebene.",
1032
+ "intakePolicy.help.forceReview": "Jedes Dokument prüfen, unabhängig vom Schwierigkeitswert.",
1026
1033
  "intakePolicy.help.grounding": "Erstellt Zitate auf Blockebene und kommentierte Belege für die Eigenschaftsextraktion.",
1034
+ "intakePolicy.help.hardnessThreshold": "Ab diesem Wert übernimmt das Modell für schwierige Inhalte.",
1027
1035
  "intakePolicy.help.identification": "Hinweise zur automatischen Typauswahl vor der Extraktion.",
1028
1036
  "intakePolicy.help.identificationGuidance": "Beschreiben Sie diesen Inhaltstyp und wann er ausgewählt werden soll.",
1029
1037
  "intakePolicy.help.locateInstructions": "Damit werden relevante Seiten vor Konvertierung und Extraktion ermittelt.",
1038
+ "intakePolicy.help.locateMinPages": "Bei kürzeren Dokumenten wird die Seitensuche übersprungen.",
1039
+ "intakePolicy.help.maxImageTokens": "Das tatsächlich bindende Budget: geschätzte Bild-Tokens pro Aufruf.",
1040
+ "intakePolicy.help.maxPayloadMb": "Eine Transportgrenze, keine Qualitätseinstellung.",
1041
+ "intakePolicy.help.method": "Ob der Text aus der integrierten Analyse, einem Modell oder Ihrer eigenen Interaktion stammt.",
1042
+ "intakePolicy.help.minCitationDensity": "Zu wenige Zitate je extrahiertem Wert, und der Durchlauf wird wiederholt.",
1030
1043
  "intakePolicy.help.mode": "Programmatische Aufnahme ist Standard; agentische Aufnahme delegiert die Orchestrierung an einen Agenten.",
1044
+ "intakePolicy.help.omitBlockBoxes": "Blockrahmen aus dem Prompt entfernen. Nur mit aktivierter Vision sinnvoll.",
1031
1045
  "intakePolicy.help.pageRanges": "Start- und Endseite einschließlich. Negative Werte zählen vom Dokumentende.",
1046
+ "intakePolicy.help.pageScope": "Alle Seiten oder nur die vom Finder ausgewählten.",
1047
+ "intakePolicy.help.refreshOcr": "OCR neu ausführen, statt gespeicherte OCR-Ergebnisse zu verwenden.",
1048
+ "intakePolicy.help.renderDpi": "Auflösung, mit der jede Seite für das Modell gerendert wird. 150 passt fast immer; erhöhen Sie den Wert nur bei sehr kleiner Schrift.",
1032
1049
  "intakePolicy.help.renderingTemplate": "Handlebars-Vorlage, die extrahierte Eigenschaften als Objekttext materialisiert.",
1033
1050
  "intakePolicy.help.review": "Optionale Modellprüfung für schwierige Seiten oder geringe Abdeckung.",
1051
+ "intakePolicy.help.section.classification": "Wie Vertesia diesen Typ erkennt und wie seine Objekte standardmäßig geöffnet werden.",
1052
+ "intakePolicy.help.section.conversion": "Wandelt die Quelldatei in lesbaren Text um, bevor irgendetwas extrahiert wird.",
1053
+ "intakePolicy.help.section.conversionModel": "Modell für die Umwandlung von Seiten in Text. Oft günstiger als das der Extraktion.",
1054
+ "intakePolicy.help.section.customConversion": "Ihre eigene Interaktion oder ein Agent anstelle des integrierten Konverters.",
1055
+ "intakePolicy.help.section.embeddings": "Was für die Suche indexiert wird und ob ein Inhaltsverzeichnis entsteht.",
1056
+ "intakePolicy.help.section.extraction": "Wie die Schema-Eigenschaften dieses Typs aus den Dokumenten befüllt werden.",
1057
+ "intakePolicy.help.section.extractionModel": "Modell, das das Dokument liest und die Eigenschaften befüllt.",
1058
+ "intakePolicy.help.section.grounding": "Verknüpft jeden extrahierten Wert mit dem Block oder der visuellen Stelle der Seite, aus der er stammt.",
1059
+ "intakePolicy.help.section.locate": "Ein günstiger visueller Überblick, der vor der eigentlichen Arbeit die wichtigen Seiten findet.",
1060
+ "intakePolicy.help.section.models": "Welches Modell verwendet wird, je nachdem wie schwer die Dokumentseiten zu lesen sind.",
1061
+ "intakePolicy.help.section.pageRanges": "Feste Seiten für die Konvertierung. Hat Vorrang vor dem Seitenumfang; negative Werte zählen vom Ende.",
1062
+ "intakePolicy.help.section.rendering": "Die Vorlage, die extrahierte Eigenschaften in den Textkörper des Objekts umwandelt.",
1063
+ "intakePolicy.help.section.review": "Ein zusätzlicher Durchgang über Seiten mit wenigen Zitaten oder schwer lesbarem Inhalt.",
1064
+ "intakePolicy.help.section.visionBudget": "Wie viel Seitenbildmaterial ein Extraktionsaufruf mitführen darf.",
1034
1065
  "intakePolicy.help.textConversion": "Steuert die Markdown- oder Texterzeugung vor Extraktion und Embedding.",
1035
1066
  "intakePolicy.help.title": "Feldleitfaden",
1067
+ "intakePolicy.help.updateProperties": "Belegte Ergebnisse zurück in die Eigenschaften des Objekts schreiben.",
1068
+ "intakePolicy.help.useVision": "Kommentierte Seitenbilder zusammen mit dem Text senden.",
1069
+ "intakePolicy.help.visionDetail": "Bildqualitätsprofile, die dieser Typ verwenden darf. Die Profile selbst gibt die Plattform vor.",
1070
+ "intakePolicy.help.windowPages": "Wie viele Seiten ein Beleg-Aufruf umfasst, bevor er aufgeteilt wird.",
1036
1071
  "intakePolicy.option.agentic": "Agentisch",
1037
1072
  "intakePolicy.option.all": "Alle Seiten",
1038
1073
  "intakePolicy.option.auto": "Automatisch",
@@ -506,20 +506,55 @@
506
506
  "intakePolicy.field.updateProperties": "Update properties",
507
507
  "intakePolicy.field.useVision": "Use vision",
508
508
  "intakePolicy.field.windowPages": "Pages per window",
509
+ "intakePolicy.help.contactSheetDetail": "Pages per thumbnail sheet. Fewer pages means bigger, more readable tiles.",
510
+ "intakePolicy.help.coverageThreshold": "Review when a page's citation coverage drops below this, a sign content may have been missed.",
509
511
  "intakePolicy.help.defaultView": "Preferred first view for objects of this type.",
512
+ "intakePolicy.help.distinguishFrom": "Types this one is easily confused with.",
510
513
  "intakePolicy.help.embeddings": "Optional per-type text, image, and properties embedding switches.",
511
514
  "intakePolicy.help.examples": "Object IDs of human-confirmed examples for this content type.",
515
+ "intakePolicy.help.extractionInteraction": "Replace the built-in extractor with your own interaction.",
516
+ "intakePolicy.help.extractionMaxPages": "Cap on how many pages reach extraction.",
512
517
  "intakePolicy.help.extractionSource": "Selects text, visual, or combined evidence for extraction.",
518
+ "intakePolicy.help.forceOcr": "OCR every page, even ones that already have a text layer.",
519
+ "intakePolicy.help.forceReview": "Review every document, whatever its hardness score.",
513
520
  "intakePolicy.help.grounding": "Creates block-level citations and annotated proof for property extraction.",
521
+ "intakePolicy.help.hardnessThreshold": "Score at or above which the hard-content model takes over.",
514
522
  "intakePolicy.help.identification": "Guidance for automatic type selection before extraction.",
515
523
  "intakePolicy.help.identificationGuidance": "Describe what this content type is and when it should be selected.",
516
524
  "intakePolicy.help.locateInstructions": "Set this to identify relevant pages before conversion and extraction.",
525
+ "intakePolicy.help.locateMinPages": "Skip the locate pass on documents shorter than this.",
526
+ "intakePolicy.help.maxImageTokens": "The budget that actually binds — estimated image tokens per call.",
527
+ "intakePolicy.help.maxPayloadMb": "A transport guard, not a quality setting.",
528
+ "intakePolicy.help.method": "Whether the text comes from built-in parsing, a model, or your own interaction.",
529
+ "intakePolicy.help.minCitationDensity": "Too few citations per extracted value and the pass retries.",
517
530
  "intakePolicy.help.mode": "Programmatic intake is the default; agentic intake delegates orchestration to an agent.",
531
+ "intakePolicy.help.omitBlockBoxes": "Drop block outlines from the prompt. Only safe with Use vision on.",
518
532
  "intakePolicy.help.pageRanges": "Inclusive start and end pages. Negative values count from the end of the document.",
533
+ "intakePolicy.help.pageScope": "Every page, or only the ones the locator picked.",
534
+ "intakePolicy.help.refreshOcr": "Re-run OCR instead of reusing stored OCR output.",
535
+ "intakePolicy.help.renderDpi": "Resolution each page is rendered at for the model. 150 suits almost everything; raise it only for very fine print.",
519
536
  "intakePolicy.help.renderingTemplate": "Handlebars template used to materialize extracted properties into object text.",
520
537
  "intakePolicy.help.review": "Optional model review for hard or low-coverage pages.",
538
+ "intakePolicy.help.section.classification": "How Vertesia recognizes this type, and how objects of it open by default.",
539
+ "intakePolicy.help.section.conversion": "Turns the source file into readable text, before anything is extracted.",
540
+ "intakePolicy.help.section.conversionModel": "Which model does the page-to-text pass. Often a cheaper one than extraction.",
541
+ "intakePolicy.help.section.customConversion": "Your own interaction or agent, in place of the built-in converter.",
542
+ "intakePolicy.help.section.embeddings": "What gets indexed for search, and whether a contents list is built.",
543
+ "intakePolicy.help.section.extraction": "How the type's schema properties are filled in from the documents.",
544
+ "intakePolicy.help.section.extractionModel": "Which model reads the document and fills in the properties.",
545
+ "intakePolicy.help.section.grounding": "Ties every extracted value back to the block or visual location on the page it came from.",
546
+ "intakePolicy.help.section.locate": "A cheap visual scan that picks out which pages matter, before the real work starts.",
547
+ "intakePolicy.help.section.models": "The model to use based on how hard document pages are to read.",
548
+ "intakePolicy.help.section.pageRanges": "Fixed pages to convert. Overrides Page scope when set; negative numbers count back from the end.",
549
+ "intakePolicy.help.section.rendering": "The template that turns extracted properties into the object's text body.",
550
+ "intakePolicy.help.section.review": "An extra pass over pages that came back as thinly cited or hard to read.",
551
+ "intakePolicy.help.section.visionBudget": "How much page imagery one extraction call is allowed to carry.",
521
552
  "intakePolicy.help.textConversion": "Controls markdown or text generation before extraction and embedding.",
522
553
  "intakePolicy.help.title": "Field Guide",
554
+ "intakePolicy.help.updateProperties": "Write grounded results back onto the object's properties.",
555
+ "intakePolicy.help.useVision": "Send annotated page images along with the text.",
556
+ "intakePolicy.help.visionDetail": "Image quality profiles this type may use. The profiles themselves are set by the platform.",
557
+ "intakePolicy.help.windowPages": "How many pages go into one grounding call before it splits.",
523
558
  "intakePolicy.option.agentic": "Agentic",
524
559
  "intakePolicy.option.all": "All pages",
525
560
  "intakePolicy.option.auto": "Automatic",