@semiont/react-ui 0.5.27 → 0.5.29

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 (192) hide show
  1. package/README.md +3 -3
  2. package/dist/{PdfAnnotationCanvas.client-EVUPTUWZ.js → PdfAnnotationCanvas.client-LSH3PZPY.js} +32 -5
  3. package/dist/{ar-OU3DQGC6.js → ar-AZBRADEB.js} +43 -23
  4. package/dist/{bn-PHWCR6AZ.js → bn-CCEW6AOS.js} +43 -23
  5. package/dist/{chunk-VXASXU4K.js → chunk-3ZBKCWUZ.js} +1 -1
  6. package/dist/{chunk-5VDTWRXJ.js → chunk-G4VHL4UA.js} +31 -31
  7. package/dist/{chunk-PCRRBU7H.js → chunk-SDKFZLEX.js} +43 -23
  8. package/dist/{cs-NEXYZ62I.js → cs-HXPF2CTE.js} +43 -23
  9. package/dist/{da-FAT43YCU.js → da-K5NTK7LH.js} +43 -23
  10. package/dist/{de-KRQ3WBCU.js → de-GMRQEDZI.js} +43 -23
  11. package/dist/{el-Q4IU3EKC.js → el-EUB4CI4G.js} +43 -23
  12. package/dist/{en-2KADE7N4.js → en-R5XA26NF.js} +2 -2
  13. package/dist/{es-2IO3R2MK.js → es-Z32DAZ6W.js} +43 -23
  14. package/dist/{fa-Q5GOQFXX.js → fa-G7HN6B32.js} +43 -23
  15. package/dist/{fi-R6NMRWBE.js → fi-3YBLZO7I.js} +43 -23
  16. package/dist/{fr-QY4D5E6J.js → fr-VUBH7BBS.js} +43 -23
  17. package/dist/{he-X6Y77XHY.js → he-WQQEY26B.js} +43 -23
  18. package/dist/{hi-XL7IOEQM.js → hi-HJZ6W4JB.js} +43 -23
  19. package/dist/{id-QZ4ZZS67.js → id-ZOGZ37MI.js} +43 -23
  20. package/dist/index.css +279 -74
  21. package/dist/index.d.ts +318 -393
  22. package/dist/index.js +2619 -2687
  23. package/dist/{it-ME2Q7OB6.js → it-DT6UW66F.js} +43 -23
  24. package/dist/{ja-HX7QASRI.js → ja-RUKQCOLO.js} +43 -23
  25. package/dist/{ko-EQO5AHAV.js → ko-ZH5ADKZM.js} +43 -23
  26. package/dist/{ms-UILFSF3I.js → ms-Y2AFPZTU.js} +43 -23
  27. package/dist/{nl-NNI45PMK.js → nl-OQEWIXNA.js} +43 -23
  28. package/dist/{no-MAL5F6P6.js → no-KPAYJZWY.js} +43 -23
  29. package/dist/{pl-4RMY6JAJ.js → pl-WSXK2UUD.js} +43 -23
  30. package/dist/{pt-VQH2X3QQ.js → pt-NWRJRUCK.js} +43 -23
  31. package/dist/{ro-XXCQO2OG.js → ro-3CGVMOC6.js} +43 -23
  32. package/dist/{sv-7Z6EJ6U4.js → sv-HGSEBA7S.js} +43 -23
  33. package/dist/test-utils.js +16 -7
  34. package/dist/{th-L3DXXYVQ.js → th-NZ4G352Z.js} +43 -23
  35. package/dist/{tr-P3DFVLFJ.js → tr-LGGS4DLW.js} +43 -23
  36. package/dist/{uk-7C5D3PXS.js → uk-AIX536L4.js} +43 -23
  37. package/dist/{vi-ZLTLEO7P.js → vi-V6CVQZLQ.js} +43 -23
  38. package/dist/{zh-5FHVWDIN.js → zh-AGKPGI3L.js} +43 -23
  39. package/package.json +16 -15
  40. package/src/components/AssistProgress.tsx +36 -2
  41. package/src/components/CodeMirrorRenderer.tsx +8 -8
  42. package/src/components/StatusDisplay.tsx +13 -13
  43. package/src/components/__tests__/AssistProgress.test.tsx +59 -0
  44. package/src/components/__tests__/StatusDisplay.test.tsx +9 -9
  45. package/src/components/modals/ComposeStep.tsx +233 -0
  46. package/src/components/modals/ConfigureGatherStep.tsx +10 -18
  47. package/src/components/modals/ConfigureGenerationStep.tsx +178 -34
  48. package/src/components/modals/ConfigureSearchStep.tsx +19 -0
  49. package/src/components/modals/ContextSummary.tsx +185 -72
  50. package/src/components/modals/CorpusPane.tsx +75 -0
  51. package/src/components/modals/DiscardPrompt.tsx +38 -0
  52. package/src/components/modals/GatherContextStep.tsx +237 -107
  53. package/src/components/modals/ReferenceWizardModal.tsx +252 -59
  54. package/src/components/modals/ResourceGenerateModal.tsx +225 -112
  55. package/src/components/modals/SearchModal.css +337 -101
  56. package/src/components/modals/SearchResultsStep.tsx +61 -68
  57. package/src/components/modals/WizardFooter.tsx +7 -1
  58. package/src/components/modals/__tests__/ComposeStep.test.tsx +152 -0
  59. package/src/components/modals/__tests__/ConfigureGatherStep.test.tsx +14 -26
  60. package/src/components/modals/__tests__/ConfigureGenerationStep.test.tsx +206 -8
  61. package/src/components/modals/__tests__/ConfigureSearchStep.test.tsx +24 -1
  62. package/src/components/modals/__tests__/GatherContextStep.resource.test.tsx +463 -25
  63. package/src/components/modals/__tests__/ReferenceWizardModal.test.tsx +442 -39
  64. package/src/components/modals/__tests__/ResourceGenerateModal.test.tsx +300 -86
  65. package/src/components/modals/__tests__/SearchResultsStep.test.tsx +61 -0
  66. package/src/components/modals/__tests__/WizardFooter.test.tsx +116 -9
  67. package/src/components/pdf-annotation/PdfAnnotationCanvas.tsx +34 -1
  68. package/src/components/pdf-annotation/__tests__/PdfAnnotationCanvas.test.tsx +38 -1
  69. package/src/components/resource/AnnotateView.tsx +3 -3
  70. package/src/components/resource/BrowseView.tsx +8 -8
  71. package/src/components/resource/DownloadFileLink.tsx +1 -1
  72. package/src/components/resource/ResourceViewer.tsx +4 -4
  73. package/src/components/resource/__tests__/AnnotateView.embeddable.test.tsx +1 -1
  74. package/src/components/resource/__tests__/BrowseView.embeddable.test.tsx +1 -1
  75. package/src/components/resource/__tests__/BrowseView.reference-hover.test.tsx +1 -1
  76. package/src/components/resource/__tests__/BrowseView.test.tsx +11 -11
  77. package/src/components/resource/__tests__/download-link.test.tsx +6 -6
  78. package/src/components/resource/annotate-renderers.tsx +3 -3
  79. package/src/components/resource/panels/AssistSection.css +35 -0
  80. package/src/components/resource/panels/ReferenceEntry.tsx +11 -4
  81. package/src/components/resource/panels/ReferencesPanel.tsx +9 -1
  82. package/src/components/resource/panels/ResourceInfoPanel.tsx +89 -20
  83. package/src/components/resource/panels/UnifiedAnnotationsPanel.tsx +7 -2
  84. package/src/components/resource/panels/__tests__/ReferenceEntry.test.tsx +41 -0
  85. package/src/components/resource/panels/__tests__/ReferencesPanel.observable-flow.test.tsx +1 -1
  86. package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +84 -3
  87. package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +149 -7
  88. package/src/features/auth/__tests__/SignInForm.a11y.test.tsx +12 -12
  89. package/src/features/auth/components/SignInForm.tsx +53 -53
  90. package/src/features/auth-welcome/state/__tests__/welcome-state-unit.test.ts +2 -2
  91. package/src/features/resource-compose/__tests__/ResourceComposePage.test.tsx +0 -65
  92. package/src/features/resource-compose/components/ResourceComposePage.tsx +35 -133
  93. package/src/features/resource-compose/state/__tests__/compose-page-state-unit.test.ts +1 -100
  94. package/src/features/resource-compose/state/compose-page-state-unit.ts +5 -57
  95. package/src/features/resource-discovery/__tests__/ResourceDiscoveryPage.test.tsx +1 -1
  96. package/src/features/resource-discovery/components/ResourceDiscoveryPage.tsx +2 -2
  97. package/src/features/resource-discovery/state/discover-state-unit.ts +1 -1
  98. package/src/features/resource-viewer/__tests__/ResourceViewerPage.test.tsx +73 -17
  99. package/src/features/resource-viewer/__tests__/generation-options.test.ts +53 -0
  100. package/src/features/resource-viewer/components/ResourceViewerPage.tsx +148 -83
  101. package/src/features/resource-viewer/generation-options.ts +29 -0
  102. package/src/styles/core/forms.css +35 -8
  103. package/src/styles/features/resource-viewer.css +0 -22
  104. package/src/styles/features/resource.css +0 -4
  105. package/src/styles/index.css +0 -1
  106. package/translations/ar.json +42 -22
  107. package/translations/bn.json +42 -22
  108. package/translations/cs.json +42 -22
  109. package/translations/da.json +42 -22
  110. package/translations/de.json +42 -22
  111. package/translations/el.json +42 -22
  112. package/translations/en.json +42 -22
  113. package/translations/es.json +42 -22
  114. package/translations/fa.json +42 -22
  115. package/translations/fi.json +42 -22
  116. package/translations/fr.json +42 -22
  117. package/translations/he.json +42 -22
  118. package/translations/hi.json +42 -22
  119. package/translations/id.json +42 -22
  120. package/translations/it.json +42 -22
  121. package/translations/ja.json +42 -22
  122. package/translations/ko.json +42 -22
  123. package/translations/ms.json +42 -22
  124. package/translations/nl.json +42 -22
  125. package/translations/no.json +42 -22
  126. package/translations/pl.json +42 -22
  127. package/translations/pt.json +42 -22
  128. package/translations/ro.json +42 -22
  129. package/translations/sv.json +42 -22
  130. package/translations/th.json +42 -22
  131. package/translations/tr.json +42 -22
  132. package/translations/uk.json +42 -22
  133. package/translations/vi.json +42 -22
  134. package/translations/zh.json +42 -22
  135. package/dist/PdfAnnotationCanvas.client-EVUPTUWZ.js.map +0 -1
  136. package/dist/PdfAnnotationCanvas.client-TGDPPGXJ.css.map +0 -1
  137. package/dist/ar-OU3DQGC6.js.map +0 -1
  138. package/dist/bn-PHWCR6AZ.js.map +0 -1
  139. package/dist/chunk-5VDTWRXJ.js.map +0 -1
  140. package/dist/chunk-BTUG3VJJ.js.map +0 -1
  141. package/dist/chunk-O23TLLXW.js.map +0 -1
  142. package/dist/chunk-PCRRBU7H.js.map +0 -1
  143. package/dist/chunk-QT7LYM72.js.map +0 -1
  144. package/dist/chunk-VXASXU4K.js.map +0 -1
  145. package/dist/cs-NEXYZ62I.js.map +0 -1
  146. package/dist/da-FAT43YCU.js.map +0 -1
  147. package/dist/de-KRQ3WBCU.js.map +0 -1
  148. package/dist/el-Q4IU3EKC.js.map +0 -1
  149. package/dist/en-2KADE7N4.js.map +0 -1
  150. package/dist/es-2IO3R2MK.js.map +0 -1
  151. package/dist/fa-Q5GOQFXX.js.map +0 -1
  152. package/dist/fi-R6NMRWBE.js.map +0 -1
  153. package/dist/fr-QY4D5E6J.js.map +0 -1
  154. package/dist/he-X6Y77XHY.js.map +0 -1
  155. package/dist/hi-XL7IOEQM.js.map +0 -1
  156. package/dist/id-QZ4ZZS67.js.map +0 -1
  157. package/dist/index.css.map +0 -1
  158. package/dist/index.js.map +0 -1
  159. package/dist/integrations/css-modules-helper.js.map +0 -1
  160. package/dist/integrations/styled-components-theme.js.map +0 -1
  161. package/dist/it-ME2Q7OB6.js.map +0 -1
  162. package/dist/ja-HX7QASRI.js.map +0 -1
  163. package/dist/ko-EQO5AHAV.js.map +0 -1
  164. package/dist/ms-UILFSF3I.js.map +0 -1
  165. package/dist/nl-NNI45PMK.js.map +0 -1
  166. package/dist/no-MAL5F6P6.js.map +0 -1
  167. package/dist/pl-4RMY6JAJ.js.map +0 -1
  168. package/dist/pt-VQH2X3QQ.js.map +0 -1
  169. package/dist/ro-XXCQO2OG.js.map +0 -1
  170. package/dist/sv-7Z6EJ6U4.js.map +0 -1
  171. package/dist/test-utils.css.map +0 -1
  172. package/dist/test-utils.js.map +0 -1
  173. package/dist/th-L3DXXYVQ.js.map +0 -1
  174. package/dist/tr-P3DFVLFJ.js.map +0 -1
  175. package/dist/uk-7C5D3PXS.js.map +0 -1
  176. package/dist/vi-ZLTLEO7P.js.map +0 -1
  177. package/dist/zh-5FHVWDIN.js.map +0 -1
  178. package/src/components/modals/ResourceSearchModal.tsx +0 -224
  179. package/src/components/modals/__tests__/ResourceSearchModal.test.tsx +0 -163
  180. package/src/features/admin-exchange/__tests__/AdminExchangePage.test.tsx +0 -137
  181. package/src/features/admin-exchange/__tests__/ExportCard.test.tsx +0 -41
  182. package/src/features/admin-exchange/__tests__/ImportCard.test.tsx +0 -148
  183. package/src/features/admin-exchange/__tests__/ImportProgress.test.tsx +0 -117
  184. package/src/features/admin-exchange/components/AdminExchangePage.tsx +0 -117
  185. package/src/features/admin-exchange/components/ExportCard.tsx +0 -35
  186. package/src/features/admin-exchange/components/ImportCard.tsx +0 -183
  187. package/src/features/admin-exchange/components/ImportProgress.tsx +0 -80
  188. package/src/features/admin-exchange/state/__tests__/exchange-state-unit.test.ts +0 -185
  189. package/src/features/admin-exchange/state/exchange-state-unit.ts +0 -133
  190. package/src/features/moderation-linked-data/__tests__/LinkedDataPage.test.tsx +0 -118
  191. package/src/features/moderation-linked-data/components/LinkedDataPage.tsx +0 -118
  192. package/src/styles/features/exchange.css +0 -374
@@ -13,6 +13,8 @@ var AssistProgress = {
13
13
  codeCompleteCreated: "\u0110\xE3 t\u1EA1o {{count}} {{kind}}",
14
14
  codeGeneratingResource: "\u0110ang t\u1EA1o\u2026",
15
15
  codeCreatingResource: "\u0110ang t\u1EA1o t\xE0i nguy\xEAn\u2026",
16
+ codeCompleteGenerated: "\u0110\xE3 t\u1EA1o t\xE0i nguy\xEAn",
17
+ codeCompleteGeneratedTruncated: "\u0110\xE3 t\u1EA1o t\xE0i nguy\xEAn \u2014 b\u1ECB c\u1EAFt \u1EDF gi\u1EDBi h\u1EA1n \u0111\u1ED9 d\xE0i",
16
18
  kindHighlight: "\u0111\xE1nh d\u1EA5u",
17
19
  kindComment: "b\xECnh lu\u1EADn",
18
20
  kindAssessment: "\u0111\xE1nh gi\xE1",
@@ -247,6 +249,7 @@ var ReferencesPanel = {
247
249
  noIncomingReferences: "Kh\xF4ng c\xF3 tham chi\u1EBFu \u0111\u1EBFn",
248
250
  stub: "Tham chi\u1EBFu s\u01A1 khai (ch\u01B0a li\xEAn k\u1EBFt)",
249
251
  resolved: "Tham chi\u1EBFu \u0111\xE3 ph\xE2n gi\u1EA3i (\u0111\xE3 li\xEAn k\u1EBFt)",
252
+ derived: "Ph\xE1i sinh",
250
253
  open: "M\u1EDF",
251
254
  unlink: "H\u1EE7y li\xEAn k\u1EBFt",
252
255
  resolve: "Gi\u1EA3i quy\u1EBFt tham chi\u1EBFu",
@@ -254,7 +257,6 @@ var ReferencesPanel = {
254
257
  createReference: "T\u1EA1o tham chi\u1EBFu",
255
258
  entityTypesOptional: "Lo\u1EA1i th\u1EF1c th\u1EC3 (T\xF9y ch\u1ECDn)",
256
259
  fragmentSelected: "\u0110\xE3 ch\u1ECDn \u0111o\u1EA1n v\u0103n b\u1EA3n",
257
- imageRegionSelected: "\u0110\xE3 ch\u1ECDn v\xF9ng h\xECnh \u1EA3nh",
258
260
  annotateReferences: "Ch\xFA th\xEDch tham chi\u1EBFu",
259
261
  selectEntityTypes: "Lo\u1EA1i th\u1EF1c th\u1EC3:",
260
262
  select: "Ch\u1ECDn",
@@ -265,8 +267,6 @@ var ReferencesPanel = {
265
267
  annotating: "\u0110ang ch\xFA th\xEDch...",
266
268
  includeDescriptiveReferences: "Bao g\u1ED3m tham chi\u1EBFu m\xF4 t\u1EA3",
267
269
  descriptiveReferencesTooltip: "C\u0169ng t\xECm c\xE1c c\u1EE5m t\u1EEB nh\u01B0 'v\u1ECB CEO', 'g\xE3 kh\u1ED5ng l\u1ED3 c\xF4ng ngh\u1EC7', 'nh\xE0 v\u1EADt l\xFD' (ngo\xE0i t\xEAn ri\xEAng)",
268
- annotationProgressTitle: "\u0110ang ch\xFA th\xEDch tham chi\u1EBFu th\u1EF1c th\u1EC3",
269
- cancelAnnotation: "H\u1EE7y ch\xFA th\xEDch",
270
270
  found: "\u0110\xE3 t\xECm th\u1EA5y {{count}}",
271
271
  complete: "Ho\xE0n th\xE0nh ch\xFA th\xEDch!",
272
272
  failed: "Ch\xFA th\xEDch th\u1EA5t b\u1EA1i",
@@ -381,19 +381,14 @@ var Settings = {
381
381
  };
382
382
  var AnnotateView = {};
383
383
  var ResourceGenerate = {
384
- gatherTitle: "C\u1EA5u h\xECnh Thu th\u1EADp",
385
- reviewTitle: "Xem l\u1EA1i Ng\u1EEF c\u1EA3nh",
386
- configureTitle: "C\u1EA5u h\xECnh T\u1EA1o sinh",
387
- next: "Ti\u1EBFp theo",
388
- back: "Quay l\u1EA1i",
389
- cancel: "H\u1EE7y",
390
384
  gatherIntro: "Ch\u1ECDn n\u1ED9i dung \u0111\u1EC3 \u0111\u01B0a v\xE0o ng\u1EEF c\u1EA3nh \u0111\xE3 thu th\u1EADp.",
391
385
  includeContent: "Bao g\u1ED3m n\u1ED9i dung t\xE0i nguy\xEAn",
392
386
  includeSummary: "Bao g\u1ED3m t\xF3m t\u1EAFt",
393
387
  gatherDepth: "\u0110\u1ED9 s\xE2u",
394
388
  gatherMaxResources: "T\xE0i nguy\xEAn T\u1ED1i \u0111a",
395
389
  gatherButton: "Thu th\u1EADp",
396
- excludeLabel: "Lo\u1EA1i tr\u1EEB kh\u1ECFi truy h\u1ED3i",
390
+ editGather: "Thay \u0111\u1ED5i c\xE0i \u0111\u1EB7t thu th\u1EADp",
391
+ recallLabel: "Bao g\u1ED3m trong truy h\u1ED3i \u2014 b\u1ECF ch\u1ECDn \u0111\u1EC3 lo\u1EA1i tr\u1EEB",
397
392
  loadingContext: "\u0110ang thu th\u1EADp ng\u1EEF c\u1EA3nh...",
398
393
  failedContext: "Kh\xF4ng th\u1EC3 thu th\u1EADp ng\u1EEF c\u1EA3nh",
399
394
  sourceContextLabel: "T\xE0i nguy\xEAn",
@@ -411,18 +406,24 @@ var ResourceGenerate = {
411
406
  maxLength: "\u0110\u1ED9 d\xE0i T\u1ED1i \u0111a",
412
407
  maxLengthHelp: "S\u1ED1 l\u01B0\u1EE3ng token t\u1ED1i \u0111a",
413
408
  generate: "T\u1EA1o sinh",
414
- progressTitle: "\u0110ang t\u1EA1o T\xE0i nguy\xEAn",
415
- progressCancel: "H\u1EE7y t\u1EA1o sinh",
416
- progressInProgress: "\u0110ang t\u1EA1o sinh\u2026",
417
- progressComplete: "T\u1EA1o sinh ho\xE0n t\u1EA5t!",
418
- progressFailed: "T\u1EA1o sinh th\u1EA5t b\u1EA1i",
419
- maxLengthCeiling: "Gi\u1EDBi h\u1EA1n {{maxOutputTokens}} token b\u1EDFi {{model}}."
409
+ maxLengthCeiling: "Gi\u1EDBi h\u1EA1n {{maxOutputTokens}} token b\u1EDFi {{model}}.",
410
+ outputFormat: "\u0110\u1ECBnh d\u1EA1ng",
411
+ formatExtensionMismatch: "V\u1ECB tr\xED l\u01B0u ph\u1EA3i k\u1EBFt th\xFAc b\u1EB1ng {{extension}} \u0111\u1EC3 kh\u1EDBp v\u1EDBi \u0111\u1ECBnh d\u1EA1ng \u0111\xE3 ch\u1ECDn.",
412
+ graphPaneTitle: "V\xF9ng l\xE2n c\u1EADn",
413
+ graphEmpty: "Ch\u01B0a c\xF3 li\xEAn k\u1EBFt.",
414
+ resourceLinkLabel: "Li\xEAn k\u1EBFt t\xE0i nguy\xEAn",
415
+ corpusPaneTitle: "\u0110o\u1EA1n v\u0103n t\u01B0\u01A1ng t\u1EF1",
416
+ corpusEmpty: "Kh\xF4ng t\xECm th\u1EA5y \u0111o\u1EA1n v\u0103n t\u01B0\u01A1ng t\u1EF1.",
417
+ excludedReceipt: "{{types}} b\u1ECB lo\u1EA1i kh\u1ECFi l\u1EA7n truy h\u1ED3i n\xE0y",
418
+ machineRead: "OCR",
419
+ score: "\u0110i\u1EC3m",
420
+ saveLocation: "V\u1ECB tr\xED l\u01B0u",
421
+ discardDraftPrompt: "B\u1ECF b\u1EA3n nh\xE1p n\xE0y?",
422
+ discardDraft: "B\u1ECF",
423
+ keepEditing: "Ti\u1EBFp t\u1EE5c ch\u1EC9nh s\u1EEDa",
424
+ title: "T\u1EA1o t\u1EEB t\xE0i nguy\xEAn n\xE0y"
420
425
  };
421
426
  var ReferenceWizard = {
422
- gatherTitle: "Ng\u1EEF c\u1EA3nh \u0111\xE3 thu th\u1EADp",
423
- configureGenerationTitle: "C\u1EA5u h\xECnh T\u1EA1o sinh",
424
- configureSearchTitle: "C\u1EA5u h\xECnh t\xECm ki\u1EBFm",
425
- searchResultsTitle: "K\u1EBFt qu\u1EA3 t\xECm ki\u1EBFm",
426
427
  sourceContextLabel: "Ng\u1EEF c\u1EA3nh ch\xFA th\xEDch trong t\xE0i nguy\xEAn",
427
428
  connectionsLabel: "Ch\xFA th\xEDch ngang h\xE0ng",
428
429
  citedByLabel: "T\xE0i nguy\xEAn \u0111\u01B0\u1EE3c tr\xEDch d\u1EABn b\u1EDFi",
@@ -430,7 +431,6 @@ var ReferenceWizard = {
430
431
  userHintPlaceholder: "M\xF4 t\u1EA3 ch\xFA th\xEDch n\xE0y \u0111\u1EC1 c\u1EADp \u0111\u1EBFn \u0111i\u1EC1u g\xEC...",
431
432
  loadingContext: "\u0110ang thu th\u1EADp ng\u1EEF c\u1EA3nh...",
432
433
  failedContext: "Kh\xF4ng th\u1EC3 thu th\u1EADp ng\u1EEF c\u1EA3nh",
433
- cancel: "H\u1EE7y",
434
434
  generate: "T\u1EA1o sinh",
435
435
  compose: "So\u1EA1n",
436
436
  resolutionStrategyLabel: "Chi\u1EBFn l\u01B0\u1EE3c gi\u1EA3i quy\u1EBFt",
@@ -453,8 +453,28 @@ var ReferenceWizard = {
453
453
  semanticScoring: "Ch\u1EA5m \u0111i\u1EC3m Ng\u1EEF ngh\u0129a",
454
454
  semanticScoringHelp: "S\u1EED d\u1EE5ng AI \u0111\u1EC3 ch\u1EA5m \u0111i\u1EC3m k\u1EBFt qu\u1EA3 theo m\u1EE9c \u0111\u1ED9 li\xEAn quan ng\u1EEF ngh\u0129a",
455
455
  searching: "\u0110ang t\xECm ki\u1EBFm...",
456
+ searchFailed: "T\xECm ki\u1EBFm th\u1EA5t b\u1EA1i",
456
457
  search: "T\xECm ki\u1EBFm",
457
- maxLengthCeiling: "Gi\u1EDBi h\u1EA1n {{maxOutputTokens}} token b\u1EDFi {{model}}."
458
+ maxLengthCeiling: "Gi\u1EDBi h\u1EA1n {{maxOutputTokens}} token b\u1EDFi {{model}}.",
459
+ outputFormat: "\u0110\u1ECBnh d\u1EA1ng",
460
+ formatExtensionMismatch: "V\u1ECB tr\xED l\u01B0u ph\u1EA3i k\u1EBFt th\xFAc b\u1EB1ng {{extension}} \u0111\u1EC3 kh\u1EDBp v\u1EDBi \u0111\u1ECBnh d\u1EA1ng \u0111\xE3 ch\u1ECDn.",
461
+ graphPaneTitle: "V\xF9ng l\xE2n c\u1EADn",
462
+ graphEmpty: "Ch\u01B0a c\xF3 li\xEAn k\u1EBFt \u2014 gi\u1EA3i quy\u1EBFt tham chi\u1EBFu n\xE0y s\u1EBD t\u1EA1o li\xEAn k\u1EBFt \u0111\u1EA7u ti\xEAn.",
463
+ resourceLinkLabel: "Li\xEAn k\u1EBFt t\xE0i nguy\xEAn",
464
+ corpusPaneTitle: "\u0110o\u1EA1n v\u0103n t\u01B0\u01A1ng t\u1EF1",
465
+ corpusEmpty: "Kh\xF4ng t\xECm th\u1EA5y \u0111o\u1EA1n v\u0103n t\u01B0\u01A1ng t\u1EF1 \u2014 t\xECm ki\u1EBFm kh\xF3 c\xF3 k\u1EBFt qu\u1EA3.",
466
+ excludedReceipt: "{{types}} b\u1ECB lo\u1EA1i kh\u1ECFi l\u1EA7n truy h\u1ED3i n\xE0y",
467
+ machineRead: "OCR",
468
+ userHintEffect: "d\u1EABn h\u01B0\u1EDBng t\xECm ki\u1EBFm v\xE0 t\u1EA1o sinh",
469
+ saveLocation: "V\u1ECB tr\xED l\u01B0u",
470
+ entityTypes: "Lo\u1EA1i th\u1EF1c th\u1EC3",
471
+ contentLabel: "N\u1ED9i dung",
472
+ createAndLink: "T\u1EA1o & Li\xEAn k\u1EBFt",
473
+ creatingAndLinking: "\u0110ang t\u1EA1o & li\xEAn k\u1EBFt\u2026",
474
+ discardDraftPrompt: "B\u1ECF b\u1EA3n nh\xE1p n\xE0y?",
475
+ discardDraft: "B\u1ECF",
476
+ keepEditing: "Ti\u1EBFp t\u1EE5c ch\u1EC9nh s\u1EEDa",
477
+ resolveTitle: "Gi\u1EA3i quy\u1EBFt tham chi\u1EBFu"
458
478
  };
459
479
  var OutcomeToasts = {
460
480
  createFailed: "Kh\xF4ng th\u1EC3 t\u1EA1o ch\xFA th\xEDch: {{detail}}",
@@ -522,4 +542,4 @@ export {
522
542
  UnifiedAnnotationsPanel,
523
543
  vi_default as default
524
544
  };
525
- //# sourceMappingURL=vi-ZLTLEO7P.js.map
545
+ //# sourceMappingURL=vi-V6CVQZLQ.js.map
@@ -13,6 +13,8 @@ var AssistProgress = {
13
13
  codeCompleteCreated: "\u5DF2\u521B\u5EFA {{count}} \u4E2A{{kind}}",
14
14
  codeGeneratingResource: "\u751F\u6210\u4E2D\u2026",
15
15
  codeCreatingResource: "\u6B63\u5728\u521B\u5EFA\u8D44\u6E90\u2026",
16
+ codeCompleteGenerated: "\u5DF2\u521B\u5EFA\u8D44\u6E90",
17
+ codeCompleteGeneratedTruncated: "\u5DF2\u521B\u5EFA\u8D44\u6E90 \u2014 \u5728\u957F\u5EA6\u9650\u5236\u5904\u88AB\u622A\u65AD",
16
18
  kindHighlight: "\u9AD8\u4EAE",
17
19
  kindComment: "\u8BC4\u8BBA",
18
20
  kindAssessment: "\u8BC4\u4F30",
@@ -247,6 +249,7 @@ var ReferencesPanel = {
247
249
  noIncomingReferences: "\u65E0\u4F20\u5165\u5F15\u7528",
248
250
  stub: "\u5B58\u6839\u5F15\u7528\uFF08\u672A\u94FE\u63A5\uFF09",
249
251
  resolved: "\u5DF2\u89E3\u6790\u5F15\u7528\uFF08\u5DF2\u94FE\u63A5\uFF09",
252
+ derived: "\u6D3E\u751F",
250
253
  open: "\u6253\u5F00",
251
254
  unlink: "\u53D6\u6D88\u94FE\u63A5",
252
255
  resolve: "\u89E3\u6790\u5F15\u7528",
@@ -254,7 +257,6 @@ var ReferencesPanel = {
254
257
  createReference: "\u521B\u5EFA\u5F15\u7528",
255
258
  entityTypesOptional: "\u5B9E\u4F53\u7C7B\u578B\uFF08\u53EF\u9009\uFF09",
256
259
  fragmentSelected: "\u5DF2\u9009\u62E9\u7247\u6BB5",
257
- imageRegionSelected: "\u5DF2\u9009\u62E9\u56FE\u50CF\u533A\u57DF",
258
260
  annotateReferences: "\u6CE8\u91CA\u5F15\u7528",
259
261
  selectEntityTypes: "\u5B9E\u4F53\u7C7B\u578B\uFF1A",
260
262
  select: "\u9009\u62E9",
@@ -265,8 +267,6 @@ var ReferencesPanel = {
265
267
  annotating: "\u6B63\u5728\u6CE8\u91CA...",
266
268
  includeDescriptiveReferences: "\u5305\u542B\u63CF\u8FF0\u6027\u5F15\u7528",
267
269
  descriptiveReferencesTooltip: "\u540C\u65F6\u67E5\u627E\u8BF8\u5982\u300C\u9996\u5E2D\u6267\u884C\u5B98\u300D\u3001\u300C\u79D1\u6280\u5DE8\u5934\u300D\u3001\u300C\u7269\u7406\u5B66\u5BB6\u300D\u7B49\u77ED\u8BED\uFF08\u9664\u540D\u79F0\u5916\uFF09",
268
- annotationProgressTitle: "\u6B63\u5728\u6CE8\u91CA\u5B9E\u4F53\u5F15\u7528",
269
- cancelAnnotation: "\u53D6\u6D88\u6CE8\u91CA",
270
270
  found: "\u627E\u5230 {{count}} \u4E2A",
271
271
  complete: "\u6CE8\u91CA\u5B8C\u6210\uFF01",
272
272
  failed: "\u6CE8\u91CA\u5931\u8D25",
@@ -381,19 +381,14 @@ var Settings = {
381
381
  };
382
382
  var AnnotateView = {};
383
383
  var ResourceGenerate = {
384
- gatherTitle: "\u914D\u7F6E\u6536\u96C6",
385
- reviewTitle: "\u67E5\u770B\u4E0A\u4E0B\u6587",
386
- configureTitle: "\u914D\u7F6E\u751F\u6210",
387
- next: "\u4E0B\u4E00\u6B65",
388
- back: "\u8FD4\u56DE",
389
- cancel: "\u53D6\u6D88",
390
384
  gatherIntro: "\u9009\u62E9\u8981\u5305\u542B\u5728\u6536\u96C6\u7684\u4E0A\u4E0B\u6587\u4E2D\u7684\u5185\u5BB9\u3002",
391
385
  includeContent: "\u5305\u542B\u8D44\u6E90\u5185\u5BB9",
392
386
  includeSummary: "\u5305\u542B\u6458\u8981",
393
387
  gatherDepth: "\u6DF1\u5EA6",
394
388
  gatherMaxResources: "\u6700\u5927\u8D44\u6E90\u6570",
395
389
  gatherButton: "\u6536\u96C6",
396
- excludeLabel: "\u4ECE\u53EC\u56DE\u4E2D\u6392\u9664",
390
+ editGather: "\u66F4\u6539\u6536\u96C6\u8BBE\u7F6E",
391
+ recallLabel: "\u5DF2\u5305\u542B\u5728\u53EC\u56DE\u4E2D \u2014 \u53D6\u6D88\u9009\u62E9\u4EE5\u6392\u9664",
397
392
  loadingContext: "\u6B63\u5728\u6536\u96C6\u4E0A\u4E0B\u6587...",
398
393
  failedContext: "\u6536\u96C6\u4E0A\u4E0B\u6587\u5931\u8D25",
399
394
  sourceContextLabel: "\u8D44\u6E90",
@@ -411,18 +406,24 @@ var ResourceGenerate = {
411
406
  maxLength: "\u6700\u5927\u957F\u5EA6",
412
407
  maxLengthHelp: "\u6700\u5927\u4EE4\u724C\u6570",
413
408
  generate: "\u751F\u6210",
414
- progressTitle: "\u6B63\u5728\u751F\u6210\u8D44\u6E90",
415
- progressCancel: "\u53D6\u6D88\u751F\u6210",
416
- progressInProgress: "\u6B63\u5728\u751F\u6210\u2026",
417
- progressComplete: "\u751F\u6210\u5B8C\u6210\uFF01",
418
- progressFailed: "\u751F\u6210\u5931\u8D25",
419
- maxLengthCeiling: "\u53D7 {{model}} \u9650\u5236\u4E3A {{maxOutputTokens}} \u4E2A\u8BCD\u5143\u3002"
409
+ maxLengthCeiling: "\u53D7 {{model}} \u9650\u5236\u4E3A {{maxOutputTokens}} \u4E2A\u8BCD\u5143\u3002",
410
+ outputFormat: "\u683C\u5F0F",
411
+ formatExtensionMismatch: "\u4FDD\u5B58\u4F4D\u7F6E\u5FC5\u987B\u4EE5 {{extension}} \u7ED3\u5C3E\uFF0C\u4EE5\u5339\u914D\u6240\u9009\u683C\u5F0F\u3002",
412
+ graphPaneTitle: "\u5468\u8FB9",
413
+ graphEmpty: "\u5C1A\u65E0\u94FE\u63A5\u3002",
414
+ resourceLinkLabel: "\u8D44\u6E90\u94FE\u63A5",
415
+ corpusPaneTitle: "\u76F8\u4F3C\u6BB5\u843D",
416
+ corpusEmpty: "\u672A\u627E\u5230\u76F8\u4F3C\u6BB5\u843D\u3002",
417
+ excludedReceipt: "{{types}} \u5DF2\u4ECE\u672C\u6B21\u53EC\u56DE\u4E2D\u6392\u9664",
418
+ machineRead: "OCR",
419
+ score: "\u8BC4\u5206",
420
+ saveLocation: "\u4FDD\u5B58\u4F4D\u7F6E",
421
+ discardDraftPrompt: "\u653E\u5F03\u6B64\u8349\u7A3F\uFF1F",
422
+ discardDraft: "\u653E\u5F03",
423
+ keepEditing: "\u7EE7\u7EED\u7F16\u8F91",
424
+ title: "\u4ECE\u6B64\u8D44\u6E90\u751F\u6210"
420
425
  };
421
426
  var ReferenceWizard = {
422
- gatherTitle: "\u5DF2\u6536\u96C6\u7684\u4E0A\u4E0B\u6587",
423
- configureGenerationTitle: "\u914D\u7F6E\u751F\u6210",
424
- configureSearchTitle: "\u914D\u7F6E\u641C\u7D22",
425
- searchResultsTitle: "\u641C\u7D22\u7ED3\u679C",
426
427
  sourceContextLabel: "\u8D44\u6E90\u4E2D\u7684\u6CE8\u91CA\u4E0A\u4E0B\u6587",
427
428
  connectionsLabel: "\u5BF9\u7B49\u6CE8\u91CA",
428
429
  citedByLabel: "\u8D44\u6E90\u88AB\u5F15\u7528",
@@ -430,7 +431,6 @@ var ReferenceWizard = {
430
431
  userHintPlaceholder: "\u63CF\u8FF0\u6B64\u6CE8\u91CA\u6240\u6307\u7684\u5185\u5BB9...",
431
432
  loadingContext: "\u6B63\u5728\u6536\u96C6\u4E0A\u4E0B\u6587...",
432
433
  failedContext: "\u6536\u96C6\u4E0A\u4E0B\u6587\u5931\u8D25",
433
- cancel: "\u53D6\u6D88",
434
434
  generate: "\u751F\u6210",
435
435
  compose: "\u7F16\u5199",
436
436
  resolutionStrategyLabel: "\u89E3\u6790\u7B56\u7565",
@@ -453,8 +453,28 @@ var ReferenceWizard = {
453
453
  semanticScoring: "\u8BED\u4E49\u8BC4\u5206",
454
454
  semanticScoringHelp: "\u4F7F\u7528 AI \u6309\u8BED\u4E49\u76F8\u5173\u6027\u5BF9\u7ED3\u679C\u8FDB\u884C\u8BC4\u5206",
455
455
  searching: "\u641C\u7D22\u4E2D...",
456
+ searchFailed: "\u641C\u7D22\u5931\u8D25",
456
457
  search: "\u641C\u7D22",
457
- maxLengthCeiling: "\u53D7 {{model}} \u9650\u5236\u4E3A {{maxOutputTokens}} \u4E2A\u8BCD\u5143\u3002"
458
+ maxLengthCeiling: "\u53D7 {{model}} \u9650\u5236\u4E3A {{maxOutputTokens}} \u4E2A\u8BCD\u5143\u3002",
459
+ outputFormat: "\u683C\u5F0F",
460
+ formatExtensionMismatch: "\u4FDD\u5B58\u4F4D\u7F6E\u5FC5\u987B\u4EE5 {{extension}} \u7ED3\u5C3E\uFF0C\u4EE5\u5339\u914D\u6240\u9009\u683C\u5F0F\u3002",
461
+ graphPaneTitle: "\u5468\u8FB9",
462
+ graphEmpty: "\u5C1A\u65E0\u94FE\u63A5 \u2014 \u89E3\u6790\u6B64\u5F15\u7528\u5C06\u521B\u5EFA\u7B2C\u4E00\u4E2A\u3002",
463
+ resourceLinkLabel: "\u8D44\u6E90\u94FE\u63A5",
464
+ corpusPaneTitle: "\u76F8\u4F3C\u6BB5\u843D",
465
+ corpusEmpty: "\u672A\u627E\u5230\u76F8\u4F3C\u6BB5\u843D \u2014 \u641C\u7D22\u4E0D\u592A\u53EF\u80FD\u6709\u7ED3\u679C\u3002",
466
+ excludedReceipt: "{{types}} \u5DF2\u4ECE\u672C\u6B21\u53EC\u56DE\u4E2D\u6392\u9664",
467
+ machineRead: "OCR",
468
+ userHintEffect: "\u5F15\u5BFC\u641C\u7D22\u4E0E\u751F\u6210",
469
+ saveLocation: "\u4FDD\u5B58\u4F4D\u7F6E",
470
+ entityTypes: "\u5B9E\u4F53\u7C7B\u578B",
471
+ contentLabel: "\u5185\u5BB9",
472
+ createAndLink: "\u521B\u5EFA\u5E76\u94FE\u63A5",
473
+ creatingAndLinking: "\u6B63\u5728\u521B\u5EFA\u5E76\u94FE\u63A5\u2026",
474
+ discardDraftPrompt: "\u653E\u5F03\u6B64\u8349\u7A3F\uFF1F",
475
+ discardDraft: "\u653E\u5F03",
476
+ keepEditing: "\u7EE7\u7EED\u7F16\u8F91",
477
+ resolveTitle: "\u89E3\u6790\u5F15\u7528"
458
478
  };
459
479
  var OutcomeToasts = {
460
480
  createFailed: "\u65E0\u6CD5\u521B\u5EFA\u6279\u6CE8\uFF1A{{detail}}",
@@ -522,4 +542,4 @@ export {
522
542
  UnifiedAnnotationsPanel,
523
543
  zh_default as default
524
544
  };
525
- //# sourceMappingURL=zh-5FHVWDIN.js.map
545
+ //# sourceMappingURL=zh-AGKPGI3L.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@semiont/react-ui",
3
- "version": "0.5.27",
3
+ "version": "0.5.29",
4
4
  "engines": {
5
5
  "node": ">=24.0.0"
6
6
  },
@@ -36,6 +36,7 @@
36
36
  },
37
37
  "files": [
38
38
  "dist",
39
+ "!dist/**/*.map",
39
40
  "src/styles",
40
41
  "src/components",
41
42
  "src/features",
@@ -91,24 +92,24 @@
91
92
  },
92
93
  "devDependencies": {
93
94
  "@headlessui/react": "^2.2.10",
94
- "@testing-library/jest-dom": "^7.0.0",
95
- "@testing-library/react": "^16.1.0",
95
+ "@testing-library/jest-dom": "^7.0.1",
96
+ "@testing-library/react": "^16.3.3",
96
97
  "@types/react": "^19.2.18",
97
- "@types/react-dom": "^19.2.4",
98
- "@vitest/coverage-v8": "^4.1.8",
98
+ "@types/react-dom": "^19.2.5",
99
+ "@vitest/coverage-v8": "^4.1.11",
99
100
  "autoprefixer": "^10.5.4",
100
101
  "axe-core": "^4.12.1",
101
- "cssnano": "^8.0.2",
102
+ "cssnano": "^8.0.8",
102
103
  "fast-check": "^4.9.0",
103
104
  "jest-axe": "^11.0.0",
104
105
  "jsdom": "^29.1.1",
105
- "postcss-import": "^16.1.1",
106
- "rollup": "^4.62.3",
106
+ "postcss-import": "^16.2.0",
107
+ "rollup": "^4.63.0",
107
108
  "rollup-plugin-dts": "^6.4.1",
108
- "styled-components": "^6.4.3",
109
+ "styled-components": "^6.5.2",
109
110
  "tsup": "^8.0.1",
110
111
  "typescript": "^6.0.2",
111
- "vitest": "^4.1.10"
112
+ "vitest": "^4.1.11"
112
113
  },
113
114
  "publishConfig": {
114
115
  "access": "public"
@@ -117,16 +118,16 @@
117
118
  "license": "Apache-2.0",
118
119
  "repository": {
119
120
  "type": "git",
120
- "url": "https://github.com/The-AI-Alliance/semiont.git",
121
+ "url": "git+https://github.com/The-AI-Alliance/semiont.git",
121
122
  "directory": "packages/react-ui"
122
123
  },
123
124
  "dependencies": {
124
- "@semiont/core": "0.5.27",
125
- "@semiont/http-transport": "0.5.27",
126
- "@semiont/sdk": "0.5.27",
125
+ "@semiont/core": "0.5.29",
126
+ "@semiont/http-transport": "0.5.29",
127
+ "@semiont/sdk": "0.5.29",
127
128
  "clsx": "^2.1.1",
128
129
  "pdfjs-dist": "^6.2.108",
129
- "react-error-boundary": "^6.1.2",
130
+ "react-error-boundary": "^6.1.3",
130
131
  "react-markdown": "^10.1.0",
131
132
  "remark-gfm": "^4.0.1",
132
133
  "use-sync-external-store": "^1.6.0"
@@ -57,6 +57,22 @@ export type AssistDataType =
57
57
  export interface AssistProgressProps {
58
58
  progress: JobProgress;
59
59
  dataType: AssistDataType;
60
+ /**
61
+ * What the finished run produced, offered as a link in the ended frame
62
+ * (GENERATE-FROM-RESOURCE D8). The label is the artifact's own name — user
63
+ * content, never translated. Rendered only once `ended`: mid-run there is no
64
+ * outcome to offer, whatever the caller has wired.
65
+ */
66
+ outcome?: { label: string; onOpen: () => void } | undefined;
67
+ /**
68
+ * The owner's terminal sentence, rendered in place of the payload message
69
+ * once `ended` (GENERATION-ARRIVAL P1). The producer's final frame is a
70
+ * fire-and-forget emit that can lose the race with `job:complete`, so an
71
+ * ended frame must not trust the last payload to describe the ending —
72
+ * the owner, which signalled `ended`, supplies the words too. Inert while
73
+ * the run is live.
74
+ */
75
+ endedMessage?: string;
60
76
  /**
61
77
  * The run has ENDED. The owner's fact, not the payload's
62
78
  * (ASSIST-PROGRESS-CONSOLIDATION D7): terminality is signalled on
@@ -96,6 +112,8 @@ export function AssistProgress({
96
112
  progress,
97
113
  dataType,
98
114
  ended,
115
+ outcome,
116
+ endedMessage,
99
117
  onCancel,
100
118
  onDismiss,
101
119
  translations: tr,
@@ -155,7 +173,9 @@ export function AssistProgress({
155
173
  {ended ? '✅' : '✨'}
156
174
  </span>
157
175
  <span data-testid="semiont-assist-status">
158
- {progress.message ? tr.message(progress.message) : tr.inProgress}
176
+ {ended && endedMessage
177
+ ? endedMessage
178
+ : progress.message ? tr.message(progress.message) : tr.inProgress}
159
179
  </span>
160
180
  </div>
161
181
 
@@ -166,11 +186,25 @@ export function AssistProgress({
166
186
  </div>
167
187
  )}
168
188
 
189
+ {/* D8: the finished run's artifact, by name. */}
190
+ {ended && outcome && (
191
+ <button
192
+ type="button"
193
+ onClick={outcome.onOpen}
194
+ className="semiont-assist-progress__outcome"
195
+ data-testid="semiont-assist-outcome"
196
+ >
197
+ {outcome.label}
198
+ </button>
199
+ )}
200
+
201
+ {/* An ended run is 100% done by definition — the last payload's number
202
+ is a mid-run fact and must not survive the ending (A1). */}
169
203
  <div className="semiont-progress-bar" data-testid="semiont-assist-bar">
170
204
  <div
171
205
  className="semiont-progress-bar__fill"
172
206
  data-type={dataType}
173
- style={{ width: `${progress.percentage}%` }}
207
+ style={{ width: `${ended ? 100 : progress.percentage}%` }}
174
208
  />
175
209
  </div>
176
210
 
@@ -37,7 +37,7 @@ interface Props {
37
37
  onTextSelect?: (exact: string, position: { start: number; end: number }) => void;
38
38
  onChange?: (content: string) => void;
39
39
  editable?: boolean;
40
- newAnnotationIds?: Set<string>;
40
+ sparkleAnnotationIds?: Set<string>;
41
41
  hoveredAnnotationId?: string | null;
42
42
  scrollToAnnotationId?: string | null;
43
43
  sourceView?: boolean; // If true, show raw source (no markdown rendering)
@@ -52,7 +52,7 @@ interface Props {
52
52
  // Effect to update annotation decorations with segments and new IDs
53
53
  interface AnnotationUpdate {
54
54
  segments: TextSegment[];
55
- newAnnotationIds?: Set<string>;
55
+ sparkleAnnotationIds?: Set<string>;
56
56
  }
57
57
 
58
58
  const updateAnnotationsEffect = StateEffect.define<AnnotationUpdate>();
@@ -70,10 +70,10 @@ const updateWidgetsEffect = StateEffect.define<WidgetUpdate>();
70
70
  // Build CodeMirror decorations from pure metadata
71
71
  function buildAnnotationDecorations(
72
72
  segments: TextSegment[],
73
- newAnnotationIds?: Set<string>
73
+ sparkleAnnotationIds?: Set<string>
74
74
  ): DecorationSet {
75
75
  const builder = new RangeSetBuilder<Decoration>();
76
- const entries = computeAnnotationDecorations(segments, newAnnotationIds);
76
+ const entries = computeAnnotationDecorations(segments, sparkleAnnotationIds);
77
77
 
78
78
  for (const { start, end, meta } of entries) {
79
79
  const decoration = Decoration.mark({
@@ -103,7 +103,7 @@ function createAnnotationDecorationsField() {
103
103
 
104
104
  for (const effect of tr.effects) {
105
105
  if (effect.is(updateAnnotationsEffect)) {
106
- decorations = buildAnnotationDecorations(effect.value.segments, effect.value.newAnnotationIds);
106
+ decorations = buildAnnotationDecorations(effect.value.segments, effect.value.sparkleAnnotationIds);
107
107
  }
108
108
  }
109
109
 
@@ -175,7 +175,7 @@ export function CodeMirrorRenderer({
175
175
  segments = [],
176
176
  onChange,
177
177
  editable = false,
178
- newAnnotationIds,
178
+ sparkleAnnotationIds,
179
179
  hoveredAnnotationId,
180
180
  scrollToAnnotationId,
181
181
  sourceView = false,
@@ -410,9 +410,9 @@ export function CodeMirrorRenderer({
410
410
  if (!viewRef.current) return;
411
411
 
412
412
  viewRef.current.dispatch({
413
- effects: updateAnnotationsEffect.of({ segments: convertedSegments, ...(newAnnotationIds && { newAnnotationIds }) })
413
+ effects: updateAnnotationsEffect.of({ segments: convertedSegments, ...(sparkleAnnotationIds && { sparkleAnnotationIds }) })
414
414
  });
415
- }, [convertedSegments, newAnnotationIds]);
415
+ }, [convertedSegments, sparkleAnnotationIds]);
416
416
 
417
417
  // Update widgets when content, segments, or generatingReferenceId changes
418
418
  useEffect(() => {
@@ -8,7 +8,7 @@ import './StatusDisplay.css';
8
8
  interface StatusDisplayProps {
9
9
  isFullyAuthenticated?: boolean;
10
10
  isAuthenticated?: boolean;
11
- hasValidBackendToken?: boolean;
11
+ hasValidGatewayToken?: boolean;
12
12
  }
13
13
 
14
14
  interface StatusData {
@@ -19,7 +19,7 @@ interface StatusData {
19
19
  export function StatusDisplay({
20
20
  isFullyAuthenticated = false,
21
21
  isAuthenticated = false,
22
- hasValidBackendToken = false
22
+ hasValidGatewayToken = false
23
23
  }: StatusDisplayProps) {
24
24
  const semiont = useObservable(useSemiont().activeSession$)?.client;
25
25
  const [data, setData] = useState<StatusData | null>(null);
@@ -48,35 +48,35 @@ export function StatusDisplay({
48
48
  }, [semiont]);
49
49
 
50
50
  const getStatusContent = () => {
51
- if (isAuthenticated && !hasValidBackendToken) {
52
- return '🚀 Frontend Status: Ready • Backend: Please sign out and sign in again to reconnect';
51
+ if (isAuthenticated && !hasValidGatewayToken) {
52
+ return '🚀 Frontend Status: Ready • Gateway: Please sign out and sign in again to reconnect';
53
53
  }
54
54
 
55
55
  if (!isFullyAuthenticated) {
56
- return '🚀 Frontend Status: Ready • Backend: Authentication required';
56
+ return '🚀 Frontend Status: Ready • Gateway: Authentication required';
57
57
  }
58
58
 
59
59
  if (data) {
60
- return `🚀 Frontend Status: Ready • Backend: ${data.status} (v${data.version})`;
60
+ return `🚀 Frontend Status: Ready • Gateway: ${data.status} (v${data.version})`;
61
61
  }
62
62
 
63
63
  if (loading) {
64
- return '🚀 Frontend Status: Ready • Backend: Connecting...';
64
+ return '🚀 Frontend Status: Ready • Gateway: Connecting...';
65
65
  }
66
66
 
67
67
  if (error) {
68
68
  const errorMessage = error.message;
69
69
  if (errorMessage.includes('401') || errorMessage.includes('Unauthorized')) {
70
- return '🚀 Frontend Status: Ready • Backend: Please sign out and sign in again';
70
+ return '🚀 Frontend Status: Ready • Gateway: Please sign out and sign in again';
71
71
  }
72
- return '🚀 Frontend Status: Ready • Backend: Connection failed';
72
+ return '🚀 Frontend Status: Ready • Gateway: Connection failed';
73
73
  }
74
74
 
75
- return '🚀 Frontend Status: Ready • Backend: Unknown';
75
+ return '🚀 Frontend Status: Ready • Gateway: Unknown';
76
76
  };
77
77
 
78
78
  const getStatusType = (): 'warning' | 'info' | 'success' | 'loading' | 'error' => {
79
- if (isAuthenticated && !hasValidBackendToken) {
79
+ if (isAuthenticated && !hasValidGatewayToken) {
80
80
  return 'warning';
81
81
  }
82
82
 
@@ -109,12 +109,12 @@ export function StatusDisplay({
109
109
  </p>
110
110
  {!isFullyAuthenticated ? (
111
111
  <p className="semiont-status-hint">
112
- Sign in to view backend status
112
+ Sign in to view gateway status
113
113
  </p>
114
114
  ) : error ? (
115
115
  <p className="semiont-status-hint semiont-status-error-hint" role="alert">
116
116
  <span className="sr-only">Error: </span>
117
- Check that the backend server is running and accessible
117
+ Check that the gateway server is running and accessible
118
118
  </p>
119
119
  ) : null}
120
120
  </section>
@@ -267,6 +267,26 @@ describe('AssistProgress — P3 consolidation', () => {
267
267
  expect(screen.getByTestId(STATUS).textContent).toContain('tr.code(detecting-entities)');
268
268
  });
269
269
 
270
+ it('the outcome link renders only in the ended frame (GENERATE-FROM-RESOURCE P2, D8)', async () => {
271
+ // The label is the resource's name — user content, deliberately NOT a
272
+ // translation. While the run is live there is no outcome to offer, even if
273
+ // a caller wires the prop early.
274
+ const onOpen = vi.fn();
275
+ const outcome = { label: 'Summary of PB', onOpen };
276
+ const { rerender } = render(
277
+ <AssistProgress ended={false} progress={detecting()} dataType="generation"
278
+ outcome={outcome} translations={T3()} />,
279
+ );
280
+ expect(screen.queryByText('Summary of PB')).toBeNull();
281
+
282
+ rerender(
283
+ <AssistProgress ended progress={detecting()} dataType="generation"
284
+ outcome={outcome} translations={T3()} />,
285
+ );
286
+ await userEvent.click(screen.getByRole('button', { name: 'Summary of PB' }));
287
+ expect(onOpen).toHaveBeenCalledTimes(1);
288
+ });
289
+
270
290
  it('H1: the params line appears only when it adds information', () => {
271
291
  // The discriminator is the COUNT, not the copy — splitting a localized
272
292
  // string on commas to decide whether to show it would be its own defect.
@@ -288,3 +308,42 @@ describe('AssistProgress — P3 consolidation', () => {
288
308
  expect(screen.getByTestId(PARAMS)).toBeInTheDocument();
289
309
  });
290
310
  });
311
+
312
+ // ─────────────────────────────────────────────────────────────────────────────
313
+ // GENERATION-ARRIVAL P1 — the honest ended frame. The producer's terminal
314
+ // 100% frame races job:complete and can lose (its emit is a fire-and-forget
315
+ // heartbeat); terminality is the OWNER's fact (D7), so the ended rendering
316
+ // stops trusting the last payload: full bar, and the owner's terminal
317
+ // sentence when it supplies one.
318
+ // ─────────────────────────────────────────────────────────────────────────────
319
+ describe('AssistProgress — the honest ended frame (GENERATION-ARRIVAL P1)', () => {
320
+ it('A1: an ended frame renders a FULL bar whatever the last payload said', () => {
321
+ const { container } = render(
322
+ <AssistProgress ended progress={detecting({ percentage: 95 })} dataType="generation" translations={T3()} />,
323
+ );
324
+ const fill = container.querySelector('.semiont-progress-bar__fill') as HTMLElement;
325
+ expect(fill.style.width).toBe('100%');
326
+ });
327
+
328
+ it('a live frame keeps the payload percentage', () => {
329
+ const { container } = render(
330
+ <AssistProgress ended={false} progress={detecting({ percentage: 95 })} dataType="generation" translations={T3()} />,
331
+ );
332
+ const fill = container.querySelector('.semiont-progress-bar__fill') as HTMLElement;
333
+ expect(fill.style.width).toBe('95%');
334
+ });
335
+
336
+ it('endedMessage replaces the stale payload copy once ended', () => {
337
+ render(
338
+ <AssistProgress ended endedMessage="tr.ended" progress={detecting({ percentage: 95 })} dataType="generation" translations={T3()} />,
339
+ );
340
+ expect(screen.getByTestId(STATUS).textContent).toBe('tr.ended');
341
+ });
342
+
343
+ it('endedMessage is inert while the run is live', () => {
344
+ render(
345
+ <AssistProgress ended={false} endedMessage="tr.ended" progress={detecting()} dataType="generation" translations={T3()} />,
346
+ );
347
+ expect(screen.getByTestId(STATUS).textContent).toBe('tr.code(detecting-entities)');
348
+ });
349
+ });