@aiquants/enrichment-react-router 0.2.2 → 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 CHANGED
@@ -215,7 +215,7 @@ 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 same composition as `ResourceFailed`'s), or that sentence alone for `""`.
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.
@@ -224,7 +224,7 @@ Only the selected panel is mounted, so leaving a tab discards what was typed the
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
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: it 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), and focus that was inside the audit card moves to the heading of the card drawn in its place.
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.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var Pe=Object.defineProperty;var Ot=Object.getOwnPropertyDescriptor;var xt=Object.getOwnPropertyNames;var kt=Object.prototype.hasOwnProperty;var Lt=(e,t)=>{for(var n in t)Pe(e,n,{get:t[n],enumerable:!0})},Ft=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of xt(t))!kt.call(e,o)&&o!==n&&Pe(e,o,{get:()=>t[o],enumerable:!(r=Ot(t,o))||r.enumerable});return e};var jt=e=>Ft(Pe({},"__esModule",{value:!0}),e);var Nn={};Lt(Nn,{StorageAdminConsoleView:()=>je,checkAllSystemHealth:()=>He,checkBackendApiHealth:()=>gt,checkNeo4jHealth:()=>ct,checkQdrantHealth:()=>dt,checkRedisHealth:()=>pt,checkSqlServerHealth:()=>mt,createStorageAdminApp:()=>Tn,createStorageAdminServer:()=>Ke});module.exports=jt(Nn);var _=require("@aiquants/console-ui"),U=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 Dt=/[^\s\x1c-\x1f\x85\ufeff]/;function pe(e){return Dt.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"),We=require("@aiquants/enrichment-core"),N=require("react");var Ut=2e3,Ht=1e4;function Te(e,t){if(t.ok&&e.kind==="ready"&&(0,We.isStrictlyEarlier)(t.value.readAt,e.value.readAt))return e;let n=!t.ok&&t.status===403&&e.kind==="ready";return(0,me.keepLastGood)(n?{kind:"loading"}:e,t)}var Mt=401;function $t(e){return e.kind==="failed"||e.refreshFailure!==null&&e.refreshFailure.status===Mt?null:e.value.active}function Ye(e,t){let[n,r]=(0,N.useState)(()=>({loaded:e,overview:Te({kind:"loading"},e)}));n.loaded!==e&&r({loaded:e,overview:Te(n.overview,e)});let o=(0,N.useRef)(t);o.current=t;let s=(0,N.useRef)(null);(0,N.useEffect)(()=>()=>s.current?.abort(),[]);let l=(0,N.useCallback)((c,m)=>re(m,y=>({ok:!1,status:null,reason:y})).then(y=>{c.aborted||r(I=>({loaded:I.loaded,overview:Te(I.overview,y)}))}),[]),u=(0,N.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,N.useCallback)(c=>l(c,()=>o.current(c)),[l]);return{overview:n.overview,reload:u,poll:d}}function Kt(e){return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)}function qt(){return document.visibilityState==="visible"}function Bt(){return!0}function Ze(e,t,n){let r=(0,N.useSyncExternalStore)(Kt,qt,Bt),o=t&&r,s=(0,N.useRef)(o),l=e.kind==="ready",u=$t(e),d=u===null?null:u.run.runUid,c=u===null?!1:u.isStale;(0,N.useEffect)(()=>{let m=o&&!s.current;if(s.current=o,!o||d===null&&!(m&&l))return;let y=new AbortController,I=c?Ht: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 _e={columns:2,className:"grid-cols-2",spanClassNames:{1:"col-span-1",2:"col-span-2"}},Ee={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"}},Ce={className:"@min-[82rem]:grid-flow-col @min-[82rem]:auto-cols-fr @min-[82rem]:grid-cols-none",lastTabClassName:"@min-[82rem]:col-auto"};function Oe(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"),Xe="tab",ke={key:"knowledge-authority",phrases:["\u6A29\u5A01\u53F0\u5E33 & \u898F\u7A0B\u885D\u7A81"]},Le={key:"pipeline",phrases:["\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3 & \u63A5\u7D9A\u72B6\u614B"]},Fe={key:"parameters",phrases:["\u30E2\u30C7\u30EB & \u30D1\u30E9\u30E1\u30FC\u30BF\u8A2D\u5B9A"]},et="\u30A8\u30F3\u30EA\u30C3\u30C1\u30E1\u30F3\u30C8\u540C\u671F\u30B9\u30C6\u30FC\u30BF\u30B9",Vt="\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"]},Le,{key:"knowledge-graph",phrases:["\u30CA\u30EC\u30C3\u30B8\u30B0\u30E9\u30D5","\u63A2\u7D22"]},Fe,{key:"prompts",phrases:["\u30D7\u30ED\u30F3\u30D7\u30C8 & \u30C9\u30E9\u30A4\u30E9\u30F3"]},ke,{key:"data-retention",phrases:["\u30C7\u30FC\u30BF\u4FDD\u6301 & \u6574\u5408\u6027\u76E3\u67FB"]}];function xe(e){return e.phrases.join("")}function Gt(e){return e!==null&&q.some(t=>t.key===e)}var Qt="Tri-Store \u30C7\u30FC\u30BF\u6574\u5408\u6027\u76E3\u67FB";function zt(e){return`\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${(0,_.reasonAside)(e)}\u3002`}var Jt=(0,_.resolveConsoleUiLabels)("ja");function Wt(e){return e.status===403?Jt.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 tt={state:"idle",formData:null,data:null,submit:()=>Promise.resolve()};function at({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(Xe),A=Gt(F)?F:q[0].key,j=i=>{z(S=>{let v=new URLSearchParams(S);return v.set(Xe,i),v},{replace:!1,preventScrollReset:!0})},ie=Zt(e.recentIngestItems,u,A==="ingest"),D=Ye(e.integrityAudit,y);Ze(D.overview,A==="data-retention",D.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)(()=>Xt(e.enrichmentStrategies),[e.enrichmentStrategies]),he=(0,g.useMemo)(()=>e.strategyVariants.map(en),[e.strategyVariants]),E=rn(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()},qe={...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&&(qe[i]=S)}let St=t.data&&"inspection"in t.data?t.data.inspection:void 0,X=t.state==="idle"?null:t.formData?.get("intent"),Rt=X==="inspect_uri",ht=X==="ingest_document",vt=X==="retry_job"||X==="retry_all_failed",It=X==="resolve_entity",Be=n.state==="idle"?null:n.formData?.get("intent"),wt=Be==="start_integrity_run"?{kind:"starting",mode:U.IntegrityRunModeSchema.parse(n.formData?.get("mode"))}:Be==="cancel_integrity_run"?{kind:"cancelling"}:{kind:"idle"},At=(0,K.useRevalidator)(),[Pt,Ie]=(0,g.useState)(null),Ve=A!=="data-retention";(0,g.useEffect)(()=>{Ve&&Ie(null)},[Ve]);let Tt=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)&&At.revalidate()},[ee,te]=(0,g.useState)(null),Nt=i=>{if(t.state!=="idle"){te({metadataId:i,intent:"retry_job",status:"refused",error:Vt});return}te({metadataId:i,intent:"retry_job",status:"pending",error:null}),t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},[Ge,we]=(0,g.useState)("console"),_t=(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:Et,submitAndAwait:Qe}=rt(t,_t);rt(n,i=>{we("integrity"),Tt(i)});let ze=Ge==="inspector"?void 0:(Ge==="console"?t:n).data?.error,Ae=i=>{j(i),J.current[i]?.focus()},Je=(0,g.useRef)(null),Ct={strategies:{label:xe(Le),onOpen:()=>Ae(Le.key),closesInspector:!0},projectionPolicy:{label:xe(Fe),onOpen:()=>Ae(Fe.key),closesInspector:!0},failedSync:{label:et,onOpen:()=>Je.current?.focus(),closesInspector:!1}},ne=Et==="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:[ze&&(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:ze}),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 ${_e.className} ${Ee.className} ${Ce.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?`${Oe(_e,q.length)} ${Oe(Ee,q.length)} ${Ce.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:St,isInspecting:Rt,isSubmitting:ht,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)(tn,{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:U.GRAPH_INDEX_LIMITS.topologyLabels.default,schema:p.graphSchema,tenantId:p.tenantId,unresolvedEntities:p.unresolvedEntities,traversal:o,onBrowseLabel:G,nodeIndexPage:f,nodeIndexFailure:$,isNodeIndexLoading:k,isResolving:It,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:qe,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=>Qe({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=>Qe({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:[D.overview.kind==="ready"?(0,a.jsx)("div",{ref:ae,children:(0,a.jsx)(h.TriStoreIntegrityAudit,{overview:D.overview.value,canReadFindings:p.canReadIntegrityFindings,command:wt,commandFailure:Pt,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:D.overview.refreshFailure===null?null:D.overview.refreshFailure.reason,headingRef:Z,onShowHistory:le,resync:{onResync:Nt,onDismiss:()=>te(null),feedback:ee},remedyDestinations:Ct})}):(0,a.jsx)(_.Card,{title:Qt,testId:"audit-overview-failed",headingRef:Z,children:(0,a.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:zt,rescueRef:ae,testId:"audit-overview-failed-resource"})}),(0,a.jsx)(h.PolicyConflictSummaryCard,{host:b,knowledgeTabLabel:xe(ke),onOpenKnowledgeTab:()=>Ae(ke.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:Je,tabIndex:-1,"aria-label":et,"data-testid":"sync-status-region",children:(0,a.jsx)(R.SyncStatusMonitor,{counts:p.syncCounts,totalFiles:p.totalFiles,failedItems:p.failedSyncItems,isRetrying:vt,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 Yt=new Set(U.EnrichmentSyncStatusSchema.options.filter(e=>e!=="SYNCED"&&!e.startsWith("FAILED"))),nt=2e3;function Zt(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=>Yt.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,nt)}};return m=setTimeout(y,nt),()=>{c=!0,clearTimeout(m)}},[d,n]),r}function rt(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 Xt(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 en(e){return{strategyId:e.strategyId,label:`${e.domainKey} / ${e.variantKey}`,embeddingModel:e.embeddingModel}}function tn({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:U.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":U.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 st={metadataId:null,runs:[],selectedRunId:null,isLoading:!1,failure:null};function nn(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 rn(e){let[t,n]=(0,g.useState)(st),[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?nn(w.value):Wt(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?sn(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(st)},[]);return{...t,openRequest:r,open:u,selectRun:d,close:c}}function sn(e){return e.length===0?null:e[0].id}function an(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)(at,{...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 je(e){return e.data?(0,a.jsx)(at,{...e,data:e.data,fetcher:e.fetcher??tt,integrityFetcher:e.integrityFetcher??tt}):(0,a.jsx)(an,{...e})}var $e=require("@aiquants/authz-core"),ft=require("@aiquants/console-ui/core"),P=require("@aiquants/enrichment-core"),B=require("@aiquants/governance-core"),T=require("zod");var Ue=3e3;function M(e){return Math.round(performance.now()-e)}function O(e){return typeof e=="string"&&pe(e)?e:null}function H(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 ot(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 lt(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 ut(e){let t=e.trim().split("://",1)[0]?.toLowerCase();if(t&&e.includes("://"))return t.endsWith("s")||t.includes("+s")}function on(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 De(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 dt(e){let t=e?.qdrantApiKey??H("QDRANT_API_KEY")??"",n=e?.timeoutMs??Ue,r=performance.now(),o="";try{o=ge(e?.qdrantUrl??H("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=M(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:on(o)??null,tls:ut(o)??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:o,latencyMs:l,details:{},errorMessage:u}}}async function ct(e){let t=e?.timeoutMs??Ue,n=performance.now(),r=O(e?.neo4jBoltUri??H("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([De(s("CALL dbms.components() YIELD versions, edition RETURN versions[0] AS version, edition",{}),t),De(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=M(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:ut(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:o,latencyMs:l,details:{},errorMessage:u}}}async function pt(e){let t=performance.now(),n="",r=lt(e?.redisTls,H("REDIS_TLS")),o=Number.NaN;try{let s=e?.redisClient;if(!s)throw new Error("Redis client not configured");let l=ge(e?.redisHost??H("REDIS_HOST"),"REDIS_HOST");o=ot(e?.redisPort,H("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=M(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=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 ln(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 mt(e){let t=performance.now(),n="",r=lt(e?.sqlServerTls,H("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??H("SQL_SERVER_HOST"),"SQL_SERVER_HOST");o=ot(e?.sqlServerPort,H("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:ln(m),I=M(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=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 gt(e){let t=e?.timeoutMs??Ue,n=performance.now(),r="";try{r=ge(e?.backendApiHost??H("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=M(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=M(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 He(e){let[t,n,r,o,s]=await Promise.all([dt(e),ct(e),pt(e),mt(e),gt(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 un=T.z.object({templateText:T.z.string(),modelName:T.z.string(),temperature:T.z.number(),maxOutputTokens:T.z.number(),responseSchema:T.z.union([T.z.record(T.z.string(),T.z.unknown()),T.z.string(),T.z.null()]).optional(),endpointBaseUrl:T.z.string().nullable()}).strict(),dn=T.z.discriminatedUnion("mode",[T.z.object({mode:P.IntegrityRunModeSchema.extract(["SCAN"]),basisRunUid:T.z.null()}).strict(),T.z.object({mode:P.IntegrityRunModeSchema.extract(["REPAIR"]),basisRunUid:T.z.string().uuid()}).strict()]),cn=T.z.object({runUid:T.z.string().uuid()}).strict();function bt(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 pn(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 mn(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 gn(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 yn(e){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`pipelineStepMetricWindow must be a positive safe integer, got ${String(e)}`);return e}async function fn(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 bn(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 Ke(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 $e.AuthzDeniedError?new Response("\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",{status:403}):ue}let f=await l(b),V=yn(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,D,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),fn(t,f),d(b),c(b),t.getUnresolvedEntities(f),t.getQdrantCollections(f),He({...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:D,circuitBreakerStatus:ve,pipelineStepMetrics:gn(W),pipelineStepMetricWindow:V,recentPipelineRuns:mn(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 $e.AuthzDeniedError)return await vn(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 Rn(t,$,k,x,f);if(L)return L;let G=await hn(t,$,k,x,f,V);if(G)return G;let Q=await In(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 Pn(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 Sn(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isFinite(n)||n<=0))return n}async function Rn(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=Sn(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=pn(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=un.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=bn(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 hn(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 vn(e){let t=await e.formData().catch(()=>null),n=t===null?null:bt(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 yt(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 In(e,t,n,r,o,s){let l=bt(n);if(l==="start"){let u=dn.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 yt(l,()=>e.startIntegrityRun(t,d,c,o))}if(l==="cancel"){let u=cn.safeParse({runUid:r.get("runUid")});return u.success?o===void 0?se(l,"FORBIDDEN",null):await yt(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 wn(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 An(e){try{return(0,ft.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 Pn(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=wn(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=An(c.fileSize);return m!==null?Response.json({error:m},{status:400}):Response.json({success:!0,inspection:c})}return null}function Tn(e){let t=Ke(e);return{loader:t.loader,action:t.action,View:je,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 Ht,ConsoleUiRoot as Mt,ResourceFailed as $t,reasonAside as tt,resolveConsoleUiLabels as Kt,useFocusRescue as qt}from"@aiquants/console-ui";import{DOCUMENT_KIND_LABELS as Bt,EnrichmentSyncStatusSchema as Vt,GRAPH_INDEX_LIMITS as Gt,IntegrityRunModeSchema as Qt,PIPELINE_STEPS as zt}from"@aiquants/enrichment-core";import{DocumentIngestConsole as Jt,EnrichmentStrategyBoard as Wt,FinishedInstant as Yt,InfrastructureHealthMonitor as Zt,MetadataSearchWorkbench as Xt,ModelComparisonWorkbench as en,OntologyStatusCard as tn,PIPELINE_RUN_STATUS_PRESENTATION as nn,PIPELINE_TRIGGER_LABELS as rn,PipelineFlowViewer as sn,PipelineRunInspector as an,pipelineRunPresentationKey as on,QdrantStorageCard as ln,RecordedInstant as un,SyncStatusMonitor as dn}from"@aiquants/enrichment-react";import{ClassificationRuleEditor as cn,ConfidentialityPolicyBoard as pn,DocumentAuthorityRegistry as mn,FeatureFlagBoard as gn,GovernanceDryRunConsole as yn,integrityFailureNeedsOverviewReread as fn,KnowledgeGraphExplorer as bn,PolicyConflictQueue as Sn,PolicyConflictSummaryCard as Rn,PromptTemplateConsole as hn,SystemParameterTable as vn,TranscriptionAdaptationBoard as In,TriStoreIntegrityAudit as wn}from"@aiquants/governance-react";import{Fragment as An,useCallback as Z,useEffect as xe,useMemo as le,useRef as O,useState as L}from"react";import{useFetcher as Qe,useLoaderData as Pn,useRevalidator as Tn,useSearchParams as Nn}from"react-router";var ae="ja-JP";var Tt=/[^\s\x1c-\x1f\x85\ufeff]/;function oe(e){return Tt.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 _t}from"@aiquants/console-ui/core";import{isStrictlyEarlier as Et}from"@aiquants/enrichment-core";import{useCallback as he,useEffect as Be,useRef as Ie,useState as Ct,useSyncExternalStore as Ot}from"react";var xt=2e3,kt=1e4;function ve(e,t){if(t.ok&&e.kind==="ready"&&Et(t.value.readAt,e.value.readAt))return e;let n=!t.ok&&t.status===403&&e.kind==="ready";return _t(n?{kind:"loading"}:e,t)}var Lt=401;function Ft(e){return e.kind==="failed"||e.refreshFailure!==null&&e.refreshFailure.status===Lt?null:e.value.active}function Ve(e,t){let[n,r]=Ct(()=>({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);Be(()=>()=>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 jt(e){return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)}function Dt(){return document.visibilityState==="visible"}function Ut(){return!0}function Ge(e,t,n){let r=Ot(jt,Dt,Ut),o=t&&r,s=Ie(o),a=e.kind==="ready",l=Ft(e),d=l===null?null:l.run.runUid,c=l===null?!1:l.isStale;Be(()=>{let m=o&&!s.current;if(s.current=o,!o||d===null&&!(m&&a))return;let g=new AbortController,h=c?kt:xt,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 Ae={columns:2,className:"grid-cols-2",spanClassNames:{1:"col-span-1",2:"col-span-2"}},Pe={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 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 ze="tab",Ee={key:"knowledge-authority",phrases:["\u6A29\u5A01\u53F0\u5E33 & \u898F\u7A0B\u885D\u7A81"]},Ce={key:"pipeline",phrases:["\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3 & \u63A5\u7D9A\u72B6\u614B"]},Oe={key:"parameters",phrases:["\u30E2\u30C7\u30EB & \u30D1\u30E9\u30E1\u30FC\u30BF\u8A2D\u5B9A"]},Je="\u30A8\u30F3\u30EA\u30C3\u30C1\u30E1\u30F3\u30C8\u540C\u671F\u30B9\u30C6\u30FC\u30BF\u30B9",_n="\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",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"]},Ce,{key:"knowledge-graph",phrases:["\u30CA\u30EC\u30C3\u30B8\u30B0\u30E9\u30D5","\u63A2\u7D22"]},Oe,{key:"prompts",phrases:["\u30D7\u30ED\u30F3\u30D7\u30C8 & \u30C9\u30E9\u30A4\u30E9\u30F3"]},Ee,{key:"data-retention",phrases:["\u30C7\u30FC\u30BF\u4FDD\u6301 & \u6574\u5408\u6027\u76E3\u67FB"]}];function _e(e){return e.phrases.join("")}function En(e){return e!==null&&U.some(t=>t.key===e)}var Cn="Tri-Store \u30C7\u30FC\u30BF\u6574\u5408\u6027\u76E3\u67FB";function On(e){return`\u76E3\u67FB\u306E\u6982\u6CC1\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F${tt(e)}\u3002`}var xn=Kt("ja");function kn(e){return e.status===403?xn.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${tt(e.reason)}\u3002`}var We={state:"idle",formData:null,data:null,submit:()=>Promise.resolve()};function nt({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,H]=L(null),[D,N]=L(null),[_,E]=L(!1),M=le(()=>{if(s!==void 0)return(i,b)=>{E(!0),Y(()=>s(i,b),R=>({ok:!1,reason:R})).then(R=>{E(!1),N(R.ok?null:R.reason),R.ok&&H(R.page)})}},[s]),[$,K]=Nn(),C=$.get(ze),I=En(C)?C:U[0].key,x=i=>{K(b=>{let R=new URLSearchParams(b);return R.set(ze,i),R},{replace:!1,preventScrollReset:!0})},ee=Fn(e.recentIngestItems,l,I==="ingest"),k=Ve(e.integrityAudit,g);Ge(k.overview,I==="data-retention",k.poll);let G=O(null),te=qt(()=>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(()=>jn(e.enrichmentStrategies),[e.enrichmentStrategies]),ye=le(()=>e.strategyVariants.map(Dn),[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=U.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=U[P].key;x(ie),q.current[ie]?.focus()},De={...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&&(De[i]=b)}let mt=t.data&&"inspection"in t.data?t.data.inspection:void 0,Q=t.state==="idle"?null:t.formData?.get("intent"),gt=Q==="inspect_uri",yt=Q==="ingest_document",ft=Q==="retry_job"||Q==="retry_all_failed",bt=Q==="resolve_entity",Ue=n.state==="idle"?null:n.formData?.get("intent"),St=Ue==="start_integrity_run"?{kind:"starting",mode:Qt.parse(n.formData?.get("mode"))}:Ue==="cancel_integrity_run"?{kind:"cancelling"}:{kind:"idle"},Rt=Tn(),[ht,be]=L(null),He=I!=="data-retention";xe(()=>{He&&be(null)},[He]);let vt=i=>{let b=i?.failure;if(b===void 0){be(null);return}be(R=>({failure:b,occurrence:R===null?1:R.occurrence+1})),fn(b)&&Rt.revalidate()},[z,J]=L(null),It=i=>{if(t.state!=="idle"){J({metadataId:i,intent:"retry_job",status:"refused",error:_n});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"),wt=(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:At,submitAndAwait:$e}=Ze(t,wt);Ze(n,i=>{Se("integrity"),vt(i)});let Ke=Me==="inspector"?void 0:(Me==="console"?t:n).data?.error,Re=i=>{x(i),q.current[i]?.focus()},qe=O(null),Pt={strategies:{label:_e(Ce),onOpen:()=>Re(Ce.key),closesInspector:!0},projectionPolicy:{label:_e(Oe),onOpen:()=>Re(Oe.key),closesInspector:!0},failedSync:{label:Je,onOpen:()=>qe.current?.focus(),closesInspector:!1}},W=At==="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:[Ke&&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:Ke}),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 ${Ae.className} ${Pe.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:U.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===U.length-1?`${Ne(Ae,U.length)} ${Ne(Pe,U.length)} ${Te.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(An,{children:[ie>0&&u("wbr",{}),P]},P))},i.key)})})}),A.metadataId!==null&&u(an,{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(Xt,{tenantId:p.tenantId,onSearch:d,circuitBreakerStatus:p.circuitBreakerStatus}),m!==void 0&&u(en,{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(Jt,{tenantId:p.tenantId,policies:p.confidentialityPolicies,domainOptions:ne,recentItems:p.recentIngestItems,inspectionResult:mt,isInspecting:gt,isSubmitting:yt,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(sn,{featureFlags:p.featureFlags,metrics:p.pipelineStepMetrics,metricSampleWindow:p.pipelineStepMetricWindow}),u(Un,{runs:p.recentPipelineRuns,onOpenRun:fe}),u(Wt,{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(Zt,{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(tn,{tenantId:p.tenantId,ontologyStatus:p.ontologyStatus}),u(bn,{topologyMaxLabels:Gt.topologyLabels.default,schema:p.graphSchema,tenantId:p.tenantId,unresolvedEntities:p.unresolvedEntities,traversal:o,onBrowseLabel:M,nodeIndexPage:y,nodeIndexFailure:D,isNodeIndexLoading:_,isResolving:bt,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(gn,{flags:De,isUpdating:t.state!=="idle",onToggleFlag:(i,b)=>{t.submit({intent:"toggle_flag",flagKey:i,enabled:String(b)},{method:"post"})}}),u(cn,{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(pn,{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(In,{vocabulary:p.transcriptionVocabulary,references:p.transcriptionReferences,unresolvedUris:p.unresolvedReferenceUris,isUpdating:t.state!=="idle",onSaveTerm:i=>$e({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=>$e({intent:"save_transcription_reference",id:i.id===null?"":String(i.id),fileUri:i.fileUri,domainKey:i.domainKey??"",isActive:String(i.isActive)},{method:"post"})}),u(vn,{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(hn,{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(yn,{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(mn,{host:v,canUpdate:p.canUpdateKnowledge,onPolicyConflictsChanged:me}),u(Sn,{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(wn,{overview:k.overview.value,canReadFindings:p.canReadIntegrityFindings,command:St,commandFailure:ht,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:It,onDismiss:()=>J(null),feedback:z},remedyDestinations:Pt})}):u(Ht,{title:Cn,testId:"audit-overview-failed",headingRef:G,children:u($t,{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:On,rescueRef:te,testId:"audit-overview-failed-resource"})}),u(Rn,{host:f,knowledgeTabLabel:_e(Ee),onOpenKnowledgeTab:()=>Re(Ee.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:qe,tabIndex:-1,"aria-label":Je,"data-testid":"sync-status-region",children:u(dn,{counts:p.syncCounts,totalFiles:p.totalFiles,failedItems:p.failedSyncItems,isRetrying:ft,onRetryItem:i=>{t.submit({intent:"retry_job",fileId:String(i)},{method:"post"})},onRetryAll:()=>{t.submit({intent:"retry_all_failed"},{method:"post"})}})}),u(ln,{overview:p.qdrantCollections,health:{healthy:p.systemHealth.services.qdrant.status==="connected",latency_ms:p.systemHealth.services.qdrant.latencyMs}})]})]})]})]})})}var Ln=new Set(Vt.options.filter(e=>e!=="SYNCED"&&!e.startsWith("FAILED"))),Ye=2e3;function Fn(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=>Ln.has(c.syncStatus))===!0;return xe(()=>{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,Ye)}};return m=setTimeout(g,Ye),()=>{c=!0,clearTimeout(m)}},[d,n]),r}function Ze(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)}xe(()=>{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 jn(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 Dn(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=on(n),o=nn[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:Bt[n.documentKind]}),u("td",{className:"whitespace-nowrap px-3 py-2","data-testid":`pipeline-run-trigger-${n.id}`,"data-trigger":n.trigger,children:rn[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":zt[n.failedStepKey].label}),u("td",{className:"whitespace-nowrap px-3 py-2 text-slate-500","data-testid":`pipeline-run-started-${n.id}`,children:u(un,{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(Yt,{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 Xe={metadataId:null,runs:[],selectedRunId:null,isLoading:!1,failure:null};function Hn(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(Xe),[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?Hn(v.value):kn(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?$n(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(Xe)},[]);return{...t,openRequest:r,open:l,selectRun:d,close:c}}function $n(e){return e.length===0?null:e[0].id}function Kn(e){let t=Pn(),n=Qe(),r=Qe(),o=e.data??t,s=e.fetcher??n,a=e.integrityFetcher??r;return o?u(nt,{...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 rt(e){return e.data?u(nt,{...e,data:e.data,fetcher:e.fetcher??We,integrityFetcher:e.integrityFetcher??We}):u(Kn,{...e})}import{AuthzDeniedError as lt}from"@aiquants/authz-core";import{formatCount as Wn}from"@aiquants/console-ui/core";import{assertSystemParameterInRange as Yn,INTEGRITY_COMMAND_CODES as Zn,IntegrityAuditOverviewSchema as Xn,IntegrityCommandFailureSchema as er,IntegrityCommandReplySchema as tr,IntegrityRunModeSchema as ut,integrityCommandFailureCodeOf as nr,isEnrichmentStageKey as rr,PipelineRunSummarySchema as sr,PipelineStepMetricSchema as ir}from"@aiquants/enrichment-core";import{CLOUD_CAPABLE_CAPABILITIES as ar,ConfidentialityLevelSchema as je,GovernedCapabilitySchema as or}from"@aiquants/governance-core";import{z as w}from"zod";var Le=3e3;function j(e){return Math.round(performance.now()-e)}function T(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 st(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 it(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 at(e){let t=e.trim().split("://",1)[0]?.toLowerCase();if(t&&e.includes("://"))return t.endsWith("s")||t.includes("+s")}function qn(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 ke(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 Bn(e){let t=e?.qdrantApiKey??F("QDRANT_API_KEY")??"",n=e?.timeoutMs??Le,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:T(d.version),endpoint:o,latencyMs:c,details:{engine:T(d.title),collectionsCount:g,restPort:qn(o)??null,tls:at(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 Vn(e){let t=e?.timeoutMs??Le,n=performance.now(),r=T(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([ke(s("CALL dbms.components() YIELD versions, edition RETURN versions[0] AS version, edition",{}),t),ke(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:T(c),endpoint:o,latencyMs:h,details:{edition:T(m),boltUri:r,nodeCount:typeof g=="number"?g:null,tls:r===null?null:at(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 Gn(e){let t=performance.now(),n="",r=it(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=st(e?.redisPort,F("REDIS_PORT"),"REDIS_PORT"),n=`${r===!1?"redis":"rediss"}://${a}:${o}`,await s.ping();let l=await s.info("server"),d=T(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 Qn(e){let t=e.match(/Microsoft SQL Server \d+ \([^)]+\)/);return T(t===null?e.substring(0,30):t[0].replace("Microsoft SQL Server ",""))}async function zn(e){let t=performance.now(),n="",r=it(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=st(e?.sqlServerPort,F("SQL_SERVER_PORT"),"SQL_SERVER_PORT"),n=`${a}:${o}`;let l=await s(),d=T(l.db_name),c=T(l.version),m=c===null?null:T(c.split(`
2
- `)[0]),g=m===null?null:Qn(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 Jn(e){let t=e?.timeoutMs??Le,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:T(s.info?.version),endpoint:r,latencyMs:l,details:{title:T(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 ot(e){let[t,n,r,o,s]=await Promise.all([Bn(e),Vn(e),Gn(e),zn(e),Jn(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 lr=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(),ur=w.discriminatedUnion("mode",[w.object({mode:ut.extract(["SCAN"]),basisRunUid:w.null()}).strict(),w.object({mode:ut.extract(["REPAIR"]),basisRunUid:w.string().uuid()}).strict()]),dr=w.object({runUid:w.string().uuid()}).strict();function ct(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 cr(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 pr(e){let t=sr.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 mr(e){let t=ir.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 gr(e){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`pipelineStepMetricWindow must be a positive safe integer, got ${String(e)}`);return e}async function yr(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=Xn.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 fr(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 pt(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 lt?new Response("\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002",{status:403}):se}let y=await a(f),H=gr(t.pipelineStepMetricWindow),[D,N,_]=await Promise.all([t.getFeatureFlags(y),t.getSystemParameters(y),t.getSyncCounts(y)]),E={featureFlags:D,systemParameters:N,syncCounts:_},[M,$,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),yr(t,y),d(f),c(f),t.getUnresolvedEntities(y),t.getQdrantCollections(y),ot({...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:M,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:mr(B),pipelineStepMetricWindow:H,recentPipelineRuns:pr(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,H=v.accessToken===null?void 0:v.accessToken;try{await s(f,{resourceKey:r,action:"update"})}catch(C){if(C instanceof lt)return await hr(f);throw C}let D=await a(f),N=await f.formData(),_=String(N.get("intent")??"");if(_==="refresh_health")return Response.json({success:!0,refreshed:!0});let E=await Sr(t,D,_,N,y);if(E)return E;let M=await Rr(t,D,_,N,y,H);if(M)return M;let $=await vr(t,D,_,N,H,()=>d(f));if($)return $;if(_==="resolve_entity"){let C=String(N.get("entityId")??""),I=String(N.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(D,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 Ar(t,D,_,N,y,f,l,H);return K||Response.json({error:`Unknown intent: ${_}`},{status:400})}return{loader:m,action:g}}function Fe(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 br(e){let t=String(e??"").trim();if(t==="")return null;let n=Number(t);if(!(!Number.isFinite(n)||n<=0))return n}async function Sr(e,t,n,r,o){if(n==="update_enrichment_strategy"){let s=String(r.get("stage")??"");if(!rr(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(!(je.safeParse(s).success&&or.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&&!ar.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=br(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:Fe(r.get("reading")),boost:a,domainKey:Fe(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:Fe(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=cr(l.data_type,a);if(d!==null)return Response.json({error:d},{status:400});try{Yn(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=lr.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=fr(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 Rr(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=er.parse({command:e,code:t,status:n}),o=Zn.find(s=>s.code===r.code);return Response.json({failure:r},{status:o===void 0?502:o.status})}async function hr(e){let t=await e.formData().catch(()=>null),n=t===null?null:ct(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 dt(e,t){let n;try{n=tr.parse(await t())}catch{return X(e,"UPSTREAM_FAILED",null)}return n.ok?Response.json({success:!0,runUid:n.runUid}):X(e,nr(e,n.status,n.errorCode),n.status)}async function vr(e,t,n,r,o,s){let a=ct(n);if(a==="start"){let l=ur.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 dt(a,()=>e.startIntegrityRun(t,d,c,o))}if(a==="cancel"){let l=dr.safeParse({runUid:r.get("runUid")});return l.success?o===void 0?X(a,"FORBIDDEN",null):await dt(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 Ir(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(!je.safeParse(t.confidentialityLevel).success)return`payload.confidentialityLevel must be one of ${je.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 wr(e){try{return Wn(e,ae),null}catch{return`inspectFileUri answered a fileSize that is not a byte count (a non-negative safe integer): ${String(e)}`}}async function Ar(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=Ir(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=wr(c.fileSize);return m!==null?Response.json({error:m},{status:400}):Response.json({success:!0,inspection:c})}return null}function is(e){let t=pt(e);return{loader:t.loader,action:t.action,View:rt,server:t}}export{rt as StorageAdminConsoleView,ot as checkAllSystemHealth,Jn as checkBackendApiHealth,Vn as checkNeo4jHealth,Bn as checkQdrantHealth,Gn as checkRedisHealth,zn as checkSqlServerHealth,is as createStorageAdminApp,pt 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.2.2",
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.1.1",
39
+ "@aiquants/console-ui": "^0.2.0",
40
40
  "@aiquants/enrichment-core": "^0.3.2",
41
- "@aiquants/enrichment-react": "^0.2.1",
41
+ "@aiquants/enrichment-react": "^0.3.0",
42
42
  "@aiquants/governance-core": "^0.2.1",
43
- "@aiquants/governance-react": "^0.2.2",
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.1.1",
51
+ "@aiquants/console-ui": "0.2.0",
52
52
  "@aiquants/enrichment-core": "0.3.2",
53
- "@aiquants/enrichment-react": "0.2.1",
53
+ "@aiquants/enrichment-react": "0.3.0",
54
54
  "@aiquants/governance-core": "0.2.1",
55
- "@aiquants/governance-react": "0.2.2",
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",