@proofhound/web-ui 0.1.6
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/LICENSE +190 -0
- package/dist/components/annotations/annotation-claim-dialog.d.ts +13 -0
- package/dist/components/annotations/annotation-claim-dialog.d.ts.map +1 -0
- package/dist/components/annotations/annotation-claim-dialog.js +60 -0
- package/dist/components/annotations/annotation-claim-dialog.js.map +1 -0
- package/dist/components/charts/source-legend.d.ts +10 -0
- package/dist/components/charts/source-legend.d.ts.map +1 -0
- package/dist/components/charts/source-legend.js +15 -0
- package/dist/components/charts/source-legend.js.map +1 -0
- package/dist/components/charts/source-stacked-bar.d.ts +22 -0
- package/dist/components/charts/source-stacked-bar.d.ts.map +1 -0
- package/dist/components/charts/source-stacked-bar.js +43 -0
- package/dist/components/charts/source-stacked-bar.js.map +1 -0
- package/dist/components/index.d.ts +15 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +17 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/json-object-textarea.d.ts +11 -0
- package/dist/components/json-object-textarea.d.ts.map +1 -0
- package/dist/components/json-object-textarea.js +82 -0
- package/dist/components/json-object-textarea.js.map +1 -0
- package/dist/components/model-context-window-input.d.ts +15 -0
- package/dist/components/model-context-window-input.d.ts.map +1 -0
- package/dist/components/model-context-window-input.js +57 -0
- package/dist/components/model-context-window-input.js.map +1 -0
- package/dist/components/model-probe-status.d.ts +11 -0
- package/dist/components/model-probe-status.d.ts.map +1 -0
- package/dist/components/model-probe-status.js +34 -0
- package/dist/components/model-probe-status.js.map +1 -0
- package/dist/components/prompt-diff/prompt-diff-split-view.d.ts +28 -0
- package/dist/components/prompt-diff/prompt-diff-split-view.d.ts.map +1 -0
- package/dist/components/prompt-diff/prompt-diff-split-view.js +101 -0
- package/dist/components/prompt-diff/prompt-diff-split-view.js.map +1 -0
- package/dist/components/prompt-language-select.d.ts +13 -0
- package/dist/components/prompt-language-select.d.ts.map +1 -0
- package/dist/components/prompt-language-select.js +14 -0
- package/dist/components/prompt-language-select.js.map +1 -0
- package/dist/components/prompt-version-picker-row.d.ts +27 -0
- package/dist/components/prompt-version-picker-row.d.ts.map +1 -0
- package/dist/components/prompt-version-picker-row.js +50 -0
- package/dist/components/prompt-version-picker-row.js.map +1 -0
- package/dist/components/prompt-version-status-badge.d.ts +8 -0
- package/dist/components/prompt-version-status-badge.d.ts.map +1 -0
- package/dist/components/prompt-version-status-badge.js +31 -0
- package/dist/components/prompt-version-status-badge.js.map +1 -0
- package/dist/components/quick-fill/quick-fill-picker.d.ts +42 -0
- package/dist/components/quick-fill/quick-fill-picker.d.ts.map +1 -0
- package/dist/components/quick-fill/quick-fill-picker.js +46 -0
- package/dist/components/quick-fill/quick-fill-picker.js.map +1 -0
- package/dist/components/time-zone-preference-menu.d.ts +10 -0
- package/dist/components/time-zone-preference-menu.d.ts.map +1 -0
- package/dist/components/time-zone-preference-menu.js +33 -0
- package/dist/components/time-zone-preference-menu.js.map +1 -0
- package/dist/contracts/index.d.ts +13 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +7 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/features/index.d.ts +3 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +4 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/model-quick-fill/model-preset-draft.d.ts +19 -0
- package/dist/features/model-quick-fill/model-preset-draft.d.ts.map +1 -0
- package/dist/features/model-quick-fill/model-preset-draft.js +22 -0
- package/dist/features/model-quick-fill/model-preset-draft.js.map +1 -0
- package/dist/features/model-quick-fill/model-preset-quick-fill.d.ts +7 -0
- package/dist/features/model-quick-fill/model-preset-quick-fill.d.ts.map +1 -0
- package/dist/features/model-quick-fill/model-preset-quick-fill.js +73 -0
- package/dist/features/model-quick-fill/model-preset-quick-fill.js.map +1 -0
- package/dist/hooks/annotation.d.ts +253 -0
- package/dist/hooks/annotation.d.ts.map +1 -0
- package/dist/hooks/annotation.js +79 -0
- package/dist/hooks/annotation.js.map +1 -0
- package/dist/hooks/canary-release.d.ts +674 -0
- package/dist/hooks/canary-release.d.ts.map +1 -0
- package/dist/hooks/canary-release.js +142 -0
- package/dist/hooks/canary-release.js.map +1 -0
- package/dist/hooks/connector.d.ts +585 -0
- package/dist/hooks/connector.d.ts.map +1 -0
- package/dist/hooks/connector.js +157 -0
- package/dist/hooks/connector.js.map +1 -0
- package/dist/hooks/dataset.d.ts +138 -0
- package/dist/hooks/dataset.d.ts.map +1 -0
- package/dist/hooks/dataset.js +84 -0
- package/dist/hooks/dataset.js.map +1 -0
- package/dist/hooks/experiment.d.ts +376 -0
- package/dist/hooks/experiment.d.ts.map +1 -0
- package/dist/hooks/experiment.js +58 -0
- package/dist/hooks/experiment.js.map +1 -0
- package/dist/hooks/index.d.ts +18 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +18 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/model.d.ts +327 -0
- package/dist/hooks/model.d.ts.map +1 -0
- package/dist/hooks/model.js +103 -0
- package/dist/hooks/model.js.map +1 -0
- package/dist/hooks/optimization.d.ts +557 -0
- package/dist/hooks/optimization.d.ts.map +1 -0
- package/dist/hooks/optimization.js +94 -0
- package/dist/hooks/optimization.js.map +1 -0
- package/dist/hooks/production-release.d.ts +141 -0
- package/dist/hooks/production-release.d.ts.map +1 -0
- package/dist/hooks/production-release.js +51 -0
- package/dist/hooks/production-release.js.map +1 -0
- package/dist/hooks/project-monitoring.d.ts +199 -0
- package/dist/hooks/project-monitoring.d.ts.map +1 -0
- package/dist/hooks/project-monitoring.js +55 -0
- package/dist/hooks/project-monitoring.js.map +1 -0
- package/dist/hooks/prompt.d.ts +509 -0
- package/dist/hooks/prompt.d.ts.map +1 -0
- package/dist/hooks/prompt.js +127 -0
- package/dist/hooks/prompt.js.map +1 -0
- package/dist/hooks/quick-start.d.ts +219 -0
- package/dist/hooks/quick-start.d.ts.map +1 -0
- package/dist/hooks/quick-start.js +35 -0
- package/dist/hooks/quick-start.js.map +1 -0
- package/dist/hooks/release-line.d.ts +819 -0
- package/dist/hooks/release-line.d.ts.map +1 -0
- package/dist/hooks/release-line.js +52 -0
- package/dist/hooks/release-line.js.map +1 -0
- package/dist/hooks/run-result.d.ts +118 -0
- package/dist/hooks/run-result.d.ts.map +1 -0
- package/dist/hooks/run-result.js +56 -0
- package/dist/hooks/run-result.js.map +1 -0
- package/dist/hooks/token.d.ts +58 -0
- package/dist/hooks/token.d.ts.map +1 -0
- package/dist/hooks/token.js +39 -0
- package/dist/hooks/token.js.map +1 -0
- package/dist/hooks/use-auto-refresh.d.ts +30 -0
- package/dist/hooks/use-auto-refresh.d.ts.map +1 -0
- package/dist/hooks/use-auto-refresh.js +175 -0
- package/dist/hooks/use-auto-refresh.js.map +1 -0
- package/dist/hooks/use-date-time-formatter.d.ts +11 -0
- package/dist/hooks/use-date-time-formatter.d.ts.map +1 -0
- package/dist/hooks/use-date-time-formatter.js +24 -0
- package/dist/hooks/use-date-time-formatter.js.map +1 -0
- package/dist/hooks/use-delayed-loading.d.ts +25 -0
- package/dist/hooks/use-delayed-loading.d.ts.map +1 -0
- package/dist/hooks/use-delayed-loading.js +95 -0
- package/dist/hooks/use-delayed-loading.js.map +1 -0
- package/dist/i18n/index.d.ts +5678 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +5712 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/language.d.ts +17 -0
- package/dist/i18n/language.d.ts.map +1 -0
- package/dist/i18n/language.js +43 -0
- package/dist/i18n/language.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-error.d.ts +2 -0
- package/dist/lib/api-error.d.ts.map +1 -0
- package/dist/lib/api-error.js +38 -0
- package/dist/lib/api-error.js.map +1 -0
- package/dist/lib/format.d.ts +30 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +157 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/index.d.ts +8 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +8 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/model-number.d.ts +2 -0
- package/dist/lib/model-number.d.ts.map +1 -0
- package/dist/lib/model-number.js +18 -0
- package/dist/lib/model-number.js.map +1 -0
- package/dist/lib/model-provider-type.d.ts +7 -0
- package/dist/lib/model-provider-type.d.ts.map +1 -0
- package/dist/lib/model-provider-type.js +28 -0
- package/dist/lib/model-provider-type.js.map +1 -0
- package/dist/lib/project-name.d.ts +7 -0
- package/dist/lib/project-name.d.ts.map +1 -0
- package/dist/lib/project-name.js +14 -0
- package/dist/lib/project-name.js.map +1 -0
- package/dist/lib/releases/release-line-model.d.ts +55 -0
- package/dist/lib/releases/release-line-model.d.ts.map +1 -0
- package/dist/lib/releases/release-line-model.js +476 -0
- package/dist/lib/releases/release-line-model.js.map +1 -0
- package/dist/lib/time-zone.d.ts +14 -0
- package/dist/lib/time-zone.d.ts.map +1 -0
- package/dist/lib/time-zone.js +118 -0
- package/dist/lib/time-zone.js.map +1 -0
- package/dist/lib/uuid.d.ts +2 -0
- package/dist/lib/uuid.d.ts.map +1 -0
- package/dist/lib/uuid.js +5 -0
- package/dist/lib/uuid.js.map +1 -0
- package/dist/providers/display-preferences-provider.d.ts +18 -0
- package/dist/providers/display-preferences-provider.d.ts.map +1 -0
- package/dist/providers/display-preferences-provider.js +46 -0
- package/dist/providers/display-preferences-provider.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/project-context-provider.d.ts +8 -0
- package/dist/providers/project-context-provider.d.ts.map +1 -0
- package/dist/providers/project-context-provider.js +15 -0
- package/dist/providers/project-context-provider.js.map +1 -0
- package/dist/providers/proofhound-web-provider.d.ts +9 -0
- package/dist/providers/proofhound-web-provider.d.ts.map +1 -0
- package/dist/providers/proofhound-web-provider.js +44 -0
- package/dist/providers/proofhound-web-provider.js.map +1 -0
- package/dist/providers/refine-provider.d.ts +5 -0
- package/dist/providers/refine-provider.d.ts.map +1 -0
- package/dist/providers/refine-provider.js +23 -0
- package/dist/providers/refine-provider.js.map +1 -0
- package/dist/screens/annotations/annotation-detail-page.d.ts +5 -0
- package/dist/screens/annotations/annotation-detail-page.d.ts.map +1 -0
- package/dist/screens/annotations/annotation-detail-page.js +379 -0
- package/dist/screens/annotations/annotation-detail-page.js.map +1 -0
- package/dist/screens/annotations/annotation-new-page.d.ts +4 -0
- package/dist/screens/annotations/annotation-new-page.d.ts.map +1 -0
- package/dist/screens/annotations/annotation-new-page.js +125 -0
- package/dist/screens/annotations/annotation-new-page.js.map +1 -0
- package/dist/screens/annotations/annotation-task-model.d.ts +39 -0
- package/dist/screens/annotations/annotation-task-model.d.ts.map +1 -0
- package/dist/screens/annotations/annotation-task-model.js +88 -0
- package/dist/screens/annotations/annotation-task-model.js.map +1 -0
- package/dist/screens/annotations/annotation-ui.d.ts +33 -0
- package/dist/screens/annotations/annotation-ui.d.ts.map +1 -0
- package/dist/screens/annotations/annotation-ui.js +92 -0
- package/dist/screens/annotations/annotation-ui.js.map +1 -0
- package/dist/screens/annotations/annotations-list-page.d.ts +4 -0
- package/dist/screens/annotations/annotations-list-page.d.ts.map +1 -0
- package/dist/screens/annotations/annotations-list-page.js +82 -0
- package/dist/screens/annotations/annotations-list-page.js.map +1 -0
- package/dist/screens/connectors/connector-detail-page.d.ts +5 -0
- package/dist/screens/connectors/connector-detail-page.d.ts.map +1 -0
- package/dist/screens/connectors/connector-detail-page.js +838 -0
- package/dist/screens/connectors/connector-detail-page.js.map +1 -0
- package/dist/screens/connectors/connector-form-page.d.ts +8 -0
- package/dist/screens/connectors/connector-form-page.d.ts.map +1 -0
- package/dist/screens/connectors/connector-form-page.js +328 -0
- package/dist/screens/connectors/connector-form-page.js.map +1 -0
- package/dist/screens/connectors/connector-peek-dialog.d.ts +8 -0
- package/dist/screens/connectors/connector-peek-dialog.d.ts.map +1 -0
- package/dist/screens/connectors/connector-peek-dialog.js +24 -0
- package/dist/screens/connectors/connector-peek-dialog.js.map +1 -0
- package/dist/screens/connectors/connector-types.d.ts +36 -0
- package/dist/screens/connectors/connector-types.d.ts.map +1 -0
- package/dist/screens/connectors/connector-types.js +48 -0
- package/dist/screens/connectors/connector-types.js.map +1 -0
- package/dist/screens/connectors/connector-ui.d.ts +14 -0
- package/dist/screens/connectors/connector-ui.d.ts.map +1 -0
- package/dist/screens/connectors/connector-ui.js +40 -0
- package/dist/screens/connectors/connector-ui.js.map +1 -0
- package/dist/screens/connectors/connectors-list-page.d.ts +4 -0
- package/dist/screens/connectors/connectors-list-page.d.ts.map +1 -0
- package/dist/screens/connectors/connectors-list-page.js +220 -0
- package/dist/screens/connectors/connectors-list-page.js.map +1 -0
- package/dist/screens/dashboard/dashboard-screen.d.ts +5 -0
- package/dist/screens/dashboard/dashboard-screen.d.ts.map +1 -0
- package/dist/screens/dashboard/dashboard-screen.js +524 -0
- package/dist/screens/dashboard/dashboard-screen.js.map +1 -0
- package/dist/screens/datasets/dataset-detail-helpers.d.ts +10 -0
- package/dist/screens/datasets/dataset-detail-helpers.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-detail-helpers.js +84 -0
- package/dist/screens/datasets/dataset-detail-helpers.js.map +1 -0
- package/dist/screens/datasets/dataset-detail-page.d.ts +6 -0
- package/dist/screens/datasets/dataset-detail-page.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-detail-page.js +379 -0
- package/dist/screens/datasets/dataset-detail-page.js.map +1 -0
- package/dist/screens/datasets/dataset-import-runner.d.ts +17 -0
- package/dist/screens/datasets/dataset-import-runner.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-import-runner.js +33 -0
- package/dist/screens/datasets/dataset-import-runner.js.map +1 -0
- package/dist/screens/datasets/dataset-mappers.d.ts +5 -0
- package/dist/screens/datasets/dataset-mappers.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-mappers.js +79 -0
- package/dist/screens/datasets/dataset-mappers.js.map +1 -0
- package/dist/screens/datasets/dataset-samples-table.d.ts +21 -0
- package/dist/screens/datasets/dataset-samples-table.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-samples-table.js +59 -0
- package/dist/screens/datasets/dataset-samples-table.js.map +1 -0
- package/dist/screens/datasets/dataset-transfer-progress.d.ts +30 -0
- package/dist/screens/datasets/dataset-transfer-progress.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-transfer-progress.js +157 -0
- package/dist/screens/datasets/dataset-transfer-progress.js.map +1 -0
- package/dist/screens/datasets/dataset-types.d.ts +59 -0
- package/dist/screens/datasets/dataset-types.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-types.js +15 -0
- package/dist/screens/datasets/dataset-types.js.map +1 -0
- package/dist/screens/datasets/dataset-ui.d.ts +49 -0
- package/dist/screens/datasets/dataset-ui.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-ui.js +163 -0
- package/dist/screens/datasets/dataset-ui.js.map +1 -0
- package/dist/screens/datasets/dataset-upload-page.d.ts +4 -0
- package/dist/screens/datasets/dataset-upload-page.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-upload-page.js +425 -0
- package/dist/screens/datasets/dataset-upload-page.js.map +1 -0
- package/dist/screens/datasets/dataset-upload-parser.d.ts +21 -0
- package/dist/screens/datasets/dataset-upload-parser.d.ts.map +1 -0
- package/dist/screens/datasets/dataset-upload-parser.js +536 -0
- package/dist/screens/datasets/dataset-upload-parser.js.map +1 -0
- package/dist/screens/datasets/datasets-list-page.d.ts +4 -0
- package/dist/screens/datasets/datasets-list-page.d.ts.map +1 -0
- package/dist/screens/datasets/datasets-list-page.js +249 -0
- package/dist/screens/datasets/datasets-list-page.js.map +1 -0
- package/dist/screens/experiments/experiment-detail-page.d.ts +5 -0
- package/dist/screens/experiments/experiment-detail-page.d.ts.map +1 -0
- package/dist/screens/experiments/experiment-detail-page.js +460 -0
- package/dist/screens/experiments/experiment-detail-page.js.map +1 -0
- package/dist/screens/experiments/experiment-new-page.d.ts +21 -0
- package/dist/screens/experiments/experiment-new-page.d.ts.map +1 -0
- package/dist/screens/experiments/experiment-new-page.js +427 -0
- package/dist/screens/experiments/experiment-new-page.js.map +1 -0
- package/dist/screens/experiments/experiment-option-adapter.d.ts +68 -0
- package/dist/screens/experiments/experiment-option-adapter.d.ts.map +1 -0
- package/dist/screens/experiments/experiment-option-adapter.js +225 -0
- package/dist/screens/experiments/experiment-option-adapter.js.map +1 -0
- package/dist/screens/experiments/experiment-progress.d.ts +5 -0
- package/dist/screens/experiments/experiment-progress.d.ts.map +1 -0
- package/dist/screens/experiments/experiment-progress.js +15 -0
- package/dist/screens/experiments/experiment-progress.js.map +1 -0
- package/dist/screens/experiments/experiment-repeat-href.d.ts +17 -0
- package/dist/screens/experiments/experiment-repeat-href.d.ts.map +1 -0
- package/dist/screens/experiments/experiment-repeat-href.js +32 -0
- package/dist/screens/experiments/experiment-repeat-href.js.map +1 -0
- package/dist/screens/experiments/experiment-theme.d.ts +43 -0
- package/dist/screens/experiments/experiment-theme.d.ts.map +1 -0
- package/dist/screens/experiments/experiment-theme.js +43 -0
- package/dist/screens/experiments/experiment-theme.js.map +1 -0
- package/dist/screens/experiments/experiment-ui.d.ts +36 -0
- package/dist/screens/experiments/experiment-ui.d.ts.map +1 -0
- package/dist/screens/experiments/experiment-ui.js +46 -0
- package/dist/screens/experiments/experiment-ui.js.map +1 -0
- package/dist/screens/experiments/experiment-view-model.d.ts +118 -0
- package/dist/screens/experiments/experiment-view-model.d.ts.map +1 -0
- package/dist/screens/experiments/experiment-view-model.js +114 -0
- package/dist/screens/experiments/experiment-view-model.js.map +1 -0
- package/dist/screens/experiments/experiments-comparison-view.d.ts +10 -0
- package/dist/screens/experiments/experiments-comparison-view.d.ts.map +1 -0
- package/dist/screens/experiments/experiments-comparison-view.js +215 -0
- package/dist/screens/experiments/experiments-comparison-view.js.map +1 -0
- package/dist/screens/experiments/experiments-list-page.d.ts +4 -0
- package/dist/screens/experiments/experiments-list-page.d.ts.map +1 -0
- package/dist/screens/experiments/experiments-list-page.js +364 -0
- package/dist/screens/experiments/experiments-list-page.js.map +1 -0
- package/dist/screens/experiments/experiments-table.d.ts +18 -0
- package/dist/screens/experiments/experiments-table.d.ts.map +1 -0
- package/dist/screens/experiments/experiments-table.js +97 -0
- package/dist/screens/experiments/experiments-table.js.map +1 -0
- package/dist/screens/experiments/run-result-detail-sheet.d.ts +9 -0
- package/dist/screens/experiments/run-result-detail-sheet.d.ts.map +1 -0
- package/dist/screens/experiments/run-result-detail-sheet.js +89 -0
- package/dist/screens/experiments/run-result-detail-sheet.js.map +1 -0
- package/dist/screens/experiments/run-result-display.d.ts +28 -0
- package/dist/screens/experiments/run-result-display.d.ts.map +1 -0
- package/dist/screens/experiments/run-result-display.js +124 -0
- package/dist/screens/experiments/run-result-display.js.map +1 -0
- package/dist/screens/experiments/run-result-labels.d.ts +16 -0
- package/dist/screens/experiments/run-result-labels.d.ts.map +1 -0
- package/dist/screens/experiments/run-result-labels.js +52 -0
- package/dist/screens/experiments/run-result-labels.js.map +1 -0
- package/dist/screens/index.d.ts +29 -0
- package/dist/screens/index.d.ts.map +1 -0
- package/dist/screens/index.js +43 -0
- package/dist/screens/index.js.map +1 -0
- package/dist/screens/models/model-form-page.d.ts +9 -0
- package/dist/screens/models/model-form-page.d.ts.map +1 -0
- package/dist/screens/models/model-form-page.js +876 -0
- package/dist/screens/models/model-form-page.js.map +1 -0
- package/dist/screens/models/model-view-model.d.ts +66 -0
- package/dist/screens/models/model-view-model.d.ts.map +1 -0
- package/dist/screens/models/model-view-model.js +36 -0
- package/dist/screens/models/model-view-model.js.map +1 -0
- package/dist/screens/models/models-list-page.d.ts +4 -0
- package/dist/screens/models/models-list-page.d.ts.map +1 -0
- package/dist/screens/models/models-list-page.js +352 -0
- package/dist/screens/models/models-list-page.js.map +1 -0
- package/dist/screens/models/project-model-adapter.d.ts +5 -0
- package/dist/screens/models/project-model-adapter.d.ts.map +1 -0
- package/dist/screens/models/project-model-adapter.js +63 -0
- package/dist/screens/models/project-model-adapter.js.map +1 -0
- package/dist/screens/monitoring/big-chart-card.d.ts +36 -0
- package/dist/screens/monitoring/big-chart-card.d.ts.map +1 -0
- package/dist/screens/monitoring/big-chart-card.js +32 -0
- package/dist/screens/monitoring/big-chart-card.js.map +1 -0
- package/dist/screens/monitoring/monitoring-filter-strip.d.ts +14 -0
- package/dist/screens/monitoring/monitoring-filter-strip.d.ts.map +1 -0
- package/dist/screens/monitoring/monitoring-filter-strip.js +36 -0
- package/dist/screens/monitoring/monitoring-filter-strip.js.map +1 -0
- package/dist/screens/monitoring/project-monitoring-page.d.ts +9 -0
- package/dist/screens/monitoring/project-monitoring-page.d.ts.map +1 -0
- package/dist/screens/monitoring/project-monitoring-page.js +240 -0
- package/dist/screens/monitoring/project-monitoring-page.js.map +1 -0
- package/dist/screens/monitoring/ranking-cards.d.ts +23 -0
- package/dist/screens/monitoring/ranking-cards.d.ts.map +1 -0
- package/dist/screens/monitoring/ranking-cards.js +78 -0
- package/dist/screens/monitoring/ranking-cards.js.map +1 -0
- package/dist/screens/optimizations/optimization-detail-page.d.ts +5 -0
- package/dist/screens/optimizations/optimization-detail-page.d.ts.map +1 -0
- package/dist/screens/optimizations/optimization-detail-page.js +934 -0
- package/dist/screens/optimizations/optimization-detail-page.js.map +1 -0
- package/dist/screens/optimizations/optimization-mappers.d.ts +56 -0
- package/dist/screens/optimizations/optimization-mappers.d.ts.map +1 -0
- package/dist/screens/optimizations/optimization-mappers.js +142 -0
- package/dist/screens/optimizations/optimization-mappers.js.map +1 -0
- package/dist/screens/optimizations/optimization-new-page.d.ts +8 -0
- package/dist/screens/optimizations/optimization-new-page.d.ts.map +1 -0
- package/dist/screens/optimizations/optimization-new-page.js +732 -0
- package/dist/screens/optimizations/optimization-new-page.js.map +1 -0
- package/dist/screens/optimizations/optimization-theme.d.ts +43 -0
- package/dist/screens/optimizations/optimization-theme.d.ts.map +1 -0
- package/dist/screens/optimizations/optimization-theme.js +46 -0
- package/dist/screens/optimizations/optimization-theme.js.map +1 -0
- package/dist/screens/optimizations/optimization-ui.d.ts +60 -0
- package/dist/screens/optimizations/optimization-ui.d.ts.map +1 -0
- package/dist/screens/optimizations/optimization-ui.js +164 -0
- package/dist/screens/optimizations/optimization-ui.js.map +1 -0
- package/dist/screens/optimizations/optimizations-list-page.d.ts +4 -0
- package/dist/screens/optimizations/optimizations-list-page.d.ts.map +1 -0
- package/dist/screens/optimizations/optimizations-list-page.js +358 -0
- package/dist/screens/optimizations/optimizations-list-page.js.map +1 -0
- package/dist/screens/prompts/prompt-body-editor.d.ts +15 -0
- package/dist/screens/prompts/prompt-body-editor.d.ts.map +1 -0
- package/dist/screens/prompts/prompt-body-editor.js +165 -0
- package/dist/screens/prompts/prompt-body-editor.js.map +1 -0
- package/dist/screens/prompts/prompt-dataset-variables.d.ts +4 -0
- package/dist/screens/prompts/prompt-dataset-variables.d.ts.map +1 -0
- package/dist/screens/prompts/prompt-dataset-variables.js +27 -0
- package/dist/screens/prompts/prompt-dataset-variables.js.map +1 -0
- package/dist/screens/prompts/prompt-detail-page.d.ts +5 -0
- package/dist/screens/prompts/prompt-detail-page.d.ts.map +1 -0
- package/dist/screens/prompts/prompt-detail-page.js +1013 -0
- package/dist/screens/prompts/prompt-detail-page.js.map +1 -0
- package/dist/screens/prompts/prompt-model.d.ts +77 -0
- package/dist/screens/prompts/prompt-model.d.ts.map +1 -0
- package/dist/screens/prompts/prompt-model.js +152 -0
- package/dist/screens/prompts/prompt-model.js.map +1 -0
- package/dist/screens/prompts/prompt-preview-parts.d.ts +12 -0
- package/dist/screens/prompts/prompt-preview-parts.d.ts.map +1 -0
- package/dist/screens/prompts/prompt-preview-parts.js +32 -0
- package/dist/screens/prompts/prompt-preview-parts.js.map +1 -0
- package/dist/screens/prompts/prompt-preview.d.ts +10 -0
- package/dist/screens/prompts/prompt-preview.d.ts.map +1 -0
- package/dist/screens/prompts/prompt-preview.js +16 -0
- package/dist/screens/prompts/prompt-preview.js.map +1 -0
- package/dist/screens/prompts/prompt-ui.d.ts +30 -0
- package/dist/screens/prompts/prompt-ui.d.ts.map +1 -0
- package/dist/screens/prompts/prompt-ui.js +51 -0
- package/dist/screens/prompts/prompt-ui.js.map +1 -0
- package/dist/screens/prompts/prompts-list-page.d.ts +5 -0
- package/dist/screens/prompts/prompts-list-page.d.ts.map +1 -0
- package/dist/screens/prompts/prompts-list-page.js +208 -0
- package/dist/screens/prompts/prompts-list-page.js.map +1 -0
- package/dist/screens/quick-start/quick-start-screen.d.ts +2 -0
- package/dist/screens/quick-start/quick-start-screen.d.ts.map +1 -0
- package/dist/screens/quick-start/quick-start-screen.js +486 -0
- package/dist/screens/quick-start/quick-start-screen.js.map +1 -0
- package/dist/screens/releases/release-line-detail-page.d.ts +5 -0
- package/dist/screens/releases/release-line-detail-page.d.ts.map +1 -0
- package/dist/screens/releases/release-line-detail-page.js +973 -0
- package/dist/screens/releases/release-line-detail-page.js.map +1 -0
- package/dist/screens/releases/release-line-ui.d.ts +30 -0
- package/dist/screens/releases/release-line-ui.d.ts.map +1 -0
- package/dist/screens/releases/release-line-ui.js +197 -0
- package/dist/screens/releases/release-line-ui.js.map +1 -0
- package/dist/screens/releases/release-new-model.d.ts +5 -0
- package/dist/screens/releases/release-new-model.d.ts.map +1 -0
- package/dist/screens/releases/release-new-model.js +18 -0
- package/dist/screens/releases/release-new-model.js.map +1 -0
- package/dist/screens/releases/release-new-page.d.ts +6 -0
- package/dist/screens/releases/release-new-page.d.ts.map +1 -0
- package/dist/screens/releases/release-new-page.js +816 -0
- package/dist/screens/releases/release-new-page.js.map +1 -0
- package/dist/screens/releases/release-topology-canvas.d.ts +13 -0
- package/dist/screens/releases/release-topology-canvas.d.ts.map +1 -0
- package/dist/screens/releases/release-topology-canvas.js +856 -0
- package/dist/screens/releases/release-topology-canvas.js.map +1 -0
- package/dist/screens/releases/releases-list-page.d.ts +4 -0
- package/dist/screens/releases/releases-list-page.d.ts.map +1 -0
- package/dist/screens/releases/releases-list-page.js +86 -0
- package/dist/screens/releases/releases-list-page.js.map +1 -0
- package/dist/screens/settings/settings-page.d.ts +2 -0
- package/dist/screens/settings/settings-page.d.ts.map +1 -0
- package/dist/screens/settings/settings-page.js +250 -0
- package/dist/screens/settings/settings-page.js.map +1 -0
- package/dist/styles/globals.css +961 -0
- package/package.json +84 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { useRouter, useSearchParams } from 'next/navigation';
|
|
6
|
+
import { formatClassificationAnnotationValue, normalizeClassificationAnnotationValue } from '@proofhound/shared';
|
|
7
|
+
import { ArrowLeft, ChevronDown, ExternalLink, ListChecks, PanelLeftClose, PanelLeftOpen, RotateCcw, Save, } from 'lucide-react';
|
|
8
|
+
import { AnnotationClaimDialog } from '../../components';
|
|
9
|
+
import { Main } from '@proofhound/ui/layout';
|
|
10
|
+
import { Button, Label, DetailPageSkeleton, Progress, formatProgressLabel, Segmented, Table, TableBody, TableCell, TableEmpty, TableHead, TableHeader, TableRow, TableSkeletonRows, cn, } from '@proofhound/ui';
|
|
11
|
+
import { useAnnotationSamples, useAnnotationTask, useDateTimeFormatter, useClaimAnnotationSamples, useReleaseAnnotationSample, useSubmitAnnotationSample, } from '../../hooks';
|
|
12
|
+
import { useDelayedLoading } from '../../hooks';
|
|
13
|
+
import { useI18n } from '../../i18n';
|
|
14
|
+
import { getApiErrorMessage } from '../../lib';
|
|
15
|
+
import { buildAnnotationTasks } from './annotation-task-model';
|
|
16
|
+
import { AnnotationMetricCard, AnnotationScopeBadge, AnnotationTaskStatusBadge, formatCount, formatDateTimeOrDash, formatPercent, } from './annotation-ui';
|
|
17
|
+
const SAMPLE_COLUMNS = [
|
|
18
|
+
{ key: 'sample', width: 'flex', minPx: 220 },
|
|
19
|
+
{ key: 'status', width: 'compact' },
|
|
20
|
+
{ key: 'result', width: 'compact' },
|
|
21
|
+
{ key: 'judgment', width: 'compact' },
|
|
22
|
+
{ key: 'createdAt', width: 'compact' },
|
|
23
|
+
];
|
|
24
|
+
function normalizeStatusParam(value) {
|
|
25
|
+
if (value === 'pending' || value === 'claimed' || value === 'submitted')
|
|
26
|
+
return value;
|
|
27
|
+
return 'all';
|
|
28
|
+
}
|
|
29
|
+
function getAnnotationStatus(annotation) {
|
|
30
|
+
if (annotation.submittedAt)
|
|
31
|
+
return 'submitted';
|
|
32
|
+
if (!annotation.lockedBy)
|
|
33
|
+
return 'pending';
|
|
34
|
+
if (!annotation.lockHeartbeatAt)
|
|
35
|
+
return 'claimed';
|
|
36
|
+
const heartbeat = Date.parse(annotation.lockHeartbeatAt);
|
|
37
|
+
if (!Number.isFinite(heartbeat))
|
|
38
|
+
return 'claimed';
|
|
39
|
+
return Date.now() - heartbeat <= 5 * 60_000 ? 'claimed' : 'pending';
|
|
40
|
+
}
|
|
41
|
+
function statusKey(status) {
|
|
42
|
+
switch (status) {
|
|
43
|
+
case 'pending':
|
|
44
|
+
return 'annotations.sample.status.pending';
|
|
45
|
+
case 'claimed':
|
|
46
|
+
return 'annotations.sample.status.claimed';
|
|
47
|
+
case 'submitted':
|
|
48
|
+
return 'annotations.sample.status.submitted';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function compactValue(value, maxLength = 80) {
|
|
52
|
+
if (!value)
|
|
53
|
+
return '-';
|
|
54
|
+
return value.length > maxLength ? `${value.slice(0, maxLength)}...` : value;
|
|
55
|
+
}
|
|
56
|
+
function isTextEditingTarget(target) {
|
|
57
|
+
if (!(target instanceof HTMLElement))
|
|
58
|
+
return false;
|
|
59
|
+
return (target.isContentEditable ||
|
|
60
|
+
target instanceof HTMLInputElement ||
|
|
61
|
+
target instanceof HTMLTextAreaElement ||
|
|
62
|
+
target instanceof HTMLSelectElement);
|
|
63
|
+
}
|
|
64
|
+
function getCategoryShortcutIndex(event) {
|
|
65
|
+
if (/^[1-9]$/.test(event.key))
|
|
66
|
+
return Number(event.key) - 1;
|
|
67
|
+
if (event.key === '0')
|
|
68
|
+
return 9;
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function isSubmitShortcut(event) {
|
|
72
|
+
return (event.key === 'Enter' ||
|
|
73
|
+
event.key === 'Return' ||
|
|
74
|
+
event.key === 'NumpadEnter' ||
|
|
75
|
+
event.code === 'Enter' ||
|
|
76
|
+
event.code === 'NumpadEnter');
|
|
77
|
+
}
|
|
78
|
+
export function AnnotationDetailPage({ projectId, annotationTaskId }) {
|
|
79
|
+
const router = useRouter();
|
|
80
|
+
const searchParams = useSearchParams();
|
|
81
|
+
const { t } = useI18n();
|
|
82
|
+
const { formatDateTime } = useDateTimeFormatter();
|
|
83
|
+
const taskQuery = useAnnotationTask(projectId, annotationTaskId);
|
|
84
|
+
const task = useMemo(() => (taskQuery.data ? (buildAnnotationTasks([taskQuery.data])[0] ?? null) : null), [taskQuery.data]);
|
|
85
|
+
const [sampleFilter, setSampleFilter] = useState(() => normalizeStatusParam(searchParams.get('status')));
|
|
86
|
+
const [claimOpen, setClaimOpen] = useState(false);
|
|
87
|
+
const [queueCollapsed, setQueueCollapsed] = useState(false);
|
|
88
|
+
const [selectedAnnotationId, setSelectedAnnotationId] = useState(null);
|
|
89
|
+
const query = useMemo(() => ({
|
|
90
|
+
status: sampleFilter === 'all' ? undefined : sampleFilter,
|
|
91
|
+
limit: 80,
|
|
92
|
+
offset: 0,
|
|
93
|
+
}), [sampleFilter]);
|
|
94
|
+
const annotationsQuery = useAnnotationSamples(projectId, annotationTaskId, query);
|
|
95
|
+
const annotationsLoading = useDelayedLoading(annotationsQuery.isLoading);
|
|
96
|
+
const claimMutation = useClaimAnnotationSamples(projectId, annotationTaskId);
|
|
97
|
+
const submitMutation = useSubmitAnnotationSample(projectId, annotationTaskId);
|
|
98
|
+
const releaseMutation = useReleaseAnnotationSample(projectId, annotationTaskId);
|
|
99
|
+
const annotations = useMemo(() => annotationsQuery.data?.data ?? [], [annotationsQuery.data]);
|
|
100
|
+
const selectedAnnotation = annotations.find((annotation) => annotation.id === selectedAnnotationId) ?? annotations[0] ?? null;
|
|
101
|
+
function selectFilter(next) {
|
|
102
|
+
setSampleFilter(next);
|
|
103
|
+
const params = new URLSearchParams(searchParams.toString());
|
|
104
|
+
if (next === 'all')
|
|
105
|
+
params.delete('status');
|
|
106
|
+
else
|
|
107
|
+
params.set('status', next);
|
|
108
|
+
const queryString = params.toString();
|
|
109
|
+
router.replace(queryString
|
|
110
|
+
? `/annotations/${encodeURIComponent(annotationTaskId)}?${queryString}`
|
|
111
|
+
: `/annotations/${encodeURIComponent(annotationTaskId)}`, { scroll: false });
|
|
112
|
+
}
|
|
113
|
+
function handleClaim(batchSize) {
|
|
114
|
+
claimMutation.mutate({ batchSize }, {
|
|
115
|
+
onSuccess: (response) => {
|
|
116
|
+
setClaimOpen(false);
|
|
117
|
+
selectFilter('claimed');
|
|
118
|
+
setSelectedAnnotationId(response.data[0]?.id ?? null);
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
const detailLoading = useDelayedLoading(taskQuery.isLoading && !taskQuery.data);
|
|
123
|
+
if (detailLoading) {
|
|
124
|
+
return (_jsx(Main, { fixed: true, className: "bg-muted/35", children: _jsx("div", { className: "mx-auto w-full max-w-[1760px]", "data-testid": "annotation-detail-page", children: _jsx(DetailPageSkeleton, {}) }) }));
|
|
125
|
+
}
|
|
126
|
+
if (!task) {
|
|
127
|
+
return (_jsx(Main, { fixed: true, className: "bg-muted/35", children: _jsx("div", { className: "mx-auto flex w-full max-w-[960px] flex-col gap-4", "data-testid": "annotation-detail-page", children: _jsxs("div", { className: "rounded-lg border bg-card p-10 text-center", children: [_jsx("div", { className: "text-[15px] font-semibold", children: t('annotations.detail.notFound') }), _jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: annotationTaskId }), _jsx(Button, { className: "mt-5", asChild: true, children: _jsxs(Link, { href: "/annotations", children: [_jsx(ArrowLeft, { className: "size-4" }), t('annotations.action.back')] }) })] }) }) }));
|
|
128
|
+
}
|
|
129
|
+
return (_jsxs(Main, { fixed: true, className: "gap-5 overflow-auto bg-muted/35 pb-8", children: [_jsxs("div", { className: "mx-auto flex w-full max-w-[1760px] flex-col gap-5", "data-testid": "annotation-detail-page", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-2", children: [_jsx("h1", { className: "truncate text-[22px] font-semibold leading-tight", children: task.name }), _jsx(AnnotationTaskStatusBadge, { status: task.status }), _jsx(AnnotationScopeBadge, { scope: task.scope })] }), _jsxs("p", { className: "mt-1 max-w-3xl text-[12.5px] text-muted-foreground", children: [task.promptName, " \u00B7 ", task.releaseVariantLabel, " \u00B7 ", task.promptVersionLabel ?? '-', " \u00B7", ' ', task.modelName ?? '-'] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Button, { variant: "outline", asChild: true, children: _jsxs(Link, { href: "/annotations", children: [_jsx(ArrowLeft, { className: "size-4" }), t('annotations.action.back')] }) }), _jsx(Button, { variant: "outline", asChild: true, children: _jsxs(Link, { href: `/releases/${encodeURIComponent(task.releaseLineId)}?tab=quality`, children: [_jsx(ExternalLink, { className: "size-4" }), t('annotations.action.openRelease')] }) }), _jsxs(Button, { onClick: () => setClaimOpen(true), disabled: task.open < 1, children: [_jsx(ListChecks, { className: "size-4" }), t('annotations.action.claim')] })] })] }), _jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-5", children: [_jsx(AnnotationMetricCard, { label: t('annotations.detail.metric.open'), value: formatCount(task.open), detail: t('annotations.detail.metric.openHint'), tone: "active" }), _jsx(AnnotationMetricCard, { label: t('annotations.detail.metric.claimed'), value: formatCount(task.claimed), detail: t('annotations.detail.metric.claimedHint') }), _jsx(AnnotationMetricCard, { label: t('annotations.detail.metric.submitted'), value: formatCount(task.submitted), detail: `${formatCount(task.submitted)} / ${formatCount(task.total)}`, tone: "success", testId: "annotation-detail-metric-submitted" }), _jsx(AnnotationMetricCard, { label: t('annotations.detail.metric.quality'), value: formatPercent(task.qualityScore, 1), detail: t('annotations.detail.metric.qualityHint') }), _jsxs("div", { className: "rounded-lg border bg-card px-4 py-3", children: [_jsx("div", { className: "text-[11.5px] font-medium text-muted-foreground", children: t('annotations.detail.metric.progress') }), _jsx("div", { className: "mt-3", children: _jsx(Progress, { value: task.submitted, max: Math.max(1, task.total), label: formatProgressLabel({
|
|
130
|
+
value: task.submitted,
|
|
131
|
+
max: Math.max(1, task.total),
|
|
132
|
+
}) }) })] })] }), _jsxs("div", { className: cn('grid gap-4', queueCollapsed ? 'xl:grid-cols-[52px_minmax(0,1fr)]' : 'xl:grid-cols-[520px_minmax(0,1fr)]'), children: [_jsx("section", { className: cn('min-w-0 overflow-hidden rounded-lg border bg-card', queueCollapsed && 'min-h-12 xl:min-h-[520px]'), children: queueCollapsed ? (_jsx("div", { className: "flex h-full items-start justify-center p-1", children: _jsx(Button, { type: "button", variant: "ghost", size: "icon", "aria-label": t('annotations.detail.queue.expand'), onClick: () => setQueueCollapsed(false), children: _jsx(PanelLeftOpen, { className: "size-4" }) }) })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2 border-b px-4 py-3", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-[14px] font-semibold", children: t('annotations.detail.queue') }), _jsx("p", { className: "mt-1 text-[11.5px] text-muted-foreground", children: t('annotations.detail.queueHint') })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Segmented, { value: sampleFilter, onChange: selectFilter, ariaLabel: t('annotations.detail.filter.label'), size: "sm", options: [
|
|
133
|
+
{ value: 'all', label: t('annotations.detail.filter.all') },
|
|
134
|
+
{ value: 'pending', label: t('annotations.sample.status.pending') },
|
|
135
|
+
{ value: 'claimed', label: t('annotations.sample.status.claimed') },
|
|
136
|
+
{ value: 'submitted', label: t('annotations.sample.status.submitted') },
|
|
137
|
+
] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", "aria-label": t('annotations.detail.queue.collapse'), onClick: () => setQueueCollapsed(true), children: _jsx(PanelLeftClose, { className: "size-4" }) })] })] }), _jsxs(Table, { columns: SAMPLE_COLUMNS, children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { column: "sample", children: t('annotations.detail.samples.sample') }), _jsx(TableHead, { column: "status", children: t('annotations.detail.samples.status') }), _jsx(TableHead, { column: "result", children: t('annotations.detail.samples.result') }), _jsx(TableHead, { column: "judgment", children: t('annotations.detail.samples.judgment') }), _jsx(TableHead, { column: "createdAt", children: t('annotations.detail.samples.createdAt') })] }) }), _jsx(TableBody, { children: annotationsLoading ? (_jsx(TableSkeletonRows, {})) : annotations.length === 0 ? (_jsx(TableEmpty, { children: t('annotations.detail.empty') })) : (annotations.map((annotation) => (_jsxs(TableRow, { selected: annotation.id === selectedAnnotation?.id, selectedTone: "canary", onClick: () => setSelectedAnnotationId(annotation.id), children: [_jsx(TableCell, { column: "sample", children: _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate font-mono text-[12.5px]", children: annotation.externalId ?? annotation.runResultId.slice(0, 8) }), _jsx("div", { className: "mt-1 line-clamp-2 text-[11.5px] text-muted-foreground", children: annotation.outputPreview ?? annotation.inputPreview ?? '-' })] }) }), _jsx(TableCell, { column: "status", children: _jsx(SampleStatusBadge, { status: getAnnotationStatus(annotation) }) }), _jsx(TableCell, { column: "result", children: _jsx(ExpectedOutputPill, { value: annotation.annotatedExpectedOutput }) }), _jsx(TableCell, { column: "judgment", children: _jsx(JudgmentPill, { annotation: annotation }) }), _jsx(TableCell, { column: "createdAt", children: _jsx("span", { className: "font-mono text-[11px] text-muted-foreground", children: formatDateTimeOrDash(annotation.createdAt, formatDateTime) }) })] }, annotation.id)))) })] })] })) }), _jsx(AnnotationWorkspace, { annotation: selectedAnnotation, categoryOptions: task.raw.categoryOptions, submitPending: submitMutation.isPending, releasePending: releaseMutation.isPending, submitError: getApiErrorMessage(submitMutation.error), releaseError: getApiErrorMessage(releaseMutation.error), onSubmit: (payload) => {
|
|
138
|
+
if (!selectedAnnotation)
|
|
139
|
+
return;
|
|
140
|
+
const selectedIndex = annotations.findIndex((annotation) => annotation.id === selectedAnnotation.id);
|
|
141
|
+
const nextAnnotation = selectedIndex >= 0
|
|
142
|
+
? [...annotations.slice(selectedIndex + 1), ...annotations.slice(0, selectedIndex)].find((annotation) => getAnnotationStatus(annotation) !== 'submitted')
|
|
143
|
+
: null;
|
|
144
|
+
submitMutation.mutate({
|
|
145
|
+
annotationId: selectedAnnotation.id,
|
|
146
|
+
expectedOutput: payload.expectedOutput.trim(),
|
|
147
|
+
notes: payload.notes.trim() ? payload.notes.trim() : null,
|
|
148
|
+
}, {
|
|
149
|
+
onSuccess: () => setSelectedAnnotationId(nextAnnotation?.id ?? null),
|
|
150
|
+
});
|
|
151
|
+
}, onRelease: () => {
|
|
152
|
+
if (!selectedAnnotation)
|
|
153
|
+
return;
|
|
154
|
+
releaseMutation.mutate({ annotationId: selectedAnnotation.id }, {
|
|
155
|
+
onSuccess: () => setSelectedAnnotationId(null),
|
|
156
|
+
});
|
|
157
|
+
} })] })] }), _jsx(AnnotationClaimDialog, { open: claimOpen, onOpenChange: setClaimOpen, inputId: "annotation-detail-claim-size", maxClaimable: task.open, isPending: claimMutation.isPending, onSubmit: handleClaim, onCancel: () => setClaimOpen(false) })] }));
|
|
158
|
+
}
|
|
159
|
+
function SampleStatusBadge({ status }) {
|
|
160
|
+
const { t } = useI18n();
|
|
161
|
+
const token = status === 'submitted'
|
|
162
|
+
? {
|
|
163
|
+
bg: 'var(--status-running-bg)',
|
|
164
|
+
fg: 'var(--status-running-fg)',
|
|
165
|
+
bd: 'var(--status-running-bd)',
|
|
166
|
+
}
|
|
167
|
+
: status === 'claimed'
|
|
168
|
+
? {
|
|
169
|
+
bg: 'var(--status-canary-bg)',
|
|
170
|
+
fg: 'var(--status-canary-fg)',
|
|
171
|
+
bd: 'var(--status-canary-bd)',
|
|
172
|
+
}
|
|
173
|
+
: {
|
|
174
|
+
bg: 'var(--status-pending-bg)',
|
|
175
|
+
fg: 'var(--status-pending-fg)',
|
|
176
|
+
bd: 'var(--status-pending-bd)',
|
|
177
|
+
};
|
|
178
|
+
return (_jsx("span", { className: "inline-flex rounded-full border px-2 py-0.5 text-[11px] font-medium", style: { background: token.bg, color: token.fg, borderColor: token.bd }, children: t(statusKey(status)) }));
|
|
179
|
+
}
|
|
180
|
+
function ExpectedOutputPill({ value }) {
|
|
181
|
+
const { t } = useI18n();
|
|
182
|
+
if (!value) {
|
|
183
|
+
return _jsx("span", { className: "text-[12px] text-muted-foreground", children: t('annotations.expectedOutput.pending') });
|
|
184
|
+
}
|
|
185
|
+
return (_jsx("span", { className: "inline-flex max-w-[180px] rounded-full border px-2 py-0.5 font-mono text-[11px] font-medium", style: {
|
|
186
|
+
background: 'var(--status-running-bg)',
|
|
187
|
+
color: 'var(--status-running-fg)',
|
|
188
|
+
borderColor: 'var(--status-running-bd)',
|
|
189
|
+
}, title: value, children: _jsx("span", { className: "truncate", children: compactValue(value) }) }));
|
|
190
|
+
}
|
|
191
|
+
function getAnnotationJudgment(annotation) {
|
|
192
|
+
if (annotation.isCorrect === true)
|
|
193
|
+
return 'correct';
|
|
194
|
+
if (annotation.isCorrect === false)
|
|
195
|
+
return 'incorrect';
|
|
196
|
+
if (!annotation.submittedAt || !annotation.annotatedExpectedOutput)
|
|
197
|
+
return null;
|
|
198
|
+
return annotation.decisionOutput === annotation.annotatedExpectedOutput ? 'correct' : 'incorrect';
|
|
199
|
+
}
|
|
200
|
+
function JudgmentPill({ annotation }) {
|
|
201
|
+
const { t } = useI18n();
|
|
202
|
+
const judgment = getAnnotationJudgment(annotation);
|
|
203
|
+
if (!judgment) {
|
|
204
|
+
return _jsx("span", { className: "text-[12px] text-muted-foreground", children: t('annotations.judgment.pending') });
|
|
205
|
+
}
|
|
206
|
+
if (judgment === 'correct') {
|
|
207
|
+
return (_jsx("span", { className: "inline-flex rounded-full border px-2 py-0.5 text-[11px] font-medium", style: {
|
|
208
|
+
background: 'var(--status-running-bg)',
|
|
209
|
+
color: 'var(--status-running-fg)',
|
|
210
|
+
borderColor: 'var(--status-running-bd)',
|
|
211
|
+
}, children: t('annotations.judgment.correct') }));
|
|
212
|
+
}
|
|
213
|
+
return (_jsx("span", { className: "inline-flex rounded-full border border-destructive/30 bg-destructive/10 px-2 py-0.5 text-[11px] font-medium text-destructive", children: t('annotations.judgment.incorrect') }));
|
|
214
|
+
}
|
|
215
|
+
function AnnotationWorkspace({ annotation, categoryOptions, submitPending, releasePending, submitError, releaseError, onSubmit, onRelease, }) {
|
|
216
|
+
const { t } = useI18n();
|
|
217
|
+
if (!annotation) {
|
|
218
|
+
return (_jsx("section", { className: "rounded-lg border bg-card p-10 text-center text-sm text-muted-foreground", children: t('annotations.detail.workspace.empty') }));
|
|
219
|
+
}
|
|
220
|
+
return (_jsx(AnnotationWorkspaceForm, { annotation: annotation, categoryOptions: categoryOptions, submitPending: submitPending, releasePending: releasePending, submitError: submitError, releaseError: releaseError, onSubmit: onSubmit, onRelease: onRelease }, annotation.id));
|
|
221
|
+
}
|
|
222
|
+
function AnnotationWorkspaceForm({ annotation, categoryOptions, submitPending, releasePending, submitError, releaseError, onSubmit, onRelease, }) {
|
|
223
|
+
const { t } = useI18n();
|
|
224
|
+
const [selectedCategory, setSelectedCategory] = useState(() => normalizeClassificationAnnotationValue(annotation.annotatedExpectedOutput ?? annotation.expectedOutput ?? '', categoryOptions) ?? '');
|
|
225
|
+
const [notes, setNotes] = useState(() => annotation.notes ?? '');
|
|
226
|
+
const sampleStatus = getAnnotationStatus(annotation);
|
|
227
|
+
const canEdit = sampleStatus !== 'submitted' && !submitPending && !releasePending && categoryOptions.length > 0;
|
|
228
|
+
const canSubmit = canEdit && selectedCategory.length > 0;
|
|
229
|
+
const expectedOutput = formatClassificationAnnotationValue(selectedCategory);
|
|
230
|
+
const selectCategory = useCallback((category) => {
|
|
231
|
+
if (!canEdit)
|
|
232
|
+
return;
|
|
233
|
+
setSelectedCategory(category);
|
|
234
|
+
}, [canEdit]);
|
|
235
|
+
const submitCurrent = useCallback(() => {
|
|
236
|
+
if (!canSubmit)
|
|
237
|
+
return;
|
|
238
|
+
onSubmit({ expectedOutput, notes });
|
|
239
|
+
}, [canSubmit, expectedOutput, notes, onSubmit]);
|
|
240
|
+
useEffect(() => {
|
|
241
|
+
function handleKeyDown(event) {
|
|
242
|
+
if (event.isComposing || event.metaKey || event.ctrlKey || event.altKey || isTextEditingTarget(event.target)) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const categoryIndex = getCategoryShortcutIndex(event);
|
|
246
|
+
if (categoryIndex !== null && categoryIndex < categoryOptions.length) {
|
|
247
|
+
event.preventDefault();
|
|
248
|
+
const category = categoryOptions[categoryIndex];
|
|
249
|
+
if (category)
|
|
250
|
+
selectCategory(category);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (isSubmitShortcut(event)) {
|
|
254
|
+
event.preventDefault();
|
|
255
|
+
submitCurrent();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
259
|
+
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
260
|
+
}, [categoryOptions, selectCategory, submitCurrent]);
|
|
261
|
+
return (_jsxs("section", { className: "grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1fr)_340px]", children: [_jsxs("div", { className: "flex min-w-0 flex-col gap-4", children: [_jsxs("div", { className: "grid gap-4 lg:grid-cols-2", children: [_jsx(ReadableDataPanel, { title: t('annotations.workspace.inputVariables'), value: annotation.inputVariables }), _jsx(ReadableDataPanel, { title: t('annotations.workspace.modelOutput'), value: annotation.decisionOutput ?? annotation.parsedOutput ?? annotation.rawResponse })] }), _jsx(CollapsibleReadablePanel, { title: t('annotations.workspace.fullPrompt'), value: annotation.renderedPrompt }), _jsx(ReadableEntryPanel, { title: t('annotations.workspace.runMeta'), entries: [
|
|
262
|
+
{ label: t('annotations.workspace.runResultId'), value: annotation.runResultId },
|
|
263
|
+
{ label: t('annotations.workspace.externalId'), value: annotation.externalId },
|
|
264
|
+
{
|
|
265
|
+
label: t('annotations.workspace.latency'),
|
|
266
|
+
value: annotation.latencyMs ? `${annotation.latencyMs}ms` : null,
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
label: t('annotations.workspace.tokens'),
|
|
270
|
+
value: (annotation.inputTokens ?? 0) + (annotation.outputTokens ?? 0),
|
|
271
|
+
},
|
|
272
|
+
] })] }), _jsxs("aside", { className: "rounded-lg border bg-card", children: [_jsxs("div", { className: "border-b px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("h2", { className: "text-[14px] font-semibold", children: t('annotations.form.title') }), _jsx(SampleStatusBadge, { status: sampleStatus })] }), _jsx("p", { className: "mt-1 text-[11.5px] text-muted-foreground", children: t('annotations.form.subtitle') })] }), _jsxs("div", { className: "space-y-4 p-4", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { children: t('annotations.form.expectedOutput') }), categoryOptions.length === 0 ? (_jsx("div", { className: "rounded-md border border-dashed bg-muted/35 px-3 py-5 text-center text-[12px] text-muted-foreground", children: t('annotations.form.noCategoryOptions') })) : (_jsx("div", { className: "grid gap-2", role: "radiogroup", "aria-label": t('annotations.form.expectedOutput'), children: categoryOptions.map((category, index) => {
|
|
273
|
+
const selected = selectedCategory === category;
|
|
274
|
+
const shortcut = index < 9 ? String(index + 1) : index === 9 ? '0' : undefined;
|
|
275
|
+
return (_jsxs("button", { type: "button", role: "radio", "data-testid": `annotation-sample-category-${category}`, "aria-checked": selected, "aria-keyshortcuts": shortcut, disabled: !canEdit, onClick: () => selectCategory(category), className: cn('flex min-h-9 w-full items-center gap-2 rounded-md border bg-background px-3 py-2 text-left text-sm transition-colors', canEdit && 'hover:bg-accent', selected && 'border-primary bg-primary/5 text-primary', !canEdit && 'cursor-not-allowed opacity-70'), children: [_jsx("span", { className: cn('inline-flex size-4 shrink-0 items-center justify-center rounded-full border', selected ? 'border-primary' : 'border-muted-foreground/50'), children: selected ? _jsx("span", { className: "size-2 rounded-full bg-primary" }) : null }), _jsx("span", { className: "min-w-0 break-words font-mono", children: category })] }, category));
|
|
276
|
+
}) })), canEdit && selectedCategory.length === 0 ? (_jsx("p", { className: "text-[11.5px] text-muted-foreground", children: t('annotations.form.expectedOutputRequired') })) : null] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { children: t('annotations.form.notes') }), _jsx("textarea", { value: notes, onChange: (event) => setNotes(event.target.value), rows: 5, className: "min-h-[120px] w-full resize-y rounded-md border border-input bg-background px-3 py-2 text-sm outline-none ring-offset-background placeholder:text-muted-foreground focus:ring-2 focus:ring-ring focus:ring-offset-2", placeholder: t('annotations.form.notesPlaceholder') })] }), submitError ? _jsx(FormError, { children: submitError }) : null, releaseError ? _jsx(FormError, { children: releaseError }) : null, _jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2 border-t pt-4", children: [_jsxs(Button, { type: "button", variant: "outline", onClick: onRelease, disabled: sampleStatus !== 'claimed' || submitPending || releasePending, children: [_jsx(RotateCcw, { className: "size-4" }), releasePending ? t('annotations.form.releasing') : t('annotations.form.release')] }), _jsxs(Button, { type: "button", "data-testid": "annotation-save", onClick: submitCurrent, "aria-keyshortcuts": "Enter", disabled: !canSubmit, children: [_jsx(Save, { className: "size-4" }), submitPending ? t('annotations.form.submitting') : t('annotations.form.submit')] })] })] })] })] }));
|
|
277
|
+
}
|
|
278
|
+
function ReadableDataPanel({ title, value }) {
|
|
279
|
+
const normalized = normalizeReadableValue(value);
|
|
280
|
+
if (isRecord(normalized)) {
|
|
281
|
+
return (_jsx(ReadableEntryPanel, { title: title, entries: Object.entries(normalized).map(([label, entryValue]) => ({
|
|
282
|
+
label: formatReadableLabel(label),
|
|
283
|
+
value: entryValue,
|
|
284
|
+
})) }));
|
|
285
|
+
}
|
|
286
|
+
return (_jsxs("div", { className: "min-w-0 rounded-lg border bg-card", children: [_jsx("div", { className: "border-b px-4 py-3 text-[13px] font-semibold", children: title }), _jsx("div", { className: "max-h-[360px] overflow-auto p-4", children: _jsx(ReadableValue, { value: normalized }) })] }));
|
|
287
|
+
}
|
|
288
|
+
function ReadableEntryPanel({ title, entries }) {
|
|
289
|
+
return (_jsxs("div", { className: "min-w-0 rounded-lg border bg-card", children: [_jsx("div", { className: "border-b px-4 py-3 text-[13px] font-semibold", children: title }), _jsx("div", { className: "max-h-[360px] overflow-auto p-4", children: entries.length === 0 ? (_jsx(ReadableValue, { value: null })) : (_jsx("dl", { className: "space-y-3", children: entries.map((entry, index) => (_jsxs("div", { className: "min-w-0", children: [_jsx("dt", { className: "text-[11.5px] font-medium text-muted-foreground", children: entry.label }), _jsx("dd", { className: "mt-1 text-[12.5px] leading-5", children: _jsx(ReadableValue, { value: entry.value }) })] }, index))) })) })] }));
|
|
290
|
+
}
|
|
291
|
+
function CollapsibleReadablePanel({ title, value }) {
|
|
292
|
+
return (_jsxs("details", { className: "group min-w-0 rounded-lg border bg-card", children: [_jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-3 border-b px-4 py-3 text-[13px] font-semibold [&::-webkit-details-marker]:hidden", children: [_jsx("span", { children: title }), _jsx(ChevronDown, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180" })] }), _jsx("div", { className: "max-h-[420px] overflow-auto p-4", children: _jsx(ReadableValue, { value: formatPromptText(value) }) })] }));
|
|
293
|
+
}
|
|
294
|
+
function ReadableValue({ value }) {
|
|
295
|
+
const text = formatReadableValue(value);
|
|
296
|
+
if (text === '-') {
|
|
297
|
+
return _jsx("span", { className: "text-[12.5px] text-muted-foreground", children: "-" });
|
|
298
|
+
}
|
|
299
|
+
return _jsx("span", { className: "whitespace-pre-wrap break-words text-[12.5px] leading-5", children: text });
|
|
300
|
+
}
|
|
301
|
+
function normalizeReadableValue(value) {
|
|
302
|
+
if (typeof value !== 'string')
|
|
303
|
+
return value;
|
|
304
|
+
const trimmed = value.trim();
|
|
305
|
+
if (!trimmed)
|
|
306
|
+
return value;
|
|
307
|
+
if (!trimmed.startsWith('{') && !trimmed.startsWith('['))
|
|
308
|
+
return value;
|
|
309
|
+
try {
|
|
310
|
+
return JSON.parse(trimmed);
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return value;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
function isRecord(value) {
|
|
317
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
318
|
+
}
|
|
319
|
+
function formatReadableLabel(label) {
|
|
320
|
+
const withSpaces = label
|
|
321
|
+
.replace(/[_-]+/g, ' ')
|
|
322
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
323
|
+
.trim();
|
|
324
|
+
return withSpaces ? `${withSpaces.charAt(0).toUpperCase()}${withSpaces.slice(1)}` : label;
|
|
325
|
+
}
|
|
326
|
+
function formatReadableValue(value) {
|
|
327
|
+
const normalized = normalizeReadableValue(value);
|
|
328
|
+
if (normalized === null || normalized === undefined || normalized === '')
|
|
329
|
+
return '-';
|
|
330
|
+
if (typeof normalized === 'string')
|
|
331
|
+
return normalized;
|
|
332
|
+
if (typeof normalized === 'number' || typeof normalized === 'boolean' || typeof normalized === 'bigint') {
|
|
333
|
+
return String(normalized);
|
|
334
|
+
}
|
|
335
|
+
if (Array.isArray(normalized)) {
|
|
336
|
+
if (normalized.length === 0)
|
|
337
|
+
return '-';
|
|
338
|
+
return normalized.map((item) => formatReadableValue(item)).join('\n\n');
|
|
339
|
+
}
|
|
340
|
+
if (isRecord(normalized)) {
|
|
341
|
+
const entries = Object.entries(normalized);
|
|
342
|
+
if (entries.length === 0)
|
|
343
|
+
return '-';
|
|
344
|
+
return entries
|
|
345
|
+
.map(([label, entryValue]) => `${formatReadableLabel(label)}: ${formatReadableValue(entryValue)}`)
|
|
346
|
+
.join('\n');
|
|
347
|
+
}
|
|
348
|
+
return String(normalized);
|
|
349
|
+
}
|
|
350
|
+
function formatPromptText(value) {
|
|
351
|
+
const normalized = normalizeReadableValue(value);
|
|
352
|
+
if (normalized === null || normalized === undefined || normalized === '')
|
|
353
|
+
return '-';
|
|
354
|
+
if (typeof normalized === 'string')
|
|
355
|
+
return normalized;
|
|
356
|
+
if (Array.isArray(normalized))
|
|
357
|
+
return normalized.map(formatPromptMessage).join('\n\n');
|
|
358
|
+
if (isRecord(normalized)) {
|
|
359
|
+
const directPrompt = normalized['prompt'] ?? normalized['renderedPrompt'] ?? normalized['text'];
|
|
360
|
+
if (typeof directPrompt === 'string')
|
|
361
|
+
return directPrompt;
|
|
362
|
+
const messages = normalized['messages'];
|
|
363
|
+
if (Array.isArray(messages))
|
|
364
|
+
return messages.map(formatPromptMessage).join('\n\n');
|
|
365
|
+
}
|
|
366
|
+
return formatReadableValue(normalized);
|
|
367
|
+
}
|
|
368
|
+
function formatPromptMessage(message, index) {
|
|
369
|
+
const normalized = normalizeReadableValue(message);
|
|
370
|
+
if (!isRecord(normalized))
|
|
371
|
+
return formatReadableValue(normalized);
|
|
372
|
+
const role = typeof normalized['role'] === 'string' ? normalized['role'] : `Message ${index + 1}`;
|
|
373
|
+
const content = normalized['content'] ?? normalized['text'] ?? normalized['message'] ?? normalized;
|
|
374
|
+
return `${formatReadableLabel(role)}\n${formatReadableValue(content)}`;
|
|
375
|
+
}
|
|
376
|
+
function FormError({ children }) {
|
|
377
|
+
return (_jsx("div", { className: "rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-[12px] text-destructive", children: children }));
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=annotation-detail-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotation-detail-page.js","sourceRoot":"","sources":["../../../src/screens/annotations/annotation-detail-page.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotation-new-page.d.ts","sourceRoot":"","sources":["../../../src/screens/annotations/annotation-new-page.tsx"],"names":[],"mappings":"AA8BA,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,2CAiRrE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo, useState } from 'react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { useRouter, useSearchParams } from 'next/navigation';
|
|
6
|
+
import { ClipboardCheck, Database, GitBranch, RadioTower } from 'lucide-react';
|
|
7
|
+
import { Main } from '@proofhound/ui/layout';
|
|
8
|
+
import { Button, Input, Label, DetailPageSkeleton, Segmented, cn, } from '@proofhound/ui';
|
|
9
|
+
import { useAnnotationTaskOptions, useCreateAnnotationTask } from '../../hooks';
|
|
10
|
+
import { useDelayedLoading } from '../../hooks';
|
|
11
|
+
import { useI18n } from '../../i18n';
|
|
12
|
+
import { getApiErrorMessage } from '../../lib';
|
|
13
|
+
import { formatCount } from './annotation-ui';
|
|
14
|
+
function buildDefaultTaskName() {
|
|
15
|
+
const now = new Date();
|
|
16
|
+
const yyyy = now.getFullYear();
|
|
17
|
+
const mm = String(now.getMonth() + 1).padStart(2, '0');
|
|
18
|
+
const dd = String(now.getDate()).padStart(2, '0');
|
|
19
|
+
return `annotation-${yyyy}${mm}${dd}`;
|
|
20
|
+
}
|
|
21
|
+
export function AnnotationNewPage({ projectId }) {
|
|
22
|
+
const router = useRouter();
|
|
23
|
+
const { t } = useI18n();
|
|
24
|
+
const searchParams = useSearchParams();
|
|
25
|
+
const optionsQuery = useAnnotationTaskOptions(projectId);
|
|
26
|
+
const createMutation = useCreateAnnotationTask(projectId);
|
|
27
|
+
const requestedReleaseLineId = searchParams.get('line') ?? '';
|
|
28
|
+
const requestedReleaseVariantId = searchParams.get('variant') ?? '';
|
|
29
|
+
const releaseLines = useMemo(() => optionsQuery.data?.data ?? [], [optionsQuery.data]);
|
|
30
|
+
const [explicitLineId, setExplicitLineId] = useState('');
|
|
31
|
+
const [explicitVariantId, setExplicitVariantId] = useState('');
|
|
32
|
+
const [scope, setScope] = useState('canary');
|
|
33
|
+
const [taskName, setTaskName] = useState(buildDefaultTaskName);
|
|
34
|
+
const [sampleSizeDraft, setSampleSizeDraft] = useState(null);
|
|
35
|
+
const selectedLineId = useMemo(() => {
|
|
36
|
+
if (explicitLineId && releaseLines.some((line) => line.id === explicitLineId))
|
|
37
|
+
return explicitLineId;
|
|
38
|
+
const requested = releaseLines.find((line) => line.id === requestedReleaseLineId);
|
|
39
|
+
const requestedByVariant = releaseLines.find((line) => line.variants.some((variant) => variant.id === requestedReleaseVariantId));
|
|
40
|
+
return (requested ?? requestedByVariant ?? releaseLines[0])?.id ?? '';
|
|
41
|
+
}, [explicitLineId, releaseLines, requestedReleaseLineId, requestedReleaseVariantId]);
|
|
42
|
+
const selectedLine = useMemo(() => releaseLines.find((line) => line.id === selectedLineId) ?? null, [releaseLines, selectedLineId]);
|
|
43
|
+
const selectedVariantId = useMemo(() => {
|
|
44
|
+
if (!selectedLine)
|
|
45
|
+
return '';
|
|
46
|
+
if (explicitVariantId && selectedLine.variants.some((variant) => variant.id === explicitVariantId)) {
|
|
47
|
+
return explicitVariantId;
|
|
48
|
+
}
|
|
49
|
+
if (requestedReleaseVariantId && selectedLine.variants.some((variant) => variant.id === requestedReleaseVariantId)) {
|
|
50
|
+
return requestedReleaseVariantId;
|
|
51
|
+
}
|
|
52
|
+
return selectedLine.variants[0]?.id ?? '';
|
|
53
|
+
}, [explicitVariantId, requestedReleaseVariantId, selectedLine]);
|
|
54
|
+
const selectedVariant = useMemo(() => selectedLine?.variants.find((variant) => variant.id === selectedVariantId) ?? null, [selectedLine, selectedVariantId]);
|
|
55
|
+
const maxSamples = selectedVariant ? getMaxSamples(selectedVariant, scope) : 0;
|
|
56
|
+
const sampleSize = sampleSizeDraft ?? (maxSamples > 0 ? String(maxSamples) : '');
|
|
57
|
+
const parsedSampleSize = Number(sampleSize);
|
|
58
|
+
const normalizedSampleSize = Number.isFinite(parsedSampleSize) && parsedSampleSize > 0 ? Math.trunc(parsedSampleSize) : 0;
|
|
59
|
+
const canCreate = Boolean(selectedLine && selectedVariant && taskName.trim()) &&
|
|
60
|
+
Boolean(selectedVariant && selectedVariant.categoryOptions.length > 0) &&
|
|
61
|
+
normalizedSampleSize >= 1 &&
|
|
62
|
+
normalizedSampleSize <= maxSamples &&
|
|
63
|
+
!createMutation.isPending;
|
|
64
|
+
const submitHint = selectedVariant && selectedVariant.categoryOptions.length === 0
|
|
65
|
+
? t('annotations.new.categoryOptionsRequired')
|
|
66
|
+
: canCreate
|
|
67
|
+
? t('annotations.new.submitReady')
|
|
68
|
+
: t('annotations.new.submitDisabled');
|
|
69
|
+
function submit() {
|
|
70
|
+
if (!selectedLine || !selectedVariant || !canCreate)
|
|
71
|
+
return;
|
|
72
|
+
createMutation.mutate({
|
|
73
|
+
name: taskName.trim(),
|
|
74
|
+
releaseLineId: selectedLine.id,
|
|
75
|
+
releaseVariantId: selectedVariant.id,
|
|
76
|
+
scope,
|
|
77
|
+
sampleSize: normalizedSampleSize,
|
|
78
|
+
}, {
|
|
79
|
+
onSuccess: (task) => {
|
|
80
|
+
router.push(`/annotations/${encodeURIComponent(task.id)}`);
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const optionsLoading = useDelayedLoading(optionsQuery.isLoading && !optionsQuery.data);
|
|
85
|
+
if (optionsLoading) {
|
|
86
|
+
return (_jsx(Main, { fixed: true, className: "bg-muted/35", children: _jsx("div", { className: "mx-auto w-full max-w-[1280px]", "data-testid": "annotation-new-page", children: _jsx(DetailPageSkeleton, {}) }) }));
|
|
87
|
+
}
|
|
88
|
+
return (_jsx(Main, { fixed: true, className: "gap-5 overflow-auto bg-muted/35 pb-8", children: _jsxs("div", { className: "mx-auto flex w-full max-w-[1280px] flex-col gap-5", "data-testid": "annotation-new-page", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-[22px] font-semibold leading-tight", children: t('annotations.new.title') }), _jsx("p", { className: "mt-1 max-w-3xl text-[12.5px] text-muted-foreground", children: t('annotations.new.subtitle') })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", asChild: true, children: _jsx(Link, { href: "/annotations", children: t('common.cancel') }) }), _jsxs(Button, { "data-testid": "annotation-new-submit", onClick: submit, disabled: !canCreate, children: [_jsx(ClipboardCheck, { className: "size-4" }), createMutation.isPending ? t('annotations.new.action.creating') : t('annotations.new.action.create')] })] })] }), _jsxs("div", { className: "grid gap-4 xl:grid-cols-[minmax(0,1fr)_340px]", children: [_jsxs("div", { className: "flex min-w-0 flex-col gap-4", children: [_jsxs("section", { className: "rounded-lg border bg-card", children: [_jsx(SectionHeader, { icon: _jsx(RadioTower, { className: "size-3" }), title: t('annotations.new.section.release'), detail: t('annotations.new.section.releaseDetail') }), _jsx("div", { className: "space-y-4 p-5", children: releaseLines.length === 0 ? (_jsx("div", { className: "rounded-md border border-dashed bg-muted/35 p-6 text-center text-sm text-muted-foreground", children: t('annotations.new.emptyRelease') })) : (_jsx("select", { "data-testid": "annotation-new-release-line-select", value: selectedLineId, onChange: (event) => {
|
|
89
|
+
setExplicitLineId(event.target.value);
|
|
90
|
+
setExplicitVariantId('');
|
|
91
|
+
setSampleSizeDraft(null);
|
|
92
|
+
}, className: "h-10 w-full rounded-md border border-input bg-background px-3 text-sm outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", children: releaseLines.map((line) => (_jsx("option", { value: line.id, children: line.name }, line.id))) })) })] }), _jsxs("section", { className: "rounded-lg border bg-card", children: [_jsx(SectionHeader, { icon: _jsx(GitBranch, { className: "size-3" }), title: t('annotations.new.section.variant'), detail: t('annotations.new.section.variantDetail') }), _jsx("div", { className: "p-5", children: !selectedLine ? (_jsx("div", { className: "rounded-md border border-dashed bg-muted/35 p-6 text-center text-sm text-muted-foreground", children: t('annotations.new.selectReleaseFirst') })) : selectedLine.variants.length === 0 ? (_jsx("div", { className: "rounded-md border border-dashed bg-muted/35 p-6 text-center text-sm text-muted-foreground", children: t('annotations.new.emptyVariant') })) : (_jsx("div", { className: "grid grid-cols-1 gap-3 lg:grid-cols-2", "data-testid": "annotation-new-release-variant-select", children: selectedLine.variants.map((variant) => (_jsx(VariantOption, { variant: variant, selected: variant.id === selectedVariantId, testId: `annotation-new-release-variant-option-${variant.id}`, onSelect: () => {
|
|
93
|
+
setExplicitVariantId(variant.id);
|
|
94
|
+
setSampleSizeDraft(null);
|
|
95
|
+
} }, variant.id))) })) })] }), _jsxs("section", { className: "rounded-lg border bg-card", children: [_jsx(SectionHeader, { icon: _jsx(Database, { className: "size-3" }), title: t('annotations.new.section.sample'), detail: t('annotations.new.section.sampleDetail') }), _jsxs("div", { className: "space-y-5 p-5", children: [_jsx("div", { "data-testid": "annotation-new-scope", children: _jsx(Segmented, { value: scope, onChange: (next) => {
|
|
96
|
+
setScope(next);
|
|
97
|
+
setSampleSizeDraft(null);
|
|
98
|
+
}, ariaLabel: t('annotations.new.scope.label'), options: [
|
|
99
|
+
{ value: 'canary', label: t('annotations.scope.canary') },
|
|
100
|
+
{ value: 'online', label: t('annotations.scope.online') },
|
|
101
|
+
] }) }), _jsxs("div", { className: "grid grid-cols-1 gap-3 md:grid-cols-2", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { className: "text-[12.5px]", children: t('annotations.new.field.name') }), _jsx(Input, { "data-testid": "annotation-new-task-name", value: taskName, onChange: (event) => setTaskName(event.target.value), placeholder: t('annotations.new.field.namePlaceholder'), className: "font-mono text-[13px]" })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { className: "text-[12.5px]", children: t('annotations.new.field.sampleLimit') }), _jsx(Input, { "data-testid": "annotation-new-sample-size", type: "number", min: 1, max: Math.max(1, maxSamples), value: sampleSize, onChange: (event) => setSampleSizeDraft(event.target.value), className: "font-mono text-[13px]" }), _jsx("p", { className: "text-[11.5px] text-muted-foreground", children: t('annotations.new.maxSamples').replace('{count}', formatCount(maxSamples)) })] })] }), _jsx("div", { className: "rounded-md border bg-muted/35 px-3 py-2 text-[12px] text-muted-foreground", children: t('annotations.new.expectedOutputOnly') }), getApiErrorMessage(createMutation.error) ? (_jsx("div", { className: "rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-[12px] text-destructive", children: getApiErrorMessage(createMutation.error) })) : null] })] })] }), _jsx("aside", { className: "xl:sticky xl:top-4 xl:self-start", children: _jsxs("div", { className: "rounded-lg border bg-card p-4", children: [_jsx("h2", { className: "text-[14px] font-semibold", children: t('annotations.new.summary.title') }), _jsxs("div", { className: "mt-4 space-y-3", children: [_jsx(SummaryRow, { label: t('annotations.new.field.name'), value: taskName.trim() || '-' }), _jsx(SummaryRow, { label: t('annotations.new.summary.release'), value: selectedLine?.name ?? '-' }), _jsx(SummaryRow, { label: t('annotations.new.summary.variant'), value: selectedVariant ? formatVariant(selectedVariant) : '-' }), _jsx(SummaryRow, { label: t('annotations.new.summary.scope'), value: scope === 'canary' ? t('annotations.scope.canary') : t('annotations.scope.online') }), _jsx(SummaryRow, { label: t('annotations.new.summary.samples'), value: `${formatCount(normalizedSampleSize)} / ${formatCount(maxSamples)}` }), _jsx(SummaryRow, { label: t('annotations.new.summary.field'), value: "expected_output" }), _jsx(SummaryRow, { label: t('annotations.new.summary.categories'), value: selectedVariant ? formatCategoryOptions(selectedVariant.categoryOptions) : '-' })] }), _jsx("div", { className: "mt-4 rounded-md border bg-muted/35 px-3 py-2 text-[12px] text-muted-foreground", children: submitHint })] }) })] })] }) }));
|
|
102
|
+
}
|
|
103
|
+
function SectionHeader({ icon, title, detail }) {
|
|
104
|
+
return (_jsxs("div", { className: "flex flex-wrap items-center gap-2 border-b px-5 py-3", children: [_jsx("span", { className: "inline-flex size-5 items-center justify-center rounded-full border border-[var(--status-canary-bd)] bg-[var(--status-canary-bg)] text-[var(--status-canary-fg)]", children: icon }), _jsx("h2", { className: "text-[14px] font-semibold", children: title }), _jsx("span", { className: "text-[12px] text-muted-foreground", children: detail })] }));
|
|
105
|
+
}
|
|
106
|
+
function VariantOption({ variant, selected, onSelect, testId, }) {
|
|
107
|
+
const { t } = useI18n();
|
|
108
|
+
return (_jsxs("button", { type: "button", "data-testid": testId, onClick: onSelect, className: cn('min-w-0 rounded-md border bg-background p-3 text-left transition-colors hover:bg-accent', selected && 'border-primary bg-primary/5'), children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-mono text-[12.5px] font-semibold", children: formatVariant(variant) }), _jsx("div", { className: "mt-1 truncate text-[11.5px] text-muted-foreground", children: variant.id })] }), _jsx("span", { className: "rounded-full border px-2 py-0.5 font-mono text-[10.5px] text-muted-foreground", children: variant.label })] }), _jsxs("div", { className: "mt-3 grid grid-cols-2 gap-2 font-mono text-[11px] text-muted-foreground", children: [_jsxs("span", { children: [t('annotations.scope.canary'), " ", formatCount(variant.canaryCount)] }), _jsxs("span", { children: [t('annotations.scope.online'), " ", formatCount(variant.onlineCount)] })] }), _jsx("div", { className: "mt-3 flex flex-wrap gap-1", children: variant.categoryOptions.length > 0 ? (_jsxs(_Fragment, { children: [variant.categoryOptions.slice(0, 4).map((category) => (_jsx("span", { className: "rounded-full border bg-muted/35 px-2 py-0.5 text-[10.5px]", children: category }, category))), variant.categoryOptions.length > 4 ? (_jsxs("span", { className: "rounded-full border bg-muted/35 px-2 py-0.5 font-mono text-[10.5px] text-muted-foreground", children: ["+", variant.categoryOptions.length - 4] })) : null] })) : (_jsx("span", { className: "text-[11px] text-destructive", children: t('annotations.new.noCategoryOptions') })) })] }));
|
|
109
|
+
}
|
|
110
|
+
function SummaryRow({ label, value }) {
|
|
111
|
+
return (_jsxs("div", { className: "grid grid-cols-[96px_minmax(0,1fr)] gap-3 text-[12px]", children: [_jsx("div", { className: "text-muted-foreground", children: label }), _jsx("div", { className: "min-w-0 truncate font-mono text-foreground", title: value, children: value })] }));
|
|
112
|
+
}
|
|
113
|
+
function getMaxSamples(variant, scope) {
|
|
114
|
+
return scope === 'online' ? variant.onlineCount : variant.canaryCount;
|
|
115
|
+
}
|
|
116
|
+
function formatVariant(variant) {
|
|
117
|
+
return `${variant.label} · ${variant.promptVersionLabel ?? variant.promptVersionId.slice(0, 8)} · ${variant.modelName ?? variant.modelId.slice(0, 8)}`;
|
|
118
|
+
}
|
|
119
|
+
function formatCategoryOptions(options) {
|
|
120
|
+
if (options.length === 0)
|
|
121
|
+
return '-';
|
|
122
|
+
const preview = options.slice(0, 3).join(' / ');
|
|
123
|
+
return options.length > 3 ? `${preview} / +${options.length - 3}` : preview;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=annotation-new-page.js.map
|