@aiquants/enrichment-react-router 0.3.0 → 0.5.0
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 +48 -30
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +56 -15
- package/dist/index.d.ts +56 -15
- package/dist/index.js +2 -2
- package/package.json +9 -9
package/dist/index.d.cts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ResourceOutcome } from "@aiquants/console-ui/core";
|
|
2
2
|
export { CommandOutcome, ResourceOutcome } from "@aiquants/console-ui/core";
|
|
3
|
-
import { EnrichmentStageKey, PipelineStepMetric,
|
|
4
|
-
export { IntegrityAuditOverview, IntegrityCommandFailure, IntegrityCommandReply, IntegrityFindingPage, IntegrityFindingsQuery, IntegrityRunMode, PipelineRunRecord, PipelineRunSummary, PipelineStepMetric, PipelineStepRecord, SearchMode, StageProvenance } from "@aiquants/enrichment-core";
|
|
5
|
-
import { EnrichmentStrategyRow,
|
|
6
|
-
export { ComparisonHit, ComparisonInput, ComparisonOutcome, ComparisonVariantResult, DocumentIngestLabel, DocumentIngestPayload, EnrichmentStrategyRow, FailedSyncItem, FileInspectionResult, FusionStrategy, MetadataSearchHit, MetadataSearchParams, MetadataSearchResult, OntologyStatusData, QdrantCollectionInfo, QdrantStorageOverview, RecentIngestItem, SearchHitGraphRelation, SearchHitScoreBreakdown, StrategyProvenance } from "@aiquants/enrichment-react";
|
|
3
|
+
import { EnrichmentStageKey, PipelineStepMetric, RecentPipelineRunEntry, IntegrityAuditOverview, IntegrityRunMode, IntegrityCommandReply, IntegrityCellResyncRequest, IntegrityCellResyncResult, IntegrityCommandFailure, DocumentCaptureAnswer } from "@aiquants/enrichment-core";
|
|
4
|
+
export { DiffLinePage, DocumentCaptureAnswer, DocumentChangeFeedPage, DocumentComparison, DocumentHistory, IntegrityAuditOverview, IntegrityCellResyncRequest, IntegrityCellResyncResult, IntegrityCommandFailure, IntegrityCommandReply, IntegrityFindingPage, IntegrityFindingsQuery, IntegrityRunMode, PipelineRunRecord, PipelineRunSummary, PipelineStepMetric, PipelineStepRecord, ReadableEntry, RecentPipelineRunEntry, RestrictedFailureMark, RestrictedIngestMark, RestrictedRunMark, SearchMode, StageProvenance } from "@aiquants/enrichment-core";
|
|
5
|
+
import { EnrichmentStrategyRow, FailedSyncEntry, QdrantStorageOverview, CircuitBreakerState, DocumentIngestPayload, FileInspectionResult, RecentIngestEntry, OntologyStatusData, MetadataSearchWorkbenchProps, ModelComparisonWorkbenchProps, DocumentHistoryHost } from "@aiquants/enrichment-react";
|
|
6
|
+
export { ComparisonHit, ComparisonInput, ComparisonOutcome, ComparisonVariantResult, DiffLinePageQuery, DiffLinePageReader, DiffLineTarget, DocumentComparisonQuery, DocumentHistoryHost, DocumentHistoryTarget, DocumentIngestLabel, DocumentIngestPayload, DocumentStateCapture, EnrichmentStrategyRow, FailedSyncEntry, FailedSyncItem, FileInspectionResult, FusionStrategy, MetadataSearchHit, MetadataSearchParams, MetadataSearchResult, OntologyStatusData, QdrantCollectionInfo, QdrantStorageOverview, RecentIngestEntry, RecentIngestItem, RecentIngestLastRun, SearchHitGraphRelation, SearchHitScoreBreakdown, StrategyProvenance } from "@aiquants/enrichment-react";
|
|
7
7
|
import { ConfidentialityPolicyRow, TranscriptionTermRow, TranscriptionReferenceRow, PromptTemplateItem, ClassificationRuleItem, GraphSchemaStats, IntegrityFindingsLoader, PolicyConflictHost, DocumentAuthorityHost, GraphTraversalHost, GraphNodeIndexOutcome, SimulationRunner } from "@aiquants/governance-react";
|
|
8
8
|
export { ClassificationRuleItem as ClassificationRule, DocumentAuthorityHost, GraphNodeIndexOutcome, GraphNodeIndexPage, GraphNodeSummary, GraphRelationshipTypesOutcome, GraphRelationshipTypesReader, GraphSchemaStats, GraphTraversalHost, GraphTraversalInput, GraphTraversalOutcome, GraphTraversalRunner, IntegrityFindingsLoader, PolicyConflictHost, PromptTemplateItem, SimulationOutcome, SimulationRunInput, SimulationRunResult, SimulationRunner, SimulationScoreSet, SimulationVerdictFlip } from "@aiquants/governance-react";
|
|
9
9
|
import * as react from "react";
|
|
@@ -20,7 +20,39 @@ interface StrategyVariant {
|
|
|
20
20
|
readonly embeddingModel: string;
|
|
21
21
|
readonly domainKey: string;
|
|
22
22
|
}
|
|
23
|
-
type
|
|
23
|
+
type IngestQueueRefresh = {
|
|
24
|
+
readonly kind: "rows";
|
|
25
|
+
readonly rows: readonly RecentIngestEntry[];
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: "refused";
|
|
28
|
+
readonly reason: string;
|
|
29
|
+
};
|
|
30
|
+
type IngestQueueRefresher = () => Promise<IngestQueueRefresh>;
|
|
31
|
+
type DocumentIngestOutcome = {
|
|
32
|
+
readonly kind: "ingested";
|
|
33
|
+
readonly result: DocumentIngestResult;
|
|
34
|
+
} | {
|
|
35
|
+
readonly kind: "refused";
|
|
36
|
+
readonly status: 403 | 500 | 503;
|
|
37
|
+
readonly error: string;
|
|
38
|
+
};
|
|
39
|
+
type DocumentStateCaptureOutcome = {
|
|
40
|
+
readonly kind: "recorded";
|
|
41
|
+
} | {
|
|
42
|
+
readonly kind: "unchanged";
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: "failed";
|
|
45
|
+
readonly status: 404 | 500 | 503;
|
|
46
|
+
readonly error: string;
|
|
47
|
+
};
|
|
48
|
+
interface HistoryCaptureRefusal {
|
|
49
|
+
readonly status: 403 | 404 | 503;
|
|
50
|
+
readonly error: string;
|
|
51
|
+
}
|
|
52
|
+
interface DocumentCaptureFailure {
|
|
53
|
+
readonly status: 403 | 404 | 500 | 503;
|
|
54
|
+
readonly reason: string;
|
|
55
|
+
}
|
|
24
56
|
interface RetryAllSkippedItem {
|
|
25
57
|
metadataId: number;
|
|
26
58
|
reason: string;
|
|
@@ -104,11 +136,11 @@ interface StorageAdminLoaderData {
|
|
|
104
136
|
classificationRuleConsumer: string | null;
|
|
105
137
|
syncCounts: Record<string, number>;
|
|
106
138
|
totalFiles: number;
|
|
107
|
-
failedSyncItems:
|
|
139
|
+
failedSyncItems: readonly FailedSyncEntry[];
|
|
108
140
|
circuitBreakerStatus: Record<string, CircuitBreakerState>;
|
|
109
141
|
pipelineStepMetrics: readonly PipelineStepMetric[];
|
|
110
142
|
pipelineStepMetricWindow: number;
|
|
111
|
-
recentPipelineRuns: readonly
|
|
143
|
+
recentPipelineRuns: readonly RecentPipelineRunEntry[];
|
|
112
144
|
displayTimeZone: string;
|
|
113
145
|
graphSchema: GraphSchemaStats;
|
|
114
146
|
enrichmentStrategies: EnrichmentStrategyRow[];
|
|
@@ -119,7 +151,8 @@ interface StorageAdminLoaderData {
|
|
|
119
151
|
unresolvedEntities: UnresolvedEntity[];
|
|
120
152
|
qdrantCollections: QdrantStorageOverview;
|
|
121
153
|
systemHealth: SystemInfrastructureHealth;
|
|
122
|
-
recentIngestItems?:
|
|
154
|
+
recentIngestItems?: readonly RecentIngestEntry[];
|
|
155
|
+
documentReadRefusal: string | null;
|
|
123
156
|
ontologyStatus: OntologyStatusData;
|
|
124
157
|
confidentialityPolicies: ConfidentialityPolicyRow[];
|
|
125
158
|
transcriptionVocabulary: TranscriptionTermRow[];
|
|
@@ -169,24 +202,27 @@ interface StorageAdminStore {
|
|
|
169
202
|
counts: Record<string, number>;
|
|
170
203
|
total: number;
|
|
171
204
|
}>;
|
|
172
|
-
getFailedSyncItems(tenantId: string): Promise<
|
|
205
|
+
getFailedSyncItems(tenantId: string, request: Request): Promise<readonly FailedSyncEntry[]>;
|
|
206
|
+
getDocumentReadRefusal(tenantId: string, request: Request): Promise<string | null>;
|
|
173
207
|
retrySyncItem(tenantId: string, fileId: string, actor?: string, accessToken?: string): Promise<void>;
|
|
174
208
|
retryAllFailedSyncItems(tenantId: string, actor?: string, accessToken?: string): Promise<RetryAllFailedResult>;
|
|
175
209
|
getPipelineStepMetrics(tenantId: string): Promise<readonly PipelineStepMetric[]>;
|
|
176
210
|
readonly pipelineStepMetricWindow: number;
|
|
177
|
-
getRecentPipelineRuns(tenantId: string): Promise<readonly
|
|
211
|
+
getRecentPipelineRuns(tenantId: string, request: Request): Promise<readonly RecentPipelineRunEntry[]>;
|
|
178
212
|
getStrategyVariants(tenantId: string): Promise<readonly StrategyVariant[]>;
|
|
179
213
|
getGraphSchema(tenantId: string): Promise<GraphSchemaStats>;
|
|
180
214
|
readIntegrityAuditOverview(tenantId: string): Promise<IntegrityAuditOverview>;
|
|
181
215
|
startIntegrityRun(tenantId: string, mode: IntegrityRunMode, basisRunUid: string | null, accessToken: string): Promise<IntegrityCommandReply>;
|
|
182
216
|
cancelIntegrityRun(tenantId: string, runUid: string, accessToken: string): Promise<IntegrityCommandReply>;
|
|
217
|
+
resyncIntegrityCell(tenantId: string, request: IntegrityCellResyncRequest, actor: string, accessToken: string | undefined): Promise<IntegrityCellResyncResult>;
|
|
183
218
|
getUnresolvedEntities(tenantId: string): Promise<UnresolvedEntity[]>;
|
|
184
219
|
resolveEntity(tenantId: string, entityId: string, action: "merge" | "promote"): Promise<void>;
|
|
185
220
|
getQdrantCollections(tenantId: string): Promise<QdrantStorageOverview>;
|
|
186
221
|
getCircuitBreakerStatus(): Record<string, CircuitBreakerState>;
|
|
187
|
-
ingestDocument(tenantId: string, payload: DocumentIngestPayload, actor: string, accessToken?: string): Promise<
|
|
222
|
+
ingestDocument(tenantId: string, payload: DocumentIngestPayload, actor: string, accessToken?: string): Promise<DocumentIngestOutcome>;
|
|
188
223
|
inspectFileUri?(tenantId: string, fileUri: string, accessToken?: string): Promise<FileInspectionResult>;
|
|
189
|
-
getRecentIngestItems(tenantId: string): Promise<
|
|
224
|
+
getRecentIngestItems(tenantId: string, request: Request): Promise<readonly RecentIngestEntry[]>;
|
|
225
|
+
captureDocumentState(tenantId: string, metadataId: number, actor: string): Promise<DocumentStateCaptureOutcome>;
|
|
190
226
|
getOntologyStatus(tenantId: string, snapshot: ConsoleConfigSnapshot): Promise<OntologyStatusData>;
|
|
191
227
|
}
|
|
192
228
|
type GraphReadOutcome = {
|
|
@@ -238,6 +274,7 @@ interface CreateStorageAdminAppOptions {
|
|
|
238
274
|
canReadIntegrityFindings: (request: Request) => Promise<boolean>;
|
|
239
275
|
canUpdateKnowledge: (request: Request) => Promise<boolean>;
|
|
240
276
|
authorizeIngest: (request: Request, payload: DocumentIngestPayload) => Promise<string | null>;
|
|
277
|
+
authorizeHistoryCapture: (request: Request, metadataId: number) => Promise<HistoryCaptureRefusal | null>;
|
|
241
278
|
}
|
|
242
279
|
interface StorageAdminActionData {
|
|
243
280
|
success?: boolean;
|
|
@@ -248,6 +285,9 @@ interface StorageAdminActionData {
|
|
|
248
285
|
skipped?: readonly RetryAllSkippedItem[];
|
|
249
286
|
failure?: IntegrityCommandFailure;
|
|
250
287
|
runUid?: string;
|
|
288
|
+
cellResync?: IntegrityCellResyncResult;
|
|
289
|
+
outcome?: DocumentCaptureAnswer["outcome"];
|
|
290
|
+
captureFailure?: DocumentCaptureFailure;
|
|
251
291
|
}
|
|
252
292
|
interface StorageAdminFetcher {
|
|
253
293
|
state: "idle" | "submitting" | "loading";
|
|
@@ -260,6 +300,8 @@ interface StorageAdminConsoleViewProps {
|
|
|
260
300
|
data?: StorageAdminLoaderData;
|
|
261
301
|
fetcher?: StorageAdminFetcher;
|
|
262
302
|
integrityFetcher?: StorageAdminFetcher;
|
|
303
|
+
inspectorFetcher?: StorageAdminFetcher;
|
|
304
|
+
captureFetcher?: StorageAdminFetcher;
|
|
263
305
|
renderHeader?: (props: {
|
|
264
306
|
title: string;
|
|
265
307
|
tenantId: string;
|
|
@@ -269,14 +311,13 @@ interface StorageAdminConsoleViewProps {
|
|
|
269
311
|
loadIntegrityFindings: IntegrityFindingsLoader;
|
|
270
312
|
policyConflicts: PolicyConflictHost;
|
|
271
313
|
documentAuthority: DocumentAuthorityHost;
|
|
272
|
-
|
|
314
|
+
documentHistory?: DocumentHistoryHost;
|
|
273
315
|
onCompareVariants?: ModelComparisonRunner;
|
|
274
316
|
graphTraversal?: GraphTraversalHost;
|
|
275
317
|
onBrowseGraphNodes?: (label: string, pageIndex: number) => Promise<GraphNodeIndexOutcome>;
|
|
276
318
|
onSimulateGovernance?: SimulationRunner;
|
|
277
319
|
onRefreshIngestQueue?: IngestQueueRefresher;
|
|
278
320
|
}
|
|
279
|
-
type IngestQueueRefresher = () => Promise<readonly RecentIngestItem[]>;
|
|
280
321
|
declare function StorageAdminConsoleView(props: StorageAdminConsoleViewProps): react.JSX.Element;
|
|
281
322
|
declare function createStorageAdminApp(options: CreateStorageAdminAppOptions): {
|
|
282
323
|
loader: (args: {
|
|
@@ -309,4 +350,4 @@ declare function createStorageAdminServer(options: CreateStorageAdminAppOptions)
|
|
|
309
350
|
request: Request;
|
|
310
351
|
}) => Promise<Response>;
|
|
311
352
|
};
|
|
312
|
-
export { type AwaitableSubmit, type ConsoleConfigSnapshot, type CreateStorageAdminAppOptions, type DocumentIngestResult, type
|
|
353
|
+
export { type AwaitableSubmit, type ConsoleConfigSnapshot, type CreateStorageAdminAppOptions, type DocumentCaptureFailure, type DocumentIngestOutcome, type DocumentIngestResult, type DocumentStateCaptureOutcome, type EnrichmentStrategyUpdate, type GraphReadOutcome, type GraphReader, type HealthProbeOptions, type HistoryCaptureRefusal, type IngestQueueRefresh, type IngestQueueRefresher, type IntegrityOverviewLoader, type MetadataSearchRunner, type ModelComparisonRunner, type PolicyWithoutDestination, type PromptTemplateUpdate, type RetryAllFailedResult, type RetryAllSkippedItem, type ServiceHealthStatus, type StorageAdminActionData, StorageAdminConsoleView, type StorageAdminConsoleViewProps, type StorageAdminFetcher, type StorageAdminLoaderData, type StorageAdminOperator, type StorageAdminStore, type StrategyVariant, type SystemInfrastructureHealth, type SystemParameter, type SystemParameterDataType, type UnresolvedEntity, checkAllSystemHealth, checkBackendApiHealth, checkNeo4jHealth, checkQdrantHealth, checkRedisHealth, checkSqlServerHealth, createStorageAdminApp, createStorageAdminServer };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ResourceOutcome } from "@aiquants/console-ui/core";
|
|
2
2
|
export { CommandOutcome, ResourceOutcome } from "@aiquants/console-ui/core";
|
|
3
|
-
import { EnrichmentStageKey, PipelineStepMetric,
|
|
4
|
-
export { IntegrityAuditOverview, IntegrityCommandFailure, IntegrityCommandReply, IntegrityFindingPage, IntegrityFindingsQuery, IntegrityRunMode, PipelineRunRecord, PipelineRunSummary, PipelineStepMetric, PipelineStepRecord, SearchMode, StageProvenance } from "@aiquants/enrichment-core";
|
|
5
|
-
import { EnrichmentStrategyRow,
|
|
6
|
-
export { ComparisonHit, ComparisonInput, ComparisonOutcome, ComparisonVariantResult, DocumentIngestLabel, DocumentIngestPayload, EnrichmentStrategyRow, FailedSyncItem, FileInspectionResult, FusionStrategy, MetadataSearchHit, MetadataSearchParams, MetadataSearchResult, OntologyStatusData, QdrantCollectionInfo, QdrantStorageOverview, RecentIngestItem, SearchHitGraphRelation, SearchHitScoreBreakdown, StrategyProvenance } from "@aiquants/enrichment-react";
|
|
3
|
+
import { EnrichmentStageKey, PipelineStepMetric, RecentPipelineRunEntry, IntegrityAuditOverview, IntegrityRunMode, IntegrityCommandReply, IntegrityCellResyncRequest, IntegrityCellResyncResult, IntegrityCommandFailure, DocumentCaptureAnswer } from "@aiquants/enrichment-core";
|
|
4
|
+
export { DiffLinePage, DocumentCaptureAnswer, DocumentChangeFeedPage, DocumentComparison, DocumentHistory, IntegrityAuditOverview, IntegrityCellResyncRequest, IntegrityCellResyncResult, IntegrityCommandFailure, IntegrityCommandReply, IntegrityFindingPage, IntegrityFindingsQuery, IntegrityRunMode, PipelineRunRecord, PipelineRunSummary, PipelineStepMetric, PipelineStepRecord, ReadableEntry, RecentPipelineRunEntry, RestrictedFailureMark, RestrictedIngestMark, RestrictedRunMark, SearchMode, StageProvenance } from "@aiquants/enrichment-core";
|
|
5
|
+
import { EnrichmentStrategyRow, FailedSyncEntry, QdrantStorageOverview, CircuitBreakerState, DocumentIngestPayload, FileInspectionResult, RecentIngestEntry, OntologyStatusData, MetadataSearchWorkbenchProps, ModelComparisonWorkbenchProps, DocumentHistoryHost } from "@aiquants/enrichment-react";
|
|
6
|
+
export { ComparisonHit, ComparisonInput, ComparisonOutcome, ComparisonVariantResult, DiffLinePageQuery, DiffLinePageReader, DiffLineTarget, DocumentComparisonQuery, DocumentHistoryHost, DocumentHistoryTarget, DocumentIngestLabel, DocumentIngestPayload, DocumentStateCapture, EnrichmentStrategyRow, FailedSyncEntry, FailedSyncItem, FileInspectionResult, FusionStrategy, MetadataSearchHit, MetadataSearchParams, MetadataSearchResult, OntologyStatusData, QdrantCollectionInfo, QdrantStorageOverview, RecentIngestEntry, RecentIngestItem, RecentIngestLastRun, SearchHitGraphRelation, SearchHitScoreBreakdown, StrategyProvenance } from "@aiquants/enrichment-react";
|
|
7
7
|
import { ConfidentialityPolicyRow, TranscriptionTermRow, TranscriptionReferenceRow, PromptTemplateItem, ClassificationRuleItem, GraphSchemaStats, IntegrityFindingsLoader, PolicyConflictHost, DocumentAuthorityHost, GraphTraversalHost, GraphNodeIndexOutcome, SimulationRunner } from "@aiquants/governance-react";
|
|
8
8
|
export { ClassificationRuleItem as ClassificationRule, DocumentAuthorityHost, GraphNodeIndexOutcome, GraphNodeIndexPage, GraphNodeSummary, GraphRelationshipTypesOutcome, GraphRelationshipTypesReader, GraphSchemaStats, GraphTraversalHost, GraphTraversalInput, GraphTraversalOutcome, GraphTraversalRunner, IntegrityFindingsLoader, PolicyConflictHost, PromptTemplateItem, SimulationOutcome, SimulationRunInput, SimulationRunResult, SimulationRunner, SimulationScoreSet, SimulationVerdictFlip } from "@aiquants/governance-react";
|
|
9
9
|
import * as react from "react";
|
|
@@ -20,7 +20,39 @@ interface StrategyVariant {
|
|
|
20
20
|
readonly embeddingModel: string;
|
|
21
21
|
readonly domainKey: string;
|
|
22
22
|
}
|
|
23
|
-
type
|
|
23
|
+
type IngestQueueRefresh = {
|
|
24
|
+
readonly kind: "rows";
|
|
25
|
+
readonly rows: readonly RecentIngestEntry[];
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: "refused";
|
|
28
|
+
readonly reason: string;
|
|
29
|
+
};
|
|
30
|
+
type IngestQueueRefresher = () => Promise<IngestQueueRefresh>;
|
|
31
|
+
type DocumentIngestOutcome = {
|
|
32
|
+
readonly kind: "ingested";
|
|
33
|
+
readonly result: DocumentIngestResult;
|
|
34
|
+
} | {
|
|
35
|
+
readonly kind: "refused";
|
|
36
|
+
readonly status: 403 | 500 | 503;
|
|
37
|
+
readonly error: string;
|
|
38
|
+
};
|
|
39
|
+
type DocumentStateCaptureOutcome = {
|
|
40
|
+
readonly kind: "recorded";
|
|
41
|
+
} | {
|
|
42
|
+
readonly kind: "unchanged";
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: "failed";
|
|
45
|
+
readonly status: 404 | 500 | 503;
|
|
46
|
+
readonly error: string;
|
|
47
|
+
};
|
|
48
|
+
interface HistoryCaptureRefusal {
|
|
49
|
+
readonly status: 403 | 404 | 503;
|
|
50
|
+
readonly error: string;
|
|
51
|
+
}
|
|
52
|
+
interface DocumentCaptureFailure {
|
|
53
|
+
readonly status: 403 | 404 | 500 | 503;
|
|
54
|
+
readonly reason: string;
|
|
55
|
+
}
|
|
24
56
|
interface RetryAllSkippedItem {
|
|
25
57
|
metadataId: number;
|
|
26
58
|
reason: string;
|
|
@@ -104,11 +136,11 @@ interface StorageAdminLoaderData {
|
|
|
104
136
|
classificationRuleConsumer: string | null;
|
|
105
137
|
syncCounts: Record<string, number>;
|
|
106
138
|
totalFiles: number;
|
|
107
|
-
failedSyncItems:
|
|
139
|
+
failedSyncItems: readonly FailedSyncEntry[];
|
|
108
140
|
circuitBreakerStatus: Record<string, CircuitBreakerState>;
|
|
109
141
|
pipelineStepMetrics: readonly PipelineStepMetric[];
|
|
110
142
|
pipelineStepMetricWindow: number;
|
|
111
|
-
recentPipelineRuns: readonly
|
|
143
|
+
recentPipelineRuns: readonly RecentPipelineRunEntry[];
|
|
112
144
|
displayTimeZone: string;
|
|
113
145
|
graphSchema: GraphSchemaStats;
|
|
114
146
|
enrichmentStrategies: EnrichmentStrategyRow[];
|
|
@@ -119,7 +151,8 @@ interface StorageAdminLoaderData {
|
|
|
119
151
|
unresolvedEntities: UnresolvedEntity[];
|
|
120
152
|
qdrantCollections: QdrantStorageOverview;
|
|
121
153
|
systemHealth: SystemInfrastructureHealth;
|
|
122
|
-
recentIngestItems?:
|
|
154
|
+
recentIngestItems?: readonly RecentIngestEntry[];
|
|
155
|
+
documentReadRefusal: string | null;
|
|
123
156
|
ontologyStatus: OntologyStatusData;
|
|
124
157
|
confidentialityPolicies: ConfidentialityPolicyRow[];
|
|
125
158
|
transcriptionVocabulary: TranscriptionTermRow[];
|
|
@@ -169,24 +202,27 @@ interface StorageAdminStore {
|
|
|
169
202
|
counts: Record<string, number>;
|
|
170
203
|
total: number;
|
|
171
204
|
}>;
|
|
172
|
-
getFailedSyncItems(tenantId: string): Promise<
|
|
205
|
+
getFailedSyncItems(tenantId: string, request: Request): Promise<readonly FailedSyncEntry[]>;
|
|
206
|
+
getDocumentReadRefusal(tenantId: string, request: Request): Promise<string | null>;
|
|
173
207
|
retrySyncItem(tenantId: string, fileId: string, actor?: string, accessToken?: string): Promise<void>;
|
|
174
208
|
retryAllFailedSyncItems(tenantId: string, actor?: string, accessToken?: string): Promise<RetryAllFailedResult>;
|
|
175
209
|
getPipelineStepMetrics(tenantId: string): Promise<readonly PipelineStepMetric[]>;
|
|
176
210
|
readonly pipelineStepMetricWindow: number;
|
|
177
|
-
getRecentPipelineRuns(tenantId: string): Promise<readonly
|
|
211
|
+
getRecentPipelineRuns(tenantId: string, request: Request): Promise<readonly RecentPipelineRunEntry[]>;
|
|
178
212
|
getStrategyVariants(tenantId: string): Promise<readonly StrategyVariant[]>;
|
|
179
213
|
getGraphSchema(tenantId: string): Promise<GraphSchemaStats>;
|
|
180
214
|
readIntegrityAuditOverview(tenantId: string): Promise<IntegrityAuditOverview>;
|
|
181
215
|
startIntegrityRun(tenantId: string, mode: IntegrityRunMode, basisRunUid: string | null, accessToken: string): Promise<IntegrityCommandReply>;
|
|
182
216
|
cancelIntegrityRun(tenantId: string, runUid: string, accessToken: string): Promise<IntegrityCommandReply>;
|
|
217
|
+
resyncIntegrityCell(tenantId: string, request: IntegrityCellResyncRequest, actor: string, accessToken: string | undefined): Promise<IntegrityCellResyncResult>;
|
|
183
218
|
getUnresolvedEntities(tenantId: string): Promise<UnresolvedEntity[]>;
|
|
184
219
|
resolveEntity(tenantId: string, entityId: string, action: "merge" | "promote"): Promise<void>;
|
|
185
220
|
getQdrantCollections(tenantId: string): Promise<QdrantStorageOverview>;
|
|
186
221
|
getCircuitBreakerStatus(): Record<string, CircuitBreakerState>;
|
|
187
|
-
ingestDocument(tenantId: string, payload: DocumentIngestPayload, actor: string, accessToken?: string): Promise<
|
|
222
|
+
ingestDocument(tenantId: string, payload: DocumentIngestPayload, actor: string, accessToken?: string): Promise<DocumentIngestOutcome>;
|
|
188
223
|
inspectFileUri?(tenantId: string, fileUri: string, accessToken?: string): Promise<FileInspectionResult>;
|
|
189
|
-
getRecentIngestItems(tenantId: string): Promise<
|
|
224
|
+
getRecentIngestItems(tenantId: string, request: Request): Promise<readonly RecentIngestEntry[]>;
|
|
225
|
+
captureDocumentState(tenantId: string, metadataId: number, actor: string): Promise<DocumentStateCaptureOutcome>;
|
|
190
226
|
getOntologyStatus(tenantId: string, snapshot: ConsoleConfigSnapshot): Promise<OntologyStatusData>;
|
|
191
227
|
}
|
|
192
228
|
type GraphReadOutcome = {
|
|
@@ -238,6 +274,7 @@ interface CreateStorageAdminAppOptions {
|
|
|
238
274
|
canReadIntegrityFindings: (request: Request) => Promise<boolean>;
|
|
239
275
|
canUpdateKnowledge: (request: Request) => Promise<boolean>;
|
|
240
276
|
authorizeIngest: (request: Request, payload: DocumentIngestPayload) => Promise<string | null>;
|
|
277
|
+
authorizeHistoryCapture: (request: Request, metadataId: number) => Promise<HistoryCaptureRefusal | null>;
|
|
241
278
|
}
|
|
242
279
|
interface StorageAdminActionData {
|
|
243
280
|
success?: boolean;
|
|
@@ -248,6 +285,9 @@ interface StorageAdminActionData {
|
|
|
248
285
|
skipped?: readonly RetryAllSkippedItem[];
|
|
249
286
|
failure?: IntegrityCommandFailure;
|
|
250
287
|
runUid?: string;
|
|
288
|
+
cellResync?: IntegrityCellResyncResult;
|
|
289
|
+
outcome?: DocumentCaptureAnswer["outcome"];
|
|
290
|
+
captureFailure?: DocumentCaptureFailure;
|
|
251
291
|
}
|
|
252
292
|
interface StorageAdminFetcher {
|
|
253
293
|
state: "idle" | "submitting" | "loading";
|
|
@@ -260,6 +300,8 @@ interface StorageAdminConsoleViewProps {
|
|
|
260
300
|
data?: StorageAdminLoaderData;
|
|
261
301
|
fetcher?: StorageAdminFetcher;
|
|
262
302
|
integrityFetcher?: StorageAdminFetcher;
|
|
303
|
+
inspectorFetcher?: StorageAdminFetcher;
|
|
304
|
+
captureFetcher?: StorageAdminFetcher;
|
|
263
305
|
renderHeader?: (props: {
|
|
264
306
|
title: string;
|
|
265
307
|
tenantId: string;
|
|
@@ -269,14 +311,13 @@ interface StorageAdminConsoleViewProps {
|
|
|
269
311
|
loadIntegrityFindings: IntegrityFindingsLoader;
|
|
270
312
|
policyConflicts: PolicyConflictHost;
|
|
271
313
|
documentAuthority: DocumentAuthorityHost;
|
|
272
|
-
|
|
314
|
+
documentHistory?: DocumentHistoryHost;
|
|
273
315
|
onCompareVariants?: ModelComparisonRunner;
|
|
274
316
|
graphTraversal?: GraphTraversalHost;
|
|
275
317
|
onBrowseGraphNodes?: (label: string, pageIndex: number) => Promise<GraphNodeIndexOutcome>;
|
|
276
318
|
onSimulateGovernance?: SimulationRunner;
|
|
277
319
|
onRefreshIngestQueue?: IngestQueueRefresher;
|
|
278
320
|
}
|
|
279
|
-
type IngestQueueRefresher = () => Promise<readonly RecentIngestItem[]>;
|
|
280
321
|
declare function StorageAdminConsoleView(props: StorageAdminConsoleViewProps): react.JSX.Element;
|
|
281
322
|
declare function createStorageAdminApp(options: CreateStorageAdminAppOptions): {
|
|
282
323
|
loader: (args: {
|
|
@@ -309,4 +350,4 @@ declare function createStorageAdminServer(options: CreateStorageAdminAppOptions)
|
|
|
309
350
|
request: Request;
|
|
310
351
|
}) => Promise<Response>;
|
|
311
352
|
};
|
|
312
|
-
export { type AwaitableSubmit, type ConsoleConfigSnapshot, type CreateStorageAdminAppOptions, type DocumentIngestResult, type
|
|
353
|
+
export { type AwaitableSubmit, type ConsoleConfigSnapshot, type CreateStorageAdminAppOptions, type DocumentCaptureFailure, type DocumentIngestOutcome, type DocumentIngestResult, type DocumentStateCaptureOutcome, type EnrichmentStrategyUpdate, type GraphReadOutcome, type GraphReader, type HealthProbeOptions, type HistoryCaptureRefusal, type IngestQueueRefresh, type IngestQueueRefresher, type IntegrityOverviewLoader, type MetadataSearchRunner, type ModelComparisonRunner, type PolicyWithoutDestination, type PromptTemplateUpdate, type RetryAllFailedResult, type RetryAllSkippedItem, type ServiceHealthStatus, type StorageAdminActionData, StorageAdminConsoleView, type StorageAdminConsoleViewProps, type StorageAdminFetcher, type StorageAdminLoaderData, type StorageAdminOperator, type StorageAdminStore, type StrategyVariant, type SystemInfrastructureHealth, type SystemParameter, type SystemParameterDataType, type UnresolvedEntity, checkAllSystemHealth, checkBackendApiHealth, checkNeo4jHealth, checkQdrantHealth, checkRedisHealth, checkSqlServerHealth, createStorageAdminApp, createStorageAdminServer };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Card as Dt,ConsoleUiRoot as Mt,ResourceFailed as Ht,reasonAside as et,resolveConsoleUiLabels as $t,useFocusRescue as Kt}from"@aiquants/console-ui";import{DOCUMENT_KIND_LABELS as qt,EnrichmentSyncStatusSchema as Bt,GRAPH_INDEX_LIMITS as Vt,IntegrityRunModeSchema as Gt,PIPELINE_STEPS as Qt}from"@aiquants/enrichment-core";import{DocumentIngestConsole as zt,EnrichmentStrategyBoard as Jt,FinishedInstant as Wt,InfrastructureHealthMonitor as Yt,MetadataSearchWorkbench as Zt,ModelComparisonWorkbench as Xt,OntologyStatusCard as en,PIPELINE_RUN_STATUS_PRESENTATION as tn,PIPELINE_TRIGGER_LABELS as nn,PipelineFlowViewer as rn,PipelineRunInspector as sn,pipelineRunPresentationKey as an,QdrantStorageCard as on,RecordedInstant as ln,SyncStatusMonitor as un}from"@aiquants/enrichment-react";import{ClassificationRuleEditor as dn,ConfidentialityPolicyBoard as cn,DocumentAuthorityRegistry as pn,FeatureFlagBoard as mn,GovernanceDryRunConsole as gn,integrityFailureNeedsOverviewReread as yn,KnowledgeGraphExplorer as fn,PolicyConflictQueue as bn,PolicyConflictSummaryCard as Sn,PromptTemplateConsole as Rn,SystemParameterTable as hn,TranscriptionAdaptationBoard as vn,TriStoreIntegrityAudit as In}from"@aiquants/governance-react";import{Fragment as wn,useCallback as Z,useEffect as Oe,useMemo as le,useRef as O,useState as L}from"react";import{useFetcher as Ge,useLoaderData as An,useRevalidator as Pn,useSearchParams as Nn}from"react-router";var ae="ja-JP";var Pt=/[^\s\x1c-\x1f\x85\ufeff]/;function oe(e){return Pt.test(e)}function Y(e,t){return new Promise(n=>n(e())).catch(n=>t(n instanceof Error?n.message:String(n)))}import{beginReload as Nt,keepLastGood as Tt}from"@aiquants/console-ui/core";import{isStrictlyEarlier as _t}from"@aiquants/enrichment-core";import{useCallback as he,useEffect as qe,useRef as Ie,useState as Et,useSyncExternalStore as Ct}from"react";var Ot=2e3,xt=1e4;function ve(e,t){return t.ok&&e.kind==="ready"&&_t(t.value.readAt,e.value.readAt)?e:Tt(e,t)}var kt=401;function Lt(e){return e.kind==="failed"||e.refreshFailure!==null&&e.refreshFailure.status===kt?null:e.value.active}function Be(e,t){let[n,r]=Et(()=>({loaded:e,overview:ve({kind:"loading"},e)}));n.loaded!==e&&r({loaded:e,overview:ve(n.overview,e)});let o=Ie(t);o.current=t;let s=Ie(null);qe(()=>()=>s.current?.abort(),[]);let a=he((c,m)=>Y(m,g=>({ok:!1,status:null,reason:g})).then(g=>{c.aborted||r(h=>({loaded:h.loaded,overview:ve(h.overview,g)}))}),[]),l=he(()=>{let c=new AbortController;s.current=c,r(m=>({loaded:m.loaded,overview:Nt(m.overview,"reload")})),a(c.signal,()=>o.current(c.signal))},[a]),d=he(c=>a(c,()=>o.current(c)),[a]);return{overview:n.overview,reload:l,poll:d}}function Ft(e){return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)}function jt(){return document.visibilityState==="visible"}function Ut(){return!0}function Ve(e,t,n){let r=Ct(Ft,jt,Ut),o=t&&r,s=Ie(o),a=e.kind==="ready",l=Lt(e),d=l===null?null:l.run.runUid,c=l===null?!1:l.isStale;qe(()=>{let m=o&&!s.current;if(s.current=o,!o||d===null&&!(m&&a))return;let g=new AbortController,h=c?xt:Ot,f,v=async()=>{await n(g.signal),!g.signal.aborted&&d!==null&&(f=setTimeout(v,h))};return f=setTimeout(v,m?0:h),()=>{g.abort(),clearTimeout(f)}},[o,a,d,c,n])}var we={columns:2,className:"grid-cols-2",spanClassNames:{1:"col-span-1",2:"col-span-2"}},Ae={columns:4,className:"@min-[41.5rem]:grid-cols-4",spanClassNames:{1:"@min-[41.5rem]:col-span-1",2:"@min-[41.5rem]:col-span-2",3:"@min-[41.5rem]:col-span-3",4:"@min-[41.5rem]:col-span-4"}},Pe={className:"@min-[82rem]:grid-flow-col @min-[82rem]:auto-cols-fr @min-[82rem]:grid-cols-none",lastTabClassName:"@min-[82rem]:col-auto"};function Ne(e,t){let n=t%e.columns,r=n===0?1:e.columns-n+1;return e.spanClassNames[r]}import{jsx as u,jsxs as S}from"react/jsx-runtime";var Qe="tab",_e={key:"knowledge-authority",phrases:["\u6A29\u5A01\u53F0\u5E33 & \u898F\u7A0B\u885D\u7A81"]},Ee={key:"pipeline",phrases:["\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3 & \u63A5\u7D9A\u72B6\u614B"]},Ce={key:"parameters",phrases:["\u30E2\u30C7\u30EB & \u30D1\u30E9\u30E1\u30FC\u30BF\u8A2D\u5B9A"]},ze="\u30A8\u30F3\u30EA\u30C3\u30C1\u30E1\u30F3\u30C8\u540C\u671F\u30B9\u30C6\u30FC\u30BF\u30B9",Tn="\u9001\u4FE1\u4E2D\u306E\u64CD\u4F5C (\u540C\u671F\u306E\u518D\u8A66\u884C\u306A\u3069) \u306E\u7D50\u679C\u3092\u5F85\u3063\u3066\u3044\u308B\u305F\u3081\u3001\u9001\u3063\u3066\u3044\u307E\u305B\u3093\u3002\u7D50\u679C\u304C\u51FA\u3066\u304B\u3089\u62BC\u3057\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002",D=[{key:"search",phrases:["\u30E1\u30BF\u30C7\u30FC\u30BF\u691C\u7D22","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1"]},{key:"ingest",phrases:["\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8","\u53D6\u308A\u8FBC\u307F & \u30E1\u30BF\u751F\u6210"]},Ee,{key:"knowledge-graph",phrases:["\u30CA\u30EC\u30C3\u30B8\u30B0\u30E9\u30D5","\u63A2\u7D22"]},Ce,{key:"prompts",phrases:["\u30D7\u30ED\u30F3\u30D7\u30C8 & \u30C9\u30E9\u30A4\u30E9\u30F3"]},_e,{key:"data-retention",phrases:["\u30C7\u30FC\u30BF\u4FDD\u6301 & \u6574\u5408\u6027\u76E3\u67FB"]}];function Te(e){return e.phrases.join("")}function _n(e){return e!==null&&D.some(t=>t.key===e)}var En="Tri-Store \u30C7\u30FC\u30BF\u6574\u5408\u6027\u76E3\u67FB";function Cn(e){return`\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${et(e)}\u3002`}var On=$t("ja");function xn(e){return On.failureSentence(e,"\u51E6\u7406\u5C65\u6B74\u3092\u95B2\u89A7\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",t=>`\u51E6\u7406\u5C65\u6B74\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${et(t)}\u3002`)}var Je={state:"idle",formData:null,data:null,submit:()=>Promise.resolve()};function tt({data:e,fetcher:t,integrityFetcher:n,renderHeader:r,graphTraversal:o,onBrowseGraphNodes:s,onSimulateGovernance:a,onRefreshIngestQueue:l,onSearch:d,onLoadDocumentRuns:c,onCompareVariants:m,loadIntegrityOverview:g,loadIntegrityFindings:h,policyConflicts:f,documentAuthority:v}){let[y,M]=L(null),[U,T]=L(null),[_,E]=L(!1),H=le(()=>{if(s!==void 0)return(i,b)=>{E(!0),Y(()=>s(i,b),R=>({ok:!1,reason:R})).then(R=>{E(!1),T(R.ok?null:R.reason),R.ok&&M(R.page)})}},[s]),[$,K]=Nn(),C=$.get(Qe),I=_n(C)?C:D[0].key,x=i=>{K(b=>{let R=new URLSearchParams(b);return R.set(Qe,i),R},{replace:!1,preventScrollReset:!0})},ee=Ln(e.recentIngestItems,l,I==="ingest"),k=Be(e.integrityAudit,g);Ve(k.overview,I==="data-retention",k.poll);let G=O(null),te=Kt(()=>G.current),[ce,pe]=L(0),me=Z(()=>pe(i=>i+1),[]),p=ee===null?e:{...e,recentIngestItems:[...ee]},q=O({}),ge=Z(()=>q.current[I]??null,[I]),ne=le(()=>Fn(e.enrichmentStrategies),[e.enrichmentStrategies]),ye=le(()=>e.strategyVariants.map(jn),[e.strategyVariants]),A=Mn(c),B=A.open,re=B===void 0?void 0:i=>B(i,null),fe=B===void 0?void 0:i=>B(i.metadataId,i.id),se=(i,b)=>{let R=D.length-1,P;if(i.key==="ArrowRight"||i.key==="ArrowDown")P=b===R?0:b+1;else if(i.key==="ArrowLeft"||i.key==="ArrowUp")P=b===0?R:b-1;else if(i.key==="Home")P=0;else if(i.key==="End")P=R;else return;i.preventDefault();let ie=D[P].key;x(ie),q.current[ie]?.focus()},je={...p.featureFlags};if(t.formData&&t.formData.get("intent")==="toggle_flag"){let i=String(t.formData.get("flagKey")??""),b=String(t.formData.get("enabled")??"")==="true";i&&(je[i]=b)}let pt=t.data&&"inspection"in t.data?t.data.inspection:void 0,Q=t.state==="idle"?null:t.formData?.get("intent"),mt=Q==="inspect_uri",gt=Q==="ingest_document",yt=Q==="retry_job"||Q==="retry_all_failed",ft=Q==="resolve_entity",Ue=n.state==="idle"?null:n.formData?.get("intent"),bt=Ue==="start_integrity_run"?{kind:"starting",mode:Gt.parse(n.formData?.get("mode"))}:Ue==="cancel_integrity_run"?{kind:"cancelling"}:{kind:"idle"},St=Pn(),[Rt,be]=L(null),De=I!=="data-retention";Oe(()=>{De&&be(null)},[De]);let ht=i=>{let b=i?.failure;if(b===void 0){be(null);return}be(R=>({failure:b,occurrence:R===null?1:R.occurrence+1})),yn(b)&&St.revalidate()},[z,J]=L(null),vt=i=>{if(t.state!=="idle"){J({metadataId:i,intent:"retry_job",status:"refused",error:Tn});return}J({metadataId:i,intent:"retry_job",status:"pending",error:null}),t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},[Me,Se]=L("console"),It=(i,b)=>{if(z!==null&&z.status==="pending"){if(b==="retry_job"){let R=i?.error;J(R===void 0?{...z,status:"accepted",error:null}:{...z,status:"refused",error:R}),Se("inspector");return}J(null)}Se("console")},{settledIntent:wt,submitAndAwait:He}=Ye(t,It);Ye(n,i=>{Se("integrity"),ht(i)});let $e=Me==="inspector"?void 0:(Me==="console"?t:n).data?.error,Re=i=>{x(i),q.current[i]?.focus()},Ke=O(null),At={strategies:{label:Te(Ee),onOpen:()=>Re(Ee.key),closesInspector:!0},projectionPolicy:{label:Te(Ce),onOpen:()=>Re(Ce.key),closesInspector:!0},failedSync:{label:ze,onOpen:()=>Ke.current?.focus(),closesInspector:!1}},W=wt==="retry_all_failed"&&t.data?.skipped!==void 0&&t.data.requeued!==void 0?{requeued:t.data.requeued,skipped:t.data.skipped}:null;return u(Mt,{locale:"ja",formatLocale:ae,timeZone:p.displayTimeZone,testId:"storage-admin-console-ui",children:S("div",{className:"container mx-auto space-y-6 p-6 font-sans text-slate-900","data-testid":"storage-admin-console",children:[$e&&u("div",{className:"rounded-lg border border-red-200 border-solid bg-red-50 p-4 font-medium text-red-700 text-sm shadow-sm",role:"alert","data-testid":"storage-admin-error-alert",children:$e}),r?r({title:"\u30B9\u30C8\u30EC\u30FC\u30B8 AI \u30A8\u30F3\u30EA\u30C3\u30C1\u30E1\u30F3\u30C8 & \u30AC\u30D0\u30CA\u30F3\u30B9\u904B\u7528\u7BA1\u7406",tenantId:p.tenantId}):S("header",{className:"flex flex-col justify-between gap-2 border-slate-200 border-b border-solid pb-4 md:flex-row md:items-center",children:[S("div",{children:[u("h1",{className:"font-bold text-2xl tracking-tight",children:"\u30B9\u30C8\u30EC\u30FC\u30B8 AI \u30A8\u30F3\u30EA\u30C3\u30C1\u30E1\u30F3\u30C8 & \u30AC\u30D0\u30CA\u30F3\u30B9\u904B\u7528\u7BA1\u7406"}),S("p",{className:"mt-1 text-slate-500 text-sm",children:["\u30C6\u30CA\u30F3\u30C8: ",u("code",{className:"font-semibold text-slate-800",children:p.tenantId})," | \u5168\u30B7\u30B9\u30C6\u30E0\u72B6\u614B\u30FB\u30D1\u30E9\u30E1\u30FC\u30BF\u5236\u5FA1\u30FB\u6574\u5408\u6027\u76E3\u67FB"]})]}),u("div",{className:"flex items-center gap-2",children:S("button",{type:"button","data-testid":"header-health-status-button",onClick:()=>x("pipeline"),className:"inline-flex items-center gap-2 rounded-full border border-slate-200 border-solid bg-slate-50 px-3 py-1.5 font-medium text-slate-700 text-xs transition-colors hover:bg-slate-100",children:[u("span",{className:`h-2 w-2 rounded-full ${p.systemHealth.allHealthy?"bg-emerald-500":"bg-amber-500"}`}),S("span",{children:["\u5468\u8FBA\u6A5F\u80FD: ",p.systemHealth.allHealthy?"\u5168\u30B5\u30FC\u30D3\u30B9\u6B63\u5E38":"\u63A5\u7D9A\u8981\u78BA\u8A8D"]})]})})]}),S("div",{className:"w-full space-y-6",children:[u("div",{className:"@container w-full","data-testid":"storage-admin-tablist-frame",children:u("div",{className:`grid w-full ${we.className} ${Ae.className} ${Pe.className} gap-1 rounded-xl bg-slate-100 p-1`,role:"tablist","aria-label":"\u904B\u7528\u7BA1\u7406\u30B3\u30F3\u30BD\u30FC\u30EB\u306E\u753B\u9762",children:D.map((i,b)=>{let R=I===i.key;return u("button",{id:`tab-${i.key}`,type:"button",role:"tab",ref:P=>{q.current[i.key]=P},"aria-selected":R,"aria-controls":`panel-${i.key}`,tabIndex:R?0:-1,"data-testid":`tab-trigger-${i.key}`,onKeyDown:P=>se(P,b),onClick:()=>x(i.key),className:`wrap-anywhere break-keep rounded-lg px-3 py-2.5 text-center font-medium text-sm transition-all ${b===D.length-1?`${Ne(we,D.length)} ${Ne(Ae,D.length)} ${Pe.lastTabClassName}`:""} ${R?"bg-white text-slate-900 shadow-sm":"text-slate-600 hover:bg-slate-200/50 hover:text-slate-900"}`,children:i.phrases.map((P,ie)=>S(wn,{children:[ie>0&&u("wbr",{}),P]},P))},i.key)})})}),A.metadataId!==null&&u(sn,{metadataId:A.metadataId,runs:A.runs,selectedRunId:A.selectedRunId,onSelectRun:A.selectRun,isLoading:A.isLoading,failure:A.failure,onClose:A.close,openRequest:A.openRequest,returnFocusFallback:ge}),I==="search"&&S("div",{role:"tabpanel",id:"panel-search","aria-labelledby":"tab-search",className:"space-y-6","data-testid":"tab-content-search",children:[u(Zt,{tenantId:p.tenantId,onSearch:d,circuitBreakerStatus:p.circuitBreakerStatus}),m!==void 0&&u(Xt,{variants:ye,onCompare:m})]}),I==="ingest"&&u("div",{role:"tabpanel",id:"panel-ingest","aria-labelledby":"tab-ingest",className:"space-y-6","data-testid":"tab-content-ingest",children:u(zt,{tenantId:p.tenantId,policies:p.confidentialityPolicies,domainOptions:ne,recentItems:p.recentIngestItems,inspectionResult:pt,isInspecting:mt,isSubmitting:gt,onInspectUri:i=>{t.submit({intent:"inspect_uri",fileUri:i},{method:"post"})},onIngestDocument:i=>{t.submit({intent:"ingest_document",payload:JSON.stringify(i)},{method:"post"})},onRetryItem:i=>{t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},onShowHistory:re})}),I==="pipeline"&&S("div",{role:"tabpanel",id:"panel-pipeline","aria-labelledby":"tab-pipeline",className:"space-y-6","data-testid":"tab-content-pipeline",children:[u(rn,{featureFlags:p.featureFlags,metrics:p.pipelineStepMetrics,metricSampleWindow:p.pipelineStepMetricWindow}),u(Un,{runs:p.recentPipelineRuns,onOpenRun:fe}),u(Jt,{strategies:p.enrichmentStrategies,featureFlags:p.featureFlags,isUpdating:t.state!=="idle",onToggleStage:(i,b,R)=>t.submit({intent:"update_enrichment_strategy",strategyId:String(i.id),domainId:String(i.domainId),stage:b,enabled:String(R)},{method:"post"})}),u(Yt,{health:p.systemHealth,isRefreshing:t.state!=="idle",onRefresh:()=>t.submit({intent:"refresh_health"},{method:"post"})})]}),I==="knowledge-graph"&&S("div",{role:"tabpanel",id:"panel-knowledge-graph","aria-labelledby":"tab-knowledge-graph",className:"space-y-6","data-testid":"tab-content-knowledge-graph",children:[u(en,{tenantId:p.tenantId,ontologyStatus:p.ontologyStatus}),u(fn,{topologyMaxLabels:Vt.topologyLabels.default,schema:p.graphSchema,tenantId:p.tenantId,unresolvedEntities:p.unresolvedEntities,traversal:o,onBrowseLabel:H,nodeIndexPage:y,nodeIndexFailure:U,isNodeIndexLoading:_,isResolving:ft,onResolveEntity:(i,b)=>{t.submit({intent:"resolve_entity",entityId:i,action:b},{method:"post"})}})]}),I==="parameters"&&S("div",{role:"tabpanel",id:"panel-parameters","aria-labelledby":"tab-parameters",className:"space-y-6","data-testid":"tab-content-parameters",children:[S("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-2",children:[u(mn,{flags:je,isUpdating:t.state!=="idle",onToggleFlag:(i,b)=>{t.submit({intent:"toggle_flag",flagKey:i,enabled:String(b)},{method:"post"})}}),u(dn,{rules:p.classificationRules,domainOptions:ne,consultedBy:p.classificationRuleConsumer,onReorderRules:i=>{t.submit({intent:"reorder_rules",orderedRuleIds:JSON.stringify(i)},{method:"post"})}})]}),p.policiesMissingDestination.length>0&&S("div",{"data-testid":"policies-missing-destination",role:"alert",style:{padding:"10px 12px",borderRadius:"6px",backgroundColor:"#fef2f2",color:"#b91c1c",fontSize:"12px"},children:[u("strong",{children:"\u6B21\u306E\u533A\u5206\u30FB\u6A5F\u80FD\u306F\u5B9F\u884C\u6642\u306B\u5931\u6557\u3057\u307E\u3059\u3002"})," \u53C2\u7167\u3059\u308B\u30D7\u30ED\u30F3\u30D7\u30C8\u884C\u306B\u5B9B\u5148\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002",u("ul",{style:{margin:"6px 0 0",paddingInlineStart:"18px"},children:p.policiesMissingDestination.map(i=>S("li",{"data-testid":`missing-destination-${i.confidentialityLevel}-${i.capability}`,children:[i.confidentialityLevel," / ",i.capability," \u2192 ",i.promptKey," (",i.modelProvider,") \u306E ",u("code",{children:"extra_params.base_url"})]},`${i.confidentialityLevel}:${i.capability}`))}),u("span",{style:{display:"block",marginTop:"4px",fontSize:"11px"},children:"\u5B9B\u5148\u3092\u8A2D\u5B9A\u3057\u3066\u3082\u3001\u305D\u306E\u30DB\u30B9\u30C8\u304C\u914D\u5099\u5185\u3068\u3057\u3066\u767B\u9332\u3055\u308C\u3066\u3044\u306A\u3051\u308C\u3070\u62D2\u5426\u3055\u308C\u307E\u3059\u3002"})]}),u(cn,{policies:p.confidentialityPolicies,promptKeys:p.promptTemplates.map(i=>i.template_key),isUpdating:t.state!=="idle",onChangePolicy:i=>{t.submit({intent:"update_confidentiality_policy",confidentialityLevel:i.confidentialityLevel,capability:i.capability,isEnabled:String(i.isEnabled),allowCloudProvider:String(i.allowCloudProvider),promptKey:i.promptKey??""},{method:"post"})}}),u(vn,{vocabulary:p.transcriptionVocabulary,references:p.transcriptionReferences,unresolvedUris:p.unresolvedReferenceUris,isUpdating:t.state!=="idle",onSaveTerm:i=>He({intent:"save_transcription_term",id:i.id===null?"":String(i.id),term:i.term,reading:i.reading??"",boost:i.boost===null?"":String(i.boost),domainKey:i.domainKey??"",isActive:String(i.isActive)},{method:"post"}),onSaveReference:i=>He({intent:"save_transcription_reference",id:i.id===null?"":String(i.id),fileUri:i.fileUri,domainKey:i.domainKey??"",isActive:String(i.isActive)},{method:"post"})}),u(hn,{parameters:p.systemParameters,onSaveParameter:(i,b)=>{t.submit({intent:"update_parameter",paramKey:i,paramValue:String(b)},{method:"post"})}})]}),I==="prompts"&&S("div",{role:"tabpanel",id:"panel-prompts","aria-labelledby":"tab-prompts",className:"space-y-6","data-testid":"tab-content-prompts",children:[u(Rn,{templates:p.promptTemplates,isSaving:t.state!=="idle",onSaveTemplate:i=>{t.submit({intent:"update_prompt",templateKey:i.template_key,payload:JSON.stringify({templateText:i.template_text,modelName:i.model_name,temperature:i.temperature,maxOutputTokens:i.max_output_tokens,responseSchema:i.response_schema,endpointBaseUrl:i.endpoint_base_url??null})},{method:"post"})}}),u(gn,{onSimulate:a})]}),I==="knowledge-authority"&&S("div",{role:"tabpanel",id:"panel-knowledge-authority","aria-labelledby":"tab-knowledge-authority",className:"space-y-6","data-testid":"tab-content-knowledge-authority",children:[u(pn,{host:v,canUpdate:p.canUpdateKnowledge,onPolicyConflictsChanged:me}),u(bn,{host:f,revision:ce})]}),I==="data-retention"&&S("div",{role:"tabpanel",id:"panel-data-retention","aria-labelledby":"tab-data-retention",className:"space-y-6","data-testid":"tab-content-data-retention",children:[k.overview.kind==="ready"?u("div",{ref:te,children:u(In,{overview:k.overview.value,canReadFindings:p.canReadIntegrityFindings,command:bt,commandFailure:Rt,onStartRun:(i,b)=>{n.submit(b===null?{intent:"start_integrity_run",mode:i}:{intent:"start_integrity_run",mode:i,basisRunUid:b},{method:"post"})},onCancelRun:i=>{n.submit({intent:"cancel_integrity_run",runUid:i},{method:"post"})},loadFindings:h,refreshFailure:k.overview.refreshFailure===null?null:k.overview.refreshFailure.reason,headingRef:G,onShowHistory:re,resync:{onResync:vt,onDismiss:()=>J(null),feedback:z},remedyDestinations:At})}):u(Dt,{title:En,testId:"audit-overview-failed",headingRef:G,children:u(Ht,{failure:k.overview,onReload:k.reload,forbiddenMessage:"\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u95B2\u89A7\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",failureMessage:Cn,rescueRef:te,testId:"audit-overview-failed-resource"})}),u(Sn,{host:f,knowledgeTabLabel:Te(_e),onOpenKnowledgeTab:()=>Re(_e.key)}),W!==null&&W.skipped.length>0&&S("div",{role:"status","data-testid":"retry-all-skipped",className:"rounded-lg border border-amber-200 border-solid bg-amber-50 p-4 text-amber-800 text-sm",children:[S("strong",{children:["\u4E00\u62EC\u518D\u8A66\u884C: ",W.requeued," \u4EF6\u3092\u518D\u6295\u5165\u3057\u3001",W.skipped.length," \u4EF6\u3092\u636E\u3048\u7F6E\u304D\u307E\u3057\u305F\u3002"]})," ","\u636E\u3048\u7F6E\u3044\u305F\u884C\u306F\u5931\u6557\u306E\u307E\u307E\u6B8B\u3063\u3066\u3044\u307E\u3059\u3002",u("ul",{className:"mt-1.5 list-disc ps-5",children:W.skipped.map(i=>S("li",{"data-testid":`retry-all-skipped-${i.metadataId}`,children:["#",i.metadataId,": ",i.reason]},i.metadataId))})]}),S("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-2",children:[u("section",{ref:Ke,tabIndex:-1,"aria-label":ze,"data-testid":"sync-status-region",children:u(un,{counts:p.syncCounts,totalFiles:p.totalFiles,failedItems:p.failedSyncItems,isRetrying:yt,onRetryItem:i=>{t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},onRetryAll:()=>{t.submit({intent:"retry_all_failed"},{method:"post"})}})}),u(on,{overview:p.qdrantCollections,health:{healthy:p.systemHealth.services.qdrant.status==="connected",latency_ms:p.systemHealth.services.qdrant.latencyMs}})]})]})]})]})})}var kn=new Set(Bt.options.filter(e=>e!=="SYNCED"&&!e.startsWith("FAILED"))),We=2e3;function Ln(e,t,n){let[r,o]=L(null),s=O(t);s.current=t;let a=O(e);a.current!==e&&(a.current=e,r!==null&&o(null));let d=(r??e)?.some(c=>kn.has(c.syncStatus))===!0;return Oe(()=>{if(!(n&&d&&s.current))return;let c=!1,m,g=async()=>{let h=s.current;if(h!==void 0){try{let f=await h();if(c)return;o(f)}catch{if(c)return}m=setTimeout(g,We)}};return m=setTimeout(g,We),()=>{c=!0,clearTimeout(m)}},[d,n]),r}function Ye(e,t){let n=O(t);n.current=t;let r=O(null),o=O(!1),s=O(null);if(e.state!=="idle"){o.current=!0;let l=e.formData?.get("intent");typeof l=="string"&&(r.current=l)}Oe(()=>{if(e.state!=="idle"||!o.current)return;o.current=!1,n.current(e.data,r.current);let l=s.current;if(l===null)return;s.current=null;let d=e.data?.error;typeof d=="string"?l.reject(new Error(d)):l.resolve()},[e.state,e.data]);let a=Z((...l)=>new Promise((d,c)=>{s.current?.reject(new Error("\u3053\u306E\u4FDD\u5B58\u306F\u5F8C\u7D9A\u306E\u9001\u4FE1\u306B\u7F6E\u304D\u63DB\u3048\u3089\u308C\u307E\u3057\u305F\u3002")),s.current={resolve:d,reject:c},e.submit(...l)}),[e]);return{settledIntent:e.state==="idle"?r.current:null,submitAndAwait:a}}function Fn(e){let t=new Set,n=[];for(let r of e)t.has(r.domainKey)||(t.add(r.domainKey),n.push({key:r.domainKey,label:r.domainLabel}));return n}function jn(e){return{strategyId:e.strategyId,label:`${e.domainKey} / ${e.variantKey}`,embeddingModel:e.embeddingModel}}function Un({runs:e,onOpenRun:t}){return S("section",{className:"rounded-xl border border-slate-200 border-solid bg-white p-6 shadow-sm","aria-labelledby":"pipeline-recent-runs-heading","data-testid":"pipeline-recent-runs",children:[u("h2",{id:"pipeline-recent-runs-heading",className:"font-bold text-base text-slate-900",children:"\u76F4\u8FD1\u306E\u5B9F\u884C"}),e.length===0?u("p",{className:"mt-4 text-[13px] text-slate-500","data-testid":"pipeline-recent-runs-empty",children:"\u8A18\u9332\u3055\u308C\u305F\u5B9F\u884C\u304C\u3042\u308A\u307E\u305B\u3093\u3002"}):u("div",{className:"relative mt-4 overflow-x-auto","data-testid":"pipeline-recent-runs-scroll",children:S("table",{className:"w-full text-left text-[13px]",children:[u("thead",{children:S("tr",{className:"whitespace-nowrap border-slate-200 border-b border-solid text-[11px] text-slate-500 uppercase",children:[u("th",{scope:"col",className:"px-3 py-2",children:"\u5B9F\u884C"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u6587\u66F8"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u7A2E\u985E"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u304D\u3063\u304B\u3051"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u8A66\u884C"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u72B6\u614B"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u6B62\u307E\u3063\u305F\u6BB5"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u958B\u59CB"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u7D42\u4E86"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u8981\u6C42\u8005"}),t!==void 0&&u("th",{scope:"col",className:"px-3 py-2",children:u("span",{className:"sr-only","data-testid":"pipeline-recent-runs-action-header",children:"\u64CD\u4F5C"})})]})}),u("tbody",{children:e.map(n=>{let r=an(n),o=tn[r];return S("tr",{className:"border-slate-100 border-b border-solid","data-testid":`pipeline-run-row-${n.id}`,"data-status":n.status,children:[S("td",{className:"whitespace-nowrap px-3 py-2 font-mono","data-testid":`pipeline-run-id-${n.id}`,children:["#",n.id]}),S("td",{className:"whitespace-nowrap px-3 py-2 font-mono","data-testid":`pipeline-run-metadata-${n.id}`,children:["#",n.metadataId]}),u("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-kind-${n.id}`,children:qt[n.documentKind]}),u("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-trigger-${n.id}`,"data-trigger":n.trigger,children:nn[n.trigger]}),u("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-attempt-${n.id}`,children:n.attempt}),u("td",{className:"px-3 py-2",children:u("span",{className:`inline-flex whitespace-nowrap rounded-full px-2 py-0.5 font-semibold text-[11px] ${o.className}`,"data-testid":`pipeline-run-status-${n.id}`,"data-status":n.status,"data-presentation":r,children:o.label})}),u("td",{className:"px-3 py-2","data-testid":`pipeline-run-failed-step-${n.id}`,children:n.failedStepKey===null?"\u2014":Qt[n.failedStepKey].label}),u("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-started-${n.id}`,children:u(ln,{iso:n.startedAt,testId:`pipeline-run-started-value-${n.id}`})}),u("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-finished-${n.id}`,children:u(Wt,{iso:n.finishedAt,testId:`pipeline-run-finished-value-${n.id}`})}),u("td",{className:"wrap-anywhere px-3 py-2","data-testid":`pipeline-run-requested-by-${n.id}`,children:n.requestedBy}),t!==void 0&&u("td",{className:"whitespace-nowrap px-3 py-2 text-right",children:u("button",{type:"button",onClick:()=>t(n),"aria-label":`\u5B9F\u884C #${n.id} (\u6587\u66F8 #${n.metadataId}) \u306E\u8A73\u7D30`,className:"whitespace-nowrap rounded-sm border border-slate-300 border-solid bg-white px-2 py-0.5 font-semibold text-[11px] text-slate-700 hover:bg-slate-50","data-testid":`pipeline-run-open-${n.id}`,children:"\u8A73\u7D30"})})]},n.id)})})]})})]})}var Ze={metadataId:null,runs:[],selectedRunId:null,isLoading:!1,failure:null};function Dn(e){for(let t of e)for(let n of t.steps){let r=n.provenance;if(r!==null){for(let[o,s]of Object.entries(r))if(typeof s=="string"&&!oe(s))return`\u51E6\u7406\u5C65\u6B74\u306E\u8A18\u9332\u306B\u8AAD\u3081\u306A\u3044\u6765\u6B74\u306E\u5024\u304C\u3042\u308A\u307E\u3059 (\u5B9F\u884C ${t.id} \u306E\u6BB5 ${n.sequence} \u306E ${o})\u3002`}}return null}function Mn(e){let[t,n]=L(Ze),[r,o]=L(0),s=O(0),a=O(null),l=le(()=>{if(e!==void 0)return(m,g)=>{s.current+=1;let h=s.current;a.current?.abort();let f=new AbortController;a.current=f,o(v=>v+1),n({metadataId:m,runs:[],selectedRunId:g,isLoading:!0,failure:null}),Y(()=>e(m,f.signal),v=>({ok:!1,status:null,reason:v})).then(v=>{if(s.current!==h)return;let y=v.ok?Dn(v.value):xn(v);if(!v.ok||y!==null){n({metadataId:m,runs:[],selectedRunId:g,isLoading:!1,failure:y});return}n({metadataId:m,runs:v.value,selectedRunId:g===null?Hn(v.value):g,isLoading:!1,failure:null})})}},[e]),d=Z(m=>{n(g=>({...g,selectedRunId:m}))},[]),c=Z(()=>{s.current+=1,a.current?.abort(),a.current=null,n(Ze)},[]);return{...t,openRequest:r,open:l,selectRun:d,close:c}}function Hn(e){return e.length===0?null:e[0].id}function $n(e){let t=An(),n=Ge(),r=Ge(),o=e.data??t,s=e.fetcher??n,a=e.integrityFetcher??r;return o?u(tt,{...e,data:o,fetcher:s,integrityFetcher:a}):u("div",{className:"p-8 text-center text-slate-500","data-testid":"storage-admin-loading",children:"\u30C7\u30FC\u30BF\u8AAD\u307F\u8FBC\u307F\u4E2D..."})}function nt(e){return e.data?u(tt,{...e,data:e.data,fetcher:e.fetcher??Je,integrityFetcher:e.integrityFetcher??Je}):u($n,{...e})}import{AuthzDeniedError as ot}from"@aiquants/authz-core";import{formatCount as Jn}from"@aiquants/console-ui/core";import{assertSystemParameterInRange as Wn,INTEGRITY_COMMAND_CODES as Yn,IntegrityAuditOverviewSchema as Zn,IntegrityCommandFailureSchema as Xn,IntegrityCommandReplySchema as er,IntegrityRunModeSchema as lt,integrityCommandFailureCodeOf as tr,isEnrichmentStageKey as nr,PipelineRunSummarySchema as rr,PipelineStepMetricSchema as sr}from"@aiquants/enrichment-core";import{CLOUD_CAPABLE_CAPABILITIES as ir,ConfidentialityLevelSchema as Fe,GovernedCapabilitySchema as ar}from"@aiquants/governance-core";import{z as w}from"zod";var ke=3e3;function j(e){return Math.round(performance.now()-e)}function N(e){return typeof e=="string"&&oe(e)?e:null}function F(e){let t=globalThis.process;return t===void 0?void 0:t.env[e]}function ue(e,t){let n=e?.trim();if(!n)throw new Error(`${t} is not configured; this probe will not guess an endpoint to send credentials to.`);return n}function rt(e,t,n){let r=e??(t?.trim()?Number(t):Number.NaN);if(!Number.isInteger(r)||r<=0||r>65535)throw new Error(`${n} is not configured with a valid port; this probe will not guess one.`);return r}function st(e,t){if(e!==void 0)return e;let n=t?.trim().toLowerCase();if(!(n===void 0||n===""))return n==="1"||n==="true"||n==="yes"||n==="on"}function it(e){let t=e.trim().split("://",1)[0]?.toLowerCase();if(t&&e.includes("://"))return t.endsWith("s")||t.includes("+s")}function Kn(e){let n=e.split("://").slice(-1)[0].split("/",1)[0],r=n.split(":").pop();if(!r||r===n)return;let o=Number(r);return Number.isInteger(o)&&o>0&&o<=65535?o:void 0}async function xe(e,t){let n;try{return await Promise.race([e,new Promise((r,o)=>{n=setTimeout(()=>o(new Error(`Probe timed out after ${t}ms`)),t)})])}finally{clearTimeout(n)}}async function qn(e){let t=e?.qdrantApiKey??F("QDRANT_API_KEY")??"",n=e?.timeoutMs??ke,r=performance.now(),o="";try{o=ue(e?.qdrantUrl??F("QDRANT_URL"),"QDRANT_URL");let s={};t&&(s["api-key"]=t);let[a,l]=await Promise.all([fetch(`${o}/`,{headers:s,signal:AbortSignal.timeout(n)}),fetch(`${o}/collections`,{headers:s,signal:AbortSignal.timeout(n)})]);if(!a.ok)throw new Error(`HTTP ${a.status}: ${a.statusText}`);if(!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText} (/collections)`);let d=await a.json(),c=j(r),g=(await l.json()).result?.collections?.length??0;return{serviceName:"Qdrant",category:"vector",status:"connected",version:N(d.version),endpoint:o,latencyMs:c,details:{engine:N(d.title),collectionsCount:g,restPort:Kn(o)??null,tls:it(o)??null}}}catch(s){let a=j(r),l=s instanceof Error?s.message:String(s);return{serviceName:"Qdrant",category:"vector",status:"error",version:null,endpoint:o,latencyMs:a,details:{},errorMessage:l}}}async function Bn(e){let t=e?.timeoutMs??ke,n=performance.now(),r=N(e?.neo4jBoltUri??F("NEO4J_URI")),o=r===null?"":r;try{let s=e?.graphReader;if(!s)throw new Error("Graph reader not configured");let a=e?.tenantId,[l,d]=await Promise.all([xe(s("CALL dbms.components() YIELD versions, edition RETURN versions[0] AS version, edition",{}),t),xe(a?s("MATCH (n {tenantId: $tenantId}) RETURN count(n) AS node_count",{tenantId:a}):s("RETURN null AS node_count",{}),t)]);if(!l.ok)throw new Error(l.reason);if(!d.ok)throw new Error(d.reason);let[c,m]=l.rows[0]??[],g=d.rows[0]?.[0],h=j(n);return{serviceName:"Neo4j",category:"graph",status:"connected",version:N(c),endpoint:o,latencyMs:h,details:{edition:N(m),boltUri:r,nodeCount:typeof g=="number"?g:null,tls:r===null?null:it(r)??null}}}catch(s){let a=j(n),l=s instanceof Error?s.message:String(s);return{serviceName:"Neo4j",category:"graph",status:"error",version:null,endpoint:o,latencyMs:a,details:{},errorMessage:l}}}async function Vn(e){let t=performance.now(),n="",r=st(e?.redisTls,F("REDIS_TLS")),o=Number.NaN;try{let s=e?.redisClient;if(!s)throw new Error("Redis client not configured");let a=ue(e?.redisHost??F("REDIS_HOST"),"REDIS_HOST");o=rt(e?.redisPort,F("REDIS_PORT"),"REDIS_PORT"),n=`${r===!1?"redis":"rediss"}://${a}:${o}`,await s.ping();let l=await s.info("server"),d=N(l.match(/redis_version:([^\r\n]+)/)?.[1]),c=null;if(typeof s.dbSize=="function")try{c=await s.dbSize()}catch{c=null}let m=j(t);return{serviceName:"Redis",category:"cache",status:"connected",version:d,endpoint:n,latencyMs:m,details:{totalKeys:c,port:o,tls:r??null,database:0}}}catch(s){let a=j(t),l=s instanceof Error?s.message:String(s);return{serviceName:"Redis",category:"cache",status:"error",version:null,endpoint:n,latencyMs:a,details:{},errorMessage:l}}}function Gn(e){let t=e.match(/Microsoft SQL Server \d+ \([^)]+\)/);return N(t===null?e.substring(0,30):t[0].replace("Microsoft SQL Server ",""))}async function Qn(e){let t=performance.now(),n="",r=st(e?.sqlServerTls,F("SQL_SERVER_TLS")),o=Number.NaN;try{let s=e?.sqlServerExecute;if(!s)throw new Error("SQL Server executor not configured");let a=ue(e?.sqlServerHost??F("SQL_SERVER_HOST"),"SQL_SERVER_HOST");o=rt(e?.sqlServerPort,F("SQL_SERVER_PORT"),"SQL_SERVER_PORT"),n=`${a}:${o}`;let l=await s(),d=N(l.db_name),c=N(l.version),m=c===null?null:N(c.split(`
|
|
2
|
-
`)[0]),g=m===null?null:Gn(m),h=j(t);return{serviceName:"SQL Server",category:"database",status:"connected",version:g,endpoint:n,latencyMs:h,details:{database:d,port:o,tls:r??null,fullVersion:m}}}catch(s){let a=j(t),l=s instanceof Error?s.message:String(s);return{serviceName:"SQL Server",category:"database",status:"error",version:null,endpoint:n,latencyMs:a,details:{},errorMessage:l}}}async function zn(e){let t=e?.timeoutMs??ke,n=performance.now(),r="";try{r=ue(e?.backendApiHost??F("BACKEND_API_HOST"),"BACKEND_API_HOST");let o=await fetch(`${r}/openapi.json`,{signal:AbortSignal.timeout(t)});if(!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);let s=await o.json(),a=Object.keys(s.paths??{}).length,l=j(n);return{serviceName:"AI Quant API",category:"api",status:"connected",version:N(s.info?.version),endpoint:r,latencyMs:l,details:{title:N(s.info?.title),endpointsCount:a}}}catch(o){let s=j(n),a=o instanceof Error?o.message:String(o);return{serviceName:"AI Quant API",category:"api",status:"error",version:null,endpoint:r,latencyMs:s,details:{},errorMessage:a}}}async function at(e){let[t,n,r,o,s]=await Promise.all([qn(e),Bn(e),Vn(e),Qn(e),zn(e)]),a=t.status==="connected"&&n.status==="connected"&&r.status==="connected"&&o.status==="connected"&&s.status==="connected";return{services:{qdrant:t,neo4j:n,redis:r,sqlServer:o,quantsApi:s},allHealthy:a,checkedAt:new Date().toISOString()}}var or=w.object({templateText:w.string(),modelName:w.string(),temperature:w.number(),maxOutputTokens:w.number(),responseSchema:w.union([w.record(w.string(),w.unknown()),w.string(),w.null()]).optional(),endpointBaseUrl:w.string().nullable()}).strict(),lr=w.discriminatedUnion("mode",[w.object({mode:lt.extract(["SCAN"]),basisRunUid:w.null()}).strict(),w.object({mode:lt.extract(["REPAIR"]),basisRunUid:w.string().uuid()}).strict()]),ur=w.object({runUid:w.string().uuid()}).strict();function dt(e){return e==="start_integrity_run"?"start":e==="cancel_integrity_run"?"cancel":null}function V(e,t){return e.issues.map(n=>`${n.path.length===0?t:n.path.join(".")}: ${n.message}`).join("; ")}function dr(e,t){if(e==="bool")return t==="true"||t==="false"?null:"paramValue must be 'true' or 'false' for a bool parameter";if(e==="int")return/^[+-]?\d+$/.test(t)&&Number.isSafeInteger(Number(t))?null:"paramValue must be a safe integer for an int parameter";if(e==="float")return t.trim()!==""&&Number.isFinite(Number(t))?null:"paramValue must be a finite number for a float parameter";if(e==="json")try{return JSON.parse(t),null}catch{return"paramValue must be valid JSON for a json parameter"}return null}function cr(e){let t=rr.array().safeParse(e);if(!t.success)throw new Error(`getRecentPipelineRuns answered something that is not a run summary: ${V(t.error,"getRecentPipelineRuns")}`);return t.data}function pr(e){let t=sr.array().safeParse(e);if(!t.success)throw new Error(`getPipelineStepMetrics answered something that is not a step metric: ${V(t.error,"getPipelineStepMetrics")}`);let n=new Set;for(let r of t.data){let o=`${r.documentKind}/${r.stepKey}`;if(n.has(o))throw new Error(`getPipelineStepMetrics answered more than one metric for (documentKind, stepKey) = (${r.documentKind}, ${r.stepKey})`);n.add(o)}return t.data}function mr(e){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`pipelineStepMetricWindow must be a positive safe integer, got ${String(e)}`);return e}async function gr(e,t){let n;try{n=await e.readIntegrityAuditOverview(t)}catch(o){return{ok:!1,status:null,reason:o instanceof Error?o.message:String(o)}}let r=Zn.safeParse(n);return r.success?{ok:!0,value:r.data}:{ok:!1,status:null,reason:`readIntegrityAuditOverview answered something that is not an audit overview: ${V(r.error,"readIntegrityAuditOverview")}`}}function yr(e){return!Array.isArray(e)||e.length===0?"orderedRuleIds must be a non-empty array of rule ids":e.every(t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>0)?new Set(e).size!==e.length?"orderedRuleIds must not name a rule twice":null:"orderedRuleIds must contain positive integers only"}function ct(e){let{store:t,healthProbeOptions:n,resourceKey:r="storage_admin",requireUser:o,requirePermission:s,resolveTenantId:a,authorizeIngest:l,canReadIntegrityFindings:d,canUpdateKnowledge:c}=e;async function m(h){let{request:f}=h;if(!await o(f))throw new Response("\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002",{status:401});try{await s(f,{resourceKey:r,action:"read"})}catch(se){throw se instanceof ot?new Response("\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",{status:403}):se}let y=await a(f),M=mr(t.pipelineStepMetricWindow),[U,T,_]=await Promise.all([t.getFeatureFlags(y),t.getSystemParameters(y),t.getSyncCounts(y)]),E={featureFlags:U,systemParameters:T,syncCounts:_},[H,$,K,C,I,x,ee,k,G,te,ce,pe,me,p,q,ge,ne,ye,A,B,re]=await Promise.all([t.getConfidentialityPolicies(y),t.getTranscriptionVocabulary(y),t.getTranscriptionReferences(y),t.getUnresolvedReferenceUris(y),t.getPoliciesMissingDestination(y),t.getPromptTemplates(y),t.getClassificationRules(y),t.getFailedSyncItems(y),t.getGraphSchema(y),gr(t,y),d(f),c(f),t.getUnresolvedEntities(y),t.getQdrantCollections(y),at({...n,tenantId:y}),t.getRecentIngestItems(y),t.getOntologyStatus(y,E),t.getEnrichmentStrategies(y),t.getStrategyVariants(y),t.getPipelineStepMetrics(y),t.getRecentPipelineRuns(y)]),fe=t.getCircuitBreakerStatus();return{tenantId:y,featureFlags:E.featureFlags,confidentialityPolicies:H,transcriptionVocabulary:$,transcriptionReferences:K,unresolvedReferenceUris:C,policiesMissingDestination:I,systemParameters:E.systemParameters,promptTemplates:x,classificationRules:ee,classificationRuleConsumer:t.classificationRuleConsumer??null,syncCounts:E.syncCounts.counts,totalFiles:E.syncCounts.total,failedSyncItems:k,circuitBreakerStatus:fe,pipelineStepMetrics:pr(B),pipelineStepMetricWindow:M,recentPipelineRuns:cr(re),displayTimeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,graphSchema:G,enrichmentStrategies:ye,strategyVariants:A,integrityAudit:te,canReadIntegrityFindings:ce,canUpdateKnowledge:pe,unresolvedEntities:me,qdrantCollections:p,systemHealth:q,recentIngestItems:ge,ontologyStatus:ne}}async function g(h){let{request:f}=h,v=await o(f);if(!v)return Response.json({error:"\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002"},{status:401});if(v.email.trim()==="")return Response.json({error:"\u64CD\u4F5C\u8005\u3092\u7279\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u8A2D\u5B9A\u3092\u5909\u66F4\u3067\u304D\u307E\u305B\u3093\u3002"},{status:403});if(v.accessToken==="")throw new Error("requireUser resolved an operator whose accessToken is an empty string; answer null when the session holds no token the upstream services accept");let y=v.email,M=v.accessToken===null?void 0:v.accessToken;try{await s(f,{resourceKey:r,action:"update"})}catch(C){if(C instanceof ot)return await Rr(f);throw C}let U=await a(f),T=await f.formData(),_=String(T.get("intent")??"");if(_==="refresh_health")return Response.json({success:!0,refreshed:!0});let E=await br(t,U,_,T,y);if(E)return E;let H=await Sr(t,U,_,T,y,M);if(H)return H;let $=await hr(t,U,_,T,M,()=>d(f));if($)return $;if(_==="resolve_entity"){let C=String(T.get("entityId")??""),I=String(T.get("action")??"");if(!C||I!=="merge"&&I!=="promote")return Response.json({error:"Valid entityId and action ('merge' | 'promote') are required"},{status:400});try{return await t.resolveEntity(U,C,I),Response.json({success:!0,entityId:C,action:I})}catch(x){return Response.json({error:x instanceof Error?x.message:String(x)},{status:400})}}let K=await wr(t,U,_,T,y,f,l,M);return K||Response.json({error:`Unknown intent: ${_}`},{status:400})}return{loader:m,action:g}}function Le(e){let t=String(e??"").trim();return t===""?null:t}function de(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isSafeInteger(n)||n<=0))return n}function fr(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isFinite(n)||n<=0))return n}async function br(e,t,n,r,o){if(n==="update_enrichment_strategy"){let s=String(r.get("stage")??"");if(!nr(s))return Response.json({error:"stage must be a canonical enrichment stage key"},{status:400});let a=de(r.get("strategyId")),l=de(r.get("domainId"));if(a==null||l===void 0||l===null)return Response.json({error:"strategyId and domainId must be positive integers naming existing rows"},{status:400});let d=String(r.get("enabled")??"")==="true";try{await e.updateEnrichmentStrategy(t,{strategyId:a,domainId:l,stage:s,enabled:d},o)}catch(c){return Response.json({error:c instanceof Error?c.message:"\u53D6\u308A\u8FBC\u307F\u6226\u7565\u3092\u66F4\u65B0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002"},{status:400})}return Response.json({success:!0,strategyId:a,domainId:l,stage:s,enabled:d})}if(n==="toggle_flag"){let s=String(r.get("flagKey")??""),a=String(r.get("enabled")??"")==="true";if(!s)return Response.json({error:"flagKey is required"},{status:400});let l=await e.getFeatureFlags(t);return Object.hasOwn(l,s)?(await e.toggleFeatureFlag(t,s,a,o),Response.json({success:!0,flagKey:s,enabled:a})):Response.json({error:`flagKey names no feature flag of this tenant: ${s}`},{status:400})}if(n==="update_confidentiality_policy"){let s=String(r.get("confidentialityLevel")??""),a=String(r.get("capability")??"");if(!(Fe.safeParse(s).success&&ar.safeParse(a).success))return Response.json({error:"confidentialityLevel and capability must be canonical values"},{status:400});let l=String(r.get("allowCloudProvider")??"")==="true";if(l&&!ir.includes(a))return Response.json({error:`${a} sends nothing outside the deployment, so it has no cloud permission to grant`},{status:400});let d=String(r.get("promptKey")??"");return await e.updateConfidentialityPolicy(t,{confidentialityLevel:s,capability:a,isEnabled:String(r.get("isEnabled")??"")==="true",allowCloudProvider:l,promptKey:d===""?null:d},o),Response.json({success:!0,confidentialityLevel:s,capability:a})}if(n==="save_transcription_term"){let s=String(r.get("term")??"").trim();if(!s)return Response.json({error:"term is required"},{status:400});let a=fr(r.get("boost"));if(a===void 0)return Response.json({error:"boost must be a number greater than zero, or absent to let the service decide"},{status:400});let l=de(r.get("id"));if(l===void 0)return Response.json({error:"id must be a positive integer naming an existing row, or absent for a new one"},{status:400});try{await e.saveTranscriptionTerm(t,{id:l,term:s,reading:Le(r.get("reading")),boost:a,domainKey:Le(r.get("domainKey")),isActive:String(r.get("isActive")??"true")==="true"},o)}catch(d){return Response.json({error:d instanceof Error?d.message:"\u8A9E\u5F59\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002"},{status:400})}return Response.json({success:!0,term:s})}if(n==="save_transcription_reference"){let s=String(r.get("fileUri")??"").trim();if(!s)return Response.json({error:"fileUri is required"},{status:400});let a=de(r.get("id"));if(a===void 0)return Response.json({error:"id must be a positive integer naming an existing row, or absent for a new one"},{status:400});try{await e.saveTranscriptionReference(t,{id:a,fileUri:s,domainKey:Le(r.get("domainKey")),isActive:String(r.get("isActive")??"true")==="true"},o)}catch(l){return Response.json({error:l instanceof Error?l.message:"\u53C2\u7167\u8CC7\u6599\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002"},{status:400})}return Response.json({success:!0,fileUri:s})}if(n==="update_parameter"){let s=String(r.get("paramKey")??""),a=String(r.get("paramValue")??"");if(!s)return Response.json({error:"paramKey is required"},{status:400});let l=(await e.getSystemParameters(t)).find(c=>c.key===s);if(l===void 0)return Response.json({error:`paramKey names no parameter of this tenant: ${s}`},{status:400});let d=dr(l.data_type,a);if(d!==null)return Response.json({error:d},{status:400});try{Wn(s,Number(a))}catch(c){return Response.json({error:c.message},{status:400})}return await e.updateSystemParameter(t,s,a,o),Response.json({success:!0,paramKey:s,paramValue:a})}if(n==="update_prompt"){let s=String(r.get("templateKey")??""),a=String(r.get("payload")??"{}"),l;try{l=JSON.parse(a)}catch{return Response.json({error:"Invalid JSON payload"},{status:400})}if(!s)return Response.json({error:"templateKey is required"},{status:400});let d=or.safeParse(l);if(!d.success)return Response.json({error:`payload does not carry a prompt template update: ${V(d.error,"payload")}`},{status:400});let c=d.data;try{return await e.updatePromptTemplate(t,s,c,o),Response.json({success:!0,templateKey:s})}catch(m){return Response.json({error:m instanceof Error?m.message:String(m)},{status:400})}}if(n==="reorder_rules"){let s=String(r.get("orderedRuleIds")??"[]"),a;try{a=JSON.parse(s)}catch{return Response.json({error:"Invalid orderedRuleIds JSON"},{status:400})}let l=yr(a);if(l!==null)return Response.json({error:l},{status:400});let d=a;return await e.reorderClassificationRules(t,d,o),Response.json({success:!0,orderedRuleIds:d})}return null}async function Sr(e,t,n,r,o,s){if(n==="retry_job"){let a=String(r.get("fileId")??"");if(!a)return Response.json({error:"fileId is required"},{status:400});try{return await e.retrySyncItem(t,a,o,s),Response.json({success:!0,fileId:a})}catch(l){return Response.json({error:l instanceof Error?l.message:String(l)},{status:400})}}if(n==="retry_all_failed")try{let{requeued:a,skipped:l}=await e.retryAllFailedSyncItems(t,o,s);return Response.json({success:!0,requeued:a,skipped:l})}catch(a){return Response.json({error:a instanceof Error?a.message:String(a)},{status:400})}return null}function X(e,t,n){let r=Xn.parse({command:e,code:t,status:n}),o=Yn.find(s=>s.code===r.code);return Response.json({failure:r},{status:o===void 0?502:o.status})}async function Rr(e){let t=await e.formData().catch(()=>null),n=t===null?null:dt(t.get("intent"));return n===null?Response.json({error:"\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002"},{status:403}):X(n,"FORBIDDEN",null)}async function ut(e,t){let n;try{n=er.parse(await t())}catch{return X(e,"UPSTREAM_FAILED",null)}return n.ok?Response.json({success:!0,runUid:n.runUid}):X(e,tr(e,n.status,n.errorCode),n.status)}async function hr(e,t,n,r,o,s){let a=dt(n);if(a==="start"){let l=lr.safeParse({mode:r.get("mode"),basisRunUid:r.get("basisRunUid")});if(!l.success)return Response.json({error:`start_integrity_run takes mode SCAN without basisRunUid, or mode REPAIR with basisRunUid (a UUID): ${V(l.error,"form")}`},{status:400});let{mode:d,basisRunUid:c}=l.data;return o===void 0||d==="REPAIR"&&!await s()?X(a,"FORBIDDEN",null):await ut(a,()=>e.startIntegrityRun(t,d,c,o))}if(a==="cancel"){let l=ur.safeParse({runUid:r.get("runUid")});return l.success?o===void 0?X(a,"FORBIDDEN",null):await ut(a,()=>e.cancelIntegrityRun(t,l.data.runUid,o)):Response.json({error:`cancel_integrity_run takes runUid (a UUID): ${V(l.error,"form")}`},{status:400})}return null}function vr(e){if(typeof e!="object"||e===null)return"payload must be an object";let t=e;if(typeof t.fileUri!="string"||t.fileUri.trim()==="")return"payload.fileUri is required";if(!Fe.safeParse(t.confidentialityLevel).success)return`payload.confidentialityLevel must be one of ${Fe.options.join(", ")}`;let r=t.departmentId;return r!=null&&(typeof r!="number"||!Number.isInteger(r))?"payload.departmentId must be an integer or null":null}function Ir(e){try{return Jn(e,ae),null}catch{return`inspectFileUri answered a fileSize that is not a byte count (a non-negative safe integer): ${String(e)}`}}async function wr(e,t,n,r,o,s,a,l){if(n==="ingest_document"){let d=String(r.get("payload")??"");if(!d)return Response.json({error:"payload is required"},{status:400});let c;try{c=JSON.parse(d)}catch{return Response.json({error:"Invalid JSON payload"},{status:400})}let m=vr(c);if(m)return Response.json({error:m},{status:400});let g=c,h=await a(s,g);if(h!==null)return Response.json({error:h},{status:403});try{let f=l===void 0?await e.ingestDocument(t,g,o):await e.ingestDocument(t,g,o,l);return Response.json({success:!0,result:f})}catch(f){return Response.json({error:f instanceof Error?f.message:String(f)},{status:400})}}if(n==="inspect_uri"){let d=String(r.get("fileUri")??"").trim();if(!d)return Response.json({error:"fileUri is required"},{status:400});if(!e.inspectFileUri)return Response.json({error:"inspectFileUri is not implemented"},{status:501});let c;try{c=l===void 0?await e.inspectFileUri(t,d):await e.inspectFileUri(t,d,l)}catch(g){return Response.json({error:g instanceof Error?g.message:String(g)},{status:400})}let m=Ir(c.fileSize);return m!==null?Response.json({error:m},{status:400}):Response.json({success:!0,inspection:c})}return null}function ss(e){let t=ct(e);return{loader:t.loader,action:t.action,View:nt,server:t}}export{nt as StorageAdminConsoleView,at as checkAllSystemHealth,zn as checkBackendApiHealth,Bn as checkNeo4jHealth,qn as checkQdrantHealth,Vn as checkRedisHealth,Qn as checkSqlServerHealth,ss as createStorageAdminApp,ct as createStorageAdminServer};
|
|
1
|
+
import{Card as dn,ConsoleUiRoot as pn,Notice as mn,ResourceFailed as gn,reasonAside as yn,useFocusRescue as fn}from"@aiquants/console-ui";import{DOCUMENT_KIND_LABELS as Rn,DocumentCaptureAnswerSchema as Sn,EnrichmentSyncStatusSchema as bn,GRAPH_INDEX_LIMITS as hn,IntegrityCellResyncResultSchema as vn,IntegrityRunModeSchema as In,PIPELINE_STEPS as wn,PipelineRunStatusSchema as An}from"@aiquants/enrichment-core";import{DocumentChangeFeed as Cn,DocumentHistoryInspector as Pn,DocumentIngestConsole as Nn,EnrichmentStrategyBoard as En,FinishedInstant as it,InfrastructureHealthMonitor as Tn,MetadataSearchWorkbench as _n,ModelComparisonWorkbench as kn,OntologyStatusCard as On,PIPELINE_RUN_STATUS_PRESENTATION as at,PIPELINE_TRIGGER_LABELS as xn,PipelineFlowViewer as Fn,pipelineRunPresentationKey as Dn,QdrantStorageCard as Ln,RESTRICTED_DOCUMENT_TEXT as jn,RecordedInstant as ot,SyncStatusMonitor as Un}from"@aiquants/enrichment-react";import{ClassificationRuleEditor as Hn,ConfidentialityPolicyBoard as $n,DocumentAuthorityRegistry as Mn,FeatureFlagBoard as Kn,GovernanceDryRunConsole as qn,integrityFailureNeedsOverviewReread as Vn,KnowledgeGraphExplorer as Bn,PolicyConflictQueue as Qn,PolicyConflictSummaryCard as Gn,PromptTemplateConsole as zn,SystemParameterTable as Wn,TranscriptionAdaptationBoard as Jn,TriStoreIntegrityAudit as Yn}from"@aiquants/governance-react";import{Fragment as Zn,useCallback as W,useEffect as Ke,useMemo as pe,useRef as _,useState as P}from"react";import{useFetcher as me,useLoaderData as Xn,useRevalidator as er,useSearchParams as tr}from"react-router";var ce="ja-JP";var Jt=/[^\s\x1c-\x1f\x85\ufeff]/;function de(e){return Jt.test(e)}function $(e,t){return new Promise(n=>n(e())).catch(n=>t(n instanceof Error?n.message:String(n)))}import{beginReload as Yt,keepLastGood as Zt}from"@aiquants/console-ui/core";import{isStrictlyEarlier as Xt}from"@aiquants/enrichment-core";import{useCallback as _e,useEffect as nt,useRef as Oe,useState as en,useSyncExternalStore as tn}from"react";var nn=2e3,rn=1e4;function ke(e,t){return t.ok&&e.kind==="ready"&&Xt(t.value.readAt,e.value.readAt)?e:Zt(e,t)}var sn=401;function an(e){return e.kind==="failed"||e.refreshFailure!==null&&e.refreshFailure.status===sn?null:e.value.active}function rt(e,t){let[n,r]=en(()=>({loaded:e,overview:ke({kind:"loading"},e)}));n.loaded!==e&&r({loaded:e,overview:ke(n.overview,e)});let a=Oe(t);a.current=t;let s=Oe(null);nt(()=>()=>s.current?.abort(),[]);let o=_e((d,p)=>$(p,y=>({ok:!1,status:null,reason:y})).then(y=>{d.aborted||r(h=>({loaded:h.loaded,overview:ke(h.overview,y)}))}),[]),l=_e(()=>{let d=new AbortController;s.current=d,r(p=>({loaded:p.loaded,overview:Yt(p.overview,"reload")})),o(d.signal,()=>a.current(d.signal))},[o]),c=_e(d=>o(d,()=>a.current(d)),[o]);return{overview:n.overview,reload:l,poll:c}}function on(e){return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)}function ln(){return document.visibilityState==="visible"}function un(){return!0}function st(e,t,n){let r=tn(on,ln,un),a=t&&r,s=Oe(a),o=e.kind==="ready",l=an(e),c=l===null?null:l.run.runUid,d=l===null?!1:l.isStale;nt(()=>{let p=a&&!s.current;if(s.current=a,!a||c===null&&!(p&&o))return;let y=new AbortController,h=d?rn:nn,v,S=async()=>{await n(y.signal),!y.signal.aborted&&c!==null&&(v=setTimeout(S,h))};return v=setTimeout(S,p?0:h),()=>{y.abort(),clearTimeout(v)}},[a,o,c,d,n])}var xe={columns:2,className:"grid-cols-2",spanClassNames:{1:"col-span-1",2:"col-span-2"}},Fe={columns:4,className:"@min-[41.5rem]:grid-cols-4",spanClassNames:{1:"@min-[41.5rem]:col-span-1",2:"@min-[41.5rem]:col-span-2",3:"@min-[41.5rem]:col-span-3",4:"@min-[41.5rem]:col-span-4"}},De={className:"@min-[82rem]:grid-flow-col @min-[82rem]:auto-cols-fr @min-[82rem]:grid-cols-none",lastTabClassName:"@min-[82rem]:col-auto"};function Le(e,t){let n=t%e.columns,r=n===0?1:e.columns-n+1;return e.spanClassNames[r]}import{jsx as u,jsxs as R}from"react/jsx-runtime";var lt="tab",He={key:"knowledge-authority",phrases:["\u6A29\u5A01\u53F0\u5E33 & \u898F\u7A0B\u885D\u7A81"]},$e={key:"pipeline",phrases:["\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3 & \u63A5\u7D9A\u72B6\u614B"]},Me={key:"parameters",phrases:["\u30E2\u30C7\u30EB & \u30D1\u30E9\u30E1\u30FC\u30BF\u8A2D\u5B9A"]},ut="\u30A8\u30F3\u30EA\u30C3\u30C1\u30E1\u30F3\u30C8\u540C\u671F\u30B9\u30C6\u30FC\u30BF\u30B9";function nr(e,t){let n=e.settled+1,r=t?.error;if(r!==void 0)return{...e,settled:n,status:"refused",nextAfter:null,error:r};let a=vn.safeParse(t?.cellResync);if(!a.success)return{...e,settled:n,status:"refused",nextAfter:null,error:"\u307E\u3068\u3081\u3066\u306E\u518D\u540C\u671F\u306E\u7B54\u3048\u306E\u5F62\u304C\u60F3\u5B9A\u3068\u7570\u306A\u308A\u307E\u3059\u3002\u958B\u767A\u62C5\u5F53\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044\u3002"};let{requeued:s,skipped:o,nextAfter:l}=a.data;return{settled:n,status:l===null?"done":"pending",requeued:e.requeued+s,skipped:[...e.skipped,...o],nextAfter:l,error:null}}var M=[{key:"search",phrases:["\u30E1\u30BF\u30C7\u30FC\u30BF\u691C\u7D22","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1"]},{key:"ingest",phrases:["\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8","\u53D6\u308A\u8FBC\u307F & \u30E1\u30BF\u751F\u6210"]},$e,{key:"knowledge-graph",phrases:["\u30CA\u30EC\u30C3\u30B8\u30B0\u30E9\u30D5","\u63A2\u7D22"]},Me,{key:"prompts",phrases:["\u30D7\u30ED\u30F3\u30D7\u30C8 & \u30C9\u30E9\u30A4\u30E9\u30F3"]},He,{key:"data-retention",phrases:["\u30C7\u30FC\u30BF\u4FDD\u6301 & \u6574\u5408\u6027\u76E3\u67FB"]}];function je(e){return e.phrases.join("")}function rr(e){return e!==null&&M.some(t=>t.key===e)}var sr="Tri-Store \u30C7\u30FC\u30BF\u6574\u5408\u6027\u76E3\u67FB";function ir(e){return`\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${yn(e)}\u3002`}var ar={kind:"latest_state"},pt=[];function or(e){for(let t of e.runs)if(t.kind==="readable")for(let n of t.item.steps){let r=n.provenance;if(r!==null){for(let[a,s]of Object.entries(r))if(typeof s=="string"&&!de(s))return`\u5B9F\u884C #${t.item.id} \u306E\u6BB5 ${n.sequence} \u306E\u5831\u544A\u306E ${a} \u306B\u8AAD\u3081\u308B\u6587\u5B57\u304C\u3042\u308A\u307E\u305B\u3093`}}return null}function te(e){return{ok:!1,status:null,reason:e}}function lr(e){return{loadHistory:async(t,n)=>{let r=await $(()=>e.loadHistory(t,n),te);if(!r.ok)return r;let a=or(r.value);return a===null?r:te(a)},compare:(t,n)=>$(()=>e.compare(t,n),te),readLines:(t,n)=>$(()=>e.readLines(t,n),te),loadChanges:(t,n)=>$(()=>e.loadChanges(t,n),te)}}function ur(e){let t=Sn.safeParse(e);if(t.success)return{ok:!0,value:t.data};let n=e?.captureFailure;if(n!==void 0)return{ok:!1,status:n.status,reason:n.reason};let r=e?.error;return r===void 0?{ok:!1,status:null,reason:"\u8A18\u9332\u306E\u7B54\u3048\u306E\u5F62\u304C\u60F3\u5B9A\u3068\u7570\u306A\u308A\u307E\u3059"}:{ok:!1,status:null,reason:r.endsWith("\u3002")?r.slice(0,-1):r}}var ge={state:"idle",formData:null,data:null,submit:()=>Promise.resolve()};function mt({data:e,fetcher:t,integrityFetcher:n,inspectorFetcher:r,captureFetcher:a,renderHeader:s,graphTraversal:o,onBrowseGraphNodes:l,onSimulateGovernance:c,onRefreshIngestQueue:d,onSearch:p,documentHistory:y,onCompareVariants:h,loadIntegrityOverview:v,loadIntegrityFindings:S,policyConflicts:k,documentAuthority:g}){let[j,E]=P(null),[w,A]=P(null),[O,q]=P(!1),V=pe(()=>{if(l!==void 0)return(i,m)=>{q(!0),$(()=>l(i,m),f=>({ok:!1,reason:f})).then(f=>{q(!1),A(f.ok?null:f.reason),f.ok&&E(f.page)})}},[l]),[B,Q]=tr(),T=B.get(lt),b=rr(T)?T:M[0].key,x=i=>{Q(m=>{let f=new URLSearchParams(m);return f.set(lt,i),f},{replace:!1,preventScrollReset:!0})},U=e.documentReadRefusal,se=U===null?e.recentIngestItems:pt,J=pr(se,d,b==="ingest"),F=rt(e.integrityAudit,v);st(F.overview,b==="data-retention",F.poll);let Y=_(null),ie=fn(()=>Y.current),[Se,be]=P(0),he=W(()=>be(i=>i+1),[]),ve=J.rows===null?se:J.rows,ae=U===null?J.refusal:U,G=_({}),Ie=W(()=>G.current[b]??null,[b]),oe=pe(()=>gr(e.enrichmentStrategies),[e.enrichmentStrategies]),we=pe(()=>e.strategyVariants.map(yr),[e.strategyVariants]),H=pe(()=>y===void 0?void 0:lr(y),[y]),[z,Ge]=P(null),[Pt,Nt]=P(0),Ae=W((i,m)=>{Ge({metadataId:i,target:m}),Nt(f=>f+1)},[]),Et=W(()=>Ge(null),[]),Tt=mr(a),ze=H===void 0?void 0:i=>Ae(i,ar),_t=H===void 0?void 0:i=>Ae(i.metadataId,{kind:"run",runId:i.id}),kt=(i,m)=>Ae(i,{kind:"state",stateId:m}),Ot=(i,m)=>{let f=M.length-1,C;if(i.key==="ArrowRight"||i.key==="ArrowDown")C=m===f?0:m+1;else if(i.key==="ArrowLeft"||i.key==="ArrowUp")C=m===0?f:m-1;else if(i.key==="Home")C=0;else if(i.key==="End")C=f;else return;i.preventDefault();let ue=M[C].key;x(ue),G.current[ue]?.focus()},We={...e.featureFlags};if(t.formData&&t.formData.get("intent")==="toggle_flag"){let i=String(t.formData.get("flagKey")??""),m=String(t.formData.get("enabled")??"")==="true";i&&(We[i]=m)}let xt=t.data&&"inspection"in t.data?t.data.inspection:void 0,Z=t.state==="idle"?null:t.formData?.get("intent"),Ft=Z==="inspect_uri",Dt=Z==="ingest_document",Lt=Z==="retry_job"||Z==="retry_all_failed",jt=Z==="resolve_entity",Je=n.state==="idle"?null:n.formData?.get("intent"),Ut=Je==="start_integrity_run"?{kind:"starting",mode:In.parse(n.formData?.get("mode"))}:Je==="cancel_integrity_run"?{kind:"cancelling"}:{kind:"idle"},Ht=er(),[$t,Ce]=P(null),Ye=b!=="data-retention";Ke(()=>{Ye&&Ce(null)},[Ye]);let Mt=i=>{let m=i?.failure;if(m===void 0){Ce(null);return}Ce(f=>({failure:m,occurrence:f===null?1:f.occurrence+1})),Vn(m)&&Ht.revalidate()},[X,Pe]=P(null),[le,Ne]=P(null),Kt=i=>{Pe({metadataId:i,intent:"retry_job",status:"pending",error:null}),r.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},qt=i=>{i.after===void 0&&Ne({settled:0,status:"pending",requeued:0,skipped:[],nextAfter:null,error:null});let{after:m,...f}=i;r.submit(m===void 0?{intent:"resync_findings",...f}:{intent:"resync_findings",...f,after:String(m)},{method:"post"})},Vt=()=>{Pe(null),Ne(null)},[Ze,Ee]=P("console"),[Bt,Qt]=P(void 0),Gt=(i,m)=>{if(m==="retry_job"&&X!==null&&X.status==="pending"){let f=i?.error;Pe(f===void 0?{...X,status:"accepted",error:null}:{...X,status:"refused",error:f});return}if(m==="resync_findings"&&le!==null&&le.status==="pending"){Ne(nr(le,i));return}Qt(i?.error),Ee("inspector")},{settledIntent:zt,submitAndAwait:Xe}=ye(t,()=>Ee("console"));ye(n,i=>{Ee("integrity"),Mt(i)}),ye(r,Gt);let et=Ze==="inspector"?Bt:(Ze==="console"?t:n).data?.error,Te=i=>{x(i),G.current[i]?.focus()},tt=_(null),Wt={strategies:{label:je($e),onOpen:()=>Te($e.key),closesInspector:!0},projectionPolicy:{label:je(Me),onOpen:()=>Te(Me.key),closesInspector:!0},failedSync:{label:ut,onOpen:()=>tt.current?.focus(),closesInspector:!1}},ee=zt==="retry_all_failed"&&t.data?.skipped!==void 0&&t.data.requeued!==void 0?{requeued:t.data.requeued,skipped:t.data.skipped}:null;return u(pn,{locale:"ja",formatLocale:ce,timeZone:e.displayTimeZone,testId:"storage-admin-console-ui",children:R("div",{className:"container mx-auto space-y-6 p-6 font-sans text-slate-900","data-testid":"storage-admin-console",children:[et&&u("div",{className:"rounded-lg border border-red-200 border-solid bg-red-50 p-4 font-medium text-red-700 text-sm shadow-sm",role:"alert","data-testid":"storage-admin-error-alert",children:et}),s?s({title:"\u30B9\u30C8\u30EC\u30FC\u30B8 AI \u30A8\u30F3\u30EA\u30C3\u30C1\u30E1\u30F3\u30C8 & \u30AC\u30D0\u30CA\u30F3\u30B9\u904B\u7528\u7BA1\u7406",tenantId:e.tenantId}):R("header",{className:"flex flex-col justify-between gap-2 border-slate-200 border-b border-solid pb-4 md:flex-row md:items-center",children:[R("div",{children:[u("h1",{className:"font-bold text-2xl tracking-tight",children:"\u30B9\u30C8\u30EC\u30FC\u30B8 AI \u30A8\u30F3\u30EA\u30C3\u30C1\u30E1\u30F3\u30C8 & \u30AC\u30D0\u30CA\u30F3\u30B9\u904B\u7528\u7BA1\u7406"}),R("p",{className:"mt-1 text-slate-500 text-sm",children:["\u30C6\u30CA\u30F3\u30C8: ",u("code",{className:"font-semibold text-slate-800",children:e.tenantId})," | \u5168\u30B7\u30B9\u30C6\u30E0\u72B6\u614B\u30FB\u30D1\u30E9\u30E1\u30FC\u30BF\u5236\u5FA1\u30FB\u6574\u5408\u6027\u76E3\u67FB"]})]}),u("div",{className:"flex items-center gap-2",children:R("button",{type:"button","data-testid":"header-health-status-button",onClick:()=>x("pipeline"),className:"inline-flex items-center gap-2 rounded-full border border-slate-200 border-solid bg-slate-50 px-3 py-1.5 font-medium text-slate-700 text-xs transition-colors hover:bg-slate-100",children:[u("span",{className:`h-2 w-2 rounded-full ${e.systemHealth.allHealthy?"bg-emerald-500":"bg-amber-500"}`}),R("span",{children:["\u5468\u8FBA\u6A5F\u80FD: ",e.systemHealth.allHealthy?"\u5168\u30B5\u30FC\u30D3\u30B9\u6B63\u5E38":"\u63A5\u7D9A\u8981\u78BA\u8A8D"]})]})})]}),R("div",{className:"w-full space-y-6",children:[u("div",{className:"@container w-full","data-testid":"storage-admin-tablist-frame",children:u("div",{className:`grid w-full ${xe.className} ${Fe.className} ${De.className} gap-1 rounded-xl bg-slate-100 p-1`,role:"tablist","aria-label":"\u904B\u7528\u7BA1\u7406\u30B3\u30F3\u30BD\u30FC\u30EB\u306E\u753B\u9762",children:M.map((i,m)=>{let f=b===i.key;return u("button",{id:`tab-${i.key}`,type:"button",role:"tab",ref:C=>{G.current[i.key]=C},"aria-selected":f,"aria-controls":`panel-${i.key}`,tabIndex:f?0:-1,"data-testid":`tab-trigger-${i.key}`,onKeyDown:C=>Ot(C,m),onClick:()=>x(i.key),className:`wrap-anywhere break-keep rounded-lg px-3 py-2.5 text-center font-medium text-sm transition-all ${m===M.length-1?`${Le(xe,M.length)} ${Le(Fe,M.length)} ${De.lastTabClassName}`:""} ${f?"bg-white text-slate-900 shadow-sm":"text-slate-600 hover:bg-slate-200/50 hover:text-slate-900"}`,children:i.phrases.map((C,ue)=>R(Zn,{children:[ue>0&&u("wbr",{}),C]},C))},i.key)})})}),H!==void 0&&z!==null&&u(Pn,{host:H,metadataId:z.metadataId,target:z.target,openRequest:Pt,onClose:Et,returnFocusFallback:Ie,captureState:Tt}),b==="search"&&R("div",{role:"tabpanel",id:"panel-search","aria-labelledby":"tab-search",className:"space-y-6","data-testid":"tab-content-search",children:[u(_n,{tenantId:e.tenantId,onSearch:p,circuitBreakerStatus:e.circuitBreakerStatus}),h!==void 0&&u(kn,{variants:we,onCompare:h})]}),b==="ingest"&&u("div",{role:"tabpanel",id:"panel-ingest","aria-labelledby":"tab-ingest",className:"space-y-6","data-testid":"tab-content-ingest",children:u(Nn,{tenantId:e.tenantId,policies:e.confidentialityPolicies,domainOptions:oe,recentItems:ve,listRefusal:ae===null?void 0:ae,inspectionResult:xt,isInspecting:Ft,isSubmitting:Dt,onInspectUri:i=>{t.submit({intent:"inspect_uri",fileUri:i},{method:"post"})},onIngestDocument:i=>{t.submit({intent:"ingest_document",payload:JSON.stringify(i)},{method:"post"})},onRetryItem:i=>{t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},onShowHistory:ze})}),b==="pipeline"&&R("div",{role:"tabpanel",id:"panel-pipeline","aria-labelledby":"tab-pipeline",className:"space-y-6","data-testid":"tab-content-pipeline",children:[u(Fn,{featureFlags:e.featureFlags,metrics:e.pipelineStepMetrics,metricSampleWindow:e.pipelineStepMetricWindow}),u(fr,{runs:e.recentPipelineRuns,refusal:U,onOpenRun:_t}),u(En,{strategies:e.enrichmentStrategies,featureFlags:e.featureFlags,isUpdating:t.state!=="idle",onToggleStage:(i,m,f)=>t.submit({intent:"update_enrichment_strategy",strategyId:String(i.id),domainId:String(i.domainId),stage:m,enabled:String(f)},{method:"post"})}),u(Tn,{health:e.systemHealth,isRefreshing:t.state!=="idle",onRefresh:()=>t.submit({intent:"refresh_health"},{method:"post"})})]}),b==="knowledge-graph"&&R("div",{role:"tabpanel",id:"panel-knowledge-graph","aria-labelledby":"tab-knowledge-graph",className:"space-y-6","data-testid":"tab-content-knowledge-graph",children:[u(On,{tenantId:e.tenantId,ontologyStatus:e.ontologyStatus}),u(Bn,{topologyMaxLabels:hn.topologyLabels.default,schema:e.graphSchema,tenantId:e.tenantId,unresolvedEntities:e.unresolvedEntities,traversal:o,onBrowseLabel:V,nodeIndexPage:j,nodeIndexFailure:w,isNodeIndexLoading:O,isResolving:jt,onResolveEntity:(i,m)=>{t.submit({intent:"resolve_entity",entityId:i,action:m},{method:"post"})}})]}),b==="parameters"&&R("div",{role:"tabpanel",id:"panel-parameters","aria-labelledby":"tab-parameters",className:"space-y-6","data-testid":"tab-content-parameters",children:[R("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-2",children:[u(Kn,{flags:We,isUpdating:t.state!=="idle",onToggleFlag:(i,m)=>{t.submit({intent:"toggle_flag",flagKey:i,enabled:String(m)},{method:"post"})}}),u(Hn,{rules:e.classificationRules,domainOptions:oe,consultedBy:e.classificationRuleConsumer,onReorderRules:i=>{t.submit({intent:"reorder_rules",orderedRuleIds:JSON.stringify(i)},{method:"post"})}})]}),e.policiesMissingDestination.length>0&&R("div",{"data-testid":"policies-missing-destination",role:"alert",style:{padding:"10px 12px",borderRadius:"6px",backgroundColor:"#fef2f2",color:"#b91c1c",fontSize:"12px"},children:[u("strong",{children:"\u6B21\u306E\u533A\u5206\u30FB\u6A5F\u80FD\u306F\u5B9F\u884C\u6642\u306B\u5931\u6557\u3057\u307E\u3059\u3002"})," \u53C2\u7167\u3059\u308B\u30D7\u30ED\u30F3\u30D7\u30C8\u884C\u306B\u5B9B\u5148\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002",u("ul",{style:{margin:"6px 0 0",paddingInlineStart:"18px"},children:e.policiesMissingDestination.map(i=>R("li",{"data-testid":`missing-destination-${i.confidentialityLevel}-${i.capability}`,children:[i.confidentialityLevel," / ",i.capability," \u2192 ",i.promptKey," (",i.modelProvider,") \u306E ",u("code",{children:"extra_params.base_url"})]},`${i.confidentialityLevel}:${i.capability}`))}),u("span",{style:{display:"block",marginTop:"4px",fontSize:"11px"},children:"\u5B9B\u5148\u3092\u8A2D\u5B9A\u3057\u3066\u3082\u3001\u305D\u306E\u30DB\u30B9\u30C8\u304C\u914D\u5099\u5185\u3068\u3057\u3066\u767B\u9332\u3055\u308C\u3066\u3044\u306A\u3051\u308C\u3070\u62D2\u5426\u3055\u308C\u307E\u3059\u3002"})]}),u($n,{policies:e.confidentialityPolicies,promptKeys:e.promptTemplates.map(i=>i.template_key),isUpdating:t.state!=="idle",onChangePolicy:i=>{t.submit({intent:"update_confidentiality_policy",confidentialityLevel:i.confidentialityLevel,capability:i.capability,isEnabled:String(i.isEnabled),allowCloudProvider:String(i.allowCloudProvider),promptKey:i.promptKey??""},{method:"post"})}}),u(Jn,{vocabulary:e.transcriptionVocabulary,references:e.transcriptionReferences,unresolvedUris:e.unresolvedReferenceUris,isUpdating:t.state!=="idle",onSaveTerm:i=>Xe({intent:"save_transcription_term",id:i.id===null?"":String(i.id),term:i.term,reading:i.reading??"",boost:i.boost===null?"":String(i.boost),domainKey:i.domainKey??"",isActive:String(i.isActive)},{method:"post"}),onSaveReference:i=>Xe({intent:"save_transcription_reference",id:i.id===null?"":String(i.id),fileUri:i.fileUri,domainKey:i.domainKey??"",isActive:String(i.isActive)},{method:"post"})}),u(Wn,{parameters:e.systemParameters,onSaveParameter:(i,m)=>{t.submit({intent:"update_parameter",paramKey:i,paramValue:String(m)},{method:"post"})}})]}),b==="prompts"&&R("div",{role:"tabpanel",id:"panel-prompts","aria-labelledby":"tab-prompts",className:"space-y-6","data-testid":"tab-content-prompts",children:[u(zn,{templates:e.promptTemplates,isSaving:t.state!=="idle",onSaveTemplate:i=>{t.submit({intent:"update_prompt",templateKey:i.template_key,payload:JSON.stringify({templateText:i.template_text,modelName:i.model_name,temperature:i.temperature,maxOutputTokens:i.max_output_tokens,responseSchema:i.response_schema,endpointBaseUrl:i.endpoint_base_url??null})},{method:"post"})}}),u(qn,{onSimulate:c})]}),b==="knowledge-authority"&&R("div",{role:"tabpanel",id:"panel-knowledge-authority","aria-labelledby":"tab-knowledge-authority",className:"space-y-6","data-testid":"tab-content-knowledge-authority",children:[u(Mn,{host:g,canUpdate:e.canUpdateKnowledge,onPolicyConflictsChanged:he}),u(Qn,{host:k,revision:Se})]}),b==="data-retention"&&R("div",{role:"tabpanel",id:"panel-data-retention","aria-labelledby":"tab-data-retention",className:"space-y-6","data-testid":"tab-content-data-retention",children:[F.overview.kind==="ready"?u("div",{ref:ie,children:u(Yn,{overview:F.overview.value,canReadFindings:e.canReadIntegrityFindings,command:Ut,commandFailure:$t,onStartRun:(i,m)=>{n.submit(m===null?{intent:"start_integrity_run",mode:i}:{intent:"start_integrity_run",mode:i,basisRunUid:m},{method:"post"})},onCancelRun:i=>{n.submit({intent:"cancel_integrity_run",runUid:i},{method:"post"})},loadFindings:S,refreshFailure:F.overview.refreshFailure===null?null:F.overview.refreshFailure.reason,headingRef:Y,onShowHistory:ze,resync:{onResync:Kt,onDismiss:Vt,feedback:X,sending:r.state!=="idle",cellResync:{onResyncCell:qt,feedback:le}},remedyDestinations:Wt})}):u(dn,{title:sr,testId:"audit-overview-failed",headingRef:Y,children:u(gn,{failure:F.overview,onReload:F.reload,forbiddenMessage:"\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u95B2\u89A7\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",failureMessage:ir,rescueRef:ie,testId:"audit-overview-failed-resource"})}),u(Gn,{host:k,knowledgeTabLabel:je(He),onOpenKnowledgeTab:()=>Te(He.key)}),H!==void 0&&u(Cn,{host:H,onOpen:kt}),ee!==null&&ee.skipped.length>0&&R("div",{role:"status","data-testid":"retry-all-skipped",className:"rounded-lg border border-amber-200 border-solid bg-amber-50 p-4 text-amber-800 text-sm",children:[R("strong",{children:["\u4E00\u62EC\u518D\u8A66\u884C: ",ee.requeued," \u4EF6\u3092\u518D\u6295\u5165\u3057\u3001",ee.skipped.length," \u4EF6\u3092\u636E\u3048\u7F6E\u304D\u307E\u3057\u305F\u3002"]})," ","\u636E\u3048\u7F6E\u3044\u305F\u884C\u306F\u5931\u6557\u306E\u307E\u307E\u6B8B\u3063\u3066\u3044\u307E\u3059\u3002",u("ul",{className:"mt-1.5 list-disc ps-5",children:ee.skipped.map(i=>R("li",{"data-testid":`retry-all-skipped-${i.metadataId}`,children:["#",i.metadataId,": ",i.reason]},i.metadataId))})]}),R("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-2",children:[u("section",{ref:tt,tabIndex:-1,"aria-label":ut,"data-testid":"sync-status-region",children:u(Un,{counts:e.syncCounts,totalFiles:e.totalFiles,failedItems:e.failedSyncItems,listRefusal:U===null?void 0:U,isRetrying:Lt,onRetryItem:i=>{t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},onRetryAll:()=>{t.submit({intent:"retry_all_failed"},{method:"post"})}})}),u(Ln,{overview:e.qdrantCollections,health:{healthy:e.systemHealth.services.qdrant.status==="connected",latency_ms:e.systemHealth.services.qdrant.latencyMs}})]})]})]})]})})}var ct=new Set(bn.options.filter(e=>e!=="SYNCED"&&!e.startsWith("FAILED"))),cr=new Set(An.options.filter(e=>e!=="SUCCEEDED"&&!e.startsWith("FAILED"))),dt=2e3;function dr(e){if(e.kind==="restricted")return e.syncStatus!==null&&ct.has(e.syncStatus);let t=e.item.lastRun;return ct.has(e.item.syncStatus)||t!==null&&t.kind==="restricted"&&cr.has(t.status)}var Ue={rows:null,refusal:null};function pr(e,t,n){let[r,a]=P(Ue),s=_(t);s.current=t;let o=_(e);o.current!==e&&(o.current=e,r!==Ue&&a(Ue));let c=(r.rows===null?e:r.rows)?.some(dr)===!0;return Ke(()=>{if(!(n&&c&&s.current))return;let d=!1,p,y=async()=>{let h=s.current;if(h!==void 0){try{let v=await h();if(d)return;a(v.kind==="rows"?{rows:v.rows,refusal:null}:{rows:pt,refusal:v.reason})}catch{if(d)return}p=setTimeout(y,dt)}};return p=setTimeout(y,dt),()=>{d=!0,clearTimeout(p)}},[c,n,e]),r}function mr(e){let t=_(e);t.current=e;let n=_(null);return ye(e,r=>{let a=n.current;n.current=null,a?.(ur(r))}),W(r=>new Promise(a=>{n.current?.({ok:!1,status:null,reason:"\u5F8C\u306E\u8A18\u9332\u306B\u7F6E\u304D\u63DB\u3048\u3089\u308C\u307E\u3057\u305F"}),n.current=a,t.current.submit({intent:"capture_document_state",metadataId:String(r)},{method:"post"})}),[])}function ye(e,t){let n=_(t);n.current=t;let r=_(null),a=_(!1),s=_(null);if(e.state!=="idle"){a.current=!0;let l=e.formData?.get("intent");typeof l=="string"&&(r.current=l)}Ke(()=>{if(e.state!=="idle"||!a.current)return;a.current=!1,n.current(e.data,r.current);let l=s.current;if(l===null)return;s.current=null;let c=e.data?.error;typeof c=="string"?l.reject(new Error(c)):l.resolve()},[e.state,e.data]);let o=W((...l)=>new Promise((c,d)=>{s.current?.reject(new Error("\u3053\u306E\u4FDD\u5B58\u306F\u5F8C\u7D9A\u306E\u9001\u4FE1\u306B\u7F6E\u304D\u63DB\u3048\u3089\u308C\u307E\u3057\u305F\u3002")),s.current={resolve:c,reject:d},e.submit(...l)}),[e]);return{settledIntent:e.state==="idle"?r.current:null,submitAndAwait:o}}function gr(e){let t=new Set,n=[];for(let r of e)t.has(r.domainKey)||(t.add(r.domainKey),n.push({key:r.domainKey,label:r.domainLabel}));return n}function yr(e){return{strategyId:e.strategyId,label:`${e.domainKey} / ${e.variantKey}`,embeddingModel:e.embeddingModel}}function fr({runs:e,refusal:t,onOpenRun:n}){return R("section",{className:"rounded-xl border border-slate-200 border-solid bg-white p-6 shadow-sm","aria-labelledby":"pipeline-recent-runs-heading","data-testid":"pipeline-recent-runs",children:[u("h2",{id:"pipeline-recent-runs-heading",className:"font-bold text-base text-slate-900",children:"\u76F4\u8FD1\u306E\u5B9F\u884C"}),t!==null?u("div",{className:"mt-4",children:u(mn,{tone:"warning",testId:"document-read-refusal-pipeline",children:t})}):e.length===0?u("p",{className:"mt-4 text-[13px] text-slate-500","data-testid":"pipeline-recent-runs-empty",children:"\u8A18\u9332\u3055\u308C\u305F\u5B9F\u884C\u304C\u3042\u308A\u307E\u305B\u3093\u3002"}):u("div",{className:"relative mt-4 overflow-x-auto","data-testid":"pipeline-recent-runs-scroll",children:R("table",{className:"w-full text-left text-[13px]",children:[u("thead",{children:R("tr",{className:"whitespace-nowrap border-slate-200 border-b border-solid text-[11px] text-slate-500 uppercase",children:[u("th",{scope:"col",className:"px-3 py-2",children:"\u5B9F\u884C"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u6587\u66F8"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u7A2E\u985E"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u304D\u3063\u304B\u3051"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u8A66\u884C"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u72B6\u614B"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u6B62\u307E\u3063\u305F\u6BB5"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u958B\u59CB"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u7D42\u4E86"}),u("th",{scope:"col",className:"px-3 py-2",children:"\u8981\u6C42\u8005"}),n!==void 0&&u("th",{scope:"col",className:"px-3 py-2",children:u("span",{className:"sr-only","data-testid":"pipeline-recent-runs-action-header",children:"\u64CD\u4F5C"})})]})}),u("tbody",{children:e.map((r,a)=>{if(r.kind==="restricted"){let c=at[r.status];return R("tr",{className:"border-slate-100 border-b border-solid","data-testid":`pipeline-run-mark-${a}`,"data-restricted-mark":"run","data-status":r.status,children:[u("td",{className:"px-3 py-2"}),u("td",{className:"px-3 py-2","data-testid":`pipeline-run-mark-document-${a}`,children:jn}),u("td",{className:"px-3 py-2"}),u("td",{className:"px-3 py-2"}),u("td",{className:"px-3 py-2"}),u("td",{className:"px-3 py-2",children:u("span",{className:`inline-flex whitespace-nowrap rounded-full px-2 py-0.5 font-semibold text-[11px] ${c.className}`,"data-testid":`pipeline-run-mark-status-${a}`,"data-status":r.status,children:c.label})}),u("td",{className:"px-3 py-2"}),u("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-mark-started-${a}`,children:u(ot,{iso:r.startedAt,testId:`pipeline-run-mark-started-value-${a}`})}),u("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-mark-finished-${a}`,children:u(it,{iso:r.finishedAt,testId:`pipeline-run-mark-finished-value-${a}`})}),u("td",{className:"px-3 py-2"}),n!==void 0&&u("td",{className:"px-3 py-2"})]},`restricted:${a}`)}let s=r.item,o=Dn(s),l=at[o];return R("tr",{className:"border-slate-100 border-b border-solid","data-testid":`pipeline-run-row-${s.id}`,"data-status":s.status,children:[R("td",{className:"whitespace-nowrap px-3 py-2 font-mono","data-testid":`pipeline-run-id-${s.id}`,children:["#",s.id]}),R("td",{className:"whitespace-nowrap px-3 py-2 font-mono","data-testid":`pipeline-run-metadata-${s.id}`,children:["#",s.metadataId]}),u("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-kind-${s.id}`,children:Rn[s.documentKind]}),u("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-trigger-${s.id}`,"data-trigger":s.trigger,children:xn[s.trigger]}),u("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-attempt-${s.id}`,children:s.attempt}),u("td",{className:"px-3 py-2",children:u("span",{className:`inline-flex whitespace-nowrap rounded-full px-2 py-0.5 font-semibold text-[11px] ${l.className}`,"data-testid":`pipeline-run-status-${s.id}`,"data-status":s.status,"data-presentation":o,children:l.label})}),u("td",{className:"px-3 py-2","data-testid":`pipeline-run-failed-step-${s.id}`,children:s.failedStepKey===null?"\u2014":wn[s.failedStepKey].label}),u("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-started-${s.id}`,children:u(ot,{iso:s.startedAt,testId:`pipeline-run-started-value-${s.id}`})}),u("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-finished-${s.id}`,children:u(it,{iso:s.finishedAt,testId:`pipeline-run-finished-value-${s.id}`})}),u("td",{className:"wrap-anywhere px-3 py-2","data-testid":`pipeline-run-requested-by-${s.id}`,children:s.requestedBy}),n!==void 0&&u("td",{className:"whitespace-nowrap px-3 py-2 text-right",children:u("button",{type:"button",onClick:()=>n(s),"aria-label":`\u5B9F\u884C #${s.id} (\u6587\u66F8 #${s.metadataId}) \u306E\u8A73\u7D30`,className:"whitespace-nowrap rounded-sm border border-slate-300 border-solid bg-white px-2 py-0.5 font-semibold text-[11px] text-slate-700 hover:bg-slate-50","data-testid":`pipeline-run-open-${s.id}`,children:"\u8A73\u7D30"})})]},`readable:${s.id}`)})})]})})]})}function Rr(e){let t=Xn(),n=me(),r=me(),a=me(),s=me(),o=e.data??t,l=e.fetcher??n,c=e.integrityFetcher??r,d=e.inspectorFetcher??a,p=e.captureFetcher??s;return o?u(mt,{...e,data:o,fetcher:l,integrityFetcher:c,inspectorFetcher:d,captureFetcher:p}):u("div",{className:"p-8 text-center text-slate-500","data-testid":"storage-admin-loading",children:"\u30C7\u30FC\u30BF\u8AAD\u307F\u8FBC\u307F\u4E2D..."})}function gt(e){return e.data?u(mt,{...e,data:e.data,fetcher:e.fetcher??ge,integrityFetcher:e.integrityFetcher??ge,inspectorFetcher:e.inspectorFetcher??ge,captureFetcher:e.captureFetcher??ge}):u(Rr,{...e})}import{AuthzDeniedError as bt}from"@aiquants/authz-core";import{formatCount as Cr}from"@aiquants/console-ui/core";import{assertSystemParameterInRange as Pr,INTEGRITY_COMMAND_CODES as Nr,IntegrityAuditOverviewSchema as Er,IntegrityCellResyncRequestSchema as Tr,IntegrityCellResyncResultSchema as _r,IntegrityCommandFailureSchema as kr,IntegrityCommandReplySchema as Or,IntegrityRunModeSchema as ht,integrityCommandFailureCodeOf as xr,isEnrichmentStageKey as Fr,PipelineStepMetricSchema as Dr,RecentPipelineRunEntrySchema as Lr}from"@aiquants/enrichment-core";import{CLOUD_CAPABLE_CAPABILITIES as jr,ConfidentialityLevelSchema as Qe,GovernedCapabilitySchema as Ur}from"@aiquants/governance-core";import{z as I}from"zod";var Ve=3e3;function L(e){return Math.round(performance.now()-e)}function N(e){return typeof e=="string"&&de(e)?e:null}function D(e){let t=globalThis.process;return t===void 0?void 0:t.env[e]}function fe(e,t){let n=e?.trim();if(!n)throw new Error(`${t} is not configured; this probe will not guess an endpoint to send credentials to.`);return n}function yt(e,t,n){let r=e??(t?.trim()?Number(t):Number.NaN);if(!Number.isInteger(r)||r<=0||r>65535)throw new Error(`${n} is not configured with a valid port; this probe will not guess one.`);return r}function ft(e,t){if(e!==void 0)return e;let n=t?.trim().toLowerCase();if(!(n===void 0||n===""))return n==="1"||n==="true"||n==="yes"||n==="on"}function Rt(e){let t=e.trim().split("://",1)[0]?.toLowerCase();if(t&&e.includes("://"))return t.endsWith("s")||t.includes("+s")}function Sr(e){let n=e.split("://").slice(-1)[0].split("/",1)[0],r=n.split(":").pop();if(!r||r===n)return;let a=Number(r);return Number.isInteger(a)&&a>0&&a<=65535?a:void 0}async function qe(e,t){let n;try{return await Promise.race([e,new Promise((r,a)=>{n=setTimeout(()=>a(new Error(`Probe timed out after ${t}ms`)),t)})])}finally{clearTimeout(n)}}async function br(e){let t=e?.qdrantApiKey??D("QDRANT_API_KEY")??"",n=e?.timeoutMs??Ve,r=performance.now(),a="";try{a=fe(e?.qdrantUrl??D("QDRANT_URL"),"QDRANT_URL");let s={};t&&(s["api-key"]=t);let[o,l]=await Promise.all([fetch(`${a}/`,{headers:s,signal:AbortSignal.timeout(n)}),fetch(`${a}/collections`,{headers:s,signal:AbortSignal.timeout(n)})]);if(!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);if(!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText} (/collections)`);let c=await o.json(),d=L(r),y=(await l.json()).result?.collections?.length??0;return{serviceName:"Qdrant",category:"vector",status:"connected",version:N(c.version),endpoint:a,latencyMs:d,details:{engine:N(c.title),collectionsCount:y,restPort:Sr(a)??null,tls:Rt(a)??null}}}catch(s){let o=L(r),l=s instanceof Error?s.message:String(s);return{serviceName:"Qdrant",category:"vector",status:"error",version:null,endpoint:a,latencyMs:o,details:{},errorMessage:l}}}async function hr(e){let t=e?.timeoutMs??Ve,n=performance.now(),r=N(e?.neo4jBoltUri??D("NEO4J_URI")),a=r===null?"":r;try{let s=e?.graphReader;if(!s)throw new Error("Graph reader not configured");let o=e?.tenantId,[l,c]=await Promise.all([qe(s("CALL dbms.components() YIELD versions, edition RETURN versions[0] AS version, edition",{}),t),qe(o?s("MATCH (n {tenantId: $tenantId}) RETURN count(n) AS node_count",{tenantId:o}):s("RETURN null AS node_count",{}),t)]);if(!l.ok)throw new Error(l.reason);if(!c.ok)throw new Error(c.reason);let[d,p]=l.rows[0]??[],y=c.rows[0]?.[0],h=L(n);return{serviceName:"Neo4j",category:"graph",status:"connected",version:N(d),endpoint:a,latencyMs:h,details:{edition:N(p),boltUri:r,nodeCount:typeof y=="number"?y:null,tls:r===null?null:Rt(r)??null}}}catch(s){let o=L(n),l=s instanceof Error?s.message:String(s);return{serviceName:"Neo4j",category:"graph",status:"error",version:null,endpoint:a,latencyMs:o,details:{},errorMessage:l}}}async function vr(e){let t=performance.now(),n="",r=ft(e?.redisTls,D("REDIS_TLS")),a=Number.NaN;try{let s=e?.redisClient;if(!s)throw new Error("Redis client not configured");let o=fe(e?.redisHost??D("REDIS_HOST"),"REDIS_HOST");a=yt(e?.redisPort,D("REDIS_PORT"),"REDIS_PORT"),n=`${r===!1?"redis":"rediss"}://${o}:${a}`,await s.ping();let l=await s.info("server"),c=N(l.match(/redis_version:([^\r\n]+)/)?.[1]),d=null;if(typeof s.dbSize=="function")try{d=await s.dbSize()}catch{d=null}let p=L(t);return{serviceName:"Redis",category:"cache",status:"connected",version:c,endpoint:n,latencyMs:p,details:{totalKeys:d,port:a,tls:r??null,database:0}}}catch(s){let o=L(t),l=s instanceof Error?s.message:String(s);return{serviceName:"Redis",category:"cache",status:"error",version:null,endpoint:n,latencyMs:o,details:{},errorMessage:l}}}function Ir(e){let t=e.match(/Microsoft SQL Server \d+ \([^)]+\)/);return N(t===null?e.substring(0,30):t[0].replace("Microsoft SQL Server ",""))}async function wr(e){let t=performance.now(),n="",r=ft(e?.sqlServerTls,D("SQL_SERVER_TLS")),a=Number.NaN;try{let s=e?.sqlServerExecute;if(!s)throw new Error("SQL Server executor not configured");let o=fe(e?.sqlServerHost??D("SQL_SERVER_HOST"),"SQL_SERVER_HOST");a=yt(e?.sqlServerPort,D("SQL_SERVER_PORT"),"SQL_SERVER_PORT"),n=`${o}:${a}`;let l=await s(),c=N(l.db_name),d=N(l.version),p=d===null?null:N(d.split(`
|
|
2
|
+
`)[0]),y=p===null?null:Ir(p),h=L(t);return{serviceName:"SQL Server",category:"database",status:"connected",version:y,endpoint:n,latencyMs:h,details:{database:c,port:a,tls:r??null,fullVersion:p}}}catch(s){let o=L(t),l=s instanceof Error?s.message:String(s);return{serviceName:"SQL Server",category:"database",status:"error",version:null,endpoint:n,latencyMs:o,details:{},errorMessage:l}}}async function Ar(e){let t=e?.timeoutMs??Ve,n=performance.now(),r="";try{r=fe(e?.backendApiHost??D("BACKEND_API_HOST"),"BACKEND_API_HOST");let a=await fetch(`${r}/openapi.json`,{signal:AbortSignal.timeout(t)});if(!a.ok)throw new Error(`HTTP ${a.status}: ${a.statusText}`);let s=await a.json(),o=Object.keys(s.paths??{}).length,l=L(n);return{serviceName:"AI Quant API",category:"api",status:"connected",version:N(s.info?.version),endpoint:r,latencyMs:l,details:{title:N(s.info?.title),endpointsCount:o}}}catch(a){let s=L(n),o=a instanceof Error?a.message:String(a);return{serviceName:"AI Quant API",category:"api",status:"error",version:null,endpoint:r,latencyMs:s,details:{},errorMessage:o}}}async function St(e){let[t,n,r,a,s]=await Promise.all([br(e),hr(e),vr(e),wr(e),Ar(e)]),o=t.status==="connected"&&n.status==="connected"&&r.status==="connected"&&a.status==="connected"&&s.status==="connected";return{services:{qdrant:t,neo4j:n,redis:r,sqlServer:a,quantsApi:s},allHealthy:o,checkedAt:new Date().toISOString()}}var Hr=I.object({templateText:I.string(),modelName:I.string(),temperature:I.number(),maxOutputTokens:I.number(),responseSchema:I.union([I.record(I.string(),I.unknown()),I.string(),I.null()]).optional(),endpointBaseUrl:I.string().nullable()}).strict(),$r=I.discriminatedUnion("mode",[I.object({mode:ht.extract(["SCAN"]),basisRunUid:I.null()}).strict(),I.object({mode:ht.extract(["REPAIR"]),basisRunUid:I.string().uuid()}).strict()]),Mr=I.object({runUid:I.string().uuid()}).strict();function It(e){return e==="start_integrity_run"?"start":e==="cancel_integrity_run"?"cancel":null}function K(e,t){return e.issues.map(n=>`${n.path.length===0?t:n.path.join(".")}: ${n.message}`).join("; ")}function Kr(e,t){if(e==="bool")return t==="true"||t==="false"?null:"paramValue must be 'true' or 'false' for a bool parameter";if(e==="int")return/^[+-]?\d+$/.test(t)&&Number.isSafeInteger(Number(t))?null:"paramValue must be a safe integer for an int parameter";if(e==="float")return t.trim()!==""&&Number.isFinite(Number(t))?null:"paramValue must be a finite number for a float parameter";if(e==="json")try{return JSON.parse(t),null}catch{return"paramValue must be valid JSON for a json parameter"}return null}function qr(e){let t=Lr.array().safeParse(e);if(!t.success)throw new Error(`getRecentPipelineRuns answered something that is neither a readable run summary nor a restricted run mark: ${K(t.error,"getRecentPipelineRuns")}`);return t.data}function Vr(e){let t=Dr.array().safeParse(e);if(!t.success)throw new Error(`getPipelineStepMetrics answered something that is not a step metric: ${K(t.error,"getPipelineStepMetrics")}`);let n=new Set;for(let r of t.data){let a=`${r.documentKind}/${r.stepKey}`;if(n.has(a))throw new Error(`getPipelineStepMetrics answered more than one metric for (documentKind, stepKey) = (${r.documentKind}, ${r.stepKey})`);n.add(a)}return t.data}function Br(e){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`pipelineStepMetricWindow must be a positive safe integer, got ${String(e)}`);return e}async function Qr(e,t){let n;try{n=await e.readIntegrityAuditOverview(t)}catch(a){return{ok:!1,status:null,reason:a instanceof Error?a.message:String(a)}}let r=Er.safeParse(n);return r.success?{ok:!0,value:r.data}:{ok:!1,status:null,reason:`readIntegrityAuditOverview answered something that is not an audit overview: ${K(r.error,"readIntegrityAuditOverview")}`}}function Gr(e){return!Array.isArray(e)||e.length===0?"orderedRuleIds must be a non-empty array of rule ids":e.every(t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>0)?new Set(e).size!==e.length?"orderedRuleIds must not name a rule twice":null:"orderedRuleIds must contain positive integers only"}function wt(e){let{store:t,healthProbeOptions:n,resourceKey:r="storage_admin",requireUser:a,requirePermission:s,resolveTenantId:o,authorizeIngest:l,authorizeHistoryCapture:c,canReadIntegrityFindings:d,canUpdateKnowledge:p}=e;async function y(v){let{request:S}=v;if(!await a(S))throw new Response("\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002",{status:401});try{await s(S,{resourceKey:r,action:"read"})}catch(z){throw z instanceof bt?new Response("\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",{status:403}):z}let g=await o(S),j=Br(t.pipelineStepMetricWindow),[E,w,A]=await Promise.all([t.getFeatureFlags(g),t.getSystemParameters(g),t.getSyncCounts(g)]),O={featureFlags:E,systemParameters:w,syncCounts:A},[q,V,B,Q,T,b,x,U,se,J,F,Y,ie,Se,be,he,ve,ae,G,Ie,oe,we]=await Promise.all([t.getConfidentialityPolicies(g),t.getTranscriptionVocabulary(g),t.getTranscriptionReferences(g),t.getUnresolvedReferenceUris(g),t.getPoliciesMissingDestination(g),t.getPromptTemplates(g),t.getClassificationRules(g),t.getFailedSyncItems(g,S),t.getGraphSchema(g),Qr(t,g),d(S),p(S),t.getUnresolvedEntities(g),t.getQdrantCollections(g),St({...n,tenantId:g}),t.getRecentIngestItems(g,S),t.getOntologyStatus(g,O),t.getEnrichmentStrategies(g),t.getStrategyVariants(g),t.getPipelineStepMetrics(g),t.getRecentPipelineRuns(g,S),t.getDocumentReadRefusal(g,S)]),H=t.getCircuitBreakerStatus();return{tenantId:g,featureFlags:O.featureFlags,confidentialityPolicies:q,transcriptionVocabulary:V,transcriptionReferences:B,unresolvedReferenceUris:Q,policiesMissingDestination:T,systemParameters:O.systemParameters,promptTemplates:b,classificationRules:x,classificationRuleConsumer:t.classificationRuleConsumer??null,syncCounts:O.syncCounts.counts,totalFiles:O.syncCounts.total,failedSyncItems:U,circuitBreakerStatus:H,pipelineStepMetrics:Vr(Ie),pipelineStepMetricWindow:j,recentPipelineRuns:qr(oe),displayTimeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,graphSchema:se,enrichmentStrategies:ae,strategyVariants:G,integrityAudit:J,canReadIntegrityFindings:F,canUpdateKnowledge:Y,unresolvedEntities:ie,qdrantCollections:Se,systemHealth:be,recentIngestItems:he,documentReadRefusal:we,ontologyStatus:ve}}async function h(v){let{request:S}=v,k=await a(S);if(!k)return Response.json({error:"\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002"},{status:401});if(k.email.trim()==="")return Response.json({error:"\u64CD\u4F5C\u8005\u3092\u7279\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u8A2D\u5B9A\u3092\u5909\u66F4\u3067\u304D\u307E\u305B\u3093\u3002"},{status:403});if(k.accessToken==="")throw new Error("requireUser resolved an operator whose accessToken is an empty string; answer null when the session holds no token the upstream services accept");let g=k.email,j=k.accessToken===null?void 0:k.accessToken;try{await s(S,{resourceKey:r,action:"update"})}catch(T){if(T instanceof bt)return await ts(S);throw T}let E=await o(S),w=await S.formData(),A=String(w.get("intent")??"");if(A==="refresh_health")return Response.json({success:!0,refreshed:!0});let O=await Wr(t,E,A,w,g);if(O)return O;let q=await Jr(t,E,A,w,g,j);if(q)return q;let V=await es(t,E,A,w,g,j,()=>d(S));if(V)return V;let B=await rs(t,E,A,w,j,()=>d(S));if(B)return B;if(A==="resolve_entity"){let T=String(w.get("entityId")??""),b=String(w.get("action")??"");if(!T||b!=="merge"&&b!=="promote")return Response.json({error:"Valid entityId and action ('merge' | 'promote') are required"},{status:400});try{return await t.resolveEntity(E,T,b),Response.json({success:!0,entityId:T,action:b})}catch(x){return Response.json({error:x instanceof Error?x.message:String(x)},{status:400})}}let Q=await as(t,E,A,w,g,S,l,j);return Q||(A===Ct?await ns(t,E,w,g,S,c):Response.json({error:`Unknown intent: ${A}`},{status:400}))}return{loader:y,action:h}}function Be(e){let t=String(e??"").trim();return t===""?null:t}function Re(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isSafeInteger(n)||n<=0))return n}function zr(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isFinite(n)||n<=0))return n}async function Wr(e,t,n,r,a){if(n==="update_enrichment_strategy"){let s=String(r.get("stage")??"");if(!Fr(s))return Response.json({error:"stage must be a canonical enrichment stage key"},{status:400});let o=Re(r.get("strategyId")),l=Re(r.get("domainId"));if(o==null||l===void 0||l===null)return Response.json({error:"strategyId and domainId must be positive integers naming existing rows"},{status:400});let c=String(r.get("enabled")??"")==="true";try{await e.updateEnrichmentStrategy(t,{strategyId:o,domainId:l,stage:s,enabled:c},a)}catch(d){return Response.json({error:d instanceof Error?d.message:"\u53D6\u308A\u8FBC\u307F\u6226\u7565\u3092\u66F4\u65B0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002"},{status:400})}return Response.json({success:!0,strategyId:o,domainId:l,stage:s,enabled:c})}if(n==="toggle_flag"){let s=String(r.get("flagKey")??""),o=String(r.get("enabled")??"")==="true";if(!s)return Response.json({error:"flagKey is required"},{status:400});let l=await e.getFeatureFlags(t);return Object.hasOwn(l,s)?(await e.toggleFeatureFlag(t,s,o,a),Response.json({success:!0,flagKey:s,enabled:o})):Response.json({error:`flagKey names no feature flag of this tenant: ${s}`},{status:400})}if(n==="update_confidentiality_policy"){let s=String(r.get("confidentialityLevel")??""),o=String(r.get("capability")??"");if(!(Qe.safeParse(s).success&&Ur.safeParse(o).success))return Response.json({error:"confidentialityLevel and capability must be canonical values"},{status:400});let l=String(r.get("allowCloudProvider")??"")==="true";if(l&&!jr.includes(o))return Response.json({error:`${o} sends nothing outside the deployment, so it has no cloud permission to grant`},{status:400});let c=String(r.get("promptKey")??"");return await e.updateConfidentialityPolicy(t,{confidentialityLevel:s,capability:o,isEnabled:String(r.get("isEnabled")??"")==="true",allowCloudProvider:l,promptKey:c===""?null:c},a),Response.json({success:!0,confidentialityLevel:s,capability:o})}if(n==="save_transcription_term"){let s=String(r.get("term")??"").trim();if(!s)return Response.json({error:"term is required"},{status:400});let o=zr(r.get("boost"));if(o===void 0)return Response.json({error:"boost must be a number greater than zero, or absent to let the service decide"},{status:400});let l=Re(r.get("id"));if(l===void 0)return Response.json({error:"id must be a positive integer naming an existing row, or absent for a new one"},{status:400});try{await e.saveTranscriptionTerm(t,{id:l,term:s,reading:Be(r.get("reading")),boost:o,domainKey:Be(r.get("domainKey")),isActive:String(r.get("isActive")??"true")==="true"},a)}catch(c){return Response.json({error:c instanceof Error?c.message:"\u8A9E\u5F59\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002"},{status:400})}return Response.json({success:!0,term:s})}if(n==="save_transcription_reference"){let s=String(r.get("fileUri")??"").trim();if(!s)return Response.json({error:"fileUri is required"},{status:400});let o=Re(r.get("id"));if(o===void 0)return Response.json({error:"id must be a positive integer naming an existing row, or absent for a new one"},{status:400});try{await e.saveTranscriptionReference(t,{id:o,fileUri:s,domainKey:Be(r.get("domainKey")),isActive:String(r.get("isActive")??"true")==="true"},a)}catch(l){return Response.json({error:l instanceof Error?l.message:"\u53C2\u7167\u8CC7\u6599\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002"},{status:400})}return Response.json({success:!0,fileUri:s})}if(n==="update_parameter"){let s=String(r.get("paramKey")??""),o=String(r.get("paramValue")??"");if(!s)return Response.json({error:"paramKey is required"},{status:400});let l=(await e.getSystemParameters(t)).find(d=>d.key===s);if(l===void 0)return Response.json({error:`paramKey names no parameter of this tenant: ${s}`},{status:400});let c=Kr(l.data_type,o);if(c!==null)return Response.json({error:c},{status:400});try{Pr(s,Number(o))}catch(d){return Response.json({error:d.message},{status:400})}return await e.updateSystemParameter(t,s,o,a),Response.json({success:!0,paramKey:s,paramValue:o})}if(n==="update_prompt"){let s=String(r.get("templateKey")??""),o=String(r.get("payload")??"{}"),l;try{l=JSON.parse(o)}catch{return Response.json({error:"Invalid JSON payload"},{status:400})}if(!s)return Response.json({error:"templateKey is required"},{status:400});let c=Hr.safeParse(l);if(!c.success)return Response.json({error:`payload does not carry a prompt template update: ${K(c.error,"payload")}`},{status:400});let d=c.data;try{return await e.updatePromptTemplate(t,s,d,a),Response.json({success:!0,templateKey:s})}catch(p){return Response.json({error:p instanceof Error?p.message:String(p)},{status:400})}}if(n==="reorder_rules"){let s=String(r.get("orderedRuleIds")??"[]"),o;try{o=JSON.parse(s)}catch{return Response.json({error:"Invalid orderedRuleIds JSON"},{status:400})}let l=Gr(o);if(l!==null)return Response.json({error:l},{status:400});let c=o;return await e.reorderClassificationRules(t,c,a),Response.json({success:!0,orderedRuleIds:c})}return null}async function Jr(e,t,n,r,a,s){if(n==="retry_job"){let o=String(r.get("fileId")??"");if(!o)return Response.json({error:"fileId is required"},{status:400});try{return await e.retrySyncItem(t,o,a,s),Response.json({success:!0,fileId:o})}catch(l){return Response.json({error:l instanceof Error?l.message:String(l)},{status:400})}}if(n==="retry_all_failed")try{let{requeued:o,skipped:l}=await e.retryAllFailedSyncItems(t,a,s);return Response.json({success:!0,requeued:o,skipped:l})}catch(o){return Response.json({error:o instanceof Error?o.message:String(o)},{status:400})}return null}var Yr="resync_findings",Zr="\u307E\u3068\u3081\u3066\u306E\u518D\u540C\u671F\u306F\u3001\u5168\u3066\u306E\u6587\u66F8\u3092\u95B2\u89A7\u3067\u304D\u308B\u64CD\u4F5C\u8005 (\u30D5\u30A1\u30A4\u30EB\u306E\u95B2\u89A7\u306E\u6A29\u9650\u306B\u884C\u3068\u5217\u306E\u30B9\u30B3\u30FC\u30D7\u304C\u7121\u3044\u64CD\u4F5C\u8005) \u3060\u3051\u304C\u5B9F\u884C\u3067\u304D\u307E\u3059\u3002",At=/^[1-9][0-9]*$/;function Xr(e){return Object.fromEntries([...e.entries()].filter(([t])=>t!=="intent").map(([t,n])=>[t,t==="after"&&typeof n=="string"&&At.test(n)?Number(n):n]))}async function es(e,t,n,r,a,s,o){if(n!==Yr)return null;if(!await o())return Response.json({error:Zr},{status:403});let l=Tr.safeParse(Xr(r));if(!l.success)return Response.json({error:`resync_findings takes runUid (a UUID), store, scopeKey, itemClass UNRECORDED and an optional after (a positive integer): ${K(l.error,"form")}`},{status:400});let c;try{c=await e.resyncIntegrityCell(t,l.data,a,s)}catch(p){return Response.json({error:p instanceof Error?p.message:String(p)},{status:400})}let d=_r.safeParse(c);return d.success?Response.json({success:!0,cellResync:d.data}):Response.json({error:`\u307E\u3068\u3081\u3066\u306E\u518D\u540C\u671F\u306E\u7B54\u3048\u304C\u5951\u7D04\u3068\u7570\u306A\u308A\u307E\u3059 (${K(d.error,"answer")})\u3002\u958B\u767A\u62C5\u5F53\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044\u3002`},{status:502})}function re(e,t,n){let r=kr.parse({command:e,code:t,status:n}),a=Nr.find(s=>s.code===r.code);return Response.json({failure:r},{status:a===void 0?502:a.status})}async function ts(e){let t=await e.formData().catch(()=>null),n=t===null?null:t.get("intent");if(n===Ct)return ne({status:403,reason:""});let r=It(n);return r===null?Response.json({error:"\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002"},{status:403}):re(r,"FORBIDDEN",null)}var Ct="capture_document_state";function ne(e){return Response.json({captureFailure:e},{status:e.status})}async function ns(e,t,n,r,a,s){let o=n.get("metadataId"),l=typeof o=="string"&&At.test(o)?Number(o):null;if(l===null||!Number.isSafeInteger(l))return Response.json({error:"capture_document_state takes metadataId (a positive integer)"},{status:400});let c=await s(a,l);if(c!==null)return ne({status:c.status,reason:c.error});let d;try{d=await e.captureDocumentState(t,l,r)}catch{return ne({status:500,reason:""})}switch(d.kind){case"recorded":return Response.json({outcome:"RECORDED"});case"unchanged":return Response.json({outcome:"UNCHANGED"});case"failed":return ne({status:d.status,reason:d.error});default:return ne({status:500,reason:""})}}async function vt(e,t){let n;try{n=Or.parse(await t())}catch{return re(e,"UPSTREAM_FAILED",null)}return n.ok?Response.json({success:!0,runUid:n.runUid}):re(e,xr(e,n.status,n.errorCode),n.status)}async function rs(e,t,n,r,a,s){let o=It(n);if(o==="start"){let l=$r.safeParse({mode:r.get("mode"),basisRunUid:r.get("basisRunUid")});if(!l.success)return Response.json({error:`start_integrity_run takes mode SCAN without basisRunUid, or mode REPAIR with basisRunUid (a UUID): ${K(l.error,"form")}`},{status:400});let{mode:c,basisRunUid:d}=l.data;return a===void 0||c==="REPAIR"&&!await s()?re(o,"FORBIDDEN",null):await vt(o,()=>e.startIntegrityRun(t,c,d,a))}if(o==="cancel"){let l=Mr.safeParse({runUid:r.get("runUid")});return l.success?a===void 0?re(o,"FORBIDDEN",null):await vt(o,()=>e.cancelIntegrityRun(t,l.data.runUid,a)):Response.json({error:`cancel_integrity_run takes runUid (a UUID): ${K(l.error,"form")}`},{status:400})}return null}function ss(e){if(typeof e!="object"||e===null)return"payload must be an object";let t=e;if(typeof t.fileUri!="string"||t.fileUri.trim()==="")return"payload.fileUri is required";if(!Qe.safeParse(t.confidentialityLevel).success)return`payload.confidentialityLevel must be one of ${Qe.options.join(", ")}`;let r=t.departmentId;return r!=null&&(typeof r!="number"||!Number.isInteger(r))?"payload.departmentId must be an integer or null":null}function is(e){try{return Cr(e,ce),null}catch{return`inspectFileUri answered a fileSize that is not a byte count (a non-negative safe integer): ${String(e)}`}}async function as(e,t,n,r,a,s,o,l){if(n==="ingest_document"){let c=String(r.get("payload")??"");if(!c)return Response.json({error:"payload is required"},{status:400});let d;try{d=JSON.parse(c)}catch{return Response.json({error:"Invalid JSON payload"},{status:400})}let p=ss(d);if(p)return Response.json({error:p},{status:400});let y=d,h=await o(s,y);if(h!==null)return Response.json({error:h},{status:403});let v;try{v=await(l===void 0?e.ingestDocument(t,y,a):e.ingestDocument(t,y,a,l))}catch(S){return Response.json({error:S instanceof Error?S.message:String(S)},{status:400})}return v.kind==="refused"?Response.json({error:v.error},{status:v.status}):Response.json({success:!0,result:v.result})}if(n==="inspect_uri"){let c=String(r.get("fileUri")??"").trim();if(!c)return Response.json({error:"fileUri is required"},{status:400});if(!e.inspectFileUri)return Response.json({error:"inspectFileUri is not implemented"},{status:501});let d;try{d=l===void 0?await e.inspectFileUri(t,c):await e.inspectFileUri(t,c,l)}catch(y){return Response.json({error:y instanceof Error?y.message:String(y)},{status:400})}let p=is(d.fileSize);return p!==null?Response.json({error:p},{status:400}):Response.json({success:!0,inspection:d})}return null}function Ms(e){let t=wt(e);return{loader:t.loader,action:t.action,View:gt,server:t}}export{gt as StorageAdminConsoleView,St as checkAllSystemHealth,Ar as checkBackendApiHealth,hr as checkNeo4jHealth,br as checkQdrantHealth,vr as checkRedisHealth,wr as checkSqlServerHealth,Ms as createStorageAdminApp,wt as createStorageAdminServer};
|