@aiquants/enrichment-react-router 0.2.1 → 0.3.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 +12 -4
- package/dist/index.cjs +2 -2
- package/dist/index.js +2 -2
- package/package.json +9 -9
package/README.md
CHANGED
|
@@ -215,24 +215,32 @@ Only the selected panel is mounted, so leaving a tab discards what was typed the
|
|
|
215
215
|
- The document history panel (`PipelineRunInspector`) opens above the panels and stays open across tabs.
|
|
216
216
|
- A recent run's 詳細 opens that run's document with that run selected. An ingest row's 履歴 opens the document's whole history and selects the newest run once it is read — also for a row with no recorded run, which the panel then states as a neutral `role="status"` note.
|
|
217
217
|
- The panel reads through `onLoadDocumentRuns`, shows `処理履歴を読めませんでした (<reason>)。` when the read fails, rejects or throws (for a rejection or a throw the reason is the error's message; a `""` reason leaves out the parentheses), and ignores a read that settles after it was closed or another document was opened.
|
|
218
|
-
- A 403 is not wrapped in that sentence: the panel states the refusal, `処理履歴を閲覧する権限がありません。`, followed by the declared cause as a second sentence (`…ありません。<reason>。`, the
|
|
218
|
+
- A 403 is not wrapped in that sentence: the panel states the refusal, `処理履歴を閲覧する権限がありません。`, followed by the declared cause as a second sentence (`…ありません。<reason>。`, by the console foundation's `failureSentence`, the rule `ResourceFailed` draws with), or that sentence alone for `""`.
|
|
219
219
|
- An entry point's run stays selected even when the history does not list it (the panel says so); the newest run is never substituted for it.
|
|
220
220
|
- Re-targeting keeps the one panel mounted. Every open from outside the panel (a 詳細 or 履歴 press, including one that names the run already shown) bumps the panel's `openRequest`, so focus moves to its heading each time; a load settling on the newest run does not move focus.
|
|
221
221
|
- On 閉じる or Escape focus returns to the entry point that opened the panel most recently; when that element has left the page (its tab panel was switched away), the panel's `returnFocusFallback` hands focus to the active tab's button.
|
|
222
222
|
- A history holding a provenance string with nothing to read (any string a step's report carries, such as `provider` or `model`) — empty, or only white space of JavaScript's and Python's `\s` — is shown as a failure naming the run, the step and the field (`処理履歴の記録に読めない来歴の値があります (実行 <id> の段 <sequence> の <field>)。`, not wrapped in the failed-read sentence), and its runs are not handed to the panel (the panel's measured text slot would refuse it while rendering and take the console with it).
|
|
223
223
|
- `search` draws `MetadataSearchWorkbench` and, when `onCompareVariants` is supplied, `ModelComparisonWorkbench`, keyed by `strategyId`, with each variant labelled `<domainKey> / <variantKey> (<embeddingModel>)`.
|
|
224
224
|
- `knowledge-authority` (権威台帳 & 規程衝突) draws `DocumentAuthorityRegistry` (its `canUpdate` is the loader's `canUpdateKnowledge`) and then `PolicyConflictQueue`. The view keeps a policy conflict revision: the ledger's `onPolicyConflictsChanged` advances it, and the queue re-reads its summary, its first page and the open detail in place when it changes.
|
|
225
|
-
- `data-retention` (データ保持 & 整合性監査) draws `TriStoreIntegrityAudit`, then `PolicyConflictSummaryCard` (its `knowledgeTabLabel` is the knowledge-authority tab's label, and its link switches to that tab and moves focus to it), then the bulk-retry notice and the `SyncStatusMonitor` / `QdrantStorageCard` grid.
|
|
225
|
+
- `data-retention` (データ保持 & 整合性監査) draws `TriStoreIntegrityAudit`, then `PolicyConflictSummaryCard` (its `knowledgeTabLabel` is the knowledge-authority tab's label, and its link switches to that tab and moves focus to it), then the bulk-retry notice and the `SyncStatusMonitor` / `QdrantStorageCard` grid. `SyncStatusMonitor` sits in a `<section tabIndex={-1}>` (`sync-status-region`) named `エンリッチメント同期ステータス`, its card's own heading.
|
|
226
226
|
- The overview is kept last-good: the loader's answer, every poll and the reload are applied in arrival order through the console foundation's `keepLastGood`, so an overview once shown stays through later failures, which show only `更新に失敗しました (<reason>)。`. A success whose `readAt` is strictly earlier than the shown one (the core's `isStrictlyEarlier`, which compares every fractional digit across offsets) is dropped.
|
|
227
|
-
- A 403 is the exception:
|
|
227
|
+
- A 403 is the exception: `keepLastGood` withdraws a shown overview, since the operator may no longer read it and the card's refresh note carries no status to say so. The overview is then drawn as a first read answered 403 is (below), it stays so through every later answer that carries no value (a 503 after it changes nothing and is not announced again) until an overview is read again, and focus that was inside the audit card moves to the heading of the card drawn in its place.
|
|
228
228
|
- Until an overview has been shown, and after a 403 withdrew it, a card titled `Tri-Store データ整合性監査` (`audit-overview-failed`) holds the console foundation's `ResourceFailed` (`audit-overview-failed-resource`).
|
|
229
229
|
It reads `監査の概況を読めませんでした (<reason>)。` with `再読み込み` (a `""` reason leaves out the parentheses), or for a 403 `監査の概況を閲覧する権限がありません。` followed by the cause the route declared (`…ありません。<reason>。`, that sentence alone for `""`) and no reload.
|
|
230
230
|
For a failure other than 403, the reload is, besides the loader's next answer, the only way back (neither the polling nor a return to the tab reads without an overview); a 403 card offers no reload, so only the loader's next answer brings the overview back. Focus that was on `再読み込み` moves to the audit card's heading on success, or to this card's heading when the reload answers 403.
|
|
231
231
|
- While the shown overview has an active run, the tab is shown and the document is visible, the overview is re-read every 2 s (`INTEGRITY_RUN_POLL_MS`), or every 10 s while the run's heartbeat is stale; a hidden document or another tab stops the polling and aborts the read in flight. The polling stops when a read shows the run ended, when a re-read is refused with 401 (repeating it would only repeat the refusal; the shown overview stays with `更新に失敗しました (<reason>)。`), and when a 403 withdraws the overview.
|
|
232
232
|
- Whenever the tab is shown and the document visible again after either was not — the first visit to the tab after the console mounted on another included — the overview is read once at once, with or without an active run: the card, mounted again with the tab, counts its age label from `readAt` plus the time since its own mount, and a successful read corrects the time away. A failed read leaves the relative age short by the time away, while the absolute 最終測定 time and `更新に失敗しました (<reason>)。` stay correct. A mount on the tab itself reads nothing: the loader has just answered.
|
|
233
|
-
- The audit card's start (`start_integrity_run`) and cancel (`cancel_integrity_run`) go through a fetcher of their own (`integrityFetcher`), so a sync retry on the same tab never aborts them, nor they a retry (React Router aborts a fetcher's earlier submission when it submits again); the card is told which one is in flight. The console's alert states the `{ error }` of whichever fetcher settled last.
|
|
233
|
+
- The audit card's start (`start_integrity_run`) and cancel (`cancel_integrity_run`) go through a fetcher of their own (`integrityFetcher`), so a sync retry on the same tab never aborts them, nor they a retry (React Router aborts a fetcher's earlier submission when it submits again); the card is told which one is in flight. The console's alert states the `{ error }` of whichever fetcher settled last, except the findings inspector's own resync (below), which the inspector states instead.
|
|
234
234
|
A failure the action answers as `{ failure }` — the `storage_admin:update` refusal included — reaches the card as `{ failure, occurrence }`, never the console's error alert (the occurrence advances with every failure, so a repeated failure is announced again).
|
|
235
235
|
The session and operator gates (no session, a blank `email`) and a malformed form answer `{ error }` in the console's alert, as for every intent. Any answer without a failure clears the card's, and so does leaving the tab, so a failure is announced once: one that settled while another tab was shown is shown when the operator returns. After a failure that outdates the overview the view re-reads the loader.
|
|
236
|
+
- The card's findings inspector gets the console's document controls and remedy places:
|
|
237
|
+
- `onShowHistory` is the ingest rows' history entry: a row's `履歴` opens the document history panel on the row's document and selects its newest run. Without `onLoadDocumentRuns` the rows offer no `履歴` and no remedy names it.
|
|
238
|
+
- `resync`: a row's `再同期` or `再試行` sets the console's one press state (`InspectorResync`: `{ metadataId, intent: "retry_job", status: "pending", error: null }`) and submits `retry_job` with the document's metadata id as `fileId` on the shared fetcher, as the sync monitor's retries do. The inspector draws the state (`pending` busy row buttons; `accepted` a sentence read once; `refused` an alert in the inspector with the action's `error`) and dismisses it once it goes away (a cell switch, 閉じる, Escape, a link to another tab, a tab switch, a newer run), which sets the state to `null`.
|
|
239
|
+
- A press while the shared fetcher is not idle (submitting or revalidating anything: the sync monitor's `retry_all_failed` or `retry_job`, the press of an inspector that went away, a command still in flight from another tab) sends nothing: submitting would make React Router drop that submission's answer, such as the `retry-all-skipped` rows or a retry's refusal.
|
|
240
|
+
The state becomes `refused` with the reason `送信中の操作 (同期の再試行など) の結果を待っているため、送っていません。結果が出てから押し直してください。`, which the inspector states as its own refusal (once per press); the console's alert and the other submission's settlement are untouched. Pressing again once the fetcher is idle submits.
|
|
241
|
+
- A settlement of the shared fetcher while the state is `pending` is routed by its intent. `retry_job` is the press's own (while it is in flight `isRetrying` disables the sync monitor's retries, and a fetcher settles only its latest submission): the state becomes `accepted`, or `refused` with the answer's `error`, and the console's alert states nothing until the next settlement of either fetcher. Any other intent superseded the press, so the state is dropped and the settlement reaches the console's alert as usual.
|
|
242
|
+
Without a `pending` state (dismissed, never pressed, or a press refused because the fetcher was busy) every settlement reaches the console's alert: a press whose inspector went away shows its refusal there, and its success stays silent like the sync monitor's own retries.
|
|
243
|
+
- `remedyDestinations`: the strategies are the `パイプライン & 接続状態` tab and the projection policy the `モデル & パラメータ設定` tab, each named by its tab's label; their links open the tab and move focus to its tab button, which takes the card and its inspector away (`closesInspector: true`). The failed-sync list is `エンリッチメント同期ステータス`: its link moves focus to the region around `SyncStatusMonitor` on the same tab and leaves the inspector open (`closesInspector: false`).
|
|
236
244
|
- The route must re-read its loader after a successful start or cancel: that re-read is how the new run appears and the polling begins. React Router's default `shouldRevalidate` does; a host that skips the re-read for intents without a loader effect must not list these two.
|
|
237
245
|
|
|
238
246
|
The console derives its in-flight and settled state from the fetcher: `isRetrying` / `isResolving` follow the intent in flight, rows skipped by `retry_all_failed` are listed in a `retry-all-skipped` notice, and the transcription-adaptation saves return a promise that settles with the submission (rejecting with the action's `error`), so the board keeps its inputs on refusal.
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var Ie=Object.defineProperty;var vt=Object.getOwnPropertyDescriptor;var It=Object.getOwnPropertyNames;var wt=Object.prototype.hasOwnProperty;var At=(e,t)=>{for(var n in t)Ie(e,n,{get:t[n],enumerable:!0})},Pt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of It(t))!wt.call(e,a)&&a!==n&&Ie(e,a,{get:()=>t[a],enumerable:!(r=vt(t,a))||r.enumerable});return e};var Nt=e=>Pt(Ie({},"__esModule",{value:!0}),e);var bn={};At(bn,{StorageAdminConsoleView:()=>Ee,checkAllSystemHealth:()=>Oe,checkBackendApiHealth:()=>it,checkNeo4jHealth:()=>nt,checkQdrantHealth:()=>tt,checkRedisHealth:()=>rt,checkSqlServerHealth:()=>st,createStorageAdminApp:()=>fn,createStorageAdminServer:()=>Fe});module.exports=Nt(bn);var _=require("@aiquants/console-ui"),U=require("@aiquants/enrichment-core"),S=require("@aiquants/enrichment-react"),h=require("@aiquants/governance-react"),g=require("react"),K=require("react-router");var le="ja-JP";var Tt=/[^\s\x1c-\x1f\x85\ufeff]/;function ue(e){return Tt.test(e)}function te(e,t){return new Promise(n=>n(e())).catch(n=>t(n instanceof Error?n.message:String(n)))}var de=require("@aiquants/console-ui/core"),Ke=require("@aiquants/enrichment-core"),T=require("react");var _t=2e3,Et=1e4;function we(e,t){if(t.ok&&e.kind==="ready"&&(0,Ke.isStrictlyEarlier)(t.value.readAt,e.value.readAt))return e;let n=!t.ok&&t.status===403&&e.kind==="ready";return(0,de.keepLastGood)(n?{kind:"loading"}:e,t)}var Ct=401;function xt(e){return e.kind==="failed"||e.refreshFailure!==null&&e.refreshFailure.status===Ct?null:e.value.active}function qe(e,t){let[n,r]=(0,T.useState)(()=>({loaded:e,overview:we({kind:"loading"},e)}));n.loaded!==e&&r({loaded:e,overview:we(n.overview,e)});let a=(0,T.useRef)(t);a.current=t;let s=(0,T.useRef)(null);(0,T.useEffect)(()=>()=>s.current?.abort(),[]);let l=(0,T.useCallback)((c,m)=>te(m,y=>({ok:!1,status:null,reason:y})).then(y=>{c.aborted||r(v=>({loaded:v.loaded,overview:we(v.overview,y)}))}),[]),u=(0,T.useCallback)(()=>{let c=new AbortController;s.current=c,r(m=>({loaded:m.loaded,overview:(0,de.beginReload)(m.overview,"reload")})),l(c.signal,()=>a.current(c.signal))},[l]),d=(0,T.useCallback)(c=>l(c,()=>a.current(c)),[l]);return{overview:n.overview,reload:u,poll:d}}function Ot(e){return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)}function kt(){return document.visibilityState==="visible"}function Lt(){return!0}function Be(e,t,n){let r=(0,T.useSyncExternalStore)(Ot,kt,Lt),a=t&&r,s=(0,T.useRef)(a),l=e.kind==="ready",u=xt(e),d=u===null?null:u.run.runUid,c=u===null?!1:u.isStale;(0,T.useEffect)(()=>{let m=a&&!s.current;if(s.current=a,!a||d===null&&!(m&&l))return;let y=new AbortController,v=c?Et:_t,b,I=async()=>{await n(y.signal),!y.signal.aborted&&d!==null&&(b=setTimeout(I,v))};return b=setTimeout(I,m?0:v),()=>{y.abort(),clearTimeout(b)}},[a,l,d,c,n])}var Pe={columns:2,className:"grid-cols-2",spanClassNames:{1:"col-span-1",2:"col-span-2"}},Ne={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"}},Te={className:"@min-[82rem]:grid-flow-col @min-[82rem]:auto-cols-fr @min-[82rem]:grid-cols-none",lastTabClassName:"@min-[82rem]:col-auto"};function _e(e,t){let n=t%e.columns,r=n===0?1:e.columns-n+1;return e.spanClassNames[r]}var i=require("react/jsx-runtime"),Ve="tab",ce={key:"knowledge-authority",phrases:["\u6A29\u5A01\u53F0\u5E33 & \u898F\u7A0B\u885D\u7A81"]},q=[{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"]},{key:"pipeline",phrases:["\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3 & \u63A5\u7D9A\u72B6\u614B"]},{key:"knowledge-graph",phrases:["\u30CA\u30EC\u30C3\u30B8\u30B0\u30E9\u30D5","\u63A2\u7D22"]},{key:"parameters",phrases:["\u30E2\u30C7\u30EB & \u30D1\u30E9\u30E1\u30FC\u30BF\u8A2D\u5B9A"]},{key:"prompts",phrases:["\u30D7\u30ED\u30F3\u30D7\u30C8 & \u30C9\u30E9\u30A4\u30E9\u30F3"]},ce,{key:"data-retention",phrases:["\u30C7\u30FC\u30BF\u4FDD\u6301 & \u6574\u5408\u6027\u76E3\u67FB"]}];function Ft(e){return e.phrases.join("")}function jt(e){return e!==null&&q.some(t=>t.key===e)}var Dt="Tri-Store \u30C7\u30FC\u30BF\u6574\u5408\u6027\u76E3\u67FB";function Ut(e){return`\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${(0,_.reasonAside)(e)}\u3002`}var Ht=(0,_.resolveConsoleUiLabels)("ja");function Mt(e){return e.status===403?Ht.forbiddenBecause("\u51E6\u7406\u5C65\u6B74\u3092\u95B2\u89A7\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",e.reason):`\u51E6\u7406\u5C65\u6B74\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${(0,_.reasonAside)(e.reason)}\u3002`}var Qe={state:"idle",formData:null,data:null,submit:()=>Promise.resolve()};function Ye({data:e,fetcher:t,integrityFetcher:n,renderHeader:r,graphTraversal:a,onBrowseGraphNodes:s,onSimulateGovernance:l,onRefreshIngestQueue:u,onSearch:d,onLoadDocumentRuns:c,onCompareVariants:m,loadIntegrityOverview:y,loadIntegrityFindings:v,policyConflicts:b,documentAuthority:I}){let[f,V]=(0,g.useState)(null),[$,O]=(0,g.useState)(null),[k,L]=(0,g.useState)(!1),Q=(0,g.useMemo)(()=>{if(s!==void 0)return(o,R)=>{L(!0),te(()=>s(o,R),w=>({ok:!1,reason:w})).then(w=>{L(!1),O(w.ok?null:w.reason),w.ok&&V(w.page)})}},[s]),[G,z]=(0,K.useSearchParams)(),F=G.get(Ve),A=jt(F)?F:q[0].key,j=o=>{z(R=>{let w=new URLSearchParams(R);return w.set(Ve,o),w},{replace:!1,preventScrollReset:!0})},re=Kt(e.recentIngestItems,u,A==="ingest"),D=qe(e.integrityAudit,y);Be(D.overview,A==="data-retention",D.poll);let Z=(0,g.useRef)(null),se=(0,_.useFocusRescue)(()=>Z.current),[ge,ye]=(0,g.useState)(0),fe=(0,g.useCallback)(()=>ye(o=>o+1),[]),p=re===null?e:{...e,recentIngestItems:[...re]},J=(0,g.useRef)({}),be=(0,g.useCallback)(()=>J.current[A]??null,[A]),ie=(0,g.useMemo)(()=>qt(e.enrichmentStrategies),[e.enrichmentStrategies]),Se=(0,g.useMemo)(()=>e.strategyVariants.map(Bt),[e.strategyVariants]),E=Gt(c),W=E.open,Re=W===void 0?void 0:o=>W(o,null),he=W===void 0?void 0:o=>W(o.metadataId,o.id),ae=(o,R)=>{let w=q.length-1,C;if(o.key==="ArrowRight"||o.key==="ArrowDown")C=R===w?0:R+1;else if(o.key==="ArrowLeft"||o.key==="ArrowUp")C=R===0?w:R-1;else if(o.key==="Home")C=0;else if(o.key==="End")C=w;else return;o.preventDefault();let oe=q[C].key;j(oe),J.current[oe]?.focus()},je={...p.featureFlags};if(t.formData&&t.formData.get("intent")==="toggle_flag"){let o=String(t.formData.get("flagKey")??""),R=String(t.formData.get("enabled")??"")==="true";o&&(je[o]=R)}let ut=t.data&&"inspection"in t.data?t.data.inspection:void 0,X=t.state==="idle"?null:t.formData?.get("intent"),dt=X==="inspect_uri",ct=X==="ingest_document",pt=X==="retry_job"||X==="retry_all_failed",mt=X==="resolve_entity",De=n.state==="idle"?null:n.formData?.get("intent"),gt=De==="start_integrity_run"?{kind:"starting",mode:U.IntegrityRunModeSchema.parse(n.formData?.get("mode"))}:De==="cancel_integrity_run"?{kind:"cancelling"}:{kind:"idle"},yt=(0,K.useRevalidator)(),[ft,ve]=(0,g.useState)(null),Ue=A!=="data-retention";(0,g.useEffect)(()=>{Ue&&ve(null)},[Ue]);let bt=o=>{let R=o?.failure;if(R===void 0){ve(null);return}ve(w=>({failure:R,occurrence:w===null?1:w.occurrence+1})),(0,h.integrityFailureNeedsOverviewReread)(R)&&yt.revalidate()},[St,He]=(0,g.useState)("console"),{settledIntent:Rt,submitAndAwait:Me}=ze(t,()=>He("console"));ze(n,o=>{He("integrity"),bt(o)});let $e=(St==="console"?t:n).data?.error,ht=()=>{j(ce.key),J.current[ce.key]?.focus()},ee=Rt==="retry_all_failed"&&t.data?.skipped!==void 0&&t.data.requeued!==void 0?{requeued:t.data.requeued,skipped:t.data.skipped}:null;return(0,i.jsx)(_.ConsoleUiRoot,{locale:"ja",formatLocale:le,timeZone:p.displayTimeZone,testId:"storage-admin-console-ui",children:(0,i.jsxs)("div",{className:"container mx-auto space-y-6 p-6 font-sans text-slate-900","data-testid":"storage-admin-console",children:[$e&&(0,i.jsx)("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}):(0,i.jsxs)("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:[(0,i.jsxs)("div",{children:[(0,i.jsx)("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"}),(0,i.jsxs)("p",{className:"mt-1 text-slate-500 text-sm",children:["\u30C6\u30CA\u30F3\u30C8: ",(0,i.jsx)("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"]})]}),(0,i.jsx)("div",{className:"flex items-center gap-2",children:(0,i.jsxs)("button",{type:"button","data-testid":"header-health-status-button",onClick:()=>j("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:[(0,i.jsx)("span",{className:`h-2 w-2 rounded-full ${p.systemHealth.allHealthy?"bg-emerald-500":"bg-amber-500"}`}),(0,i.jsxs)("span",{children:["\u5468\u8FBA\u6A5F\u80FD: ",p.systemHealth.allHealthy?"\u5168\u30B5\u30FC\u30D3\u30B9\u6B63\u5E38":"\u63A5\u7D9A\u8981\u78BA\u8A8D"]})]})})]}),(0,i.jsxs)("div",{className:"w-full space-y-6",children:[(0,i.jsx)("div",{className:"@container w-full","data-testid":"storage-admin-tablist-frame",children:(0,i.jsx)("div",{className:`grid w-full ${Pe.className} ${Ne.className} ${Te.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:q.map((o,R)=>{let w=A===o.key;return(0,i.jsx)("button",{id:`tab-${o.key}`,type:"button",role:"tab",ref:C=>{J.current[o.key]=C},"aria-selected":w,"aria-controls":`panel-${o.key}`,tabIndex:w?0:-1,"data-testid":`tab-trigger-${o.key}`,onKeyDown:C=>ae(C,R),onClick:()=>j(o.key),className:`wrap-anywhere break-keep rounded-lg px-3 py-2.5 text-center font-medium text-sm transition-all ${R===q.length-1?`${_e(Pe,q.length)} ${_e(Ne,q.length)} ${Te.lastTabClassName}`:""} ${w?"bg-white text-slate-900 shadow-sm":"text-slate-600 hover:bg-slate-200/50 hover:text-slate-900"}`,children:o.phrases.map((C,oe)=>(0,i.jsxs)(g.Fragment,{children:[oe>0&&(0,i.jsx)("wbr",{}),C]},C))},o.key)})})}),E.metadataId!==null&&(0,i.jsx)(S.PipelineRunInspector,{metadataId:E.metadataId,runs:E.runs,selectedRunId:E.selectedRunId,onSelectRun:E.selectRun,isLoading:E.isLoading,failure:E.failure,onClose:E.close,openRequest:E.openRequest,returnFocusFallback:be}),A==="search"&&(0,i.jsxs)("div",{role:"tabpanel",id:"panel-search","aria-labelledby":"tab-search",className:"space-y-6","data-testid":"tab-content-search",children:[(0,i.jsx)(S.MetadataSearchWorkbench,{tenantId:p.tenantId,onSearch:d,circuitBreakerStatus:p.circuitBreakerStatus}),m!==void 0&&(0,i.jsx)(S.ModelComparisonWorkbench,{variants:Se,onCompare:m})]}),A==="ingest"&&(0,i.jsx)("div",{role:"tabpanel",id:"panel-ingest","aria-labelledby":"tab-ingest",className:"space-y-6","data-testid":"tab-content-ingest",children:(0,i.jsx)(S.DocumentIngestConsole,{tenantId:p.tenantId,policies:p.confidentialityPolicies,domainOptions:ie,recentItems:p.recentIngestItems,inspectionResult:ut,isInspecting:dt,isSubmitting:ct,onInspectUri:o=>{t.submit({intent:"inspect_uri",fileUri:o},{method:"post"})},onIngestDocument:o=>{t.submit({intent:"ingest_document",payload:JSON.stringify(o)},{method:"post"})},onRetryItem:o=>{t.submit({intent:"retry_job",fileId:String(o)},{method:"post"})},onShowHistory:Re})}),A==="pipeline"&&(0,i.jsxs)("div",{role:"tabpanel",id:"panel-pipeline","aria-labelledby":"tab-pipeline",className:"space-y-6","data-testid":"tab-content-pipeline",children:[(0,i.jsx)(S.PipelineFlowViewer,{featureFlags:p.featureFlags,metrics:p.pipelineStepMetrics,metricSampleWindow:p.pipelineStepMetricWindow}),(0,i.jsx)(Vt,{runs:p.recentPipelineRuns,onOpenRun:he}),(0,i.jsx)(S.EnrichmentStrategyBoard,{strategies:p.enrichmentStrategies,featureFlags:p.featureFlags,isUpdating:t.state!=="idle",onToggleStage:(o,R,w)=>t.submit({intent:"update_enrichment_strategy",strategyId:String(o.id),domainId:String(o.domainId),stage:R,enabled:String(w)},{method:"post"})}),(0,i.jsx)(S.InfrastructureHealthMonitor,{health:p.systemHealth,isRefreshing:t.state!=="idle",onRefresh:()=>t.submit({intent:"refresh_health"},{method:"post"})})]}),A==="knowledge-graph"&&(0,i.jsxs)("div",{role:"tabpanel",id:"panel-knowledge-graph","aria-labelledby":"tab-knowledge-graph",className:"space-y-6","data-testid":"tab-content-knowledge-graph",children:[(0,i.jsx)(S.OntologyStatusCard,{tenantId:p.tenantId,ontologyStatus:p.ontologyStatus}),(0,i.jsx)(h.KnowledgeGraphExplorer,{topologyMaxLabels:U.GRAPH_INDEX_LIMITS.topologyLabels.default,schema:p.graphSchema,tenantId:p.tenantId,unresolvedEntities:p.unresolvedEntities,traversal:a,onBrowseLabel:Q,nodeIndexPage:f,nodeIndexFailure:$,isNodeIndexLoading:k,isResolving:mt,onResolveEntity:(o,R)=>{t.submit({intent:"resolve_entity",entityId:o,action:R},{method:"post"})}})]}),A==="parameters"&&(0,i.jsxs)("div",{role:"tabpanel",id:"panel-parameters","aria-labelledby":"tab-parameters",className:"space-y-6","data-testid":"tab-content-parameters",children:[(0,i.jsxs)("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-2",children:[(0,i.jsx)(h.FeatureFlagBoard,{flags:je,isUpdating:t.state!=="idle",onToggleFlag:(o,R)=>{t.submit({intent:"toggle_flag",flagKey:o,enabled:String(R)},{method:"post"})}}),(0,i.jsx)(h.ClassificationRuleEditor,{rules:p.classificationRules,domainOptions:ie,consultedBy:p.classificationRuleConsumer,onReorderRules:o=>{t.submit({intent:"reorder_rules",orderedRuleIds:JSON.stringify(o)},{method:"post"})}})]}),p.policiesMissingDestination.length>0&&(0,i.jsxs)("div",{"data-testid":"policies-missing-destination",role:"alert",style:{padding:"10px 12px",borderRadius:"6px",backgroundColor:"#fef2f2",color:"#b91c1c",fontSize:"12px"},children:[(0,i.jsx)("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",(0,i.jsx)("ul",{style:{margin:"6px 0 0",paddingInlineStart:"18px"},children:p.policiesMissingDestination.map(o=>(0,i.jsxs)("li",{"data-testid":`missing-destination-${o.confidentialityLevel}-${o.capability}`,children:[o.confidentialityLevel," / ",o.capability," \u2192 ",o.promptKey," (",o.modelProvider,") \u306E ",(0,i.jsx)("code",{children:"extra_params.base_url"})]},`${o.confidentialityLevel}:${o.capability}`))}),(0,i.jsx)("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"})]}),(0,i.jsx)(h.ConfidentialityPolicyBoard,{policies:p.confidentialityPolicies,promptKeys:p.promptTemplates.map(o=>o.template_key),isUpdating:t.state!=="idle",onChangePolicy:o=>{t.submit({intent:"update_confidentiality_policy",confidentialityLevel:o.confidentialityLevel,capability:o.capability,isEnabled:String(o.isEnabled),allowCloudProvider:String(o.allowCloudProvider),promptKey:o.promptKey??""},{method:"post"})}}),(0,i.jsx)(h.TranscriptionAdaptationBoard,{vocabulary:p.transcriptionVocabulary,references:p.transcriptionReferences,unresolvedUris:p.unresolvedReferenceUris,isUpdating:t.state!=="idle",onSaveTerm:o=>Me({intent:"save_transcription_term",id:o.id===null?"":String(o.id),term:o.term,reading:o.reading??"",boost:o.boost===null?"":String(o.boost),domainKey:o.domainKey??"",isActive:String(o.isActive)},{method:"post"}),onSaveReference:o=>Me({intent:"save_transcription_reference",id:o.id===null?"":String(o.id),fileUri:o.fileUri,domainKey:o.domainKey??"",isActive:String(o.isActive)},{method:"post"})}),(0,i.jsx)(h.SystemParameterTable,{parameters:p.systemParameters,onSaveParameter:(o,R)=>{t.submit({intent:"update_parameter",paramKey:o,paramValue:String(R)},{method:"post"})}})]}),A==="prompts"&&(0,i.jsxs)("div",{role:"tabpanel",id:"panel-prompts","aria-labelledby":"tab-prompts",className:"space-y-6","data-testid":"tab-content-prompts",children:[(0,i.jsx)(h.PromptTemplateConsole,{templates:p.promptTemplates,isSaving:t.state!=="idle",onSaveTemplate:o=>{t.submit({intent:"update_prompt",templateKey:o.template_key,payload:JSON.stringify({templateText:o.template_text,modelName:o.model_name,temperature:o.temperature,maxOutputTokens:o.max_output_tokens,responseSchema:o.response_schema,endpointBaseUrl:o.endpoint_base_url??null})},{method:"post"})}}),(0,i.jsx)(h.GovernanceDryRunConsole,{onSimulate:l})]}),A==="knowledge-authority"&&(0,i.jsxs)("div",{role:"tabpanel",id:"panel-knowledge-authority","aria-labelledby":"tab-knowledge-authority",className:"space-y-6","data-testid":"tab-content-knowledge-authority",children:[(0,i.jsx)(h.DocumentAuthorityRegistry,{host:I,canUpdate:p.canUpdateKnowledge,onPolicyConflictsChanged:fe}),(0,i.jsx)(h.PolicyConflictQueue,{host:b,revision:ge})]}),A==="data-retention"&&(0,i.jsxs)("div",{role:"tabpanel",id:"panel-data-retention","aria-labelledby":"tab-data-retention",className:"space-y-6","data-testid":"tab-content-data-retention",children:[D.overview.kind==="ready"?(0,i.jsx)("div",{ref:se,children:(0,i.jsx)(h.TriStoreIntegrityAudit,{overview:D.overview.value,canReadFindings:p.canReadIntegrityFindings,command:gt,commandFailure:ft,onStartRun:(o,R)=>{n.submit(R===null?{intent:"start_integrity_run",mode:o}:{intent:"start_integrity_run",mode:o,basisRunUid:R},{method:"post"})},onCancelRun:o=>{n.submit({intent:"cancel_integrity_run",runUid:o},{method:"post"})},loadFindings:v,refreshFailure:D.overview.refreshFailure===null?null:D.overview.refreshFailure.reason,headingRef:Z})}):(0,i.jsx)(_.Card,{title:Dt,testId:"audit-overview-failed",headingRef:Z,children:(0,i.jsx)(_.ResourceFailed,{failure:D.overview,onReload:D.reload,forbiddenMessage:"\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u95B2\u89A7\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",failureMessage:Ut,rescueRef:se,testId:"audit-overview-failed-resource"})}),(0,i.jsx)(h.PolicyConflictSummaryCard,{host:b,knowledgeTabLabel:Ft(ce),onOpenKnowledgeTab:ht}),ee!==null&&ee.skipped.length>0&&(0,i.jsxs)("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:[(0,i.jsxs)("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",(0,i.jsx)("ul",{className:"mt-1.5 list-disc ps-5",children:ee.skipped.map(o=>(0,i.jsxs)("li",{"data-testid":`retry-all-skipped-${o.metadataId}`,children:["#",o.metadataId,": ",o.reason]},o.metadataId))})]}),(0,i.jsxs)("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-2",children:[(0,i.jsx)(S.SyncStatusMonitor,{counts:p.syncCounts,totalFiles:p.totalFiles,failedItems:p.failedSyncItems,isRetrying:pt,onRetryItem:o=>{t.submit({intent:"retry_job",fileId:String(o)},{method:"post"})},onRetryAll:()=>{t.submit({intent:"retry_all_failed"},{method:"post"})}}),(0,i.jsx)(S.QdrantStorageCard,{overview:p.qdrantCollections,health:{healthy:p.systemHealth.services.qdrant.status==="connected",latency_ms:p.systemHealth.services.qdrant.latencyMs}})]})]})]})]})})}var $t=new Set(U.EnrichmentSyncStatusSchema.options.filter(e=>e!=="SYNCED"&&!e.startsWith("FAILED"))),Ge=2e3;function Kt(e,t,n){let[r,a]=(0,g.useState)(null),s=(0,g.useRef)(t);s.current=t;let l=(0,g.useRef)(e);l.current!==e&&(l.current=e,r!==null&&a(null));let d=(r??e)?.some(c=>$t.has(c.syncStatus))===!0;return(0,g.useEffect)(()=>{if(!(n&&d&&s.current))return;let c=!1,m,y=async()=>{let v=s.current;if(v!==void 0){try{let b=await v();if(c)return;a(b)}catch{if(c)return}m=setTimeout(y,Ge)}};return m=setTimeout(y,Ge),()=>{c=!0,clearTimeout(m)}},[d,n]),r}function ze(e,t){let n=(0,g.useRef)(t);n.current=t;let r=(0,g.useRef)(null),a=(0,g.useRef)(!1),s=(0,g.useRef)(null);if(e.state!=="idle"){a.current=!0;let u=e.formData?.get("intent");typeof u=="string"&&(r.current=u)}(0,g.useEffect)(()=>{if(e.state!=="idle"||!a.current)return;a.current=!1,n.current(e.data);let u=s.current;if(u===null)return;s.current=null;let d=e.data?.error;typeof d=="string"?u.reject(new Error(d)):u.resolve()},[e.state,e.data]);let l=(0,g.useCallback)((...u)=>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(...u)}),[e]);return{settledIntent:e.state==="idle"?r.current:null,submitAndAwait:l}}function qt(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 Bt(e){return{strategyId:e.strategyId,label:`${e.domainKey} / ${e.variantKey}`,embeddingModel:e.embeddingModel}}function Vt({runs:e,onOpenRun:t}){return(0,i.jsxs)("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:[(0,i.jsx)("h2",{id:"pipeline-recent-runs-heading",className:"font-bold text-base text-slate-900",children:"\u76F4\u8FD1\u306E\u5B9F\u884C"}),e.length===0?(0,i.jsx)("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"}):(0,i.jsx)("div",{className:"relative mt-4 overflow-x-auto","data-testid":"pipeline-recent-runs-scroll",children:(0,i.jsxs)("table",{className:"w-full text-left text-[13px]",children:[(0,i.jsx)("thead",{children:(0,i.jsxs)("tr",{className:"whitespace-nowrap border-slate-200 border-b border-solid text-[11px] text-slate-500 uppercase",children:[(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u5B9F\u884C"}),(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u6587\u66F8"}),(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u7A2E\u985E"}),(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u304D\u3063\u304B\u3051"}),(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u8A66\u884C"}),(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u72B6\u614B"}),(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u6B62\u307E\u3063\u305F\u6BB5"}),(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u958B\u59CB"}),(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u7D42\u4E86"}),(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u8981\u6C42\u8005"}),t!==void 0&&(0,i.jsx)("th",{scope:"col",className:"px-3 py-2",children:(0,i.jsx)("span",{className:"sr-only","data-testid":"pipeline-recent-runs-action-header",children:"\u64CD\u4F5C"})})]})}),(0,i.jsx)("tbody",{children:e.map(n=>{let r=(0,S.pipelineRunPresentationKey)(n),a=S.PIPELINE_RUN_STATUS_PRESENTATION[r];return(0,i.jsxs)("tr",{className:"border-slate-100 border-b border-solid","data-testid":`pipeline-run-row-${n.id}`,"data-status":n.status,children:[(0,i.jsxs)("td",{className:"whitespace-nowrap px-3 py-2 font-mono","data-testid":`pipeline-run-id-${n.id}`,children:["#",n.id]}),(0,i.jsxs)("td",{className:"whitespace-nowrap px-3 py-2 font-mono","data-testid":`pipeline-run-metadata-${n.id}`,children:["#",n.metadataId]}),(0,i.jsx)("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-kind-${n.id}`,children:U.DOCUMENT_KIND_LABELS[n.documentKind]}),(0,i.jsx)("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-trigger-${n.id}`,"data-trigger":n.trigger,children:S.PIPELINE_TRIGGER_LABELS[n.trigger]}),(0,i.jsx)("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-attempt-${n.id}`,children:n.attempt}),(0,i.jsx)("td",{className:"px-3 py-2",children:(0,i.jsx)("span",{className:`inline-flex whitespace-nowrap rounded-full px-2 py-0.5 font-semibold text-[11px] ${a.className}`,"data-testid":`pipeline-run-status-${n.id}`,"data-status":n.status,"data-presentation":r,children:a.label})}),(0,i.jsx)("td",{className:"px-3 py-2","data-testid":`pipeline-run-failed-step-${n.id}`,children:n.failedStepKey===null?"\u2014":U.PIPELINE_STEPS[n.failedStepKey].label}),(0,i.jsx)("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-started-${n.id}`,children:(0,i.jsx)(S.RecordedInstant,{iso:n.startedAt,testId:`pipeline-run-started-value-${n.id}`})}),(0,i.jsx)("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-finished-${n.id}`,children:(0,i.jsx)(S.FinishedInstant,{iso:n.finishedAt,testId:`pipeline-run-finished-value-${n.id}`})}),(0,i.jsx)("td",{className:"wrap-anywhere px-3 py-2","data-testid":`pipeline-run-requested-by-${n.id}`,children:n.requestedBy}),t!==void 0&&(0,i.jsx)("td",{className:"whitespace-nowrap px-3 py-2 text-right",children:(0,i.jsx)("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 Je={metadataId:null,runs:[],selectedRunId:null,isLoading:!1,failure:null};function Qt(e){for(let t of e)for(let n of t.steps){let r=n.provenance;if(r!==null){for(let[a,s]of Object.entries(r))if(typeof s=="string"&&!ue(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 ${a})\u3002`}}return null}function Gt(e){let[t,n]=(0,g.useState)(Je),[r,a]=(0,g.useState)(0),s=(0,g.useRef)(0),l=(0,g.useRef)(null),u=(0,g.useMemo)(()=>{if(e!==void 0)return(m,y)=>{s.current+=1;let v=s.current;l.current?.abort();let b=new AbortController;l.current=b,a(I=>I+1),n({metadataId:m,runs:[],selectedRunId:y,isLoading:!0,failure:null}),te(()=>e(m,b.signal),I=>({ok:!1,status:null,reason:I})).then(I=>{if(s.current!==v)return;let f=I.ok?Qt(I.value):Mt(I);if(!I.ok||f!==null){n({metadataId:m,runs:[],selectedRunId:y,isLoading:!1,failure:f});return}n({metadataId:m,runs:I.value,selectedRunId:y===null?zt(I.value):y,isLoading:!1,failure:null})})}},[e]),d=(0,g.useCallback)(m=>{n(y=>({...y,selectedRunId:m}))},[]),c=(0,g.useCallback)(()=>{s.current+=1,l.current?.abort(),l.current=null,n(Je)},[]);return{...t,openRequest:r,open:u,selectRun:d,close:c}}function zt(e){return e.length===0?null:e[0].id}function Jt(e){let t=(0,K.useLoaderData)(),n=(0,K.useFetcher)(),r=(0,K.useFetcher)(),a=e.data??t,s=e.fetcher??n,l=e.integrityFetcher??r;return a?(0,i.jsx)(Ye,{...e,data:a,fetcher:s,integrityFetcher:l}):(0,i.jsx)("div",{className:"p-8 text-center text-slate-500","data-testid":"storage-admin-loading",children:"\u30C7\u30FC\u30BF\u8AAD\u307F\u8FBC\u307F\u4E2D..."})}function Ee(e){return e.data?(0,i.jsx)(Ye,{...e,data:e.data,fetcher:e.fetcher??Qe,integrityFetcher:e.integrityFetcher??Qe}):(0,i.jsx)(Jt,{...e})}var Le=require("@aiquants/authz-core"),ot=require("@aiquants/console-ui/core"),P=require("@aiquants/enrichment-core"),B=require("@aiquants/governance-core"),N=require("zod");var xe=3e3;function M(e){return Math.round(performance.now()-e)}function x(e){return typeof e=="string"&&ue(e)?e:null}function H(e){let t=globalThis.process;return t===void 0?void 0:t.env[e]}function pe(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 Ze(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 Xe(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 et(e){let t=e.trim().split("://",1)[0]?.toLowerCase();if(t&&e.includes("://"))return t.endsWith("s")||t.includes("+s")}function Wt(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 Ce(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 tt(e){let t=e?.qdrantApiKey??H("QDRANT_API_KEY")??"",n=e?.timeoutMs??xe,r=performance.now(),a="";try{a=pe(e?.qdrantUrl??H("QDRANT_URL"),"QDRANT_URL");let s={};t&&(s["api-key"]=t);let[l,u]=await Promise.all([fetch(`${a}/`,{headers:s,signal:AbortSignal.timeout(n)}),fetch(`${a}/collections`,{headers:s,signal:AbortSignal.timeout(n)})]);if(!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);if(!u.ok)throw new Error(`HTTP ${u.status}: ${u.statusText} (/collections)`);let d=await l.json(),c=M(r),y=(await u.json()).result?.collections?.length??0;return{serviceName:"Qdrant",category:"vector",status:"connected",version:x(d.version),endpoint:a,latencyMs:c,details:{engine:x(d.title),collectionsCount:y,restPort:Wt(a)??null,tls:et(a)??null}}}catch(s){let l=M(r),u=s instanceof Error?s.message:String(s);return{serviceName:"Qdrant",category:"vector",status:"error",version:null,endpoint:a,latencyMs:l,details:{},errorMessage:u}}}async function nt(e){let t=e?.timeoutMs??xe,n=performance.now(),r=x(e?.neo4jBoltUri??H("NEO4J_URI")),a=r===null?"":r;try{let s=e?.graphReader;if(!s)throw new Error("Graph reader not configured");let l=e?.tenantId,[u,d]=await Promise.all([Ce(s("CALL dbms.components() YIELD versions, edition RETURN versions[0] AS version, edition",{}),t),Ce(l?s("MATCH (n {tenantId: $tenantId}) RETURN count(n) AS node_count",{tenantId:l}):s("RETURN null AS node_count",{}),t)]);if(!u.ok)throw new Error(u.reason);if(!d.ok)throw new Error(d.reason);let[c,m]=u.rows[0]??[],y=d.rows[0]?.[0],v=M(n);return{serviceName:"Neo4j",category:"graph",status:"connected",version:x(c),endpoint:a,latencyMs:v,details:{edition:x(m),boltUri:r,nodeCount:typeof y=="number"?y:null,tls:r===null?null:et(r)??null}}}catch(s){let l=M(n),u=s instanceof Error?s.message:String(s);return{serviceName:"Neo4j",category:"graph",status:"error",version:null,endpoint:a,latencyMs:l,details:{},errorMessage:u}}}async function rt(e){let t=performance.now(),n="",r=Xe(e?.redisTls,H("REDIS_TLS")),a=Number.NaN;try{let s=e?.redisClient;if(!s)throw new Error("Redis client not configured");let l=pe(e?.redisHost??H("REDIS_HOST"),"REDIS_HOST");a=Ze(e?.redisPort,H("REDIS_PORT"),"REDIS_PORT"),n=`${r===!1?"redis":"rediss"}://${l}:${a}`,await s.ping();let u=await s.info("server"),d=x(u.match(/redis_version:([^\r\n]+)/)?.[1]),c=null;if(typeof s.dbSize=="function")try{c=await s.dbSize()}catch{c=null}let m=M(t);return{serviceName:"Redis",category:"cache",status:"connected",version:d,endpoint:n,latencyMs:m,details:{totalKeys:c,port:a,tls:r??null,database:0}}}catch(s){let l=M(t),u=s instanceof Error?s.message:String(s);return{serviceName:"Redis",category:"cache",status:"error",version:null,endpoint:n,latencyMs:l,details:{},errorMessage:u}}}function Yt(e){let t=e.match(/Microsoft SQL Server \d+ \([^)]+\)/);return x(t===null?e.substring(0,30):t[0].replace("Microsoft SQL Server ",""))}async function st(e){let t=performance.now(),n="",r=Xe(e?.sqlServerTls,H("SQL_SERVER_TLS")),a=Number.NaN;try{let s=e?.sqlServerExecute;if(!s)throw new Error("SQL Server executor not configured");let l=pe(e?.sqlServerHost??H("SQL_SERVER_HOST"),"SQL_SERVER_HOST");a=Ze(e?.sqlServerPort,H("SQL_SERVER_PORT"),"SQL_SERVER_PORT"),n=`${l}:${a}`;let u=await s(),d=x(u.db_name),c=x(u.version),m=c===null?null:x(c.split(`
|
|
2
|
-
`)[0]),y=m===null?null:Yt(m),v=M(t);return{serviceName:"SQL Server",category:"database",status:"connected",version:y,endpoint:n,latencyMs:v,details:{database:d,port:a,tls:r??null,fullVersion:m}}}catch(s){let l=M(t),u=s instanceof Error?s.message:String(s);return{serviceName:"SQL Server",category:"database",status:"error",version:null,endpoint:n,latencyMs:l,details:{},errorMessage:u}}}async function it(e){let t=e?.timeoutMs??xe,n=performance.now(),r="";try{r=pe(e?.backendApiHost??H("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(),l=Object.keys(s.paths??{}).length,u=M(n);return{serviceName:"AI Quant API",category:"api",status:"connected",version:x(s.info?.version),endpoint:r,latencyMs:u,details:{title:x(s.info?.title),endpointsCount:l}}}catch(a){let s=M(n),l=a instanceof Error?a.message:String(a);return{serviceName:"AI Quant API",category:"api",status:"error",version:null,endpoint:r,latencyMs:s,details:{},errorMessage:l}}}async function Oe(e){let[t,n,r,a,s]=await Promise.all([tt(e),nt(e),rt(e),st(e),it(e)]),l=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:l,checkedAt:new Date().toISOString()}}var Zt=N.z.object({templateText:N.z.string(),modelName:N.z.string(),temperature:N.z.number(),maxOutputTokens:N.z.number(),responseSchema:N.z.union([N.z.record(N.z.string(),N.z.unknown()),N.z.string(),N.z.null()]).optional(),endpointBaseUrl:N.z.string().nullable()}).strict(),Xt=N.z.discriminatedUnion("mode",[N.z.object({mode:P.IntegrityRunModeSchema.extract(["SCAN"]),basisRunUid:N.z.null()}).strict(),N.z.object({mode:P.IntegrityRunModeSchema.extract(["REPAIR"]),basisRunUid:N.z.string().uuid()}).strict()]),en=N.z.object({runUid:N.z.string().uuid()}).strict();function lt(e){return e==="start_integrity_run"?"start":e==="cancel_integrity_run"?"cancel":null}function Y(e,t){return e.issues.map(n=>`${n.path.length===0?t:n.path.join(".")}: ${n.message}`).join("; ")}function tn(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 nn(e){let t=P.PipelineRunSummarySchema.array().safeParse(e);if(!t.success)throw new Error(`getRecentPipelineRuns answered something that is not a run summary: ${Y(t.error,"getRecentPipelineRuns")}`);return t.data}function rn(e){let t=P.PipelineStepMetricSchema.array().safeParse(e);if(!t.success)throw new Error(`getPipelineStepMetrics answered something that is not a step metric: ${Y(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 sn(e){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`pipelineStepMetricWindow must be a positive safe integer, got ${String(e)}`);return e}async function an(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=P.IntegrityAuditOverviewSchema.safeParse(n);return r.success?{ok:!0,value:r.data}:{ok:!1,status:null,reason:`readIntegrityAuditOverview answered something that is not an audit overview: ${Y(r.error,"readIntegrityAuditOverview")}`}}function on(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 Fe(e){let{store:t,healthProbeOptions:n,resourceKey:r="storage_admin",requireUser:a,requirePermission:s,resolveTenantId:l,authorizeIngest:u,canReadIntegrityFindings:d,canUpdateKnowledge:c}=e;async function m(v){let{request:b}=v;if(!await a(b))throw new Response("\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002",{status:401});try{await s(b,{resourceKey:r,action:"read"})}catch(ae){throw ae instanceof Le.AuthzDeniedError?new Response("\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",{status:403}):ae}let f=await l(b),V=sn(t.pipelineStepMetricWindow),[$,O,k]=await Promise.all([t.getFeatureFlags(f),t.getSystemParameters(f),t.getSyncCounts(f)]),L={featureFlags:$,systemParameters:O,syncCounts:k},[Q,G,z,F,A,j,re,D,Z,se,ge,ye,fe,p,J,be,ie,Se,E,W,Re]=await Promise.all([t.getConfidentialityPolicies(f),t.getTranscriptionVocabulary(f),t.getTranscriptionReferences(f),t.getUnresolvedReferenceUris(f),t.getPoliciesMissingDestination(f),t.getPromptTemplates(f),t.getClassificationRules(f),t.getFailedSyncItems(f),t.getGraphSchema(f),an(t,f),d(b),c(b),t.getUnresolvedEntities(f),t.getQdrantCollections(f),Oe({...n,tenantId:f}),t.getRecentIngestItems(f),t.getOntologyStatus(f,L),t.getEnrichmentStrategies(f),t.getStrategyVariants(f),t.getPipelineStepMetrics(f),t.getRecentPipelineRuns(f)]),he=t.getCircuitBreakerStatus();return{tenantId:f,featureFlags:L.featureFlags,confidentialityPolicies:Q,transcriptionVocabulary:G,transcriptionReferences:z,unresolvedReferenceUris:F,policiesMissingDestination:A,systemParameters:L.systemParameters,promptTemplates:j,classificationRules:re,classificationRuleConsumer:t.classificationRuleConsumer??null,syncCounts:L.syncCounts.counts,totalFiles:L.syncCounts.total,failedSyncItems:D,circuitBreakerStatus:he,pipelineStepMetrics:rn(W),pipelineStepMetricWindow:V,recentPipelineRuns:nn(Re),displayTimeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,graphSchema:Z,enrichmentStrategies:Se,strategyVariants:E,integrityAudit:se,canReadIntegrityFindings:ge,canUpdateKnowledge:ye,unresolvedEntities:fe,qdrantCollections:p,systemHealth:J,recentIngestItems:be,ontologyStatus:ie}}async function y(v){let{request:b}=v,I=await a(b);if(!I)return Response.json({error:"\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002"},{status:401});if(I.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(I.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 f=I.email,V=I.accessToken===null?void 0:I.accessToken;try{await s(b,{resourceKey:r,action:"update"})}catch(F){if(F instanceof Le.AuthzDeniedError)return await cn(b);throw F}let $=await l(b),O=await b.formData(),k=String(O.get("intent")??"");if(k==="refresh_health")return Response.json({success:!0,refreshed:!0});let L=await un(t,$,k,O,f);if(L)return L;let Q=await dn(t,$,k,O,f,V);if(Q)return Q;let G=await pn(t,$,k,O,V,()=>d(b));if(G)return G;if(k==="resolve_entity"){let F=String(O.get("entityId")??""),A=String(O.get("action")??"");if(!F||A!=="merge"&&A!=="promote")return Response.json({error:"Valid entityId and action ('merge' | 'promote') are required"},{status:400});try{return await t.resolveEntity($,F,A),Response.json({success:!0,entityId:F,action:A})}catch(j){return Response.json({error:j instanceof Error?j.message:String(j)},{status:400})}}let z=await yn(t,$,k,O,f,b,u,V);return z||Response.json({error:`Unknown intent: ${k}`},{status:400})}return{loader:m,action:y}}function ke(e){let t=String(e??"").trim();return t===""?null:t}function me(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isSafeInteger(n)||n<=0))return n}function ln(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isFinite(n)||n<=0))return n}async function un(e,t,n,r,a){if(n==="update_enrichment_strategy"){let s=String(r.get("stage")??"");if(!(0,P.isEnrichmentStageKey)(s))return Response.json({error:"stage must be a canonical enrichment stage key"},{status:400});let l=me(r.get("strategyId")),u=me(r.get("domainId"));if(l==null||u===void 0||u===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:l,domainId:u,stage:s,enabled:d},a)}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:l,domainId:u,stage:s,enabled:d})}if(n==="toggle_flag"){let s=String(r.get("flagKey")??""),l=String(r.get("enabled")??"")==="true";if(!s)return Response.json({error:"flagKey is required"},{status:400});let u=await e.getFeatureFlags(t);return Object.hasOwn(u,s)?(await e.toggleFeatureFlag(t,s,l,a),Response.json({success:!0,flagKey:s,enabled:l})):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")??""),l=String(r.get("capability")??"");if(!(B.ConfidentialityLevelSchema.safeParse(s).success&&B.GovernedCapabilitySchema.safeParse(l).success))return Response.json({error:"confidentialityLevel and capability must be canonical values"},{status:400});let u=String(r.get("allowCloudProvider")??"")==="true";if(u&&!B.CLOUD_CAPABLE_CAPABILITIES.includes(l))return Response.json({error:`${l} 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:l,isEnabled:String(r.get("isEnabled")??"")==="true",allowCloudProvider:u,promptKey:d===""?null:d},a),Response.json({success:!0,confidentialityLevel:s,capability:l})}if(n==="save_transcription_term"){let s=String(r.get("term")??"").trim();if(!s)return Response.json({error:"term is required"},{status:400});let l=ln(r.get("boost"));if(l===void 0)return Response.json({error:"boost must be a number greater than zero, or absent to let the service decide"},{status:400});let u=me(r.get("id"));if(u===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:u,term:s,reading:ke(r.get("reading")),boost:l,domainKey:ke(r.get("domainKey")),isActive:String(r.get("isActive")??"true")==="true"},a)}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 l=me(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.saveTranscriptionReference(t,{id:l,fileUri:s,domainKey:ke(r.get("domainKey")),isActive:String(r.get("isActive")??"true")==="true"},a)}catch(u){return Response.json({error:u instanceof Error?u.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")??""),l=String(r.get("paramValue")??"");if(!s)return Response.json({error:"paramKey is required"},{status:400});let u=(await e.getSystemParameters(t)).find(c=>c.key===s);if(u===void 0)return Response.json({error:`paramKey names no parameter of this tenant: ${s}`},{status:400});let d=tn(u.data_type,l);if(d!==null)return Response.json({error:d},{status:400});try{(0,P.assertSystemParameterInRange)(s,Number(l))}catch(c){return Response.json({error:c.message},{status:400})}return await e.updateSystemParameter(t,s,l,a),Response.json({success:!0,paramKey:s,paramValue:l})}if(n==="update_prompt"){let s=String(r.get("templateKey")??""),l=String(r.get("payload")??"{}"),u;try{u=JSON.parse(l)}catch{return Response.json({error:"Invalid JSON payload"},{status:400})}if(!s)return Response.json({error:"templateKey is required"},{status:400});let d=Zt.safeParse(u);if(!d.success)return Response.json({error:`payload does not carry a prompt template update: ${Y(d.error,"payload")}`},{status:400});let c=d.data;try{return await e.updatePromptTemplate(t,s,c,a),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")??"[]"),l;try{l=JSON.parse(s)}catch{return Response.json({error:"Invalid orderedRuleIds JSON"},{status:400})}let u=on(l);if(u!==null)return Response.json({error:u},{status:400});let d=l;return await e.reorderClassificationRules(t,d,a),Response.json({success:!0,orderedRuleIds:d})}return null}async function dn(e,t,n,r,a,s){if(n==="retry_job"){let l=String(r.get("fileId")??"");if(!l)return Response.json({error:"fileId is required"},{status:400});try{return await e.retrySyncItem(t,l,a,s),Response.json({success:!0,fileId:l})}catch(u){return Response.json({error:u instanceof Error?u.message:String(u)},{status:400})}}if(n==="retry_all_failed")try{let{requeued:l,skipped:u}=await e.retryAllFailedSyncItems(t,a,s);return Response.json({success:!0,requeued:l,skipped:u})}catch(l){return Response.json({error:l instanceof Error?l.message:String(l)},{status:400})}return null}function ne(e,t,n){let r=P.IntegrityCommandFailureSchema.parse({command:e,code:t,status:n}),a=P.INTEGRITY_COMMAND_CODES.find(s=>s.code===r.code);return Response.json({failure:r},{status:a===void 0?502:a.status})}async function cn(e){let t=await e.formData().catch(()=>null),n=t===null?null:lt(t.get("intent"));return n===null?Response.json({error:"\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002"},{status:403}):ne(n,"FORBIDDEN",null)}async function at(e,t){let n;try{n=P.IntegrityCommandReplySchema.parse(await t())}catch{return ne(e,"UPSTREAM_FAILED",null)}return n.ok?Response.json({success:!0,runUid:n.runUid}):ne(e,(0,P.integrityCommandFailureCodeOf)(e,n.status,n.errorCode),n.status)}async function pn(e,t,n,r,a,s){let l=lt(n);if(l==="start"){let u=Xt.safeParse({mode:r.get("mode"),basisRunUid:r.get("basisRunUid")});if(!u.success)return Response.json({error:`start_integrity_run takes mode SCAN without basisRunUid, or mode REPAIR with basisRunUid (a UUID): ${Y(u.error,"form")}`},{status:400});let{mode:d,basisRunUid:c}=u.data;return a===void 0||d==="REPAIR"&&!await s()?ne(l,"FORBIDDEN",null):await at(l,()=>e.startIntegrityRun(t,d,c,a))}if(l==="cancel"){let u=en.safeParse({runUid:r.get("runUid")});return u.success?a===void 0?ne(l,"FORBIDDEN",null):await at(l,()=>e.cancelIntegrityRun(t,u.data.runUid,a)):Response.json({error:`cancel_integrity_run takes runUid (a UUID): ${Y(u.error,"form")}`},{status:400})}return null}function mn(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(!B.ConfidentialityLevelSchema.safeParse(t.confidentialityLevel).success)return`payload.confidentialityLevel must be one of ${B.ConfidentialityLevelSchema.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 gn(e){try{return(0,ot.formatCount)(e,le),null}catch{return`inspectFileUri answered a fileSize that is not a byte count (a non-negative safe integer): ${String(e)}`}}async function yn(e,t,n,r,a,s,l,u){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=mn(c);if(m)return Response.json({error:m},{status:400});let y=c,v=await l(s,y);if(v!==null)return Response.json({error:v},{status:403});try{let b=u===void 0?await e.ingestDocument(t,y,a):await e.ingestDocument(t,y,a,u);return Response.json({success:!0,result:b})}catch(b){return Response.json({error:b instanceof Error?b.message:String(b)},{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=u===void 0?await e.inspectFileUri(t,d):await e.inspectFileUri(t,d,u)}catch(y){return Response.json({error:y instanceof Error?y.message:String(y)},{status:400})}let m=gn(c.fileSize);return m!==null?Response.json({error:m},{status:400}):Response.json({success:!0,inspection:c})}return null}function fn(e){let t=Fe(e);return{loader:t.loader,action:t.action,View:Ee,server:t}}0&&(module.exports={StorageAdminConsoleView,checkAllSystemHealth,checkBackendApiHealth,checkNeo4jHealth,checkQdrantHealth,checkRedisHealth,checkSqlServerHealth,createStorageAdminApp,createStorageAdminServer});
|
|
1
|
+
"use strict";var Pe=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var Ot=Object.getOwnPropertyNames;var xt=Object.prototype.hasOwnProperty;var kt=(e,t)=>{for(var n in t)Pe(e,n,{get:t[n],enumerable:!0})},Lt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ot(t))!xt.call(e,o)&&o!==n&&Pe(e,o,{get:()=>t[o],enumerable:!(r=Ct(t,o))||r.enumerable});return e};var Ft=e=>Lt(Pe({},"__esModule",{value:!0}),e);var Nn={};kt(Nn,{StorageAdminConsoleView:()=>Fe,checkAllSystemHealth:()=>De,checkBackendApiHealth:()=>mt,checkNeo4jHealth:()=>dt,checkQdrantHealth:()=>ut,checkRedisHealth:()=>ct,checkSqlServerHealth:()=>pt,createStorageAdminApp:()=>Pn,createStorageAdminServer:()=>$e});module.exports=Ft(Nn);var _=require("@aiquants/console-ui"),D=require("@aiquants/enrichment-core"),R=require("@aiquants/enrichment-react"),h=require("@aiquants/governance-react"),g=require("react"),K=require("react-router");var ce="ja-JP";var jt=/[^\s\x1c-\x1f\x85\ufeff]/;function pe(e){return jt.test(e)}function re(e,t){return new Promise(n=>n(e())).catch(n=>t(n instanceof Error?n.message:String(n)))}var me=require("@aiquants/console-ui/core"),Je=require("@aiquants/enrichment-core"),T=require("react");var Ut=2e3,Dt=1e4;function Ne(e,t){return t.ok&&e.kind==="ready"&&(0,Je.isStrictlyEarlier)(t.value.readAt,e.value.readAt)?e:(0,me.keepLastGood)(e,t)}var Mt=401;function Ht(e){return e.kind==="failed"||e.refreshFailure!==null&&e.refreshFailure.status===Mt?null:e.value.active}function We(e,t){let[n,r]=(0,T.useState)(()=>({loaded:e,overview:Ne({kind:"loading"},e)}));n.loaded!==e&&r({loaded:e,overview:Ne(n.overview,e)});let o=(0,T.useRef)(t);o.current=t;let s=(0,T.useRef)(null);(0,T.useEffect)(()=>()=>s.current?.abort(),[]);let l=(0,T.useCallback)((c,m)=>re(m,y=>({ok:!1,status:null,reason:y})).then(y=>{c.aborted||r(I=>({loaded:I.loaded,overview:Ne(I.overview,y)}))}),[]),u=(0,T.useCallback)(()=>{let c=new AbortController;s.current=c,r(m=>({loaded:m.loaded,overview:(0,me.beginReload)(m.overview,"reload")})),l(c.signal,()=>o.current(c.signal))},[l]),d=(0,T.useCallback)(c=>l(c,()=>o.current(c)),[l]);return{overview:n.overview,reload:u,poll:d}}function $t(e){return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)}function Kt(){return document.visibilityState==="visible"}function qt(){return!0}function Ye(e,t,n){let r=(0,T.useSyncExternalStore)($t,Kt,qt),o=t&&r,s=(0,T.useRef)(o),l=e.kind==="ready",u=Ht(e),d=u===null?null:u.run.runUid,c=u===null?!1:u.isStale;(0,T.useEffect)(()=>{let m=o&&!s.current;if(s.current=o,!o||d===null&&!(m&&l))return;let y=new AbortController,I=c?Dt:Ut,b,w=async()=>{await n(y.signal),!y.signal.aborted&&d!==null&&(b=setTimeout(w,I))};return b=setTimeout(w,m?0:I),()=>{y.abort(),clearTimeout(b)}},[o,l,d,c,n])}var Te={columns:2,className:"grid-cols-2",spanClassNames:{1:"col-span-1",2:"col-span-2"}},_e={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"}},Ee={className:"@min-[82rem]:grid-flow-col @min-[82rem]:auto-cols-fr @min-[82rem]:grid-cols-none",lastTabClassName:"@min-[82rem]:col-auto"};function Ce(e,t){let n=t%e.columns,r=n===0?1:e.columns-n+1;return e.spanClassNames[r]}var a=require("react/jsx-runtime"),Ze="tab",xe={key:"knowledge-authority",phrases:["\u6A29\u5A01\u53F0\u5E33 & \u898F\u7A0B\u885D\u7A81"]},ke={key:"pipeline",phrases:["\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3 & \u63A5\u7D9A\u72B6\u614B"]},Le={key:"parameters",phrases:["\u30E2\u30C7\u30EB & \u30D1\u30E9\u30E1\u30FC\u30BF\u8A2D\u5B9A"]},Xe="\u30A8\u30F3\u30EA\u30C3\u30C1\u30E1\u30F3\u30C8\u540C\u671F\u30B9\u30C6\u30FC\u30BF\u30B9",Bt="\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",q=[{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"]},ke,{key:"knowledge-graph",phrases:["\u30CA\u30EC\u30C3\u30B8\u30B0\u30E9\u30D5","\u63A2\u7D22"]},Le,{key:"prompts",phrases:["\u30D7\u30ED\u30F3\u30D7\u30C8 & \u30C9\u30E9\u30A4\u30E9\u30F3"]},xe,{key:"data-retention",phrases:["\u30C7\u30FC\u30BF\u4FDD\u6301 & \u6574\u5408\u6027\u76E3\u67FB"]}];function Oe(e){return e.phrases.join("")}function Vt(e){return e!==null&&q.some(t=>t.key===e)}var Gt="Tri-Store \u30C7\u30FC\u30BF\u6574\u5408\u6027\u76E3\u67FB";function Qt(e){return`\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${(0,_.reasonAside)(e)}\u3002`}var zt=(0,_.resolveConsoleUiLabels)("ja");function Jt(e){return zt.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${(0,_.reasonAside)(t)}\u3002`)}var et={state:"idle",formData:null,data:null,submit:()=>Promise.resolve()};function it({data:e,fetcher:t,integrityFetcher:n,renderHeader:r,graphTraversal:o,onBrowseGraphNodes:s,onSimulateGovernance:l,onRefreshIngestQueue:u,onSearch:d,onLoadDocumentRuns:c,onCompareVariants:m,loadIntegrityOverview:y,loadIntegrityFindings:I,policyConflicts:b,documentAuthority:w}){let[f,V]=(0,g.useState)(null),[$,x]=(0,g.useState)(null),[k,L]=(0,g.useState)(!1),G=(0,g.useMemo)(()=>{if(s!==void 0)return(i,S)=>{L(!0),re(()=>s(i,S),v=>({ok:!1,reason:v})).then(v=>{L(!1),x(v.ok?null:v.reason),v.ok&&V(v.page)})}},[s]),[Q,z]=(0,K.useSearchParams)(),F=Q.get(Ze),A=Vt(F)?F:q[0].key,j=i=>{z(S=>{let v=new URLSearchParams(S);return v.set(Ze,i),v},{replace:!1,preventScrollReset:!0})},ie=Yt(e.recentIngestItems,u,A==="ingest"),U=We(e.integrityAudit,y);Ye(U.overview,A==="data-retention",U.poll);let Z=(0,g.useRef)(null),ae=(0,_.useFocusRescue)(()=>Z.current),[fe,be]=(0,g.useState)(0),Se=(0,g.useCallback)(()=>be(i=>i+1),[]),p=ie===null?e:{...e,recentIngestItems:[...ie]},J=(0,g.useRef)({}),Re=(0,g.useCallback)(()=>J.current[A]??null,[A]),oe=(0,g.useMemo)(()=>Zt(e.enrichmentStrategies),[e.enrichmentStrategies]),he=(0,g.useMemo)(()=>e.strategyVariants.map(Xt),[e.strategyVariants]),E=nn(c),W=E.open,le=W===void 0?void 0:i=>W(i,null),ve=W===void 0?void 0:i=>W(i.metadataId,i.id),ue=(i,S)=>{let v=q.length-1,C;if(i.key==="ArrowRight"||i.key==="ArrowDown")C=S===v?0:S+1;else if(i.key==="ArrowLeft"||i.key==="ArrowUp")C=S===0?v:S-1;else if(i.key==="Home")C=0;else if(i.key==="End")C=v;else return;i.preventDefault();let de=q[C].key;j(de),J.current[de]?.focus()},Ke={...p.featureFlags};if(t.formData&&t.formData.get("intent")==="toggle_flag"){let i=String(t.formData.get("flagKey")??""),S=String(t.formData.get("enabled")??"")==="true";i&&(Ke[i]=S)}let bt=t.data&&"inspection"in t.data?t.data.inspection:void 0,X=t.state==="idle"?null:t.formData?.get("intent"),St=X==="inspect_uri",Rt=X==="ingest_document",ht=X==="retry_job"||X==="retry_all_failed",vt=X==="resolve_entity",qe=n.state==="idle"?null:n.formData?.get("intent"),It=qe==="start_integrity_run"?{kind:"starting",mode:D.IntegrityRunModeSchema.parse(n.formData?.get("mode"))}:qe==="cancel_integrity_run"?{kind:"cancelling"}:{kind:"idle"},wt=(0,K.useRevalidator)(),[At,Ie]=(0,g.useState)(null),Be=A!=="data-retention";(0,g.useEffect)(()=>{Be&&Ie(null)},[Be]);let Pt=i=>{let S=i?.failure;if(S===void 0){Ie(null);return}Ie(v=>({failure:S,occurrence:v===null?1:v.occurrence+1})),(0,h.integrityFailureNeedsOverviewReread)(S)&&wt.revalidate()},[ee,te]=(0,g.useState)(null),Nt=i=>{if(t.state!=="idle"){te({metadataId:i,intent:"retry_job",status:"refused",error:Bt});return}te({metadataId:i,intent:"retry_job",status:"pending",error:null}),t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},[Ve,we]=(0,g.useState)("console"),Tt=(i,S)=>{if(ee!==null&&ee.status==="pending"){if(S==="retry_job"){let v=i?.error;te(v===void 0?{...ee,status:"accepted",error:null}:{...ee,status:"refused",error:v}),we("inspector");return}te(null)}we("console")},{settledIntent:_t,submitAndAwait:Ge}=nt(t,Tt);nt(n,i=>{we("integrity"),Pt(i)});let Qe=Ve==="inspector"?void 0:(Ve==="console"?t:n).data?.error,Ae=i=>{j(i),J.current[i]?.focus()},ze=(0,g.useRef)(null),Et={strategies:{label:Oe(ke),onOpen:()=>Ae(ke.key),closesInspector:!0},projectionPolicy:{label:Oe(Le),onOpen:()=>Ae(Le.key),closesInspector:!0},failedSync:{label:Xe,onOpen:()=>ze.current?.focus(),closesInspector:!1}},ne=_t==="retry_all_failed"&&t.data?.skipped!==void 0&&t.data.requeued!==void 0?{requeued:t.data.requeued,skipped:t.data.skipped}:null;return(0,a.jsx)(_.ConsoleUiRoot,{locale:"ja",formatLocale:ce,timeZone:p.displayTimeZone,testId:"storage-admin-console-ui",children:(0,a.jsxs)("div",{className:"container mx-auto space-y-6 p-6 font-sans text-slate-900","data-testid":"storage-admin-console",children:[Qe&&(0,a.jsx)("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:Qe}),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}):(0,a.jsxs)("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:[(0,a.jsxs)("div",{children:[(0,a.jsx)("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"}),(0,a.jsxs)("p",{className:"mt-1 text-slate-500 text-sm",children:["\u30C6\u30CA\u30F3\u30C8: ",(0,a.jsx)("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"]})]}),(0,a.jsx)("div",{className:"flex items-center gap-2",children:(0,a.jsxs)("button",{type:"button","data-testid":"header-health-status-button",onClick:()=>j("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:[(0,a.jsx)("span",{className:`h-2 w-2 rounded-full ${p.systemHealth.allHealthy?"bg-emerald-500":"bg-amber-500"}`}),(0,a.jsxs)("span",{children:["\u5468\u8FBA\u6A5F\u80FD: ",p.systemHealth.allHealthy?"\u5168\u30B5\u30FC\u30D3\u30B9\u6B63\u5E38":"\u63A5\u7D9A\u8981\u78BA\u8A8D"]})]})})]}),(0,a.jsxs)("div",{className:"w-full space-y-6",children:[(0,a.jsx)("div",{className:"@container w-full","data-testid":"storage-admin-tablist-frame",children:(0,a.jsx)("div",{className:`grid w-full ${Te.className} ${_e.className} ${Ee.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:q.map((i,S)=>{let v=A===i.key;return(0,a.jsx)("button",{id:`tab-${i.key}`,type:"button",role:"tab",ref:C=>{J.current[i.key]=C},"aria-selected":v,"aria-controls":`panel-${i.key}`,tabIndex:v?0:-1,"data-testid":`tab-trigger-${i.key}`,onKeyDown:C=>ue(C,S),onClick:()=>j(i.key),className:`wrap-anywhere break-keep rounded-lg px-3 py-2.5 text-center font-medium text-sm transition-all ${S===q.length-1?`${Ce(Te,q.length)} ${Ce(_e,q.length)} ${Ee.lastTabClassName}`:""} ${v?"bg-white text-slate-900 shadow-sm":"text-slate-600 hover:bg-slate-200/50 hover:text-slate-900"}`,children:i.phrases.map((C,de)=>(0,a.jsxs)(g.Fragment,{children:[de>0&&(0,a.jsx)("wbr",{}),C]},C))},i.key)})})}),E.metadataId!==null&&(0,a.jsx)(R.PipelineRunInspector,{metadataId:E.metadataId,runs:E.runs,selectedRunId:E.selectedRunId,onSelectRun:E.selectRun,isLoading:E.isLoading,failure:E.failure,onClose:E.close,openRequest:E.openRequest,returnFocusFallback:Re}),A==="search"&&(0,a.jsxs)("div",{role:"tabpanel",id:"panel-search","aria-labelledby":"tab-search",className:"space-y-6","data-testid":"tab-content-search",children:[(0,a.jsx)(R.MetadataSearchWorkbench,{tenantId:p.tenantId,onSearch:d,circuitBreakerStatus:p.circuitBreakerStatus}),m!==void 0&&(0,a.jsx)(R.ModelComparisonWorkbench,{variants:he,onCompare:m})]}),A==="ingest"&&(0,a.jsx)("div",{role:"tabpanel",id:"panel-ingest","aria-labelledby":"tab-ingest",className:"space-y-6","data-testid":"tab-content-ingest",children:(0,a.jsx)(R.DocumentIngestConsole,{tenantId:p.tenantId,policies:p.confidentialityPolicies,domainOptions:oe,recentItems:p.recentIngestItems,inspectionResult:bt,isInspecting:St,isSubmitting:Rt,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:le})}),A==="pipeline"&&(0,a.jsxs)("div",{role:"tabpanel",id:"panel-pipeline","aria-labelledby":"tab-pipeline",className:"space-y-6","data-testid":"tab-content-pipeline",children:[(0,a.jsx)(R.PipelineFlowViewer,{featureFlags:p.featureFlags,metrics:p.pipelineStepMetrics,metricSampleWindow:p.pipelineStepMetricWindow}),(0,a.jsx)(en,{runs:p.recentPipelineRuns,onOpenRun:ve}),(0,a.jsx)(R.EnrichmentStrategyBoard,{strategies:p.enrichmentStrategies,featureFlags:p.featureFlags,isUpdating:t.state!=="idle",onToggleStage:(i,S,v)=>t.submit({intent:"update_enrichment_strategy",strategyId:String(i.id),domainId:String(i.domainId),stage:S,enabled:String(v)},{method:"post"})}),(0,a.jsx)(R.InfrastructureHealthMonitor,{health:p.systemHealth,isRefreshing:t.state!=="idle",onRefresh:()=>t.submit({intent:"refresh_health"},{method:"post"})})]}),A==="knowledge-graph"&&(0,a.jsxs)("div",{role:"tabpanel",id:"panel-knowledge-graph","aria-labelledby":"tab-knowledge-graph",className:"space-y-6","data-testid":"tab-content-knowledge-graph",children:[(0,a.jsx)(R.OntologyStatusCard,{tenantId:p.tenantId,ontologyStatus:p.ontologyStatus}),(0,a.jsx)(h.KnowledgeGraphExplorer,{topologyMaxLabels:D.GRAPH_INDEX_LIMITS.topologyLabels.default,schema:p.graphSchema,tenantId:p.tenantId,unresolvedEntities:p.unresolvedEntities,traversal:o,onBrowseLabel:G,nodeIndexPage:f,nodeIndexFailure:$,isNodeIndexLoading:k,isResolving:vt,onResolveEntity:(i,S)=>{t.submit({intent:"resolve_entity",entityId:i,action:S},{method:"post"})}})]}),A==="parameters"&&(0,a.jsxs)("div",{role:"tabpanel",id:"panel-parameters","aria-labelledby":"tab-parameters",className:"space-y-6","data-testid":"tab-content-parameters",children:[(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-2",children:[(0,a.jsx)(h.FeatureFlagBoard,{flags:Ke,isUpdating:t.state!=="idle",onToggleFlag:(i,S)=>{t.submit({intent:"toggle_flag",flagKey:i,enabled:String(S)},{method:"post"})}}),(0,a.jsx)(h.ClassificationRuleEditor,{rules:p.classificationRules,domainOptions:oe,consultedBy:p.classificationRuleConsumer,onReorderRules:i=>{t.submit({intent:"reorder_rules",orderedRuleIds:JSON.stringify(i)},{method:"post"})}})]}),p.policiesMissingDestination.length>0&&(0,a.jsxs)("div",{"data-testid":"policies-missing-destination",role:"alert",style:{padding:"10px 12px",borderRadius:"6px",backgroundColor:"#fef2f2",color:"#b91c1c",fontSize:"12px"},children:[(0,a.jsx)("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",(0,a.jsx)("ul",{style:{margin:"6px 0 0",paddingInlineStart:"18px"},children:p.policiesMissingDestination.map(i=>(0,a.jsxs)("li",{"data-testid":`missing-destination-${i.confidentialityLevel}-${i.capability}`,children:[i.confidentialityLevel," / ",i.capability," \u2192 ",i.promptKey," (",i.modelProvider,") \u306E ",(0,a.jsx)("code",{children:"extra_params.base_url"})]},`${i.confidentialityLevel}:${i.capability}`))}),(0,a.jsx)("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"})]}),(0,a.jsx)(h.ConfidentialityPolicyBoard,{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"})}}),(0,a.jsx)(h.TranscriptionAdaptationBoard,{vocabulary:p.transcriptionVocabulary,references:p.transcriptionReferences,unresolvedUris:p.unresolvedReferenceUris,isUpdating:t.state!=="idle",onSaveTerm:i=>Ge({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=>Ge({intent:"save_transcription_reference",id:i.id===null?"":String(i.id),fileUri:i.fileUri,domainKey:i.domainKey??"",isActive:String(i.isActive)},{method:"post"})}),(0,a.jsx)(h.SystemParameterTable,{parameters:p.systemParameters,onSaveParameter:(i,S)=>{t.submit({intent:"update_parameter",paramKey:i,paramValue:String(S)},{method:"post"})}})]}),A==="prompts"&&(0,a.jsxs)("div",{role:"tabpanel",id:"panel-prompts","aria-labelledby":"tab-prompts",className:"space-y-6","data-testid":"tab-content-prompts",children:[(0,a.jsx)(h.PromptTemplateConsole,{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"})}}),(0,a.jsx)(h.GovernanceDryRunConsole,{onSimulate:l})]}),A==="knowledge-authority"&&(0,a.jsxs)("div",{role:"tabpanel",id:"panel-knowledge-authority","aria-labelledby":"tab-knowledge-authority",className:"space-y-6","data-testid":"tab-content-knowledge-authority",children:[(0,a.jsx)(h.DocumentAuthorityRegistry,{host:w,canUpdate:p.canUpdateKnowledge,onPolicyConflictsChanged:Se}),(0,a.jsx)(h.PolicyConflictQueue,{host:b,revision:fe})]}),A==="data-retention"&&(0,a.jsxs)("div",{role:"tabpanel",id:"panel-data-retention","aria-labelledby":"tab-data-retention",className:"space-y-6","data-testid":"tab-content-data-retention",children:[U.overview.kind==="ready"?(0,a.jsx)("div",{ref:ae,children:(0,a.jsx)(h.TriStoreIntegrityAudit,{overview:U.overview.value,canReadFindings:p.canReadIntegrityFindings,command:It,commandFailure:At,onStartRun:(i,S)=>{n.submit(S===null?{intent:"start_integrity_run",mode:i}:{intent:"start_integrity_run",mode:i,basisRunUid:S},{method:"post"})},onCancelRun:i=>{n.submit({intent:"cancel_integrity_run",runUid:i},{method:"post"})},loadFindings:I,refreshFailure:U.overview.refreshFailure===null?null:U.overview.refreshFailure.reason,headingRef:Z,onShowHistory:le,resync:{onResync:Nt,onDismiss:()=>te(null),feedback:ee},remedyDestinations:Et})}):(0,a.jsx)(_.Card,{title:Gt,testId:"audit-overview-failed",headingRef:Z,children:(0,a.jsx)(_.ResourceFailed,{failure:U.overview,onReload:U.reload,forbiddenMessage:"\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u95B2\u89A7\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",failureMessage:Qt,rescueRef:ae,testId:"audit-overview-failed-resource"})}),(0,a.jsx)(h.PolicyConflictSummaryCard,{host:b,knowledgeTabLabel:Oe(xe),onOpenKnowledgeTab:()=>Ae(xe.key)}),ne!==null&&ne.skipped.length>0&&(0,a.jsxs)("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:[(0,a.jsxs)("strong",{children:["\u4E00\u62EC\u518D\u8A66\u884C: ",ne.requeued," \u4EF6\u3092\u518D\u6295\u5165\u3057\u3001",ne.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",(0,a.jsx)("ul",{className:"mt-1.5 list-disc ps-5",children:ne.skipped.map(i=>(0,a.jsxs)("li",{"data-testid":`retry-all-skipped-${i.metadataId}`,children:["#",i.metadataId,": ",i.reason]},i.metadataId))})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6 md:grid-cols-2",children:[(0,a.jsx)("section",{ref:ze,tabIndex:-1,"aria-label":Xe,"data-testid":"sync-status-region",children:(0,a.jsx)(R.SyncStatusMonitor,{counts:p.syncCounts,totalFiles:p.totalFiles,failedItems:p.failedSyncItems,isRetrying:ht,onRetryItem:i=>{t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},onRetryAll:()=>{t.submit({intent:"retry_all_failed"},{method:"post"})}})}),(0,a.jsx)(R.QdrantStorageCard,{overview:p.qdrantCollections,health:{healthy:p.systemHealth.services.qdrant.status==="connected",latency_ms:p.systemHealth.services.qdrant.latencyMs}})]})]})]})]})})}var Wt=new Set(D.EnrichmentSyncStatusSchema.options.filter(e=>e!=="SYNCED"&&!e.startsWith("FAILED"))),tt=2e3;function Yt(e,t,n){let[r,o]=(0,g.useState)(null),s=(0,g.useRef)(t);s.current=t;let l=(0,g.useRef)(e);l.current!==e&&(l.current=e,r!==null&&o(null));let d=(r??e)?.some(c=>Wt.has(c.syncStatus))===!0;return(0,g.useEffect)(()=>{if(!(n&&d&&s.current))return;let c=!1,m,y=async()=>{let I=s.current;if(I!==void 0){try{let b=await I();if(c)return;o(b)}catch{if(c)return}m=setTimeout(y,tt)}};return m=setTimeout(y,tt),()=>{c=!0,clearTimeout(m)}},[d,n]),r}function nt(e,t){let n=(0,g.useRef)(t);n.current=t;let r=(0,g.useRef)(null),o=(0,g.useRef)(!1),s=(0,g.useRef)(null);if(e.state!=="idle"){o.current=!0;let u=e.formData?.get("intent");typeof u=="string"&&(r.current=u)}(0,g.useEffect)(()=>{if(e.state!=="idle"||!o.current)return;o.current=!1,n.current(e.data,r.current);let u=s.current;if(u===null)return;s.current=null;let d=e.data?.error;typeof d=="string"?u.reject(new Error(d)):u.resolve()},[e.state,e.data]);let l=(0,g.useCallback)((...u)=>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(...u)}),[e]);return{settledIntent:e.state==="idle"?r.current:null,submitAndAwait:l}}function Zt(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 Xt(e){return{strategyId:e.strategyId,label:`${e.domainKey} / ${e.variantKey}`,embeddingModel:e.embeddingModel}}function en({runs:e,onOpenRun:t}){return(0,a.jsxs)("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:[(0,a.jsx)("h2",{id:"pipeline-recent-runs-heading",className:"font-bold text-base text-slate-900",children:"\u76F4\u8FD1\u306E\u5B9F\u884C"}),e.length===0?(0,a.jsx)("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"}):(0,a.jsx)("div",{className:"relative mt-4 overflow-x-auto","data-testid":"pipeline-recent-runs-scroll",children:(0,a.jsxs)("table",{className:"w-full text-left text-[13px]",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"whitespace-nowrap border-slate-200 border-b border-solid text-[11px] text-slate-500 uppercase",children:[(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u5B9F\u884C"}),(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u6587\u66F8"}),(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u7A2E\u985E"}),(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u304D\u3063\u304B\u3051"}),(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u8A66\u884C"}),(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u72B6\u614B"}),(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u6B62\u307E\u3063\u305F\u6BB5"}),(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u958B\u59CB"}),(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u7D42\u4E86"}),(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:"\u8981\u6C42\u8005"}),t!==void 0&&(0,a.jsx)("th",{scope:"col",className:"px-3 py-2",children:(0,a.jsx)("span",{className:"sr-only","data-testid":"pipeline-recent-runs-action-header",children:"\u64CD\u4F5C"})})]})}),(0,a.jsx)("tbody",{children:e.map(n=>{let r=(0,R.pipelineRunPresentationKey)(n),o=R.PIPELINE_RUN_STATUS_PRESENTATION[r];return(0,a.jsxs)("tr",{className:"border-slate-100 border-b border-solid","data-testid":`pipeline-run-row-${n.id}`,"data-status":n.status,children:[(0,a.jsxs)("td",{className:"whitespace-nowrap px-3 py-2 font-mono","data-testid":`pipeline-run-id-${n.id}`,children:["#",n.id]}),(0,a.jsxs)("td",{className:"whitespace-nowrap px-3 py-2 font-mono","data-testid":`pipeline-run-metadata-${n.id}`,children:["#",n.metadataId]}),(0,a.jsx)("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-kind-${n.id}`,children:D.DOCUMENT_KIND_LABELS[n.documentKind]}),(0,a.jsx)("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-trigger-${n.id}`,"data-trigger":n.trigger,children:R.PIPELINE_TRIGGER_LABELS[n.trigger]}),(0,a.jsx)("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-attempt-${n.id}`,children:n.attempt}),(0,a.jsx)("td",{className:"px-3 py-2",children:(0,a.jsx)("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})}),(0,a.jsx)("td",{className:"px-3 py-2","data-testid":`pipeline-run-failed-step-${n.id}`,children:n.failedStepKey===null?"\u2014":D.PIPELINE_STEPS[n.failedStepKey].label}),(0,a.jsx)("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-started-${n.id}`,children:(0,a.jsx)(R.RecordedInstant,{iso:n.startedAt,testId:`pipeline-run-started-value-${n.id}`})}),(0,a.jsx)("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-finished-${n.id}`,children:(0,a.jsx)(R.FinishedInstant,{iso:n.finishedAt,testId:`pipeline-run-finished-value-${n.id}`})}),(0,a.jsx)("td",{className:"wrap-anywhere px-3 py-2","data-testid":`pipeline-run-requested-by-${n.id}`,children:n.requestedBy}),t!==void 0&&(0,a.jsx)("td",{className:"whitespace-nowrap px-3 py-2 text-right",children:(0,a.jsx)("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 rt={metadataId:null,runs:[],selectedRunId:null,isLoading:!1,failure:null};function tn(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"&&!pe(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 nn(e){let[t,n]=(0,g.useState)(rt),[r,o]=(0,g.useState)(0),s=(0,g.useRef)(0),l=(0,g.useRef)(null),u=(0,g.useMemo)(()=>{if(e!==void 0)return(m,y)=>{s.current+=1;let I=s.current;l.current?.abort();let b=new AbortController;l.current=b,o(w=>w+1),n({metadataId:m,runs:[],selectedRunId:y,isLoading:!0,failure:null}),re(()=>e(m,b.signal),w=>({ok:!1,status:null,reason:w})).then(w=>{if(s.current!==I)return;let f=w.ok?tn(w.value):Jt(w);if(!w.ok||f!==null){n({metadataId:m,runs:[],selectedRunId:y,isLoading:!1,failure:f});return}n({metadataId:m,runs:w.value,selectedRunId:y===null?rn(w.value):y,isLoading:!1,failure:null})})}},[e]),d=(0,g.useCallback)(m=>{n(y=>({...y,selectedRunId:m}))},[]),c=(0,g.useCallback)(()=>{s.current+=1,l.current?.abort(),l.current=null,n(rt)},[]);return{...t,openRequest:r,open:u,selectRun:d,close:c}}function rn(e){return e.length===0?null:e[0].id}function sn(e){let t=(0,K.useLoaderData)(),n=(0,K.useFetcher)(),r=(0,K.useFetcher)(),o=e.data??t,s=e.fetcher??n,l=e.integrityFetcher??r;return o?(0,a.jsx)(it,{...e,data:o,fetcher:s,integrityFetcher:l}):(0,a.jsx)("div",{className:"p-8 text-center text-slate-500","data-testid":"storage-admin-loading",children:"\u30C7\u30FC\u30BF\u8AAD\u307F\u8FBC\u307F\u4E2D..."})}function Fe(e){return e.data?(0,a.jsx)(it,{...e,data:e.data,fetcher:e.fetcher??et,integrityFetcher:e.integrityFetcher??et}):(0,a.jsx)(sn,{...e})}var He=require("@aiquants/authz-core"),yt=require("@aiquants/console-ui/core"),P=require("@aiquants/enrichment-core"),B=require("@aiquants/governance-core"),N=require("zod");var Ue=3e3;function H(e){return Math.round(performance.now()-e)}function O(e){return typeof e=="string"&&pe(e)?e:null}function M(e){let t=globalThis.process;return t===void 0?void 0:t.env[e]}function ge(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 at(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 ot(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 lt(e){let t=e.trim().split("://",1)[0]?.toLowerCase();if(t&&e.includes("://"))return t.endsWith("s")||t.includes("+s")}function an(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 je(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 ut(e){let t=e?.qdrantApiKey??M("QDRANT_API_KEY")??"",n=e?.timeoutMs??Ue,r=performance.now(),o="";try{o=ge(e?.qdrantUrl??M("QDRANT_URL"),"QDRANT_URL");let s={};t&&(s["api-key"]=t);let[l,u]=await Promise.all([fetch(`${o}/`,{headers:s,signal:AbortSignal.timeout(n)}),fetch(`${o}/collections`,{headers:s,signal:AbortSignal.timeout(n)})]);if(!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);if(!u.ok)throw new Error(`HTTP ${u.status}: ${u.statusText} (/collections)`);let d=await l.json(),c=H(r),y=(await u.json()).result?.collections?.length??0;return{serviceName:"Qdrant",category:"vector",status:"connected",version:O(d.version),endpoint:o,latencyMs:c,details:{engine:O(d.title),collectionsCount:y,restPort:an(o)??null,tls:lt(o)??null}}}catch(s){let l=H(r),u=s instanceof Error?s.message:String(s);return{serviceName:"Qdrant",category:"vector",status:"error",version:null,endpoint:o,latencyMs:l,details:{},errorMessage:u}}}async function dt(e){let t=e?.timeoutMs??Ue,n=performance.now(),r=O(e?.neo4jBoltUri??M("NEO4J_URI")),o=r===null?"":r;try{let s=e?.graphReader;if(!s)throw new Error("Graph reader not configured");let l=e?.tenantId,[u,d]=await Promise.all([je(s("CALL dbms.components() YIELD versions, edition RETURN versions[0] AS version, edition",{}),t),je(l?s("MATCH (n {tenantId: $tenantId}) RETURN count(n) AS node_count",{tenantId:l}):s("RETURN null AS node_count",{}),t)]);if(!u.ok)throw new Error(u.reason);if(!d.ok)throw new Error(d.reason);let[c,m]=u.rows[0]??[],y=d.rows[0]?.[0],I=H(n);return{serviceName:"Neo4j",category:"graph",status:"connected",version:O(c),endpoint:o,latencyMs:I,details:{edition:O(m),boltUri:r,nodeCount:typeof y=="number"?y:null,tls:r===null?null:lt(r)??null}}}catch(s){let l=H(n),u=s instanceof Error?s.message:String(s);return{serviceName:"Neo4j",category:"graph",status:"error",version:null,endpoint:o,latencyMs:l,details:{},errorMessage:u}}}async function ct(e){let t=performance.now(),n="",r=ot(e?.redisTls,M("REDIS_TLS")),o=Number.NaN;try{let s=e?.redisClient;if(!s)throw new Error("Redis client not configured");let l=ge(e?.redisHost??M("REDIS_HOST"),"REDIS_HOST");o=at(e?.redisPort,M("REDIS_PORT"),"REDIS_PORT"),n=`${r===!1?"redis":"rediss"}://${l}:${o}`,await s.ping();let u=await s.info("server"),d=O(u.match(/redis_version:([^\r\n]+)/)?.[1]),c=null;if(typeof s.dbSize=="function")try{c=await s.dbSize()}catch{c=null}let m=H(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 l=H(t),u=s instanceof Error?s.message:String(s);return{serviceName:"Redis",category:"cache",status:"error",version:null,endpoint:n,latencyMs:l,details:{},errorMessage:u}}}function on(e){let t=e.match(/Microsoft SQL Server \d+ \([^)]+\)/);return O(t===null?e.substring(0,30):t[0].replace("Microsoft SQL Server ",""))}async function pt(e){let t=performance.now(),n="",r=ot(e?.sqlServerTls,M("SQL_SERVER_TLS")),o=Number.NaN;try{let s=e?.sqlServerExecute;if(!s)throw new Error("SQL Server executor not configured");let l=ge(e?.sqlServerHost??M("SQL_SERVER_HOST"),"SQL_SERVER_HOST");o=at(e?.sqlServerPort,M("SQL_SERVER_PORT"),"SQL_SERVER_PORT"),n=`${l}:${o}`;let u=await s(),d=O(u.db_name),c=O(u.version),m=c===null?null:O(c.split(`
|
|
2
|
+
`)[0]),y=m===null?null:on(m),I=H(t);return{serviceName:"SQL Server",category:"database",status:"connected",version:y,endpoint:n,latencyMs:I,details:{database:d,port:o,tls:r??null,fullVersion:m}}}catch(s){let l=H(t),u=s instanceof Error?s.message:String(s);return{serviceName:"SQL Server",category:"database",status:"error",version:null,endpoint:n,latencyMs:l,details:{},errorMessage:u}}}async function mt(e){let t=e?.timeoutMs??Ue,n=performance.now(),r="";try{r=ge(e?.backendApiHost??M("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(),l=Object.keys(s.paths??{}).length,u=H(n);return{serviceName:"AI Quant API",category:"api",status:"connected",version:O(s.info?.version),endpoint:r,latencyMs:u,details:{title:O(s.info?.title),endpointsCount:l}}}catch(o){let s=H(n),l=o instanceof Error?o.message:String(o);return{serviceName:"AI Quant API",category:"api",status:"error",version:null,endpoint:r,latencyMs:s,details:{},errorMessage:l}}}async function De(e){let[t,n,r,o,s]=await Promise.all([ut(e),dt(e),ct(e),pt(e),mt(e)]),l=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:l,checkedAt:new Date().toISOString()}}var ln=N.z.object({templateText:N.z.string(),modelName:N.z.string(),temperature:N.z.number(),maxOutputTokens:N.z.number(),responseSchema:N.z.union([N.z.record(N.z.string(),N.z.unknown()),N.z.string(),N.z.null()]).optional(),endpointBaseUrl:N.z.string().nullable()}).strict(),un=N.z.discriminatedUnion("mode",[N.z.object({mode:P.IntegrityRunModeSchema.extract(["SCAN"]),basisRunUid:N.z.null()}).strict(),N.z.object({mode:P.IntegrityRunModeSchema.extract(["REPAIR"]),basisRunUid:N.z.string().uuid()}).strict()]),dn=N.z.object({runUid:N.z.string().uuid()}).strict();function ft(e){return e==="start_integrity_run"?"start":e==="cancel_integrity_run"?"cancel":null}function Y(e,t){return e.issues.map(n=>`${n.path.length===0?t:n.path.join(".")}: ${n.message}`).join("; ")}function cn(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 pn(e){let t=P.PipelineRunSummarySchema.array().safeParse(e);if(!t.success)throw new Error(`getRecentPipelineRuns answered something that is not a run summary: ${Y(t.error,"getRecentPipelineRuns")}`);return t.data}function mn(e){let t=P.PipelineStepMetricSchema.array().safeParse(e);if(!t.success)throw new Error(`getPipelineStepMetrics answered something that is not a step metric: ${Y(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 gn(e){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`pipelineStepMetricWindow must be a positive safe integer, got ${String(e)}`);return e}async function yn(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=P.IntegrityAuditOverviewSchema.safeParse(n);return r.success?{ok:!0,value:r.data}:{ok:!1,status:null,reason:`readIntegrityAuditOverview answered something that is not an audit overview: ${Y(r.error,"readIntegrityAuditOverview")}`}}function fn(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 $e(e){let{store:t,healthProbeOptions:n,resourceKey:r="storage_admin",requireUser:o,requirePermission:s,resolveTenantId:l,authorizeIngest:u,canReadIntegrityFindings:d,canUpdateKnowledge:c}=e;async function m(I){let{request:b}=I;if(!await o(b))throw new Response("\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002",{status:401});try{await s(b,{resourceKey:r,action:"read"})}catch(ue){throw ue instanceof He.AuthzDeniedError?new Response("\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",{status:403}):ue}let f=await l(b),V=gn(t.pipelineStepMetricWindow),[$,x,k]=await Promise.all([t.getFeatureFlags(f),t.getSystemParameters(f),t.getSyncCounts(f)]),L={featureFlags:$,systemParameters:x,syncCounts:k},[G,Q,z,F,A,j,ie,U,Z,ae,fe,be,Se,p,J,Re,oe,he,E,W,le]=await Promise.all([t.getConfidentialityPolicies(f),t.getTranscriptionVocabulary(f),t.getTranscriptionReferences(f),t.getUnresolvedReferenceUris(f),t.getPoliciesMissingDestination(f),t.getPromptTemplates(f),t.getClassificationRules(f),t.getFailedSyncItems(f),t.getGraphSchema(f),yn(t,f),d(b),c(b),t.getUnresolvedEntities(f),t.getQdrantCollections(f),De({...n,tenantId:f}),t.getRecentIngestItems(f),t.getOntologyStatus(f,L),t.getEnrichmentStrategies(f),t.getStrategyVariants(f),t.getPipelineStepMetrics(f),t.getRecentPipelineRuns(f)]),ve=t.getCircuitBreakerStatus();return{tenantId:f,featureFlags:L.featureFlags,confidentialityPolicies:G,transcriptionVocabulary:Q,transcriptionReferences:z,unresolvedReferenceUris:F,policiesMissingDestination:A,systemParameters:L.systemParameters,promptTemplates:j,classificationRules:ie,classificationRuleConsumer:t.classificationRuleConsumer??null,syncCounts:L.syncCounts.counts,totalFiles:L.syncCounts.total,failedSyncItems:U,circuitBreakerStatus:ve,pipelineStepMetrics:mn(W),pipelineStepMetricWindow:V,recentPipelineRuns:pn(le),displayTimeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,graphSchema:Z,enrichmentStrategies:he,strategyVariants:E,integrityAudit:ae,canReadIntegrityFindings:fe,canUpdateKnowledge:be,unresolvedEntities:Se,qdrantCollections:p,systemHealth:J,recentIngestItems:Re,ontologyStatus:oe}}async function y(I){let{request:b}=I,w=await o(b);if(!w)return Response.json({error:"\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002"},{status:401});if(w.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(w.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 f=w.email,V=w.accessToken===null?void 0:w.accessToken;try{await s(b,{resourceKey:r,action:"update"})}catch(F){if(F instanceof He.AuthzDeniedError)return await hn(b);throw F}let $=await l(b),x=await b.formData(),k=String(x.get("intent")??"");if(k==="refresh_health")return Response.json({success:!0,refreshed:!0});let L=await Sn(t,$,k,x,f);if(L)return L;let G=await Rn(t,$,k,x,f,V);if(G)return G;let Q=await vn(t,$,k,x,V,()=>d(b));if(Q)return Q;if(k==="resolve_entity"){let F=String(x.get("entityId")??""),A=String(x.get("action")??"");if(!F||A!=="merge"&&A!=="promote")return Response.json({error:"Valid entityId and action ('merge' | 'promote') are required"},{status:400});try{return await t.resolveEntity($,F,A),Response.json({success:!0,entityId:F,action:A})}catch(j){return Response.json({error:j instanceof Error?j.message:String(j)},{status:400})}}let z=await An(t,$,k,x,f,b,u,V);return z||Response.json({error:`Unknown intent: ${k}`},{status:400})}return{loader:m,action:y}}function Me(e){let t=String(e??"").trim();return t===""?null:t}function ye(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isSafeInteger(n)||n<=0))return n}function bn(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isFinite(n)||n<=0))return n}async function Sn(e,t,n,r,o){if(n==="update_enrichment_strategy"){let s=String(r.get("stage")??"");if(!(0,P.isEnrichmentStageKey)(s))return Response.json({error:"stage must be a canonical enrichment stage key"},{status:400});let l=ye(r.get("strategyId")),u=ye(r.get("domainId"));if(l==null||u===void 0||u===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:l,domainId:u,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:l,domainId:u,stage:s,enabled:d})}if(n==="toggle_flag"){let s=String(r.get("flagKey")??""),l=String(r.get("enabled")??"")==="true";if(!s)return Response.json({error:"flagKey is required"},{status:400});let u=await e.getFeatureFlags(t);return Object.hasOwn(u,s)?(await e.toggleFeatureFlag(t,s,l,o),Response.json({success:!0,flagKey:s,enabled:l})):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")??""),l=String(r.get("capability")??"");if(!(B.ConfidentialityLevelSchema.safeParse(s).success&&B.GovernedCapabilitySchema.safeParse(l).success))return Response.json({error:"confidentialityLevel and capability must be canonical values"},{status:400});let u=String(r.get("allowCloudProvider")??"")==="true";if(u&&!B.CLOUD_CAPABLE_CAPABILITIES.includes(l))return Response.json({error:`${l} 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:l,isEnabled:String(r.get("isEnabled")??"")==="true",allowCloudProvider:u,promptKey:d===""?null:d},o),Response.json({success:!0,confidentialityLevel:s,capability:l})}if(n==="save_transcription_term"){let s=String(r.get("term")??"").trim();if(!s)return Response.json({error:"term is required"},{status:400});let l=bn(r.get("boost"));if(l===void 0)return Response.json({error:"boost must be a number greater than zero, or absent to let the service decide"},{status:400});let u=ye(r.get("id"));if(u===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:u,term:s,reading:Me(r.get("reading")),boost:l,domainKey:Me(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 l=ye(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.saveTranscriptionReference(t,{id:l,fileUri:s,domainKey:Me(r.get("domainKey")),isActive:String(r.get("isActive")??"true")==="true"},o)}catch(u){return Response.json({error:u instanceof Error?u.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")??""),l=String(r.get("paramValue")??"");if(!s)return Response.json({error:"paramKey is required"},{status:400});let u=(await e.getSystemParameters(t)).find(c=>c.key===s);if(u===void 0)return Response.json({error:`paramKey names no parameter of this tenant: ${s}`},{status:400});let d=cn(u.data_type,l);if(d!==null)return Response.json({error:d},{status:400});try{(0,P.assertSystemParameterInRange)(s,Number(l))}catch(c){return Response.json({error:c.message},{status:400})}return await e.updateSystemParameter(t,s,l,o),Response.json({success:!0,paramKey:s,paramValue:l})}if(n==="update_prompt"){let s=String(r.get("templateKey")??""),l=String(r.get("payload")??"{}"),u;try{u=JSON.parse(l)}catch{return Response.json({error:"Invalid JSON payload"},{status:400})}if(!s)return Response.json({error:"templateKey is required"},{status:400});let d=ln.safeParse(u);if(!d.success)return Response.json({error:`payload does not carry a prompt template update: ${Y(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")??"[]"),l;try{l=JSON.parse(s)}catch{return Response.json({error:"Invalid orderedRuleIds JSON"},{status:400})}let u=fn(l);if(u!==null)return Response.json({error:u},{status:400});let d=l;return await e.reorderClassificationRules(t,d,o),Response.json({success:!0,orderedRuleIds:d})}return null}async function Rn(e,t,n,r,o,s){if(n==="retry_job"){let l=String(r.get("fileId")??"");if(!l)return Response.json({error:"fileId is required"},{status:400});try{return await e.retrySyncItem(t,l,o,s),Response.json({success:!0,fileId:l})}catch(u){return Response.json({error:u instanceof Error?u.message:String(u)},{status:400})}}if(n==="retry_all_failed")try{let{requeued:l,skipped:u}=await e.retryAllFailedSyncItems(t,o,s);return Response.json({success:!0,requeued:l,skipped:u})}catch(l){return Response.json({error:l instanceof Error?l.message:String(l)},{status:400})}return null}function se(e,t,n){let r=P.IntegrityCommandFailureSchema.parse({command:e,code:t,status:n}),o=P.INTEGRITY_COMMAND_CODES.find(s=>s.code===r.code);return Response.json({failure:r},{status:o===void 0?502:o.status})}async function hn(e){let t=await e.formData().catch(()=>null),n=t===null?null:ft(t.get("intent"));return n===null?Response.json({error:"\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002"},{status:403}):se(n,"FORBIDDEN",null)}async function gt(e,t){let n;try{n=P.IntegrityCommandReplySchema.parse(await t())}catch{return se(e,"UPSTREAM_FAILED",null)}return n.ok?Response.json({success:!0,runUid:n.runUid}):se(e,(0,P.integrityCommandFailureCodeOf)(e,n.status,n.errorCode),n.status)}async function vn(e,t,n,r,o,s){let l=ft(n);if(l==="start"){let u=un.safeParse({mode:r.get("mode"),basisRunUid:r.get("basisRunUid")});if(!u.success)return Response.json({error:`start_integrity_run takes mode SCAN without basisRunUid, or mode REPAIR with basisRunUid (a UUID): ${Y(u.error,"form")}`},{status:400});let{mode:d,basisRunUid:c}=u.data;return o===void 0||d==="REPAIR"&&!await s()?se(l,"FORBIDDEN",null):await gt(l,()=>e.startIntegrityRun(t,d,c,o))}if(l==="cancel"){let u=dn.safeParse({runUid:r.get("runUid")});return u.success?o===void 0?se(l,"FORBIDDEN",null):await gt(l,()=>e.cancelIntegrityRun(t,u.data.runUid,o)):Response.json({error:`cancel_integrity_run takes runUid (a UUID): ${Y(u.error,"form")}`},{status:400})}return null}function In(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(!B.ConfidentialityLevelSchema.safeParse(t.confidentialityLevel).success)return`payload.confidentialityLevel must be one of ${B.ConfidentialityLevelSchema.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 wn(e){try{return(0,yt.formatCount)(e,ce),null}catch{return`inspectFileUri answered a fileSize that is not a byte count (a non-negative safe integer): ${String(e)}`}}async function An(e,t,n,r,o,s,l,u){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=In(c);if(m)return Response.json({error:m},{status:400});let y=c,I=await l(s,y);if(I!==null)return Response.json({error:I},{status:403});try{let b=u===void 0?await e.ingestDocument(t,y,o):await e.ingestDocument(t,y,o,u);return Response.json({success:!0,result:b})}catch(b){return Response.json({error:b instanceof Error?b.message:String(b)},{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=u===void 0?await e.inspectFileUri(t,d):await e.inspectFileUri(t,d,u)}catch(y){return Response.json({error:y instanceof Error?y.message:String(y)},{status:400})}let m=wn(c.fileSize);return m!==null?Response.json({error:m},{status:400}):Response.json({success:!0,inspection:c})}return null}function Pn(e){let t=$e(e);return{loader:t.loader,action:t.action,View:Fe,server:t}}0&&(module.exports={StorageAdminConsoleView,checkAllSystemHealth,checkBackendApiHealth,checkNeo4jHealth,checkQdrantHealth,checkRedisHealth,checkSqlServerHealth,createStorageAdminApp,createStorageAdminServer});
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Card as Et,ConsoleUiRoot as Ct,ResourceFailed as xt,reasonAside as Qe,resolveConsoleUiLabels as Ot,useFocusRescue as kt}from"@aiquants/console-ui";import{DOCUMENT_KIND_LABELS as Lt,EnrichmentSyncStatusSchema as Ft,GRAPH_INDEX_LIMITS as jt,IntegrityRunModeSchema as Dt,PIPELINE_STEPS as Ut}from"@aiquants/enrichment-core";import{DocumentIngestConsole as Ht,EnrichmentStrategyBoard as Mt,FinishedInstant as $t,InfrastructureHealthMonitor as Kt,MetadataSearchWorkbench as qt,ModelComparisonWorkbench as Bt,OntologyStatusCard as Vt,PIPELINE_RUN_STATUS_PRESENTATION as Qt,PIPELINE_TRIGGER_LABELS as Gt,PipelineFlowViewer as zt,PipelineRunInspector as Jt,pipelineRunPresentationKey as Wt,QdrantStorageCard as Yt,RecordedInstant as Zt,SyncStatusMonitor as Xt}from"@aiquants/enrichment-react";import{ClassificationRuleEditor as en,ConfidentialityPolicyBoard as tn,DocumentAuthorityRegistry as nn,FeatureFlagBoard as rn,GovernanceDryRunConsole as sn,integrityFailureNeedsOverviewReread as an,KnowledgeGraphExplorer as on,PolicyConflictQueue as ln,PolicyConflictSummaryCard as un,PromptTemplateConsole as dn,SystemParameterTable as cn,TranscriptionAdaptationBoard as pn,TriStoreIntegrityAudit as mn}from"@aiquants/governance-react";import{Fragment as gn,useCallback as W,useEffect as Pe,useMemo as ie,useRef as k,useState as D}from"react";import{useFetcher as He,useLoaderData as yn,useRevalidator as fn,useSearchParams as bn}from"react-router";var re="ja-JP";var ft=/[^\s\x1c-\x1f\x85\ufeff]/;function se(e){return ft.test(e)}function J(e,t){return new Promise(n=>n(e())).catch(n=>t(n instanceof Error?n.message:String(n)))}import{beginReload as bt,keepLastGood as St}from"@aiquants/console-ui/core";import{isStrictlyEarlier as Rt}from"@aiquants/enrichment-core";import{useCallback as be,useEffect as je,useRef as Re,useState as ht,useSyncExternalStore as vt}from"react";var It=2e3,wt=1e4;function Se(e,t){if(t.ok&&e.kind==="ready"&&Rt(t.value.readAt,e.value.readAt))return e;let n=!t.ok&&t.status===403&&e.kind==="ready";return St(n?{kind:"loading"}:e,t)}var At=401;function Pt(e){return e.kind==="failed"||e.refreshFailure!==null&&e.refreshFailure.status===At?null:e.value.active}function De(e,t){let[n,r]=ht(()=>({loaded:e,overview:Se({kind:"loading"},e)}));n.loaded!==e&&r({loaded:e,overview:Se(n.overview,e)});let o=Re(t);o.current=t;let s=Re(null);je(()=>()=>s.current?.abort(),[]);let a=be((c,m)=>J(m,g=>({ok:!1,status:null,reason:g})).then(g=>{c.aborted||r(R=>({loaded:R.loaded,overview:Se(R.overview,g)}))}),[]),l=be(()=>{let c=new AbortController;s.current=c,r(m=>({loaded:m.loaded,overview:bt(m.overview,"reload")})),a(c.signal,()=>o.current(c.signal))},[a]),d=be(c=>a(c,()=>o.current(c)),[a]);return{overview:n.overview,reload:l,poll:d}}function Nt(e){return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)}function Tt(){return document.visibilityState==="visible"}function _t(){return!0}function Ue(e,t,n){let r=vt(Nt,Tt,_t),o=t&&r,s=Re(o),a=e.kind==="ready",l=Pt(e),d=l===null?null:l.run.runUid,c=l===null?!1:l.isStale;je(()=>{let m=o&&!s.current;if(s.current=o,!o||d===null&&!(m&&a))return;let g=new AbortController,R=c?wt:It,f,h=async()=>{await n(g.signal),!g.signal.aborted&&d!==null&&(f=setTimeout(h,R))};return f=setTimeout(h,m?0:R),()=>{g.abort(),clearTimeout(f)}},[o,a,d,c,n])}var ve={columns:2,className:"grid-cols-2",spanClassNames:{1:"col-span-1",2:"col-span-2"}},Ie={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"}},we={className:"@min-[82rem]:grid-flow-col @min-[82rem]:auto-cols-fr @min-[82rem]:grid-cols-none",lastTabClassName:"@min-[82rem]:col-auto"};function Ae(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 Me="tab",ae={key:"knowledge-authority",phrases:["\u6A29\u5A01\u53F0\u5E33 & \u898F\u7A0B\u885D\u7A81"]},U=[{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"]},{key:"pipeline",phrases:["\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3 & \u63A5\u7D9A\u72B6\u614B"]},{key:"knowledge-graph",phrases:["\u30CA\u30EC\u30C3\u30B8\u30B0\u30E9\u30D5","\u63A2\u7D22"]},{key:"parameters",phrases:["\u30E2\u30C7\u30EB & \u30D1\u30E9\u30E1\u30FC\u30BF\u8A2D\u5B9A"]},{key:"prompts",phrases:["\u30D7\u30ED\u30F3\u30D7\u30C8 & \u30C9\u30E9\u30A4\u30E9\u30F3"]},ae,{key:"data-retention",phrases:["\u30C7\u30FC\u30BF\u4FDD\u6301 & \u6574\u5408\u6027\u76E3\u67FB"]}];function Sn(e){return e.phrases.join("")}function Rn(e){return e!==null&&U.some(t=>t.key===e)}var hn="Tri-Store \u30C7\u30FC\u30BF\u6574\u5408\u6027\u76E3\u67FB";function vn(e){return`\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${Qe(e)}\u3002`}var In=Ot("ja");function wn(e){return e.status===403?In.forbiddenBecause("\u51E6\u7406\u5C65\u6B74\u3092\u95B2\u89A7\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",e.reason):`\u51E6\u7406\u5C65\u6B74\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${Qe(e.reason)}\u3002`}var $e={state:"idle",formData:null,data:null,submit:()=>Promise.resolve()};function Ge({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:R,policyConflicts:f,documentAuthority:h}){let[y,H]=D(null),[j,T]=D(null),[_,E]=D(!1),M=ie(()=>{if(s!==void 0)return(i,b)=>{E(!0),J(()=>s(i,b),v=>({ok:!1,reason:v})).then(v=>{E(!1),T(v.ok?null:v.reason),v.ok&&H(v.page)})}},[s]),[$,K]=bn(),C=$.get(Me),I=Rn(C)?C:U[0].key,x=i=>{K(b=>{let v=new URLSearchParams(b);return v.set(Me,i),v},{replace:!1,preventScrollReset:!0})},Z=Pn(e.recentIngestItems,l,I==="ingest"),O=De(e.integrityAudit,g);Ue(O.overview,I==="data-retention",O.poll);let Q=k(null),X=kt(()=>Q.current),[ue,de]=D(0),ce=W(()=>de(i=>i+1),[]),p=Z===null?e:{...e,recentIngestItems:[...Z]},q=k({}),pe=W(()=>q.current[I]??null,[I]),ee=ie(()=>Nn(e.enrichmentStrategies),[e.enrichmentStrategies]),me=ie(()=>e.strategyVariants.map(Tn),[e.strategyVariants]),A=Cn(c),B=A.open,ge=B===void 0?void 0:i=>B(i,null),ye=B===void 0?void 0:i=>B(i.metadataId,i.id),te=(i,b)=>{let v=U.length-1,P;if(i.key==="ArrowRight"||i.key==="ArrowDown")P=b===v?0:b+1;else if(i.key==="ArrowLeft"||i.key==="ArrowUp")P=b===0?v:b-1;else if(i.key==="Home")P=0;else if(i.key==="End")P=v;else return;i.preventDefault();let ne=U[P].key;x(ne),q.current[ne]?.focus()},Ce={...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&&(Ce[i]=b)}let st=t.data&&"inspection"in t.data?t.data.inspection:void 0,G=t.state==="idle"?null:t.formData?.get("intent"),it=G==="inspect_uri",at=G==="ingest_document",ot=G==="retry_job"||G==="retry_all_failed",lt=G==="resolve_entity",xe=n.state==="idle"?null:n.formData?.get("intent"),ut=xe==="start_integrity_run"?{kind:"starting",mode:Dt.parse(n.formData?.get("mode"))}:xe==="cancel_integrity_run"?{kind:"cancelling"}:{kind:"idle"},dt=fn(),[ct,fe]=D(null),Oe=I!=="data-retention";Pe(()=>{Oe&&fe(null)},[Oe]);let pt=i=>{let b=i?.failure;if(b===void 0){fe(null);return}fe(v=>({failure:b,occurrence:v===null?1:v.occurrence+1})),an(b)&&dt.revalidate()},[mt,ke]=D("console"),{settledIntent:gt,submitAndAwait:Le}=qe(t,()=>ke("console"));qe(n,i=>{ke("integrity"),pt(i)});let Fe=(mt==="console"?t:n).data?.error,yt=()=>{x(ae.key),q.current[ae.key]?.focus()},z=gt==="retry_all_failed"&&t.data?.skipped!==void 0&&t.data.requeued!==void 0?{requeued:t.data.requeued,skipped:t.data.skipped}:null;return u(Ct,{locale:"ja",formatLocale:re,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:[Fe&&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:Fe}),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 ${ve.className} ${Ie.className} ${we.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:U.map((i,b)=>{let v=I===i.key;return u("button",{id:`tab-${i.key}`,type:"button",role:"tab",ref:P=>{q.current[i.key]=P},"aria-selected":v,"aria-controls":`panel-${i.key}`,tabIndex:v?0:-1,"data-testid":`tab-trigger-${i.key}`,onKeyDown:P=>te(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===U.length-1?`${Ae(ve,U.length)} ${Ae(Ie,U.length)} ${we.lastTabClassName}`:""} ${v?"bg-white text-slate-900 shadow-sm":"text-slate-600 hover:bg-slate-200/50 hover:text-slate-900"}`,children:i.phrases.map((P,ne)=>S(gn,{children:[ne>0&&u("wbr",{}),P]},P))},i.key)})})}),A.metadataId!==null&&u(Jt,{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:pe}),I==="search"&&S("div",{role:"tabpanel",id:"panel-search","aria-labelledby":"tab-search",className:"space-y-6","data-testid":"tab-content-search",children:[u(qt,{tenantId:p.tenantId,onSearch:d,circuitBreakerStatus:p.circuitBreakerStatus}),m!==void 0&&u(Bt,{variants:me,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(Ht,{tenantId:p.tenantId,policies:p.confidentialityPolicies,domainOptions:ee,recentItems:p.recentIngestItems,inspectionResult:st,isInspecting:it,isSubmitting:at,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:ge})}),I==="pipeline"&&S("div",{role:"tabpanel",id:"panel-pipeline","aria-labelledby":"tab-pipeline",className:"space-y-6","data-testid":"tab-content-pipeline",children:[u(zt,{featureFlags:p.featureFlags,metrics:p.pipelineStepMetrics,metricSampleWindow:p.pipelineStepMetricWindow}),u(_n,{runs:p.recentPipelineRuns,onOpenRun:ye}),u(Mt,{strategies:p.enrichmentStrategies,featureFlags:p.featureFlags,isUpdating:t.state!=="idle",onToggleStage:(i,b,v)=>t.submit({intent:"update_enrichment_strategy",strategyId:String(i.id),domainId:String(i.domainId),stage:b,enabled:String(v)},{method:"post"})}),u(Kt,{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(Vt,{tenantId:p.tenantId,ontologyStatus:p.ontologyStatus}),u(on,{topologyMaxLabels:jt.topologyLabels.default,schema:p.graphSchema,tenantId:p.tenantId,unresolvedEntities:p.unresolvedEntities,traversal:o,onBrowseLabel:M,nodeIndexPage:y,nodeIndexFailure:j,isNodeIndexLoading:_,isResolving:lt,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(rn,{flags:Ce,isUpdating:t.state!=="idle",onToggleFlag:(i,b)=>{t.submit({intent:"toggle_flag",flagKey:i,enabled:String(b)},{method:"post"})}}),u(en,{rules:p.classificationRules,domainOptions:ee,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(tn,{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(pn,{vocabulary:p.transcriptionVocabulary,references:p.transcriptionReferences,unresolvedUris:p.unresolvedReferenceUris,isUpdating:t.state!=="idle",onSaveTerm:i=>Le({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=>Le({intent:"save_transcription_reference",id:i.id===null?"":String(i.id),fileUri:i.fileUri,domainKey:i.domainKey??"",isActive:String(i.isActive)},{method:"post"})}),u(cn,{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(dn,{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(sn,{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(nn,{host:h,canUpdate:p.canUpdateKnowledge,onPolicyConflictsChanged:ce}),u(ln,{host:f,revision:ue})]}),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:[O.overview.kind==="ready"?u("div",{ref:X,children:u(mn,{overview:O.overview.value,canReadFindings:p.canReadIntegrityFindings,command:ut,commandFailure:ct,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:R,refreshFailure:O.overview.refreshFailure===null?null:O.overview.refreshFailure.reason,headingRef:Q})}):u(Et,{title:hn,testId:"audit-overview-failed",headingRef:Q,children:u(xt,{failure:O.overview,onReload:O.reload,forbiddenMessage:"\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u95B2\u89A7\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",failureMessage:vn,rescueRef:X,testId:"audit-overview-failed-resource"})}),u(un,{host:f,knowledgeTabLabel:Sn(ae),onOpenKnowledgeTab:yt}),z!==null&&z.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: ",z.requeued," \u4EF6\u3092\u518D\u6295\u5165\u3057\u3001",z.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:z.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(Xt,{counts:p.syncCounts,totalFiles:p.totalFiles,failedItems:p.failedSyncItems,isRetrying:ot,onRetryItem:i=>{t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},onRetryAll:()=>{t.submit({intent:"retry_all_failed"},{method:"post"})}}),u(Yt,{overview:p.qdrantCollections,health:{healthy:p.systemHealth.services.qdrant.status==="connected",latency_ms:p.systemHealth.services.qdrant.latencyMs}})]})]})]})]})})}var An=new Set(Ft.options.filter(e=>e!=="SYNCED"&&!e.startsWith("FAILED"))),Ke=2e3;function Pn(e,t,n){let[r,o]=D(null),s=k(t);s.current=t;let a=k(e);a.current!==e&&(a.current=e,r!==null&&o(null));let d=(r??e)?.some(c=>An.has(c.syncStatus))===!0;return Pe(()=>{if(!(n&&d&&s.current))return;let c=!1,m,g=async()=>{let R=s.current;if(R!==void 0){try{let f=await R();if(c)return;o(f)}catch{if(c)return}m=setTimeout(g,Ke)}};return m=setTimeout(g,Ke),()=>{c=!0,clearTimeout(m)}},[d,n]),r}function qe(e,t){let n=k(t);n.current=t;let r=k(null),o=k(!1),s=k(null);if(e.state!=="idle"){o.current=!0;let l=e.formData?.get("intent");typeof l=="string"&&(r.current=l)}Pe(()=>{if(e.state!=="idle"||!o.current)return;o.current=!1,n.current(e.data);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=W((...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 Nn(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 Tn(e){return{strategyId:e.strategyId,label:`${e.domainKey} / ${e.variantKey}`,embeddingModel:e.embeddingModel}}function _n({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=Wt(n),o=Qt[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:Lt[n.documentKind]}),u("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-trigger-${n.id}`,"data-trigger":n.trigger,children:Gt[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":Ut[n.failedStepKey].label}),u("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-started-${n.id}`,children:u(Zt,{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($t,{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 Be={metadataId:null,runs:[],selectedRunId:null,isLoading:!1,failure:null};function En(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"&&!se(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 Cn(e){let[t,n]=D(Be),[r,o]=D(0),s=k(0),a=k(null),l=ie(()=>{if(e!==void 0)return(m,g)=>{s.current+=1;let R=s.current;a.current?.abort();let f=new AbortController;a.current=f,o(h=>h+1),n({metadataId:m,runs:[],selectedRunId:g,isLoading:!0,failure:null}),J(()=>e(m,f.signal),h=>({ok:!1,status:null,reason:h})).then(h=>{if(s.current!==R)return;let y=h.ok?En(h.value):wn(h);if(!h.ok||y!==null){n({metadataId:m,runs:[],selectedRunId:g,isLoading:!1,failure:y});return}n({metadataId:m,runs:h.value,selectedRunId:g===null?xn(h.value):g,isLoading:!1,failure:null})})}},[e]),d=W(m=>{n(g=>({...g,selectedRunId:m}))},[]),c=W(()=>{s.current+=1,a.current?.abort(),a.current=null,n(Be)},[]);return{...t,openRequest:r,open:l,selectRun:d,close:c}}function xn(e){return e.length===0?null:e[0].id}function On(e){let t=yn(),n=He(),r=He(),o=e.data??t,s=e.fetcher??n,a=e.integrityFetcher??r;return o?u(Ge,{...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 ze(e){return e.data?u(Ge,{...e,data:e.data,fetcher:e.fetcher??$e,integrityFetcher:e.integrityFetcher??$e}):u(On,{...e})}import{AuthzDeniedError as Xe}from"@aiquants/authz-core";import{formatCount as Mn}from"@aiquants/console-ui/core";import{assertSystemParameterInRange as $n,INTEGRITY_COMMAND_CODES as Kn,IntegrityAuditOverviewSchema as qn,IntegrityCommandFailureSchema as Bn,IntegrityCommandReplySchema as Vn,IntegrityRunModeSchema as et,integrityCommandFailureCodeOf as Qn,isEnrichmentStageKey as Gn,PipelineRunSummarySchema as zn,PipelineStepMetricSchema as Jn}from"@aiquants/enrichment-core";import{CLOUD_CAPABLE_CAPABILITIES as Wn,ConfidentialityLevelSchema as Ee,GovernedCapabilitySchema as Yn}from"@aiquants/governance-core";import{z as w}from"zod";var Te=3e3;function F(e){return Math.round(performance.now()-e)}function N(e){return typeof e=="string"&&se(e)?e:null}function L(e){let t=globalThis.process;return t===void 0?void 0:t.env[e]}function oe(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 Je(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 We(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 Ye(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 Ne(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 Ln(e){let t=e?.qdrantApiKey??L("QDRANT_API_KEY")??"",n=e?.timeoutMs??Te,r=performance.now(),o="";try{o=oe(e?.qdrantUrl??L("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=F(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:Ye(o)??null}}}catch(s){let a=F(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 Fn(e){let t=e?.timeoutMs??Te,n=performance.now(),r=N(e?.neo4jBoltUri??L("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([Ne(s("CALL dbms.components() YIELD versions, edition RETURN versions[0] AS version, edition",{}),t),Ne(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],R=F(n);return{serviceName:"Neo4j",category:"graph",status:"connected",version:N(c),endpoint:o,latencyMs:R,details:{edition:N(m),boltUri:r,nodeCount:typeof g=="number"?g:null,tls:r===null?null:Ye(r)??null}}}catch(s){let a=F(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 jn(e){let t=performance.now(),n="",r=We(e?.redisTls,L("REDIS_TLS")),o=Number.NaN;try{let s=e?.redisClient;if(!s)throw new Error("Redis client not configured");let a=oe(e?.redisHost??L("REDIS_HOST"),"REDIS_HOST");o=Je(e?.redisPort,L("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=F(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=F(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 Dn(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 Un(e){let t=performance.now(),n="",r=We(e?.sqlServerTls,L("SQL_SERVER_TLS")),o=Number.NaN;try{let s=e?.sqlServerExecute;if(!s)throw new Error("SQL Server executor not configured");let a=oe(e?.sqlServerHost??L("SQL_SERVER_HOST"),"SQL_SERVER_HOST");o=Je(e?.sqlServerPort,L("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:Dn(m),R=F(t);return{serviceName:"SQL Server",category:"database",status:"connected",version:g,endpoint:n,latencyMs:R,details:{database:d,port:o,tls:r??null,fullVersion:m}}}catch(s){let a=F(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 Hn(e){let t=e?.timeoutMs??Te,n=performance.now(),r="";try{r=oe(e?.backendApiHost??L("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=F(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=F(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 Ze(e){let[t,n,r,o,s]=await Promise.all([Ln(e),Fn(e),jn(e),Un(e),Hn(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 Zn=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(),Xn=w.discriminatedUnion("mode",[w.object({mode:et.extract(["SCAN"]),basisRunUid:w.null()}).strict(),w.object({mode:et.extract(["REPAIR"]),basisRunUid:w.string().uuid()}).strict()]),er=w.object({runUid:w.string().uuid()}).strict();function nt(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 tr(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 nr(e){let t=zn.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 rr(e){let t=Jn.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 sr(e){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`pipelineStepMetricWindow must be a positive safe integer, got ${String(e)}`);return e}async function ir(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=qn.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 ar(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 rt(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(R){let{request:f}=R;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(te){throw te instanceof Xe?new Response("\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",{status:403}):te}let y=await a(f),H=sr(t.pipelineStepMetricWindow),[j,T,_]=await Promise.all([t.getFeatureFlags(y),t.getSystemParameters(y),t.getSyncCounts(y)]),E={featureFlags:j,systemParameters:T,syncCounts:_},[M,$,K,C,I,x,Z,O,Q,X,ue,de,ce,p,q,pe,ee,me,A,B,ge]=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),ir(t,y),d(f),c(f),t.getUnresolvedEntities(y),t.getQdrantCollections(y),Ze({...n,tenantId:y}),t.getRecentIngestItems(y),t.getOntologyStatus(y,E),t.getEnrichmentStrategies(y),t.getStrategyVariants(y),t.getPipelineStepMetrics(y),t.getRecentPipelineRuns(y)]),ye=t.getCircuitBreakerStatus();return{tenantId:y,featureFlags:E.featureFlags,confidentialityPolicies:M,transcriptionVocabulary:$,transcriptionReferences:K,unresolvedReferenceUris:C,policiesMissingDestination:I,systemParameters:E.systemParameters,promptTemplates:x,classificationRules:Z,classificationRuleConsumer:t.classificationRuleConsumer??null,syncCounts:E.syncCounts.counts,totalFiles:E.syncCounts.total,failedSyncItems:O,circuitBreakerStatus:ye,pipelineStepMetrics:rr(B),pipelineStepMetricWindow:H,recentPipelineRuns:nr(ge),displayTimeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,graphSchema:Q,enrichmentStrategies:me,strategyVariants:A,integrityAudit:X,canReadIntegrityFindings:ue,canUpdateKnowledge:de,unresolvedEntities:ce,qdrantCollections:p,systemHealth:q,recentIngestItems:pe,ontologyStatus:ee}}async function g(R){let{request:f}=R,h=await o(f);if(!h)return Response.json({error:"\u8A8D\u8A3C\u304C\u5FC5\u8981\u3067\u3059\u3002"},{status:401});if(h.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(h.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=h.email,H=h.accessToken===null?void 0:h.accessToken;try{await s(f,{resourceKey:r,action:"update"})}catch(C){if(C instanceof Xe)return await dr(f);throw C}let j=await a(f),T=await f.formData(),_=String(T.get("intent")??"");if(_==="refresh_health")return Response.json({success:!0,refreshed:!0});let E=await lr(t,j,_,T,y);if(E)return E;let M=await ur(t,j,_,T,y,H);if(M)return M;let $=await cr(t,j,_,T,H,()=>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(j,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 gr(t,j,_,T,y,f,l,H);return K||Response.json({error:`Unknown intent: ${_}`},{status:400})}return{loader:m,action:g}}function _e(e){let t=String(e??"").trim();return t===""?null:t}function le(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isSafeInteger(n)||n<=0))return n}function or(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isFinite(n)||n<=0))return n}async function lr(e,t,n,r,o){if(n==="update_enrichment_strategy"){let s=String(r.get("stage")??"");if(!Gn(s))return Response.json({error:"stage must be a canonical enrichment stage key"},{status:400});let a=le(r.get("strategyId")),l=le(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(!(Ee.safeParse(s).success&&Yn.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&&!Wn.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=or(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=le(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:_e(r.get("reading")),boost:a,domainKey:_e(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=le(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:_e(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=tr(l.data_type,a);if(d!==null)return Response.json({error:d},{status:400});try{$n(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=Zn.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=ar(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 ur(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 Y(e,t,n){let r=Bn.parse({command:e,code:t,status:n}),o=Kn.find(s=>s.code===r.code);return Response.json({failure:r},{status:o===void 0?502:o.status})}async function dr(e){let t=await e.formData().catch(()=>null),n=t===null?null:nt(t.get("intent"));return n===null?Response.json({error:"\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002"},{status:403}):Y(n,"FORBIDDEN",null)}async function tt(e,t){let n;try{n=Vn.parse(await t())}catch{return Y(e,"UPSTREAM_FAILED",null)}return n.ok?Response.json({success:!0,runUid:n.runUid}):Y(e,Qn(e,n.status,n.errorCode),n.status)}async function cr(e,t,n,r,o,s){let a=nt(n);if(a==="start"){let l=Xn.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()?Y(a,"FORBIDDEN",null):await tt(a,()=>e.startIntegrityRun(t,d,c,o))}if(a==="cancel"){let l=er.safeParse({runUid:r.get("runUid")});return l.success?o===void 0?Y(a,"FORBIDDEN",null):await tt(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 pr(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(!Ee.safeParse(t.confidentialityLevel).success)return`payload.confidentialityLevel must be one of ${Ee.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 mr(e){try{return Mn(e,re),null}catch{return`inspectFileUri answered a fileSize that is not a byte count (a non-negative safe integer): ${String(e)}`}}async function gr(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=pr(c);if(m)return Response.json({error:m},{status:400});let g=c,R=await a(s,g);if(R!==null)return Response.json({error:R},{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=mr(c.fileSize);return m!==null?Response.json({error:m},{status:400}):Response.json({success:!0,inspection:c})}return null}function Jr(e){let t=rt(e);return{loader:t.loader,action:t.action,View:ze,server:t}}export{ze as StorageAdminConsoleView,Ze as checkAllSystemHealth,Hn as checkBackendApiHealth,Fn as checkNeo4jHealth,Ln as checkQdrantHealth,jn as checkRedisHealth,Un as checkSqlServerHealth,Jr as createStorageAdminApp,rt as createStorageAdminServer};
|
|
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};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiquants/enrichment-react-router",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "React Router (v7 / v8) adapter for storage AI enrichment & knowledge governance admin console.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
"license": "MIT",
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"@aiquants/authz-core": "^0.6.1",
|
|
39
|
-
"@aiquants/console-ui": "^0.
|
|
40
|
-
"@aiquants/enrichment-core": "^0.3.
|
|
41
|
-
"@aiquants/enrichment-react": "^0.
|
|
39
|
+
"@aiquants/console-ui": "^0.2.0",
|
|
40
|
+
"@aiquants/enrichment-core": "^0.3.2",
|
|
41
|
+
"@aiquants/enrichment-react": "^0.3.0",
|
|
42
42
|
"@aiquants/governance-core": "^0.2.1",
|
|
43
|
-
"@aiquants/governance-react": "^0.
|
|
43
|
+
"@aiquants/governance-react": "^0.3.0",
|
|
44
44
|
"react": ">=19",
|
|
45
45
|
"react-dom": ">=19",
|
|
46
46
|
"react-router": "^7.0.0 || ^8.0.0",
|
|
@@ -48,11 +48,11 @@
|
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@aiquants/authz-core": "0.6.1",
|
|
51
|
-
"@aiquants/console-ui": "0.
|
|
52
|
-
"@aiquants/enrichment-core": "0.3.
|
|
53
|
-
"@aiquants/enrichment-react": "0.
|
|
51
|
+
"@aiquants/console-ui": "0.2.0",
|
|
52
|
+
"@aiquants/enrichment-core": "0.3.2",
|
|
53
|
+
"@aiquants/enrichment-react": "0.3.0",
|
|
54
54
|
"@aiquants/governance-core": "0.2.1",
|
|
55
|
-
"@aiquants/governance-react": "0.
|
|
55
|
+
"@aiquants/governance-react": "0.3.0",
|
|
56
56
|
"@testing-library/jest-dom": "^6.9.1",
|
|
57
57
|
"@testing-library/react": "^16.3.2",
|
|
58
58
|
"@testing-library/user-event": "^14.6.1",
|