@semiont/react-ui 0.5.25 → 0.5.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -4
- package/dist/PdfAnnotationCanvas.client-EVUPTUWZ.js +677 -0
- package/dist/PdfAnnotationCanvas.client-EVUPTUWZ.js.map +1 -0
- package/dist/PdfAnnotationCanvas.client-TGDPPGXJ.css +185 -0
- package/dist/PdfAnnotationCanvas.client-TGDPPGXJ.css.map +1 -0
- package/dist/{ar-CULRHLNG.js → ar-OU3DQGC6.js} +65 -7
- package/dist/ar-OU3DQGC6.js.map +1 -0
- package/dist/{bn-HYR7CEL2.js → bn-PHWCR6AZ.js} +65 -7
- package/dist/bn-PHWCR6AZ.js.map +1 -0
- package/dist/chunk-5VDTWRXJ.js +287 -0
- package/dist/chunk-5VDTWRXJ.js.map +1 -0
- package/dist/{chunk-TG2XQEC4.js → chunk-BTUG3VJJ.js} +18 -298
- package/dist/chunk-BTUG3VJJ.js.map +1 -0
- package/dist/{chunk-NH6L2GIL.js → chunk-PCRRBU7H.js} +65 -7
- package/dist/chunk-PCRRBU7H.js.map +1 -0
- package/dist/{cs-YBRWY7NH.js → cs-NEXYZ62I.js} +65 -7
- package/dist/cs-NEXYZ62I.js.map +1 -0
- package/dist/{da-PHDEOBV3.js → da-FAT43YCU.js} +65 -7
- package/dist/da-FAT43YCU.js.map +1 -0
- package/dist/{de-O4UCCVLJ.js → de-KRQ3WBCU.js} +65 -7
- package/dist/de-KRQ3WBCU.js.map +1 -0
- package/dist/{el-MVGO6WZV.js → el-Q4IU3EKC.js} +65 -7
- package/dist/el-Q4IU3EKC.js.map +1 -0
- package/dist/{en-2KQILFKQ.js → en-2KADE7N4.js} +6 -2
- package/dist/{es-USSLXQY7.js → es-2IO3R2MK.js} +65 -7
- package/dist/es-2IO3R2MK.js.map +1 -0
- package/dist/{fa-WMAREFWY.js → fa-Q5GOQFXX.js} +65 -7
- package/dist/fa-Q5GOQFXX.js.map +1 -0
- package/dist/{fi-B3NBNOTS.js → fi-R6NMRWBE.js} +65 -7
- package/dist/fi-R6NMRWBE.js.map +1 -0
- package/dist/{fr-TXYK5T5W.js → fr-QY4D5E6J.js} +65 -7
- package/dist/fr-QY4D5E6J.js.map +1 -0
- package/dist/{he-JCJACW5D.js → he-X6Y77XHY.js} +65 -7
- package/dist/he-X6Y77XHY.js.map +1 -0
- package/dist/{hi-VOQLZNJU.js → hi-XL7IOEQM.js} +65 -7
- package/dist/hi-XL7IOEQM.js.map +1 -0
- package/dist/{id-BFN5RZNZ.js → id-QZ4ZZS67.js} +65 -7
- package/dist/id-QZ4ZZS67.js.map +1 -0
- package/dist/index.css +241 -508
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +155 -54
- package/dist/index.js +1815 -1642
- package/dist/index.js.map +1 -1
- package/dist/integrations/css-modules-helper.js +1 -3
- package/dist/integrations/css-modules-helper.js.map +1 -1
- package/dist/{it-TWWDHKKM.js → it-ME2Q7OB6.js} +65 -7
- package/dist/it-ME2Q7OB6.js.map +1 -0
- package/dist/{ja-YRQLEBFM.js → ja-HX7QASRI.js} +65 -7
- package/dist/ja-HX7QASRI.js.map +1 -0
- package/dist/{ko-PG6B3CRB.js → ko-EQO5AHAV.js} +65 -7
- package/dist/ko-EQO5AHAV.js.map +1 -0
- package/dist/{ms-7EZECVKM.js → ms-UILFSF3I.js} +65 -7
- package/dist/ms-UILFSF3I.js.map +1 -0
- package/dist/{nl-HP753YAP.js → nl-NNI45PMK.js} +65 -7
- package/dist/nl-NNI45PMK.js.map +1 -0
- package/dist/{no-JUD5WX3N.js → no-MAL5F6P6.js} +65 -7
- package/dist/no-MAL5F6P6.js.map +1 -0
- package/dist/{pl-RVUL4CBM.js → pl-4RMY6JAJ.js} +65 -7
- package/dist/pl-4RMY6JAJ.js.map +1 -0
- package/dist/{pt-RPOVD4QM.js → pt-VQH2X3QQ.js} +65 -7
- package/dist/pt-VQH2X3QQ.js.map +1 -0
- package/dist/{ro-DMYWQTRD.js → ro-XXCQO2OG.js} +65 -7
- package/dist/ro-XXCQO2OG.js.map +1 -0
- package/dist/{sv-DMZ4FGXD.js → sv-7Z6EJ6U4.js} +65 -7
- package/dist/sv-7Z6EJ6U4.js.map +1 -0
- package/dist/test-utils.css +1 -1
- package/dist/test-utils.css.map +1 -1
- package/dist/test-utils.d.ts +1 -1
- package/dist/test-utils.js +5 -3
- package/dist/test-utils.js.map +1 -1
- package/dist/{th-4HVBJBQ2.js → th-L3DXXYVQ.js} +65 -7
- package/dist/th-L3DXXYVQ.js.map +1 -0
- package/dist/{tr-6BDPU5ML.js → tr-P3DFVLFJ.js} +65 -7
- package/dist/tr-P3DFVLFJ.js.map +1 -0
- package/dist/{uk-TBZBT2TL.js → uk-7C5D3PXS.js} +65 -7
- package/dist/uk-7C5D3PXS.js.map +1 -0
- package/dist/{vi-UMKZKZL3.js → vi-ZLTLEO7P.js} +65 -7
- package/dist/vi-ZLTLEO7P.js.map +1 -0
- package/dist/{zh-YBJWJJYB.js → zh-5FHVWDIN.js} +65 -7
- package/dist/zh-5FHVWDIN.js.map +1 -0
- package/package.json +7 -7
- package/src/components/AssistProgress.tsx +144 -134
- package/src/components/{EntityFoundLog.tsx → ItemFoundLog.tsx} +12 -7
- package/src/components/ProtectedErrorBoundary.css +3 -1
- package/src/components/StatusDisplay.css +35 -35
- package/src/components/Toast.css +3 -1
- package/src/components/__tests__/AssistProgress.test.tsx +216 -148
- package/src/components/annotation/annotation-entries.css +0 -4
- package/src/components/annotation/annotations.css +1 -1
- package/src/components/annotation/references.css +0 -4
- package/src/components/image-annotation/AnnotationOverlay.tsx +6 -6
- package/src/components/image-annotation/SvgDrawingCanvas.tsx +1 -1
- package/src/components/image-annotation/__tests__/AnnotationOverlay.click.test.tsx +7 -9
- package/src/components/image-annotation/__tests__/SvgDrawingCanvas.click.test.tsx +1 -2
- package/src/components/layout/Header.css +0 -4
- package/src/components/layout/LeftSidebar.css +0 -4
- package/src/components/modals/ConfigureGenerationStep.tsx +109 -48
- package/src/components/modals/ConfigureSearchStep.tsx +23 -40
- package/src/components/modals/ReferenceWizardModal.tsx +55 -16
- package/src/components/modals/ResourceGenerateModal.tsx +24 -8
- package/src/components/modals/ResourceSearchModal.tsx +1 -1
- package/src/components/modals/SearchModal.css +5 -17
- package/src/components/modals/SearchModal.tsx +1 -1
- package/src/components/modals/SearchResultsStep.tsx +2 -20
- package/src/components/modals/WizardFooter.tsx +63 -0
- package/src/components/modals/__tests__/ConfigureGenerationStep.test.tsx +255 -0
- package/src/components/modals/__tests__/ConfigureSearchStep.test.tsx +72 -0
- package/src/components/modals/__tests__/ReferenceWizardModal.test.tsx +256 -0
- package/src/components/modals/__tests__/ResourceGenerateModal.test.tsx +1 -0
- package/src/components/modals/__tests__/ResourceSearchModal.test.tsx +6 -2
- package/src/components/modals/__tests__/SearchModal.search-wiring.test.tsx +6 -2
- package/src/components/modals/__tests__/WizardFooter.test.tsx +235 -0
- package/src/components/modals/modals.css +16 -42
- package/src/components/navigation/NavigationTabs.css +0 -20
- package/src/components/pdf-annotation/PdfAnnotationCanvas.css +162 -6
- package/src/components/pdf-annotation/PdfAnnotationCanvas.tsx +623 -232
- package/src/components/pdf-annotation/__tests__/PdfAnnotationCanvas.test.tsx +764 -7
- package/src/components/pdf-annotation/__tests__/estimate-slot-height.test.ts +53 -0
- package/src/components/pdf-annotation/estimate-slot-height.ts +31 -0
- package/src/components/resource/AnnotateView.tsx +16 -5
- package/src/components/resource/AnnotationHistory.tsx +2 -0
- package/src/components/resource/BrowseView.tsx +15 -4
- package/src/components/resource/ResourceViewer.tsx +23 -24
- package/src/components/resource/__tests__/AnnotateView.focus.test.tsx +50 -0
- package/src/components/resource/__tests__/AnnotationHistory.test.tsx +2 -0
- package/src/components/resource/__tests__/BrowseView.test.tsx +29 -3
- package/src/components/resource/__tests__/ResourceViewer.embeddable.test.tsx +47 -3
- package/src/components/resource/__tests__/browse-renderers.dispatch.test.tsx +33 -0
- package/src/components/resource/annotate-renderers.tsx +10 -1
- package/src/components/resource/browse-renderers.tsx +10 -1
- package/src/components/resource/event-formatting.ts +0 -3
- package/src/components/resource/panels/AssessmentEntry.tsx +1 -1
- package/src/components/resource/panels/AssessmentPanel.css +5 -6
- package/src/components/resource/panels/AssistSection.css +68 -271
- package/src/components/resource/panels/AssistSection.tsx +4 -4
- package/src/components/resource/panels/AssistShell.tsx +12 -4
- package/src/components/resource/panels/CollaborationPanel.css +47 -22
- package/src/components/resource/panels/CollaborationPanel.tsx +93 -2
- package/src/components/resource/panels/CommentEntry.tsx +1 -1
- package/src/components/resource/panels/CommentsPanel.css +0 -16
- package/src/components/resource/panels/HighlightEntry.tsx +1 -1
- package/src/components/resource/panels/HighlightPanel.css +0 -7
- package/src/components/resource/panels/JsonLdPanel.css +0 -4
- package/src/components/resource/panels/ReferenceEntry.tsx +1 -1
- package/src/components/resource/panels/ReferencesPanel.css +0 -12
- package/src/components/resource/panels/ReferencesPanel.tsx +12 -20
- package/src/components/resource/panels/ResourceInfoPanel.css +0 -32
- package/src/components/resource/panels/ResourceInfoPanel.tsx +1 -1
- package/src/components/resource/panels/StatisticsPanel.css +0 -20
- package/src/components/resource/panels/TagEntry.tsx +1 -1
- package/src/components/resource/panels/TaggingPanel.css +0 -4
- package/src/components/resource/panels/TaggingPanel.tsx +2 -10
- package/src/components/resource/panels/UnifiedAnnotationsPanel.css +0 -4
- package/src/components/resource/panels/__tests__/AssessmentEntry.test.tsx +0 -1
- package/src/components/resource/panels/__tests__/AssistSection.test.tsx +48 -50
- package/src/components/resource/panels/__tests__/AssistShell.test.tsx +11 -6
- package/src/components/resource/panels/__tests__/CollaborationPanel.test.tsx +89 -0
- package/src/components/resource/panels/__tests__/CommentEntry.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/HighlightEntry.test.tsx +0 -1
- package/src/components/resource/panels/__tests__/HighlightPanel.annotationProgress.test.tsx +44 -36
- package/src/components/resource/panels/__tests__/ReferenceEntry.test.tsx +0 -1
- package/src/components/resource/panels/__tests__/ReferencesPanel.headless.test.tsx +1 -1
- package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +34 -53
- package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +37 -1
- package/src/components/resource/panels/__tests__/TagEntry.test.tsx +0 -1
- package/src/components/settings/SettingsPanel.css +0 -4
- package/src/features/auth/auth.css +9 -33
- package/src/features/resource-compose/state/__tests__/compose-page-state-unit.test.ts +25 -1
- package/src/features/resource-compose/state/compose-page-state-unit.ts +11 -2
- package/src/features/resource-discovery/__tests__/ResourceDiscoveryPage.test.tsx +55 -0
- package/src/features/resource-discovery/components/ResourceDiscoveryPage.tsx +29 -0
- package/src/features/resource-discovery/state/__tests__/discover-state-unit.test.ts +53 -3
- package/src/features/resource-discovery/state/discover-state-unit.ts +29 -8
- package/src/features/resource-viewer/__tests__/ResourceViewerPage.test.tsx +26 -0
- package/src/features/resource-viewer/components/ResourceViewerPage.tsx +42 -21
- package/src/features/resource-viewer/hooks/__tests__/useResourceViewedReport.test.tsx +63 -0
- package/src/features/resource-viewer/hooks/useResourceViewedReport.ts +33 -0
- package/src/features/resource-viewer/state/__tests__/resource-viewer-page-state-unit.test.ts +2 -2
- package/src/features/resource-viewer/state/resource-viewer-page-state-unit.ts +1 -1
- package/src/styles/core/buttons.css +3 -1
- package/src/styles/core/forms.css +0 -21
- package/src/styles/core/indicators.css +0 -4
- package/src/styles/core/inputs.css +1 -5
- package/src/styles/core/progress.css +2 -34
- package/src/styles/core/sliders.css +0 -4
- package/src/styles/core/toggles.css +0 -4
- package/src/styles/features/compose.css +1 -1
- package/src/styles/features/resource-discovery.css +13 -0
- package/src/styles/features/resource-viewer.css +1 -21
- package/src/styles/features/static-pages.css +11 -11
- package/src/styles/motivations/motivation-assessment.css +2 -2
- package/src/styles/motivations/motivation-comment.css +2 -2
- package/src/styles/motivations/motivation-reference.css +2 -2
- package/src/styles/panels/history-panel.css +0 -40
- package/src/styles/panels/user-panel.css +0 -3
- package/src/styles/patterns/panel-helpers.css +0 -27
- package/src/styles/patterns/panel-sections.css +0 -59
- package/src/styles/patterns/panels-base.css +4 -36
- package/src/styles/utilities/motion.css +15 -15
- package/src/styles/variables.css +29 -1
- package/translations/ar.json +59 -5
- package/translations/bn.json +59 -5
- package/translations/cs.json +59 -5
- package/translations/da.json +59 -5
- package/translations/de.json +59 -5
- package/translations/el.json +59 -5
- package/translations/en.json +59 -5
- package/translations/es.json +59 -5
- package/translations/fa.json +59 -5
- package/translations/fi.json +59 -5
- package/translations/fr.json +59 -5
- package/translations/he.json +59 -5
- package/translations/hi.json +59 -5
- package/translations/id.json +59 -5
- package/translations/it.json +59 -5
- package/translations/ja.json +59 -5
- package/translations/ko.json +59 -5
- package/translations/ms.json +59 -5
- package/translations/nl.json +59 -5
- package/translations/no.json +59 -5
- package/translations/pl.json +59 -5
- package/translations/pt.json +59 -5
- package/translations/ro.json +59 -5
- package/translations/sv.json +59 -5
- package/translations/th.json +59 -5
- package/translations/tr.json +59 -5
- package/translations/uk.json +59 -5
- package/translations/vi.json +59 -5
- package/translations/zh.json +59 -5
- package/dist/PdfAnnotationCanvas.client-EHQWF6BR.js +0 -462
- package/dist/PdfAnnotationCanvas.client-EHQWF6BR.js.map +0 -1
- package/dist/PdfAnnotationCanvas.client-SU5KNT7G.css +0 -98
- package/dist/PdfAnnotationCanvas.client-SU5KNT7G.css.map +0 -1
- package/dist/ar-CULRHLNG.js.map +0 -1
- package/dist/bn-HYR7CEL2.js.map +0 -1
- package/dist/chunk-NH6L2GIL.js.map +0 -1
- package/dist/chunk-TG2XQEC4.js.map +0 -1
- package/dist/chunk-XUDKYAVC.js +0 -21
- package/dist/chunk-XUDKYAVC.js.map +0 -1
- package/dist/cs-YBRWY7NH.js.map +0 -1
- package/dist/da-PHDEOBV3.js.map +0 -1
- package/dist/de-O4UCCVLJ.js.map +0 -1
- package/dist/el-MVGO6WZV.js.map +0 -1
- package/dist/es-USSLXQY7.js.map +0 -1
- package/dist/fa-WMAREFWY.js.map +0 -1
- package/dist/fi-B3NBNOTS.js.map +0 -1
- package/dist/fr-TXYK5T5W.js.map +0 -1
- package/dist/he-JCJACW5D.js.map +0 -1
- package/dist/hi-VOQLZNJU.js.map +0 -1
- package/dist/id-BFN5RZNZ.js.map +0 -1
- package/dist/it-TWWDHKKM.js.map +0 -1
- package/dist/ja-YRQLEBFM.js.map +0 -1
- package/dist/ko-PG6B3CRB.js.map +0 -1
- package/dist/ms-7EZECVKM.js.map +0 -1
- package/dist/nl-HP753YAP.js.map +0 -1
- package/dist/no-JUD5WX3N.js.map +0 -1
- package/dist/pl-RVUL4CBM.js.map +0 -1
- package/dist/pt-RPOVD4QM.js.map +0 -1
- package/dist/ro-DMYWQTRD.js.map +0 -1
- package/dist/sv-DMZ4FGXD.js.map +0 -1
- package/dist/th-4HVBJBQ2.js.map +0 -1
- package/dist/tr-6BDPU5ML.js.map +0 -1
- package/dist/uk-TBZBT2TL.js.map +0 -1
- package/dist/vi-UMKZKZL3.js.map +0 -1
- package/dist/zh-YBJWJJYB.js.map +0 -1
- package/src/integrations/tailwind-plugin.cjs +0 -224
- /package/dist/{en-2KQILFKQ.js.map → en-2KADE7N4.js.map} +0 -0
|
@@ -126,267 +126,84 @@
|
|
|
126
126
|
Detection Log (Completed Results)
|
|
127
127
|
============================================ */
|
|
128
128
|
|
|
129
|
-
|
|
130
129
|
/* ============================================
|
|
131
130
|
Detection Progress Display
|
|
132
131
|
============================================ */
|
|
133
132
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
[data-theme="dark"] .semiont-annotation-progress {
|
|
143
|
-
background-color: var(--semiont-color-gray-800);
|
|
144
|
-
border-color: var(--semiont-color-blue-600);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/* Header section */
|
|
148
|
-
.semiont-annotation-header {
|
|
149
|
-
display: flex;
|
|
150
|
-
align-items: center;
|
|
151
|
-
justify-content: space-between;
|
|
152
|
-
margin-bottom: 0.75rem;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
.semiont-annotation-title {
|
|
156
|
-
font-size: 0.875rem;
|
|
157
|
-
font-weight: 600;
|
|
158
|
-
color: var(--semiont-color-gray-900);
|
|
159
|
-
display: flex;
|
|
160
|
-
align-items: center;
|
|
161
|
-
gap: 0.5rem;
|
|
162
|
-
margin: 0;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
[data-theme="dark"] .semiont-annotation-title {
|
|
166
|
-
color: var(--semiont-color-gray-100);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
.semiont-annotation-sparkle {
|
|
170
|
-
font-size: 1.125rem;
|
|
171
|
-
animation: semiont-sparkle-infinite 1.5s ease-in-out infinite;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
@keyframes semiont-sparkle-infinite {
|
|
175
|
-
0%, 100% {
|
|
176
|
-
opacity: 0.5;
|
|
177
|
-
transform: scale(1);
|
|
178
|
-
}
|
|
179
|
-
50% {
|
|
180
|
-
opacity: 1;
|
|
181
|
-
transform: scale(1.1);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
.semiont-annotation-cancel {
|
|
186
|
-
color: var(--semiont-color-gray-600);
|
|
187
|
-
background: none;
|
|
188
|
-
border: none;
|
|
189
|
-
padding: 0;
|
|
190
|
-
font-size: 0.875rem;
|
|
191
|
-
cursor: pointer;
|
|
192
|
-
transition: color 0.2s;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
.semiont-annotation-cancel:hover {
|
|
196
|
-
color: var(--semiont-color-gray-900);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
[data-theme="dark"] .semiont-annotation-cancel {
|
|
200
|
-
color: var(--semiont-color-gray-400);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
[data-theme="dark"] .semiont-annotation-cancel:hover {
|
|
204
|
-
color: var(--semiont-color-gray-300);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/* Completed entity types log */
|
|
208
|
-
.semiont-annotation-log {
|
|
209
|
-
margin-bottom: 0.75rem;
|
|
133
|
+
/* ── Assist progress: TWO containers, not five ──────────────────────────────
|
|
134
|
+
The widget was `.semiont-assist-widget` > `.semiont-annotation-progress` >
|
|
135
|
+
`__params` > `__message`, each with its own border, padding and tint — four
|
|
136
|
+
nested boxes around one sentence of status. The outer `.semiont-assist-widget`
|
|
137
|
+
(above) already provides the card; this provides the status region inside it.
|
|
138
|
+
ASSIST-PROGRESS-CONSOLIDATION P3. */
|
|
139
|
+
.semiont-assist-progress {
|
|
210
140
|
display: flex;
|
|
211
141
|
flex-direction: column;
|
|
212
|
-
gap: 0.
|
|
142
|
+
gap: 0.375rem;
|
|
143
|
+
position: relative;
|
|
213
144
|
}
|
|
214
145
|
|
|
215
|
-
.semiont-
|
|
216
|
-
font-size: 0.75rem;
|
|
217
|
-
color: var(--semiont-color-gray-600);
|
|
146
|
+
.semiont-assist-progress__status {
|
|
218
147
|
display: flex;
|
|
219
|
-
align-items:
|
|
148
|
+
align-items: baseline;
|
|
220
149
|
gap: 0.5rem;
|
|
150
|
+
padding-right: 1.5rem; /* room for the single control */
|
|
151
|
+
font-size: var(--semiont-text-sm);
|
|
152
|
+
font-weight: var(--semiont-font-medium);
|
|
153
|
+
color: var(--semiont-text-primary);
|
|
221
154
|
}
|
|
222
155
|
|
|
223
|
-
|
|
224
|
-
|
|
156
|
+
.semiont-assist-progress__icon {
|
|
157
|
+
flex: none;
|
|
225
158
|
}
|
|
226
159
|
|
|
227
|
-
.
|
|
228
|
-
|
|
160
|
+
/* The subject and the parameters are context for the status, not peers of it. */
|
|
161
|
+
.semiont-assist-progress__subject,
|
|
162
|
+
.semiont-assist-progress__params {
|
|
163
|
+
font-size: var(--semiont-text-xs);
|
|
164
|
+
color: var(--semiont-text-secondary);
|
|
229
165
|
}
|
|
230
166
|
|
|
231
|
-
[data-theme="dark"] .semiont-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
.semiont-annotation-entity-type {
|
|
236
|
-
font-weight: 500;
|
|
167
|
+
[data-theme="dark"] .semiont-assist-progress__subject,
|
|
168
|
+
[data-theme="dark"] .semiont-assist-progress__params {
|
|
169
|
+
color: var(--semiont-text-secondary);
|
|
237
170
|
}
|
|
238
171
|
|
|
239
|
-
.semiont-
|
|
240
|
-
|
|
241
|
-
padding: 0.5rem;
|
|
242
|
-
background-color: rgba(59, 130, 246, 0.05);
|
|
243
|
-
border-radius: 0.375rem;
|
|
244
|
-
border: 1px solid rgba(59, 130, 246, 0.2);
|
|
172
|
+
.semiont-assist-progress__subject {
|
|
173
|
+
font-variant-numeric: tabular-nums;
|
|
245
174
|
}
|
|
246
175
|
|
|
247
|
-
|
|
248
|
-
background-color: rgba(59, 130, 246, 0.1);
|
|
249
|
-
border-color: rgba(59, 130, 246, 0.3);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
.semiont-annotation-progress__params-title {
|
|
253
|
-
font-size: 0.75rem;
|
|
254
|
-
font-weight: 600;
|
|
255
|
-
color: var(--semiont-color-blue-700);
|
|
256
|
-
margin-bottom: 0.25rem;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
[data-theme="dark"] .semiont-annotation-progress__params-title {
|
|
260
|
-
color: var(--semiont-color-blue-300);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
.semiont-annotation-progress__param {
|
|
264
|
-
font-size: 0.75rem;
|
|
265
|
-
color: var(--semiont-color-gray-700);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
[data-theme="dark"] .semiont-annotation-progress__param {
|
|
269
|
-
color: var(--semiont-color-gray-300);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
.semiont-annotation-progress__param-label {
|
|
273
|
-
font-weight: 500;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
.semiont-annotation-progress__status {
|
|
176
|
+
.semiont-assist-progress__params {
|
|
277
177
|
display: flex;
|
|
278
|
-
flex-
|
|
178
|
+
flex-wrap: wrap;
|
|
279
179
|
gap: 0.5rem;
|
|
280
|
-
position: relative;
|
|
281
180
|
}
|
|
282
181
|
|
|
283
|
-
.semiont-
|
|
284
|
-
|
|
285
|
-
align-items: center;
|
|
286
|
-
gap: 0.5rem;
|
|
287
|
-
font-size: 0.875rem;
|
|
288
|
-
color: var(--semiont-color-gray-900);
|
|
289
|
-
font-weight: 500;
|
|
290
|
-
padding: 0.75rem 2.5rem 0.75rem 1rem; /* Extra right padding for close button */
|
|
291
|
-
border-radius: 0.5rem;
|
|
292
|
-
background: linear-gradient(135deg, rgba(59, 130, 246, 0.15), rgba(37, 99, 235, 0.15));
|
|
293
|
-
border: 2px solid rgba(59, 130, 246, 0.3);
|
|
294
|
-
animation: semiont-detection-pulse 2s ease-in-out infinite;
|
|
182
|
+
.semiont-assist-progress__param-label {
|
|
183
|
+
font-weight: var(--semiont-font-medium);
|
|
295
184
|
}
|
|
296
185
|
|
|
297
|
-
|
|
186
|
+
/* One control, top-right, quiet until hovered. */
|
|
187
|
+
.semiont-assist-progress__control {
|
|
298
188
|
position: absolute;
|
|
299
|
-
top: 0
|
|
300
|
-
right: 0
|
|
301
|
-
|
|
302
|
-
height: 1.5rem;
|
|
303
|
-
border: none;
|
|
304
|
-
background-color: rgba(0, 0, 0, 0.1);
|
|
305
|
-
color: var(--semiont-color-gray-700);
|
|
306
|
-
font-size: 1.25rem;
|
|
189
|
+
top: 0;
|
|
190
|
+
right: 0;
|
|
191
|
+
padding: 0.125rem 0.25rem;
|
|
307
192
|
line-height: 1;
|
|
308
|
-
|
|
193
|
+
background: none;
|
|
194
|
+
border: none;
|
|
309
195
|
cursor: pointer;
|
|
310
|
-
|
|
311
|
-
align-items: center;
|
|
312
|
-
justify-content: center;
|
|
313
|
-
transition: all 0.2s ease;
|
|
196
|
+
color: var(--semiont-text-secondary);
|
|
314
197
|
}
|
|
315
198
|
|
|
316
|
-
.semiont-
|
|
317
|
-
|
|
318
|
-
color: var(--semiont-color-gray-900);
|
|
199
|
+
.semiont-assist-progress__control:hover {
|
|
200
|
+
color: var(--semiont-text-primary);
|
|
319
201
|
}
|
|
320
202
|
|
|
321
|
-
[data-theme="dark"] .semiont-
|
|
322
|
-
|
|
323
|
-
color: var(--semiont-color-gray-300);
|
|
203
|
+
[data-theme="dark"] .semiont-assist-progress__control {
|
|
204
|
+
color: var(--semiont-text-secondary);
|
|
324
205
|
}
|
|
325
206
|
|
|
326
|
-
[data-theme="dark"] .semiont-annotation-progress__close:hover {
|
|
327
|
-
background-color: rgba(255, 255, 255, 0.2);
|
|
328
|
-
color: var(--semiont-color-gray-100);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
[data-theme="dark"] .semiont-annotation-progress__message {
|
|
332
|
-
color: var(--semiont-color-gray-100);
|
|
333
|
-
background: linear-gradient(135deg, rgba(59, 130, 246, 0.25), rgba(37, 99, 235, 0.25));
|
|
334
|
-
border-color: rgba(59, 130, 246, 0.5);
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
@keyframes semiont-detection-pulse {
|
|
338
|
-
0%, 100% {
|
|
339
|
-
opacity: 1;
|
|
340
|
-
transform: scale(1);
|
|
341
|
-
}
|
|
342
|
-
50% {
|
|
343
|
-
opacity: 0.85;
|
|
344
|
-
transform: scale(1.02);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
.semiont-annotation-progress__icon {
|
|
349
|
-
font-size: 1.125rem;
|
|
350
|
-
animation: semiont-sparkle-rotate 2s linear infinite;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
@keyframes semiont-sparkle-rotate {
|
|
354
|
-
0% {
|
|
355
|
-
transform: rotate(0deg) scale(1);
|
|
356
|
-
filter: brightness(1);
|
|
357
|
-
}
|
|
358
|
-
25% {
|
|
359
|
-
transform: rotate(90deg) scale(1.2);
|
|
360
|
-
filter: brightness(1.3);
|
|
361
|
-
}
|
|
362
|
-
50% {
|
|
363
|
-
transform: rotate(180deg) scale(1);
|
|
364
|
-
filter: brightness(1);
|
|
365
|
-
}
|
|
366
|
-
75% {
|
|
367
|
-
transform: rotate(270deg) scale(1.2);
|
|
368
|
-
filter: brightness(1.3);
|
|
369
|
-
}
|
|
370
|
-
100% {
|
|
371
|
-
transform: rotate(360deg) scale(1);
|
|
372
|
-
filter: brightness(1);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
.semiont-annotation-progress__details {
|
|
377
|
-
font-size: 0.75rem;
|
|
378
|
-
color: var(--semiont-color-gray-500);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
[data-theme="dark"] .semiont-annotation-progress__details {
|
|
382
|
-
color: var(--semiont-color-gray-400);
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
/* ============================================
|
|
386
|
-
Motivation-Specific Theming via data-type
|
|
387
|
-
============================================ */
|
|
388
|
-
|
|
389
|
-
/* Highlight */
|
|
390
207
|
.semiont-assist-widget[data-type="highlight"] {
|
|
391
208
|
border-color: var(--semiont-color-yellow-300);
|
|
392
209
|
}
|
|
@@ -436,56 +253,36 @@
|
|
|
436
253
|
============================================ */
|
|
437
254
|
|
|
438
255
|
/* Highlight - Yellow */
|
|
439
|
-
.semiont-annotation-progress[data-type="highlight"] .semiont-annotation-progress__message {
|
|
440
|
-
background: linear-gradient(135deg, rgba(250, 204, 21, 0.15), rgba(234, 179, 8, 0.15));
|
|
441
|
-
border-color: rgba(250, 204, 21, 0.3);
|
|
442
|
-
}
|
|
443
256
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
.semiont-annotation-progress[data-type="assessment"] .semiont-annotation-progress__message {
|
|
462
|
-
background: linear-gradient(135deg, rgba(168, 85, 247, 0.15), rgba(147, 51, 234, 0.15));
|
|
463
|
-
border-color: rgba(168, 85, 247, 0.3);
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
[data-theme="dark"] .semiont-annotation-progress[data-type="assessment"] .semiont-annotation-progress__message {
|
|
467
|
-
background: linear-gradient(135deg, rgba(168, 85, 247, 0.25), rgba(147, 51, 234, 0.25));
|
|
468
|
-
border-color: rgba(168, 85, 247, 0.5);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
/* Tag - Orange */
|
|
472
|
-
.semiont-annotation-progress[data-type="tag"] .semiont-annotation-progress__message {
|
|
473
|
-
background: linear-gradient(135deg, rgba(251, 146, 60, 0.15), rgba(249, 115, 22, 0.15));
|
|
474
|
-
border-color: rgba(251, 146, 60, 0.3);
|
|
257
|
+
/*
|
|
258
|
+
* The progress bar. `AssistProgress` is its only consumer in the whole
|
|
259
|
+
* package, so it lives here rather than in `styles/core/` — it was defined in
|
|
260
|
+
* three files while nothing else rendered it (CLEAN-PROGRESS D4). If a second
|
|
261
|
+
* consumer ever appears, promoting these rules to core is a move, not a copy.
|
|
262
|
+
*
|
|
263
|
+
* The track is NOT `--semiont-bg-secondary`: that is exactly
|
|
264
|
+
* `.semiont-assist-widget`'s own background, so the track went invisible inside
|
|
265
|
+
* the card and the fill floated with nothing to measure it against (spotted in
|
|
266
|
+
* live testing, 2026-08-12).
|
|
267
|
+
*/
|
|
268
|
+
.semiont-progress-bar {
|
|
269
|
+
width: 100%;
|
|
270
|
+
height: 0.5rem;
|
|
271
|
+
overflow: hidden;
|
|
272
|
+
border-radius: var(--semiont-radius-full);
|
|
273
|
+
background-color: var(--semiont-color-gray-200);
|
|
475
274
|
}
|
|
476
275
|
|
|
477
|
-
[data-theme="dark"] .semiont-
|
|
478
|
-
background:
|
|
479
|
-
border-color: rgba(251, 146, 60, 0.5);
|
|
276
|
+
[data-theme="dark"] .semiont-progress-bar {
|
|
277
|
+
background-color: var(--semiont-color-gray-700);
|
|
480
278
|
}
|
|
481
279
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
background:
|
|
485
|
-
|
|
280
|
+
.semiont-progress-bar__fill {
|
|
281
|
+
height: 100%;
|
|
282
|
+
background-color: var(--semiont-color-primary-500);
|
|
283
|
+
transition: width 0.3s ease;
|
|
486
284
|
}
|
|
487
285
|
|
|
488
|
-
[data-theme="dark"] .semiont-
|
|
489
|
-
background:
|
|
490
|
-
border-color: rgba(59, 130, 246, 0.5);
|
|
286
|
+
[data-theme="dark"] .semiont-progress-bar__fill {
|
|
287
|
+
background-color: var(--semiont-color-primary-400);
|
|
491
288
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useState, useCallback } from 'react';
|
|
4
|
+
import { assistProgressCopy, assistSubjectCopy, assistParamLabel } from '../../../lib/assist-progress-copy';
|
|
4
5
|
import { useTranslations } from '../../../contexts/TranslationContext';
|
|
5
6
|
import type { SemiontSession } from '@semiont/sdk';
|
|
6
7
|
import type { Motivation, components } from '@semiont/core';
|
|
@@ -93,11 +94,10 @@ export function AssistSection({
|
|
|
93
94
|
translations: {
|
|
94
95
|
cancel: t('cancel'),
|
|
95
96
|
inProgress: t('annotating'),
|
|
96
|
-
complete: t('complete'),
|
|
97
|
-
failed: t('failed'),
|
|
98
|
-
paramsTitle: ta('paramsTitle'),
|
|
99
|
-
processing: (label) => ta('processing', { label }),
|
|
100
97
|
close: ta('close'),
|
|
98
|
+
message: assistProgressCopy(ta),
|
|
99
|
+
subject: assistSubjectCopy(ta),
|
|
100
|
+
paramLabel: assistParamLabel(ta),
|
|
101
101
|
},
|
|
102
102
|
}}
|
|
103
103
|
form={
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useEffect, type ReactNode } from 'react';
|
|
4
4
|
import type { components } from '@semiont/core';
|
|
5
|
-
import { AssistProgress, type AssistProgressProps } from '../../AssistProgress';
|
|
5
|
+
import { AssistProgress, type AssistProgressProps, type AssistDataType } from '../../AssistProgress';
|
|
6
6
|
|
|
7
7
|
type JobProgress = components['schemas']['JobProgress'];
|
|
8
8
|
|
|
9
9
|
export interface AssistShellProps {
|
|
10
|
-
/** localStorage persist-key suffix and CSS `data-type
|
|
11
|
-
assistType:
|
|
10
|
+
/** localStorage persist-key suffix and CSS `data-type`. */
|
|
11
|
+
assistType: AssistDataType;
|
|
12
12
|
/** Collapsible section title (already translated). */
|
|
13
13
|
title: string;
|
|
14
14
|
isAssisting: boolean;
|
|
@@ -24,7 +24,7 @@ export interface AssistShellProps {
|
|
|
24
24
|
* itself, so a caller that omitted this would render untranslated chrome —
|
|
25
25
|
* the failure Lane A exists to make impossible.
|
|
26
26
|
*/
|
|
27
|
-
progressProps: Omit<AssistProgressProps, 'progress' | 'dataType'>;
|
|
27
|
+
progressProps: Omit<AssistProgressProps, 'progress' | 'dataType' | 'ended'>;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
@@ -70,6 +70,14 @@ export function AssistShell({ assistType, title, isAssisting, progress, form, pr
|
|
|
70
70
|
<AssistProgress
|
|
71
71
|
progress={progress}
|
|
72
72
|
dataType={assistType}
|
|
73
|
+
// `ended` is deliberately NOT in `progressProps` (it is Omit'd):
|
|
74
|
+
// the shell watches the job lifecycle, so a panel cannot get this
|
|
75
|
+
// wrong or forget it.
|
|
76
|
+
// D7: terminality is the OWNER's fact. `isAssisting` follows the
|
|
77
|
+
// job lifecycle (job:complete / job:fail); the widget must never
|
|
78
|
+
// infer "done" from a progress payload, which cannot tell it
|
|
79
|
+
// about a cancel or a crash after the last tick.
|
|
80
|
+
ended={!isAssisting}
|
|
73
81
|
{...progressProps}
|
|
74
82
|
{...(isAssisting ? { onDismiss: undefined } : {})}
|
|
75
83
|
/>
|
|
@@ -19,10 +19,6 @@
|
|
|
19
19
|
color: var(--semiont-text-primary);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
[data-theme="dark"] .semiont-collaboration-panel__title {
|
|
23
|
-
color: var(--semiont-text-primary);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
22
|
/* Sections */
|
|
27
23
|
.semiont-collaboration-panel__section {
|
|
28
24
|
display: flex;
|
|
@@ -93,10 +89,6 @@
|
|
|
93
89
|
color: var(--semiont-text-tertiary);
|
|
94
90
|
}
|
|
95
91
|
|
|
96
|
-
[data-theme="dark"] .semiont-collaboration-panel__status-text {
|
|
97
|
-
color: var(--semiont-text-tertiary);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
92
|
.semiont-collaboration-panel__status-text[data-connected="true"] {
|
|
101
93
|
color: var(--semiont-color-success-dark);
|
|
102
94
|
}
|
|
@@ -110,10 +102,6 @@
|
|
|
110
102
|
color: var(--semiont-text-tertiary);
|
|
111
103
|
}
|
|
112
104
|
|
|
113
|
-
[data-theme="dark"] .semiont-collaboration-panel__event-count {
|
|
114
|
-
color: var(--semiont-text-tertiary);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
105
|
/* Details */
|
|
118
106
|
.semiont-collaboration-panel__details {
|
|
119
107
|
display: flex;
|
|
@@ -133,10 +121,6 @@
|
|
|
133
121
|
color: var(--semiont-text-primary);
|
|
134
122
|
}
|
|
135
123
|
|
|
136
|
-
[data-theme="dark"] .semiont-collaboration-panel__label {
|
|
137
|
-
color: var(--semiont-text-primary);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
124
|
/* Description */
|
|
141
125
|
.semiont-collaboration-panel__description {
|
|
142
126
|
margin: 0;
|
|
@@ -208,15 +192,56 @@
|
|
|
208
192
|
color: var(--semiont-text-primary);
|
|
209
193
|
}
|
|
210
194
|
|
|
211
|
-
|
|
195
|
+
.semiont-collaboration-panel__user-status {
|
|
196
|
+
font-size: var(--semiont-text-xs);
|
|
197
|
+
color: var(--semiont-text-tertiary);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/* Collaborators roster — one row per software agent (INFERENCE-LIMITS-EXPOSURE P3a) */
|
|
201
|
+
.semiont-collaboration-panel__collaborator {
|
|
202
|
+
display: flex;
|
|
203
|
+
flex-direction: column;
|
|
204
|
+
gap: 0.125rem;
|
|
205
|
+
padding: 0.375rem 0;
|
|
206
|
+
font-size: var(--semiont-text-sm);
|
|
207
|
+
line-height: 1.4;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.semiont-collaboration-panel__collaborator + .semiont-collaboration-panel__collaborator {
|
|
211
|
+
border-top: 1px solid var(--semiont-border-secondary);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
[data-theme="dark"] .semiont-collaboration-panel__collaborator + .semiont-collaboration-panel__collaborator {
|
|
215
|
+
border-top-color: var(--semiont-color-gray-700);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.semiont-collaboration-panel__collaborator-id {
|
|
219
|
+
display: flex;
|
|
220
|
+
gap: 0.375rem;
|
|
221
|
+
align-items: baseline;
|
|
212
222
|
color: var(--semiont-text-primary);
|
|
213
223
|
}
|
|
214
224
|
|
|
215
|
-
.
|
|
225
|
+
/* The provider is context for the model, not a peer of it. */
|
|
226
|
+
.semiont-collaboration-panel__collaborator-provider {
|
|
216
227
|
font-size: var(--semiont-text-xs);
|
|
217
|
-
color: var(--semiont-text-
|
|
228
|
+
color: var(--semiont-text-secondary);
|
|
229
|
+
text-transform: uppercase;
|
|
230
|
+
letter-spacing: 0.03em;
|
|
218
231
|
}
|
|
219
232
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
233
|
+
.semiont-collaboration-panel__collaborator-model {
|
|
234
|
+
font-weight: var(--semiont-font-medium);
|
|
235
|
+
word-break: break-all;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.semiont-collaboration-panel__collaborator-jobs,
|
|
239
|
+
.semiont-collaboration-panel__collaborator-limits {
|
|
240
|
+
font-size: var(--semiont-text-xs);
|
|
241
|
+
color: var(--semiont-text-secondary);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* Ceilings are figures — align them with the numeral treatment used elsewhere. */
|
|
245
|
+
.semiont-collaboration-panel__collaborator-limits {
|
|
246
|
+
font-variant-numeric: tabular-nums;
|
|
247
|
+
}
|
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import type { ConnectionState } from '@semiont/core';
|
|
3
|
+
import type { CollaboratorEntry, ConnectionState } from '@semiont/core';
|
|
4
4
|
import { useTranslations } from '../../../contexts/TranslationContext';
|
|
5
5
|
import './CollaborationPanel.css';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Token counts read as ceilings, not quantities — "200K" carries the meaning a
|
|
9
|
+
* bare 200000 makes the reader compute. Kept lossless above the K/M break so a
|
|
10
|
+
* 128000 window never displays as a rounded-away 130K.
|
|
11
|
+
*/
|
|
12
|
+
function formatTokens(n: number): string {
|
|
13
|
+
if (n >= 1_000_000) {
|
|
14
|
+
const m = n / 1_000_000;
|
|
15
|
+
return `${Number.isInteger(m) ? m : m.toFixed(1)}M`;
|
|
16
|
+
}
|
|
17
|
+
if (n >= 1_000) {
|
|
18
|
+
const k = n / 1_000;
|
|
19
|
+
return `${Number.isInteger(k) ? k : k.toFixed(1)}K`;
|
|
20
|
+
}
|
|
21
|
+
return String(n);
|
|
22
|
+
}
|
|
23
|
+
|
|
7
24
|
interface Props {
|
|
8
25
|
/**
|
|
9
26
|
* Connection state from `client.actor.state$`. See
|
|
@@ -26,16 +43,34 @@ interface Props {
|
|
|
26
43
|
eventCount: number;
|
|
27
44
|
lastEventTimestamp?: string;
|
|
28
45
|
knowledgeBaseName?: string;
|
|
46
|
+
/**
|
|
47
|
+
* The KB's collaborator roster (`client.browse.agents()`, typically via
|
|
48
|
+
* `useCollaborators`). Optional so hosts that never wire it — including
|
|
49
|
+
* external consumers of this package — render exactly as before.
|
|
50
|
+
*
|
|
51
|
+
* Each entry's `limits` is absent whenever discovery could not answer *right
|
|
52
|
+
* now* (INFERENCE-LIMITS-EXPOSURE D3), so a missing ceiling is normal and
|
|
53
|
+
* shows as no ceiling rather than as an error.
|
|
54
|
+
*/
|
|
55
|
+
collaborators?: CollaboratorEntry[];
|
|
29
56
|
}
|
|
30
57
|
|
|
31
58
|
export function CollaborationPanel({
|
|
32
59
|
state,
|
|
33
60
|
eventCount,
|
|
34
61
|
lastEventTimestamp,
|
|
35
|
-
knowledgeBaseName
|
|
62
|
+
knowledgeBaseName,
|
|
63
|
+
collaborators
|
|
36
64
|
}: Props) {
|
|
37
65
|
const t = useTranslations('CollaborationPanel');
|
|
38
66
|
|
|
67
|
+
// Only Software agents have a provider/model and can carry inference
|
|
68
|
+
// ceilings; Persons and Organizations are collaborators in a different
|
|
69
|
+
// sense and have nothing to show in this section.
|
|
70
|
+
const softwareAgents = (collaborators ?? []).filter(
|
|
71
|
+
(entry) => entry.agent['@type'] === 'Software',
|
|
72
|
+
);
|
|
73
|
+
|
|
39
74
|
// Healthy = live, or briefly flapping. Only genuinely sustained
|
|
40
75
|
// disconnects surface as "Disconnected" in the UI.
|
|
41
76
|
const isHealthy = state === 'open' || state === 'reconnecting' || state === 'initial' || state === 'connecting';
|
|
@@ -122,6 +157,62 @@ export function CollaborationPanel({
|
|
|
122
157
|
</div>
|
|
123
158
|
</div>
|
|
124
159
|
|
|
160
|
+
{/* Collaborators roster — software agents and their discovered ceilings */}
|
|
161
|
+
{softwareAgents.length > 0 && (
|
|
162
|
+
<div className="semiont-collaboration-panel__section semiont-collaboration-panel__section--bordered">
|
|
163
|
+
<h3 className="semiont-collaboration-panel__heading">
|
|
164
|
+
{t('collaborators')}
|
|
165
|
+
</h3>
|
|
166
|
+
{softwareAgents.map((entry, i) => {
|
|
167
|
+
// `agent` is narrowed to the Software member by the filter above,
|
|
168
|
+
// but the generated union is structural, so read through a local.
|
|
169
|
+
const agent = entry.agent as Extract<CollaboratorEntry['agent'], { '@type': 'Software' }>;
|
|
170
|
+
const limits = entry.limits;
|
|
171
|
+
// `maxOutputTokens === contextTokens` is the schema's documented
|
|
172
|
+
// sentinel for a provider with ONE shared window (Ollama). Showing
|
|
173
|
+
// "128K in / 128K out" there would invent a distinction the
|
|
174
|
+
// provider does not make.
|
|
175
|
+
const ceiling = !limits
|
|
176
|
+
? null
|
|
177
|
+
: limits.maxOutputTokens === limits.contextTokens
|
|
178
|
+
? t('sharedWindow', { contextTokens: formatTokens(limits.contextTokens) })
|
|
179
|
+
: t('ceilings', {
|
|
180
|
+
contextTokens: formatTokens(limits.contextTokens),
|
|
181
|
+
maxOutputTokens: formatTokens(limits.maxOutputTokens),
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
return (
|
|
185
|
+
<div
|
|
186
|
+
key={agent['@id'] ?? `${agent.provider}:${agent.model}:${i}`}
|
|
187
|
+
className="semiont-collaboration-panel__collaborator"
|
|
188
|
+
data-testid="semiont-collaborator-row"
|
|
189
|
+
>
|
|
190
|
+
<div className="semiont-collaboration-panel__collaborator-id">
|
|
191
|
+
{agent.provider && (
|
|
192
|
+
<span className="semiont-collaboration-panel__collaborator-provider">
|
|
193
|
+
{agent.provider}
|
|
194
|
+
</span>
|
|
195
|
+
)}
|
|
196
|
+
<span className="semiont-collaboration-panel__collaborator-model">
|
|
197
|
+
{agent.model ?? agent.name}
|
|
198
|
+
</span>
|
|
199
|
+
</div>
|
|
200
|
+
{entry.servesJobTypes && entry.servesJobTypes.length > 0 && (
|
|
201
|
+
<div className="semiont-collaboration-panel__collaborator-jobs">
|
|
202
|
+
{entry.servesJobTypes.join(', ')}
|
|
203
|
+
</div>
|
|
204
|
+
)}
|
|
205
|
+
{ceiling && (
|
|
206
|
+
<div className="semiont-collaboration-panel__collaborator-limits">
|
|
207
|
+
{ceiling}
|
|
208
|
+
</div>
|
|
209
|
+
)}
|
|
210
|
+
</div>
|
|
211
|
+
);
|
|
212
|
+
})}
|
|
213
|
+
</div>
|
|
214
|
+
)}
|
|
215
|
+
|
|
125
216
|
{/* Sharing Section - Placeholder for future */}
|
|
126
217
|
<div className="semiont-collaboration-panel__section semiont-collaboration-panel__section--bordered">
|
|
127
218
|
<h3 className="semiont-collaboration-panel__heading">
|