ltcai 7.0.0 → 7.2.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 +22 -20
- package/docs/CHANGELOG.md +43 -0
- package/frontend/src/App.tsx +80 -0
- package/frontend/src/api/client.ts +9 -0
- package/frontend/src/components/AdminAccessGate.tsx +70 -0
- package/frontend/src/components/BrainConversation.tsx +232 -8
- package/frontend/src/components/FeedbackState.tsx +45 -0
- package/frontend/src/components/WorkspaceProfileSwitcher.tsx +176 -0
- package/frontend/src/components/onboarding/AnalysisScreen.tsx +20 -12
- package/frontend/src/components/onboarding/InstallScreen.tsx +55 -0
- package/frontend/src/components/onboarding/RecommendationScreen.tsx +55 -5
- package/frontend/src/components/onboarding/recommendationModel.ts +59 -2
- package/frontend/src/features/admin/AdminConsole.tsx +41 -1
- package/frontend/src/features/brain/BrainConversation.tsx +232 -19
- package/frontend/src/features/brain/BrainGraphLayer.tsx +258 -25
- package/frontend/src/features/brain/BrainHome.tsx +193 -1
- package/frontend/src/features/brain/brainData.ts +25 -1
- package/frontend/src/features/brain/graphLayout.ts +12 -1
- package/frontend/src/features/brain/types.ts +41 -0
- package/frontend/src/i18n.ts +328 -0
- package/frontend/src/store/appStore.ts +15 -0
- package/frontend/src/styles.css +1175 -0
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/runtime/agent_runtime.py +51 -0
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/agents.py +12 -0
- package/latticeai/api/tools.py +14 -0
- package/latticeai/api/workspace.py +59 -0
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/tool_registry.py +47 -0
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/services/tool_dispatch.py +14 -0
- package/package.json +1 -1
- package/src-tauri/Cargo.lock +1 -1
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +28 -28
- package/static/app/assets/Act-Di4tRFWY.js +2 -0
- package/static/app/assets/{Act-DhLaHnrT.js.map → Act-Di4tRFWY.js.map} +1 -1
- package/static/app/assets/Brain-BZB3Gy9w.js +322 -0
- package/static/app/assets/Brain-BZB3Gy9w.js.map +1 -0
- package/static/app/assets/{Capture-CAKouj52.js → Capture-tNyYWxnh.js} +2 -2
- package/static/app/assets/{Capture-CAKouj52.js.map → Capture-tNyYWxnh.js.map} +1 -1
- package/static/app/assets/Library-DAtDDLdg.js +2 -0
- package/static/app/assets/{Library-B_hW4AwR.js.map → Library-DAtDDLdg.js.map} +1 -1
- package/static/app/assets/System-DEu0xNUc.js +2 -0
- package/static/app/assets/System-DEu0xNUc.js.map +1 -0
- package/static/app/assets/{index-DKFpn5Kn.css → index-Bi_bpigM.css} +1 -1
- package/static/app/assets/index-COuGp7_5.js +17 -0
- package/static/app/assets/index-COuGp7_5.js.map +1 -0
- package/static/app/assets/primitives-CdwcE--L.js +2 -0
- package/static/app/assets/primitives-CdwcE--L.js.map +1 -0
- package/static/app/assets/textarea-CqOdBPL1.js +2 -0
- package/static/app/assets/{textarea-DR2Tyy_6.js.map → textarea-CqOdBPL1.js.map} +1 -1
- package/static/app/index.html +2 -2
- package/static/app/assets/Act-DhLaHnrT.js +0 -2
- package/static/app/assets/Brain-DS7NULyY.js +0 -322
- package/static/app/assets/Brain-DS7NULyY.js.map +0 -1
- package/static/app/assets/Library-B_hW4AwR.js +0 -2
- package/static/app/assets/System-9OAoXWPz.js +0 -2
- package/static/app/assets/System-9OAoXWPz.js.map +0 -1
- package/static/app/assets/index-C-7aHabu.js +0 -17
- package/static/app/assets/index-C-7aHabu.js.map +0 -1
- package/static/app/assets/primitives-DcO2H3yh.js +0 -2
- package/static/app/assets/primitives-DcO2H3yh.js.map +0 -1
- package/static/app/assets/textarea-DR2Tyy_6.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{_ as e,b as t,c as n,d as r,f as i,g as a,h as o,i as s,m as c,n as l,t as u,v as d
|
|
2
|
-
//# sourceMappingURL=Capture-
|
|
1
|
+
import{_ as e,b as t,c as n,d as r,f as i,g as a,h as o,i as s,m as c,n as l,t as u,v as d}from"./primitives-CdwcE--L.js";import{B as f,C as p,F as m,I as h,M as g,N as _,P as v,R as y,S as b,T as x,b as S,d as C,h as w,j as T,m as E,n as D,r as O,u as k}from"./index-COuGp7_5.js";var A=b(`hard-drive`,[[`path`,{d:`M10 16h.01`,key:`1bzywj`}],[`path`,{d:`M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`18tbho`}],[`path`,{d:`M21.946 12.013H2.054`,key:`zqlbp7`}],[`path`,{d:`M6 16h.01`,key:`1pmjb7`}]]),j=b(`upload`,[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]]),M=f(y()),N=h();function P({initialTab:e}){let t=g(e=>e.language),[n,r]=M.useState(e||`files`),a=[{id:`files`,label:p(t,`capture.tab.files`)},{id:`local`,label:p(t,`capture.tab.local`)},{id:`browser`,label:p(t,`capture.tab.browser`)},{id:`pipeline`,label:p(t,`capture.tab.pipeline`)}];return M.useEffect(()=>{(e===`pipeline`||e===`local`||e===`files`)&&r(e)},[e]),(0,N.jsxs)(`div`,{className:`space-y-5`,children:[(0,N.jsxs)(`header`,{className:`page-hero`,children:[(0,N.jsxs)(`div`,{className:`page-kicker`,children:[(0,N.jsx)(j,{className:`h-4 w-4`}),` `,p(t,`capture.kicker`)]}),(0,N.jsx)(`h1`,{className:`page-title`,children:p(t,`capture.title`)}),(0,N.jsx)(`p`,{className:`page-copy`,children:p(t,`capture.body`)})]}),(0,N.jsx)(i,{tabs:a,value:n,onChange:e=>r(e)}),n===`files`?(0,N.jsx)(F,{}):null,n===`local`?(0,N.jsx)(z,{}):null,n===`browser`?(0,N.jsx)(B,{}):null,n===`pipeline`?(0,N.jsx)(V,{}):null]})}function F(){let t=g(e=>e.language),n=m(),r=v({queryKey:[`documents`],queryFn:()=>T.documents(200)}),[i,u]=M.useState([]),f=_({mutationFn:e=>I(e,u),onSuccess:()=>{n.invalidateQueries({queryKey:[`documents`]}),n.invalidateQueries({queryKey:[`graphStats`]}),n.invalidateQueries({queryKey:[`memoryManager`]})}}),h=M.useCallback(e=>{let t=Array.from(e);t.length&&f.mutate(t)},[f]);return(0,N.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[0.75fr_1.25fr]`,children:[(0,N.jsxs)(c,{children:[(0,N.jsxs)(e,{children:[(0,N.jsxs)(d,{className:`flex items-center gap-2`,children:[(0,N.jsx)(j,{className:`h-4 w-4`}),` `,p(t,`capture.files.title`)]}),(0,N.jsx)(a,{children:p(t,`capture.files.description`)})]}),(0,N.jsxs)(o,{children:[(0,N.jsxs)(`label`,{className:`flex min-h-56 cursor-pointer flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-muted/30 p-6 text-center transition hover:bg-muted/50`,onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault(),h(e.dataTransfer.files)},children:[(0,N.jsx)(j,{className:`h-7 w-7 text-primary`}),(0,N.jsx)(`span`,{className:`text-lg font-semibold`,children:p(t,`capture.files.drop`)}),(0,N.jsx)(`span`,{className:`max-w-sm text-sm leading-6 text-muted-foreground`,children:p(t,`capture.files.dropDetail`)}),(0,N.jsx)(`input`,{type:`file`,multiple:!0,className:`sr-only`,onChange:e=>e.target.files&&h(e.target.files)})]}),(0,N.jsx)(L,{queue:i,onRetry:e=>h([e])})]})]}),(0,N.jsx)(l,{title:p(t,`capture.files.uploaded`),result:r.data,children:e=>(0,N.jsxs)(`div`,{className:`space-y-3`,children:[(0,N.jsx)(s,{items:e.documents||e,titleKey:`filename`,metaKey:`ingest_state`,limit:12}),(0,N.jsx)(`div`,{className:`rounded-md border border-border bg-background/55 p-3 text-sm text-muted-foreground`,children:p(t,`capture.files.completed`)})]})})]})}async function I(e,t){let n=e.map(e=>({id:`${e.name}-${e.size}-${e.lastModified}-${Date.now()}`,file:e,name:e.name,size:e.size,status:`queued`}));t(e=>[...n,...e].slice(0,12));let r=[];for(let e of n){t(t=>t.map(t=>t.id===e.id?{...t,status:`uploading`}:t));let n=await T.uploadDocument(e.file);r.push(n),t(t=>t.map(t=>t.id===e.id?{...t,status:n.ok?`done`:`failed`,result:n}:t))}return r}function L({queue:e,onRetry:r}){let i=g(e=>e.language);return e.length?(0,N.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.map(e=>{let a=R(e,i);return(0,N.jsxs)(`div`,{className:`rounded-md border border-border bg-background/55 p-3 text-sm`,children:[(0,N.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2 font-medium`,children:[e.status===`done`?(0,N.jsx)(S,{className:`h-4 w-4 text-emerald-400`}):e.status===`failed`?(0,N.jsx)(t,{className:`h-4 w-4 text-amber-400`}):(0,N.jsx)(C,{className:`h-4 w-4 animate-spin text-primary`}),e.name]}),(0,N.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[Math.max(1,Math.round(e.size/1024)),` KB · `,a]})]}),e.status===`failed`?(0,N.jsxs)(O,{size:`sm`,variant:`outline`,onClick:()=>r(e.file),children:[(0,N.jsx)(k,{className:`h-3.5 w-3.5`}),` `,p(i,`capture.retry`)]}):null]}),e.result?(0,N.jsx)(n,{result:e.result,successLabel:p(i,`capture.files.success`)}):null]},e.id)})}):null}function R(e,t){if(e.status===`queued`)return p(t,`capture.files.queued`);if(e.status===`uploading`)return p(t,`capture.files.uploading`);if(!e.result?.ok)return e.result?.error||p(t,`capture.files.failed`);let n=e.result.data||{},r=String(n.node_id||n.graph_node||n.provenance_id||``);return r?p(t,`capture.files.capturedWithNode`,{node:r}):p(t,`capture.files.captured`)}function z(){let t=g(e=>e.language),i=m(),[f,h]=M.useState(``),y=v({queryKey:[`localSources`],queryFn:T.localSources}),b=v({queryKey:[`localAgent`],queryFn:T.localAgent}),S=_({mutationFn:()=>T.connectFolder(f),onSuccess:()=>i.invalidateQueries({queryKey:[`localSources`]})});return(0,N.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[0.9fr_1.1fr]`,children:[(0,N.jsxs)(c,{children:[(0,N.jsxs)(e,{children:[(0,N.jsxs)(d,{className:`flex items-center gap-2`,children:[(0,N.jsx)(E,{className:`h-4 w-4`}),` `,p(t,`capture.local.title`)]}),(0,N.jsx)(a,{children:p(t,`capture.local.description`)})]}),(0,N.jsxs)(o,{className:`space-y-3`,children:[(0,N.jsx)(D,{value:f,onChange:e=>h(e.target.value),placeholder:p(t,`capture.local.placeholder`)}),(0,N.jsx)(O,{disabled:!f.trim()||S.isPending,onClick:()=>S.mutate(),children:p(t,`capture.local.connect`)}),S.data?(0,N.jsx)(n,{result:S.data,successLabel:p(t,`capture.local.success`)}):null]})]}),(0,N.jsx)(l,{title:p(t,`capture.local.sources`),result:y.data,children:e=>(0,N.jsxs)(`div`,{className:`space-y-3`,children:[(0,N.jsx)(s,{items:e.sources,titleKey:`path`,metaKey:`status`}),x(e.sources).map(e=>(0,N.jsx)(u,{label:`Stop ${String(e.path||e.id||`source`)}`,action:()=>T.localWatchStop(String(e.id||e.source_id)),invalidate:[`localSources`]},String(e.id||e.source_id||e.path)))]})}),(0,N.jsx)(l,{title:p(t,`capture.local.access`),result:b.data,className:`xl:col-span-2`,children:e=>(0,N.jsx)(r,{value:e})})]})}function B(){let t=g(e=>e.language),[r,i]=M.useState(``),s=_({mutationFn:()=>T.browserReadUrl(r)});return(0,N.jsxs)(c,{children:[(0,N.jsxs)(e,{children:[(0,N.jsxs)(d,{className:`flex items-center gap-2`,children:[(0,N.jsx)(w,{className:`h-4 w-4`}),` `,p(t,`capture.browser.title`)]}),(0,N.jsx)(a,{children:p(t,`capture.browser.description`)})]}),(0,N.jsxs)(o,{className:`space-y-3`,children:[(0,N.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,N.jsx)(D,{value:r,onChange:e=>i(e.target.value),placeholder:p(t,`capture.browser.placeholder`)}),(0,N.jsx)(O,{disabled:!r.trim()||s.isPending,onClick:()=>s.mutate(),children:p(t,`capture.browser.capture`)})]}),s.data?(0,N.jsx)(n,{result:s.data,successLabel:p(t,`capture.browser.success`)}):null]})]})}function V(){let t=g(e=>e.language),n=v({queryKey:[`index`],queryFn:T.indexStatus}),i=v({queryKey:[`graphStats`],queryFn:T.graphStats});return(0,N.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,N.jsx)(l,{title:p(t,`capture.pipeline.status`),result:n.data,children:e=>(0,N.jsx)(r,{value:e})}),(0,N.jsx)(l,{title:p(t,`capture.pipeline.growth`),result:i.data,children:e=>(0,N.jsx)(r,{value:e})}),(0,N.jsxs)(c,{className:`xl:col-span-2`,children:[(0,N.jsxs)(e,{children:[(0,N.jsxs)(d,{className:`flex items-center gap-2`,children:[(0,N.jsx)(A,{className:`h-4 w-4`}),` `,p(t,`capture.pipeline.refresh`)]}),(0,N.jsx)(a,{children:p(t,`capture.pipeline.description`)})]}),(0,N.jsx)(o,{children:(0,N.jsx)(u,{label:p(t,`capture.pipeline.rebuild`),action:()=>T.rebuildIndex(),invalidate:[`index`]})})]})]})}export{P as CapturePage};
|
|
2
|
+
//# sourceMappingURL=Capture-tNyYWxnh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Capture-CAKouj52.js","names":["__iconNode"],"sources":["../../../node_modules/lucide-react/dist/esm/icons/hard-drive.mjs","../../../node_modules/lucide-react/dist/esm/icons/upload.mjs","../../../frontend/src/pages/Capture.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 16h.01\", key: \"1bzywj\" }],\n [\n \"path\",\n {\n d: \"M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"18tbho\"\n }\n ],\n [\"path\", { d: \"M21.946 12.013H2.054\", key: \"zqlbp7\" }],\n [\"path\", { d: \"M6 16h.01\", key: \"1pmjb7\" }]\n];\nconst HardDrive = createLucideIcon(\"hard-drive\", __iconNode);\n\nexport { __iconNode, HardDrive as default };\n//# sourceMappingURL=hard-drive.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.mjs.map\n","import * as React from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { AlertCircle, CheckCircle2, FolderPlus, Globe2, HardDrive, Loader2, RotateCcw, Upload } from \"lucide-react\";\nimport { latticeApi } from \"@/api/client\";\nimport { ActionButton, DataPanel, EntityList, OperationResult, StructuredView, Tabs } from \"@/components/primitives\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { t, type Language } from \"@/i18n\";\nimport { asArray } from \"@/lib/utils\";\nimport { useAppStore } from \"@/store/appStore\";\n\ntype CaptureTab = \"files\" | \"local\" | \"browser\" | \"pipeline\";\n\nexport function CapturePage({ initialTab }: { initialTab?: string }) {\n const language = useAppStore((state) => state.language);\n const [tab, setTab] = React.useState<CaptureTab>((initialTab as CaptureTab) || \"files\");\n const tabs: Array<{ id: CaptureTab; label: string }> = [\n { id: \"files\", label: t(language, \"capture.tab.files\") },\n { id: \"local\", label: t(language, \"capture.tab.local\") },\n { id: \"browser\", label: t(language, \"capture.tab.browser\") },\n { id: \"pipeline\", label: t(language, \"capture.tab.pipeline\") },\n ];\n React.useEffect(() => {\n if (initialTab === \"pipeline\" || initialTab === \"local\" || initialTab === \"files\") setTab(initialTab);\n }, [initialTab]);\n return (\n <div className=\"space-y-5\">\n <header className=\"page-hero\">\n <div className=\"page-kicker\"><Upload className=\"h-4 w-4\" /> {t(language, \"capture.kicker\")}</div>\n <h1 className=\"page-title\">{t(language, \"capture.title\")}</h1>\n <p className=\"page-copy\">{t(language, \"capture.body\")}</p>\n </header>\n <Tabs tabs={tabs} value={tab} onChange={(id) => setTab(id as CaptureTab)} />\n {tab === \"files\" ? <FilesPanel /> : null}\n {tab === \"local\" ? <LocalPanel /> : null}\n {tab === \"browser\" ? <BrowserPanel /> : null}\n {tab === \"pipeline\" ? <PipelinePanel /> : null}\n </div>\n );\n}\n\nfunction FilesPanel() {\n const language = useAppStore((state) => state.language);\n const qc = useQueryClient();\n const docs = useQuery({ queryKey: [\"documents\"], queryFn: () => latticeApi.documents(200) });\n const [queue, setQueue] = React.useState<UploadQueueItem[]>([]);\n const upload = useMutation({\n mutationFn: (files: File[]) => uploadFiles(files, setQueue),\n onSuccess: () => {\n void qc.invalidateQueries({ queryKey: [\"documents\"] });\n void qc.invalidateQueries({ queryKey: [\"graphStats\"] });\n void qc.invalidateQueries({ queryKey: [\"memoryManager\"] });\n },\n });\n const beginUpload = React.useCallback((files: FileList | File[]) => {\n const nextFiles = Array.from(files);\n if (!nextFiles.length) return;\n upload.mutate(nextFiles);\n }, [upload]);\n return (\n <div className=\"grid gap-4 xl:grid-cols-[0.75fr_1.25fr]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Upload className=\"h-4 w-4\" /> {t(language, \"capture.files.title\")}</CardTitle>\n <CardDescription>{t(language, \"capture.files.description\")}</CardDescription>\n </CardHeader>\n <CardContent>\n <label\n className=\"flex min-h-56 cursor-pointer flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-muted/30 p-6 text-center transition hover:bg-muted/50\"\n onDragOver={(event) => event.preventDefault()}\n onDrop={(event) => {\n event.preventDefault();\n beginUpload(event.dataTransfer.files);\n }}\n >\n <Upload className=\"h-7 w-7 text-primary\" />\n <span className=\"text-lg font-semibold\">{t(language, \"capture.files.drop\")}</span>\n <span className=\"max-w-sm text-sm leading-6 text-muted-foreground\">{t(language, \"capture.files.dropDetail\")}</span>\n <input type=\"file\" multiple className=\"sr-only\" onChange={(e) => e.target.files && beginUpload(e.target.files)} />\n </label>\n <DocumentUploadQueue queue={queue} onRetry={(file) => beginUpload([file])} />\n </CardContent>\n </Card>\n <DataPanel title={t(language, \"capture.files.uploaded\")} result={docs.data}>\n {(data) => (\n <div className=\"space-y-3\">\n <EntityList items={(data as Record<string, unknown>).documents || data} titleKey=\"filename\" metaKey=\"ingest_state\" limit={12} />\n <div className=\"rounded-md border border-border bg-background/55 p-3 text-sm text-muted-foreground\">\n {t(language, \"capture.files.completed\")}\n </div>\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n\ntype UploadQueueItem = {\n id: string;\n file: File;\n name: string;\n size: number;\n status: \"queued\" | \"uploading\" | \"done\" | \"failed\";\n result?: Awaited<ReturnType<typeof latticeApi.uploadDocument>>;\n};\n\nasync function uploadFiles(files: File[], setQueue: React.Dispatch<React.SetStateAction<UploadQueueItem[]>>) {\n const rows = files.map((file) => ({\n id: `${file.name}-${file.size}-${file.lastModified}-${Date.now()}`,\n file,\n name: file.name,\n size: file.size,\n status: \"queued\" as const,\n }));\n setQueue((items) => [...rows, ...items].slice(0, 12));\n const results = [];\n for (const row of rows) {\n setQueue((items) => items.map((item) => item.id === row.id ? { ...item, status: \"uploading\" } : item));\n const result = await latticeApi.uploadDocument(row.file);\n results.push(result);\n setQueue((items) => items.map((item) => item.id === row.id ? { ...item, status: result.ok ? \"done\" : \"failed\", result } : item));\n }\n return results;\n}\n\nfunction DocumentUploadQueue({ queue, onRetry }: { queue: UploadQueueItem[]; onRetry: (file: File) => void }) {\n const language = useAppStore((state) => state.language);\n if (!queue.length) return null;\n return (\n <div className=\"mt-4 space-y-2\">\n {queue.map((item) => {\n const detail = uploadResultDetail(item, language);\n return (\n <div key={item.id} className=\"rounded-md border border-border bg-background/55 p-3 text-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"flex items-center gap-2 font-medium\">\n {item.status === \"done\" ? <CheckCircle2 className=\"h-4 w-4 text-emerald-400\" /> : item.status === \"failed\" ? <AlertCircle className=\"h-4 w-4 text-amber-400\" /> : <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />}\n {item.name}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {Math.max(1, Math.round(item.size / 1024))} KB · {detail}\n </div>\n </div>\n {item.status === \"failed\" ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => onRetry(item.file)}>\n <RotateCcw className=\"h-3.5 w-3.5\" /> {t(language, \"capture.retry\")}\n </Button>\n ) : null}\n </div>\n {item.result ? <OperationResult result={item.result} successLabel={t(language, \"capture.files.success\")} /> : null}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction uploadResultDetail(item: UploadQueueItem, language: Language) {\n if (item.status === \"queued\") return t(language, \"capture.files.queued\");\n if (item.status === \"uploading\") return t(language, \"capture.files.uploading\");\n if (!item.result?.ok) return item.result?.error || t(language, \"capture.files.failed\");\n const data = item.result.data || {};\n const node = String(data.node_id || data.graph_node || data.provenance_id || \"\");\n return node ? t(language, \"capture.files.capturedWithNode\", { node }) : t(language, \"capture.files.captured\");\n}\n\nfunction LocalPanel() {\n const language = useAppStore((state) => state.language);\n const qc = useQueryClient();\n const [path, setPath] = React.useState(\"\");\n const local = useQuery({ queryKey: [\"localSources\"], queryFn: latticeApi.localSources });\n const agent = useQuery({ queryKey: [\"localAgent\"], queryFn: latticeApi.localAgent });\n const connect = useMutation({\n mutationFn: () => latticeApi.connectFolder(path),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"localSources\"] }),\n });\n return (\n <div className=\"grid gap-4 xl:grid-cols-[0.9fr_1.1fr]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><FolderPlus className=\"h-4 w-4\" /> {t(language, \"capture.local.title\")}</CardTitle>\n <CardDescription>{t(language, \"capture.local.description\")}</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Input value={path} onChange={(e) => setPath(e.target.value)} placeholder={t(language, \"capture.local.placeholder\")} />\n <Button disabled={!path.trim() || connect.isPending} onClick={() => connect.mutate()}>{t(language, \"capture.local.connect\")}</Button>\n {connect.data ? <OperationResult result={connect.data} successLabel={t(language, \"capture.local.success\")} /> : null}\n </CardContent>\n </Card>\n <DataPanel title={t(language, \"capture.local.sources\")} result={local.data}>\n {(data) => (\n <div className=\"space-y-3\">\n <EntityList items={(data as Record<string, unknown>).sources} titleKey=\"path\" metaKey=\"status\" />\n {asArray<Record<string, unknown>>((data as Record<string, unknown>).sources).map((source) => (\n <ActionButton\n key={String(source.id || source.source_id || source.path)}\n label={`Stop ${String(source.path || source.id || \"source\")}`}\n action={() => latticeApi.localWatchStop(String(source.id || source.source_id))}\n invalidate={[\"localSources\"]}\n />\n ))}\n </div>\n )}\n </DataPanel>\n <DataPanel title={t(language, \"capture.local.access\")} result={agent.data} className=\"xl:col-span-2\">\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n </div>\n );\n}\n\nfunction BrowserPanel() {\n const language = useAppStore((state) => state.language);\n const [url, setUrl] = React.useState(\"\");\n const read = useMutation({ mutationFn: () => latticeApi.browserReadUrl(url) });\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Globe2 className=\"h-4 w-4\" /> {t(language, \"capture.browser.title\")}</CardTitle>\n <CardDescription>{t(language, \"capture.browser.description\")}</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input value={url} onChange={(e) => setUrl(e.target.value)} placeholder={t(language, \"capture.browser.placeholder\")} />\n <Button disabled={!url.trim() || read.isPending} onClick={() => read.mutate()}>{t(language, \"capture.browser.capture\")}</Button>\n </div>\n {read.data ? <OperationResult result={read.data} successLabel={t(language, \"capture.browser.success\")} /> : null}\n </CardContent>\n </Card>\n );\n}\n\nfunction PipelinePanel() {\n const language = useAppStore((state) => state.language);\n const index = useQuery({ queryKey: [\"index\"], queryFn: latticeApi.indexStatus });\n const stats = useQuery({ queryKey: [\"graphStats\"], queryFn: latticeApi.graphStats });\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title={t(language, \"capture.pipeline.status\")} result={index.data}>\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n <DataPanel title={t(language, \"capture.pipeline.growth\")} result={stats.data}>\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n <Card className=\"xl:col-span-2\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><HardDrive className=\"h-4 w-4\" /> {t(language, \"capture.pipeline.refresh\")}</CardTitle>\n <CardDescription>{t(language, \"capture.pipeline.description\")}</CardDescription>\n </CardHeader>\n <CardContent>\n <ActionButton label={t(language, \"capture.pipeline.rebuild\")} action={() => latticeApi.rebuildIndex()} invalidate={[\"index\"]} />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Capture-tNyYWxnh.js","names":["__iconNode"],"sources":["../../../node_modules/lucide-react/dist/esm/icons/hard-drive.mjs","../../../node_modules/lucide-react/dist/esm/icons/upload.mjs","../../../frontend/src/pages/Capture.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 16h.01\", key: \"1bzywj\" }],\n [\n \"path\",\n {\n d: \"M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"18tbho\"\n }\n ],\n [\"path\", { d: \"M21.946 12.013H2.054\", key: \"zqlbp7\" }],\n [\"path\", { d: \"M6 16h.01\", key: \"1pmjb7\" }]\n];\nconst HardDrive = createLucideIcon(\"hard-drive\", __iconNode);\n\nexport { __iconNode, HardDrive as default };\n//# sourceMappingURL=hard-drive.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.mjs.map\n","import * as React from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { AlertCircle, CheckCircle2, FolderPlus, Globe2, HardDrive, Loader2, RotateCcw, Upload } from \"lucide-react\";\nimport { latticeApi } from \"@/api/client\";\nimport { ActionButton, DataPanel, EntityList, OperationResult, StructuredView, Tabs } from \"@/components/primitives\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { t, type Language } from \"@/i18n\";\nimport { asArray } from \"@/lib/utils\";\nimport { useAppStore } from \"@/store/appStore\";\n\ntype CaptureTab = \"files\" | \"local\" | \"browser\" | \"pipeline\";\n\nexport function CapturePage({ initialTab }: { initialTab?: string }) {\n const language = useAppStore((state) => state.language);\n const [tab, setTab] = React.useState<CaptureTab>((initialTab as CaptureTab) || \"files\");\n const tabs: Array<{ id: CaptureTab; label: string }> = [\n { id: \"files\", label: t(language, \"capture.tab.files\") },\n { id: \"local\", label: t(language, \"capture.tab.local\") },\n { id: \"browser\", label: t(language, \"capture.tab.browser\") },\n { id: \"pipeline\", label: t(language, \"capture.tab.pipeline\") },\n ];\n React.useEffect(() => {\n if (initialTab === \"pipeline\" || initialTab === \"local\" || initialTab === \"files\") setTab(initialTab);\n }, [initialTab]);\n return (\n <div className=\"space-y-5\">\n <header className=\"page-hero\">\n <div className=\"page-kicker\"><Upload className=\"h-4 w-4\" /> {t(language, \"capture.kicker\")}</div>\n <h1 className=\"page-title\">{t(language, \"capture.title\")}</h1>\n <p className=\"page-copy\">{t(language, \"capture.body\")}</p>\n </header>\n <Tabs tabs={tabs} value={tab} onChange={(id) => setTab(id as CaptureTab)} />\n {tab === \"files\" ? <FilesPanel /> : null}\n {tab === \"local\" ? <LocalPanel /> : null}\n {tab === \"browser\" ? <BrowserPanel /> : null}\n {tab === \"pipeline\" ? <PipelinePanel /> : null}\n </div>\n );\n}\n\nfunction FilesPanel() {\n const language = useAppStore((state) => state.language);\n const qc = useQueryClient();\n const docs = useQuery({ queryKey: [\"documents\"], queryFn: () => latticeApi.documents(200) });\n const [queue, setQueue] = React.useState<UploadQueueItem[]>([]);\n const upload = useMutation({\n mutationFn: (files: File[]) => uploadFiles(files, setQueue),\n onSuccess: () => {\n void qc.invalidateQueries({ queryKey: [\"documents\"] });\n void qc.invalidateQueries({ queryKey: [\"graphStats\"] });\n void qc.invalidateQueries({ queryKey: [\"memoryManager\"] });\n },\n });\n const beginUpload = React.useCallback((files: FileList | File[]) => {\n const nextFiles = Array.from(files);\n if (!nextFiles.length) return;\n upload.mutate(nextFiles);\n }, [upload]);\n return (\n <div className=\"grid gap-4 xl:grid-cols-[0.75fr_1.25fr]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Upload className=\"h-4 w-4\" /> {t(language, \"capture.files.title\")}</CardTitle>\n <CardDescription>{t(language, \"capture.files.description\")}</CardDescription>\n </CardHeader>\n <CardContent>\n <label\n className=\"flex min-h-56 cursor-pointer flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-muted/30 p-6 text-center transition hover:bg-muted/50\"\n onDragOver={(event) => event.preventDefault()}\n onDrop={(event) => {\n event.preventDefault();\n beginUpload(event.dataTransfer.files);\n }}\n >\n <Upload className=\"h-7 w-7 text-primary\" />\n <span className=\"text-lg font-semibold\">{t(language, \"capture.files.drop\")}</span>\n <span className=\"max-w-sm text-sm leading-6 text-muted-foreground\">{t(language, \"capture.files.dropDetail\")}</span>\n <input type=\"file\" multiple className=\"sr-only\" onChange={(e) => e.target.files && beginUpload(e.target.files)} />\n </label>\n <DocumentUploadQueue queue={queue} onRetry={(file) => beginUpload([file])} />\n </CardContent>\n </Card>\n <DataPanel title={t(language, \"capture.files.uploaded\")} result={docs.data}>\n {(data) => (\n <div className=\"space-y-3\">\n <EntityList items={(data as Record<string, unknown>).documents || data} titleKey=\"filename\" metaKey=\"ingest_state\" limit={12} />\n <div className=\"rounded-md border border-border bg-background/55 p-3 text-sm text-muted-foreground\">\n {t(language, \"capture.files.completed\")}\n </div>\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n\ntype UploadQueueItem = {\n id: string;\n file: File;\n name: string;\n size: number;\n status: \"queued\" | \"uploading\" | \"done\" | \"failed\";\n result?: Awaited<ReturnType<typeof latticeApi.uploadDocument>>;\n};\n\nasync function uploadFiles(files: File[], setQueue: React.Dispatch<React.SetStateAction<UploadQueueItem[]>>) {\n const rows = files.map((file) => ({\n id: `${file.name}-${file.size}-${file.lastModified}-${Date.now()}`,\n file,\n name: file.name,\n size: file.size,\n status: \"queued\" as const,\n }));\n setQueue((items) => [...rows, ...items].slice(0, 12));\n const results = [];\n for (const row of rows) {\n setQueue((items) => items.map((item) => item.id === row.id ? { ...item, status: \"uploading\" } : item));\n const result = await latticeApi.uploadDocument(row.file);\n results.push(result);\n setQueue((items) => items.map((item) => item.id === row.id ? { ...item, status: result.ok ? \"done\" : \"failed\", result } : item));\n }\n return results;\n}\n\nfunction DocumentUploadQueue({ queue, onRetry }: { queue: UploadQueueItem[]; onRetry: (file: File) => void }) {\n const language = useAppStore((state) => state.language);\n if (!queue.length) return null;\n return (\n <div className=\"mt-4 space-y-2\">\n {queue.map((item) => {\n const detail = uploadResultDetail(item, language);\n return (\n <div key={item.id} className=\"rounded-md border border-border bg-background/55 p-3 text-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"flex items-center gap-2 font-medium\">\n {item.status === \"done\" ? <CheckCircle2 className=\"h-4 w-4 text-emerald-400\" /> : item.status === \"failed\" ? <AlertCircle className=\"h-4 w-4 text-amber-400\" /> : <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />}\n {item.name}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {Math.max(1, Math.round(item.size / 1024))} KB · {detail}\n </div>\n </div>\n {item.status === \"failed\" ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => onRetry(item.file)}>\n <RotateCcw className=\"h-3.5 w-3.5\" /> {t(language, \"capture.retry\")}\n </Button>\n ) : null}\n </div>\n {item.result ? <OperationResult result={item.result} successLabel={t(language, \"capture.files.success\")} /> : null}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction uploadResultDetail(item: UploadQueueItem, language: Language) {\n if (item.status === \"queued\") return t(language, \"capture.files.queued\");\n if (item.status === \"uploading\") return t(language, \"capture.files.uploading\");\n if (!item.result?.ok) return item.result?.error || t(language, \"capture.files.failed\");\n const data = item.result.data || {};\n const node = String(data.node_id || data.graph_node || data.provenance_id || \"\");\n return node ? t(language, \"capture.files.capturedWithNode\", { node }) : t(language, \"capture.files.captured\");\n}\n\nfunction LocalPanel() {\n const language = useAppStore((state) => state.language);\n const qc = useQueryClient();\n const [path, setPath] = React.useState(\"\");\n const local = useQuery({ queryKey: [\"localSources\"], queryFn: latticeApi.localSources });\n const agent = useQuery({ queryKey: [\"localAgent\"], queryFn: latticeApi.localAgent });\n const connect = useMutation({\n mutationFn: () => latticeApi.connectFolder(path),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"localSources\"] }),\n });\n return (\n <div className=\"grid gap-4 xl:grid-cols-[0.9fr_1.1fr]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><FolderPlus className=\"h-4 w-4\" /> {t(language, \"capture.local.title\")}</CardTitle>\n <CardDescription>{t(language, \"capture.local.description\")}</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Input value={path} onChange={(e) => setPath(e.target.value)} placeholder={t(language, \"capture.local.placeholder\")} />\n <Button disabled={!path.trim() || connect.isPending} onClick={() => connect.mutate()}>{t(language, \"capture.local.connect\")}</Button>\n {connect.data ? <OperationResult result={connect.data} successLabel={t(language, \"capture.local.success\")} /> : null}\n </CardContent>\n </Card>\n <DataPanel title={t(language, \"capture.local.sources\")} result={local.data}>\n {(data) => (\n <div className=\"space-y-3\">\n <EntityList items={(data as Record<string, unknown>).sources} titleKey=\"path\" metaKey=\"status\" />\n {asArray<Record<string, unknown>>((data as Record<string, unknown>).sources).map((source) => (\n <ActionButton\n key={String(source.id || source.source_id || source.path)}\n label={`Stop ${String(source.path || source.id || \"source\")}`}\n action={() => latticeApi.localWatchStop(String(source.id || source.source_id))}\n invalidate={[\"localSources\"]}\n />\n ))}\n </div>\n )}\n </DataPanel>\n <DataPanel title={t(language, \"capture.local.access\")} result={agent.data} className=\"xl:col-span-2\">\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n </div>\n );\n}\n\nfunction BrowserPanel() {\n const language = useAppStore((state) => state.language);\n const [url, setUrl] = React.useState(\"\");\n const read = useMutation({ mutationFn: () => latticeApi.browserReadUrl(url) });\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Globe2 className=\"h-4 w-4\" /> {t(language, \"capture.browser.title\")}</CardTitle>\n <CardDescription>{t(language, \"capture.browser.description\")}</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input value={url} onChange={(e) => setUrl(e.target.value)} placeholder={t(language, \"capture.browser.placeholder\")} />\n <Button disabled={!url.trim() || read.isPending} onClick={() => read.mutate()}>{t(language, \"capture.browser.capture\")}</Button>\n </div>\n {read.data ? <OperationResult result={read.data} successLabel={t(language, \"capture.browser.success\")} /> : null}\n </CardContent>\n </Card>\n );\n}\n\nfunction PipelinePanel() {\n const language = useAppStore((state) => state.language);\n const index = useQuery({ queryKey: [\"index\"], queryFn: latticeApi.indexStatus });\n const stats = useQuery({ queryKey: [\"graphStats\"], queryFn: latticeApi.graphStats });\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title={t(language, \"capture.pipeline.status\")} result={index.data}>\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n <DataPanel title={t(language, \"capture.pipeline.growth\")} result={stats.data}>\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n <Card className=\"xl:col-span-2\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><HardDrive className=\"h-4 w-4\" /> {t(language, \"capture.pipeline.refresh\")}</CardTitle>\n <CardDescription>{t(language, \"capture.pipeline.description\")}</CardDescription>\n </CardHeader>\n <CardContent>\n <ActionButton label={t(language, \"capture.pipeline.rebuild\")} action={() => latticeApi.rebuildIndex()} invalidate={[\"index\"]} />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{_ as e,c as t,d as n,f as r,g as i,h as a,i as o,m as s,n as c,p as l,r as u,t as d,u as f,v as p,y as m}from"./primitives-CdwcE--L.js";import{B as h,F as g,I as _,M as v,N as y,P as b,R as x,S,T as C,b as w,g as T,j as E,n as D,r as O,v as k}from"./index-COuGp7_5.js";var A=S(`boxes`,[[`path`,{d:`M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z`,key:`lc1i9w`}],[`path`,{d:`m7 16.5-4.74-2.85`,key:`1o9zyk`}],[`path`,{d:`m7 16.5 5-3`,key:`va8pkn`}],[`path`,{d:`M7 16.5v5.17`,key:`jnp8gn`}],[`path`,{d:`M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z`,key:`8zsnat`}],[`path`,{d:`m17 16.5-5-3`,key:`8arw3v`}],[`path`,{d:`m17 16.5 4.74-2.85`,key:`8rfmw`}],[`path`,{d:`M17 16.5v5.17`,key:`k6z78m`}],[`path`,{d:`M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z`,key:`1xygjf`}],[`path`,{d:`M12 8 7.26 5.15`,key:`1vbdud`}],[`path`,{d:`m12 8 4.74-2.85`,key:`3rx089`}],[`path`,{d:`M12 13.5V8`,key:`1io7kd`}]]),j=S(`circle-play`,[[`path`,{d:`M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z`,key:`kmsa83`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),M=S(`package-plus`,[[`path`,{d:`M12 22V12`,key:`d0xqtd`}],[`path`,{d:`M16 17h6`,key:`1ook5g`}],[`path`,{d:`M19 14v6`,key:`1ckrd5`}],[`path`,{d:`M21 10.535V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.729l7 4a2 2 0 0 0 2 .001l1.675-.955`,key:`28k6lz`}],[`path`,{d:`M3.29 7 12 12l8.71-5`,key:`19ckod`}],[`path`,{d:`m7.5 4.27 8.997 5.148`,key:`9yrvtv`}]]),N=S(`plug`,[[`path`,{d:`M12 22v-5`,key:`1ega77`}],[`path`,{d:`M15 8V2`,key:`18g5xt`}],[`path`,{d:`M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z`,key:`1xoxul`}],[`path`,{d:`M9 8V2`,key:`14iosj`}]]),P=S(`shield-alert`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]),F=h(x()),I=_(),L=[{id:`models`,label:`Models`},{id:`skills`,label:`Skills`},{id:`mcp`,label:`Connections`},{id:`marketplace`,label:`Marketplace`}];function R({initialTab:e}){let t=v(e=>e.mode),[n,i]=F.useState(e||`models`);F.useEffect(()=>{L.some(t=>t.id===e)&&i(e)},[e]);let a=L.map(e=>e.id===`mcp`&&t!==`basic`?{...e,label:`MCP / tools`}:e);return(0,I.jsxs)(`div`,{className:`space-y-5`,children:[(0,I.jsxs)(`header`,{className:`page-hero`,children:[(0,I.jsxs)(`div`,{className:`page-kicker`,children:[(0,I.jsx)(A,{className:`h-4 w-4`}),` Library`]}),(0,I.jsx)(`h1`,{className:`page-title`,children:`Choose your Brain's voice.`}),(0,I.jsx)(`p`,{className:`page-copy`,children:`Start with a short local model recommendation. Your Brain and memories stay durable when you switch later.`})]}),(0,I.jsx)(r,{tabs:a,value:n,onChange:e=>i(e)}),n===`models`?(0,I.jsx)(z,{}):null,n===`skills`?(0,I.jsx)(W,{}):null,n===`mcp`?(0,I.jsx)(G,{}):null,n===`marketplace`?(0,I.jsx)(K,{}):null]})}function z(){let e=g(),t=v(e=>e.mode),r=b({queryKey:[`models`],queryFn:E.models}),i=b({queryKey:[`modelRecommendations`,`local_mlx`],queryFn:()=>E.modelRecommendations(`local_mlx`)}),a=b({queryKey:[`embeddings`],queryFn:E.embeddingsStatus}),[s,f]=F.useState(!1),[p,h]=F.useState(null),[_,y]=F.useState([]),[x,S]=F.useState(null),[D,A]=F.useState(null),[N,L]=F.useState(!1),R=[...C(r.data?.data?.catalog),...C(r.data?.data?.recommended)],z=C(i.data?.data?.recommendations?.models),W=new Map(z.map(e=>[String(e.id),e])),G=C(r.data?.data?.loaded),K=String(r.data?.data?.current||``),q=R.find(e=>G.includes(String(e.id))||String(e.id)===K),J=i.data?.data?.recommendations?.top_pick||null,Y=_[_.length-1]||null,X=F.useCallback(e=>{let n=String(e||`This model is not ready to load yet.`);return t===`basic`?n.replace(/gemma4_unified/gi,`this local model format`).replace(/mlx[-_ ]?vlm|mlx[-_ ]?lm|local_mlx|\bmlx\b|\bgguf\b|\bollama\b|hugging face/gi,`local model support`).replace(/runtime/gi,`model support`).replace(/model_type/gi,`model format`).replace(/this local model format local model support format/gi,`this local model format`).replace(/local model support model support/gi,`local model support`):n},[t]);async function Z(t,n,r){L(!0),h(t),y([]),S(null),A(null);let i=await E.streamModelPrepare({model:t,engine:n||`local_mlx`,allow_download:r},{onProgress:e=>y(t=>[...t.slice(-8),e]),onDone:e=>S(e),onError:e=>A(e)});L(!1),await e.invalidateQueries({queryKey:[`models`]}),await e.invalidateQueries({queryKey:[`modelRecommendations`,`local_mlx`]}),!i.ok&&!D&&A(i.data)}return(0,I.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[1.2fr_0.8fr]`,children:[(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsx)(c,{title:`Guided model setup`,description:`Lattice recommends a small set first, explains internet/download needs, and keeps every model download behind consent.`,result:i.data,children:t=>{let n=t.recommendations,r=t.profile;return(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsx)(V,{profile:r||{},recommendation:n||{},current:q,currentId:K,latestProgress:Y,lastResult:x,onReload:()=>{q&&Z(String(q.recommended_load_id||q.id||K),String(q.recommended_engine||q.engine||`local_mlx`),s)},onUnload:()=>{K&&E.unloadModel(K).then(()=>e.invalidateQueries({queryKey:[`models`]}))}}),(0,I.jsx)(`div`,{className:`grid gap-2 md:grid-cols-3 xl:grid-cols-6`,children:[[`Environment Analysis`,!0,k],[`Recommended Models`,!!(J||R.length),w],[`Install`,!!(q||Y?.stage===`engine`),M],[`Download Progress`,!!(q||Y?.stage===`download`),T],[`Validate`,!!(q||Y?.stage===`smoke_test`),P],[`Load / Ready`,!!(q||x),j]].map(([e,t,n])=>(0,I.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/55 p-3`,children:[F.createElement(n,{className:`h-4 w-4 text-primary`}),(0,I.jsx)(`div`,{className:`mt-2 text-sm font-medium`,children:String(e)}),(0,I.jsx)(m,{variant:t?`success`:`muted`,children:t?`ready`:`pending`})]},String(e)))}),(0,I.jsxs)(`label`,{className:`flex items-start gap-2 rounded-lg border border-border bg-background/55 p-3 text-sm leading-6`,children:[(0,I.jsx)(`input`,{className:`mt-1`,type:`checkbox`,checked:s,onChange:e=>f(e.target.checked)}),(0,I.jsx)(`span`,{children:`Allow Lattice to install a missing local model component or download model files for this action. Download uses the internet; running the model stays local.`})]}),Y?(0,I.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/55 p-3 text-sm`,children:[(0,I.jsx)(`div`,{className:`font-medium`,children:String(Y.message||`Preparing model`)}),(0,I.jsx)(`div`,{className:`mt-2 h-2 overflow-hidden rounded-full bg-muted`,children:(0,I.jsx)(`div`,{className:`h-full bg-primary`,style:{width:`${Number(Y.percent||8)}%`}})}),Y.detail?(0,I.jsx)(`div`,{className:`mt-2 text-xs text-muted-foreground`,children:String(Y.detail)}):null]}):null,D?(0,I.jsx)(H,{error:D}):null]})}}),(0,I.jsx)(c,{title:t===`basic`?`Recommended models`:`Recommended and advanced models`,result:r.data,children:e=>(0,I.jsxs)(`div`,{className:`grid gap-2`,children:[(R.length?R:C(e.loaded)).slice(0,t===`basic`?3:14).map((n,r)=>{let i=String(n.id||n.model_id||n.name||r),a=C(e.loaded).includes(i)||e.current===i||n.state===`loaded`,o=String(n.recommended_load_id||i),c=String(n.recommended_engine||n.engine||``),l=W.get(i)||W.get(o)||{},u=U(n.verification),f=U(l.verification),h=U(n.hardware),g=U(l.hardware),_=h.notes||g.notes||(h.recommended_ram_gb?`~${h.recommended_ram_gb}GB RAM rec`:``),v=n.safety_notes||l.safety_notes,y=n.license||l.license,b=n.runtime_compatibility||l.runtime_compatibility||{},x=String(b.status||``)===`fallback_available`,S=n.load_status===`unsupported`||b.supported===!1,w=!!n.download_required,T=(!!n.load_available||a)&&!S,D=String(n.load_status||(a?`loaded`:`unavailable`)),k=X(n.unavailable_reason||`This model is not ready to load yet.`),A=String(n.runtime_label||b.preferred_runtime||c||`local_mlx`),j=String(b.action||D.replace(/_/g,` `)),M=S&&t===`basic`?`needs attention`:S?j:D,P=T||w,F=n.download_size||n.estimated_size||l.download_size||l.estimated_size||n.size||l.size,L=n.provider||l.provider||n.organization||l.organization;return(0,I.jsxs)(`div`,{className:`grid gap-3 rounded-lg border border-border bg-background/55 p-4 md:grid-cols-[1fr_auto]`,children:[(0,I.jsxs)(`div`,{className:`min-w-0`,children:[(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,I.jsx)(`div`,{className:`text-base font-semibold`,children:String(n.name||i)}),J?.id===i||n.recommended_default?(0,I.jsx)(m,{variant:`success`,children:`recommended`}):null,String(n.modality||l.modality||``).includes(`multi`)||String(n.modality||``)===`multimodal`?(0,I.jsx)(m,{variant:`muted`,children:`multimodal`}):null,u.verified||f.verified?(0,I.jsx)(m,{variant:`success`,title:`HF verified (config+tokenizer present)`,children:`✓ HF`}):null]}),(0,I.jsx)(`div`,{className:`mt-1 text-sm text-muted-foreground`,children:t===`basic`?[X(n.family||l.family||`Local model`),/mlx|gguf|ollama/i.test(String(n.size||l.size||``))?``:n.size||l.size].filter(Boolean).map(String).join(` · `):[n.family||l.family||`local`,n.size||l.size].filter(Boolean).map(String).join(` · `)}),n.hardware||l.hardware?(0,I.jsx)(`div`,{className:`mt-1 text-[11px] text-muted-foreground/80`,children:String(_)}):null,(0,I.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1 text-[11px] text-muted-foreground`,children:[(0,I.jsx)(m,{variant:`muted`,children:w?`Download: ${String(F||`required`)}`:`No download needed now`}),(0,I.jsx)(m,{variant:`muted`,children:w?`Internet only during download`:`Runs locally when loaded`}),L?(0,I.jsx)(m,{variant:`muted`,children:String(L)}):null]}),S?(0,I.jsxs)(`div`,{className:`mt-3 rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm`,children:[(0,I.jsx)(`div`,{className:`font-medium`,children:t===`basic`?`Needs attention before loading`:j}),(0,I.jsx)(`div`,{className:`text-muted-foreground`,children:X(b.user_message||k)})]}):x?(0,I.jsxs)(`div`,{className:`mt-3 rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm`,children:[(0,I.jsx)(`div`,{className:`font-medium`,children:t===`basic`?`Compatible loading path available`:`Runtime fallback available`}),(0,I.jsx)(`div`,{className:`text-muted-foreground`,children:X(b.user_message||`Lattice will try the compatible local runtime path before showing this model as unsupported.`)})]}):!a&&!T?(0,I.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:k}):null,t===`basic`?null:(0,I.jsxs)(`div`,{className:`mt-2 space-y-1 text-xs text-muted-foreground`,children:[(0,I.jsxs)(`div`,{children:[A,` · `,o,n.load_strategy||l.load_strategy?` · ${String(n.load_strategy||l.load_strategy)}`:``,u.notes?` · ${String(u.notes).slice(0,60)}`:``]}),v||y?(0,I.jsx)(`div`,{children:[y?`License: ${String(y)}`:``,v?String(v):``].filter(Boolean).join(` · `)}):null]}),S||x?(0,I.jsx)(B,{compatibility:b}):null]}),(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 md:justify-end`,children:[(0,I.jsx)(m,{variant:a?`success`:T?`muted`:`warning`,children:a?`loaded`:M}),a?(0,I.jsx)(d,{label:`Unload`,action:()=>E.unloadModel(o),invalidate:[`models`]}):(0,I.jsx)(O,{variant:`outline`,disabled:N||S||!P||w&&!s,onClick:()=>Z(o,c||`local_mlx`,s),children:p===o&&N?`Preparing`:w?`Install & Load`:`Validate & Load`})]})]},i)}),t===`basic`&&R.length>3?(0,I.jsx)(`div`,{className:`rounded-lg border border-border bg-background/55 p-3 text-sm text-muted-foreground`,children:`Showing the safest short list. Switch to Advanced for the full registry, runtime details, licenses, and safety notes.`}):null]})})]}),(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsx)(c,{title:t===`basic`?`Memory search support`:`Embedding provider`,result:a.data,children:e=>t===`basic`?(0,I.jsx)(l,{value:e.state||`ready`}):(0,I.jsx)(n,{value:e})}),(0,I.jsx)(c,{title:`Model validation`,result:r.data,children:e=>{let n=C(e.compat_profiles);return n.length?(0,I.jsx)(o,{items:n.map(e=>({...e,name:t===`basic`?e.name||e.display_name||`Loaded model`:e.name||e.display_name||e.model_id,status:e.quality_status||e.load_status||`checked`})),titleKey:`name`,metaKey:`status`,limit:6}):(0,I.jsx)(u,{title:`No model checked yet`,detail:`Load a model to confirm it can answer before you start using it.`})}})]})]})}function B({compatibility:e}){let t=v(e=>e.mode),n=C(e.alternatives);return n.length?(0,I.jsx)(`div`,{className:`mt-2 flex flex-wrap gap-1`,children:n.slice(0,3).map(e=>(0,I.jsx)(m,{variant:`muted`,children:t===`basic`&&/mlx|gguf|ollama|lm studio/i.test(String(e.name||e.id))?`Compatible alternative`:String(e.name||e.id)},String(e.id||e.name)))}):null}function V({profile:e,recommendation:t,current:n,currentId:r,latestProgress:i,lastResult:a,onReload:o,onUnload:s}){let c=String(n?.name||n?.id||r||``),l=String(n?.engine||n?.recommended_engine||i?.engine||`local_mlx`),u=String(n?.local_path||n?.storage_location||t.cache_path||t.storage_location||`~/.cache/huggingface / ~/.latticeai/models`),d=String(i?.stage||a?.stage||(c?`ready`:`idle`));return(0,I.jsxs)(`div`,{className:`space-y-3`,children:[(0,I.jsx)(f,{stats:[{label:`Computer`,value:e?.os?`${String(e.os)} ${String(e.arch||``)}`:`detected`},{label:`Engine`,value:l},{label:`Loaded model`,value:c||`No local model loaded`},{label:`Runtime state`,value:d}]}),(0,I.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/55 p-3 text-sm`,children:[(0,I.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`div`,{className:`font-medium`,children:c?`Local model runtime is available`:`No model is loaded yet`}),(0,I.jsxs)(`div`,{className:`mt-1 text-muted-foreground`,children:[`Cache/storage: `,u]})]}),(0,I.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,I.jsx)(O,{variant:`outline`,size:`sm`,disabled:!c,onClick:o,children:`Reload`}),(0,I.jsx)(O,{variant:`outline`,size:`sm`,disabled:!c,onClick:s,children:`Unload`})]})]}),i?(0,I.jsxs)(`div`,{className:`mt-3`,children:[(0,I.jsxs)(`div`,{className:`flex justify-between text-xs text-muted-foreground`,children:[(0,I.jsx)(`span`,{children:String(i.message||`Preparing model`)}),(0,I.jsxs)(`span`,{children:[Number(i.percent||0),`%`]})]}),(0,I.jsx)(`div`,{className:`mt-1 h-2 overflow-hidden rounded-full bg-muted`,children:(0,I.jsx)(`div`,{className:`h-full bg-primary`,style:{width:`${Number(i.percent||8)}%`}})})]}):null]})]})}function H({error:e}){let t=C(e.recovery_guidance);return(0,I.jsxs)(`div`,{className:`rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm`,children:[(0,I.jsx)(`div`,{className:`font-medium`,children:String(e.user_message||`Model setup needs attention.`)}),t.length?(0,I.jsx)(`ul`,{className:`mt-2 list-inside list-disc text-muted-foreground`,children:t.slice(0,3).map(e=>(0,I.jsx)(`li`,{children:e},e))}):null]})}function U(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function W(){let e=g(),t=b({queryKey:[`skills`],queryFn:E.skills}),n=b({queryKey:[`skillsMarketplace`],queryFn:E.skillsMarketplace}),r=y({mutationFn:e=>E.skillInstall(String(e.name||e.id),String(e.plugin||``)),onSuccess:()=>e.invalidateQueries({queryKey:[`skills`]})});return(0,I.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,I.jsx)(c,{title:`Installed skills`,result:t.data,children:e=>(0,I.jsx)(`div`,{className:`grid gap-2`,children:C(e.skills).map(e=>(0,I.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border border-border p-3`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`div`,{className:`font-medium`,children:String(e.name||e.id)}),(0,I.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:String(e.plugin||e.description||``)})]}),(0,I.jsx)(d,{label:e.enabled?`Disable`:`Enable`,action:()=>E.skillToggle(String(e.name||e.id),!!e.enabled),invalidate:[`skills`]})]},String(e.name||e.id)))})}),(0,I.jsx)(c,{title:`Skill marketplace`,result:n.data,children:e=>(0,I.jsx)(`div`,{className:`grid gap-2`,children:C(e.skills).slice(0,10).map(e=>(0,I.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border border-border p-3`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`div`,{className:`font-medium`,children:String(e.name||e.id)}),(0,I.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:String(e.description||e.category||``)})]}),(0,I.jsx)(O,{variant:`outline`,disabled:r.isPending,onClick:()=>r.mutate(e),children:`Install`})]},String(e.name||e.id)))})})]})}function G(){let n=v(e=>e.mode),[r,l]=F.useState(`github`),u=b({queryKey:[`mcpTools`],queryFn:E.mcpTools}),d=y({mutationFn:()=>E.mcpRecommend(r)});return(0,I.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[1fr_1fr]`,children:[(0,I.jsx)(c,{title:n===`basic`?`Tool connections`:`MCP tools`,result:u.data,children:e=>(0,I.jsx)(o,{items:e.tools||e.installed_mcps,titleKey:`name`,metaKey:`status`})}),(0,I.jsxs)(s,{children:[(0,I.jsxs)(e,{children:[(0,I.jsxs)(p,{className:`flex items-center gap-2`,children:[(0,I.jsx)(N,{className:`h-4 w-4`}),` Recommend connector`]}),(0,I.jsx)(i,{children:`Describe what you want to connect and Lattice will suggest a connector.`})]}),(0,I.jsxs)(a,{className:`space-y-3`,children:[(0,I.jsxs)(`div`,{className:`flex gap-2`,children:[(0,I.jsx)(D,{value:r,onChange:e=>l(e.target.value)}),(0,I.jsx)(O,{onClick:()=>d.mutate(),disabled:!r.trim()||d.isPending,children:`Recommend`})]}),d.data?(0,I.jsx)(t,{result:d.data,successLabel:`Recommendation completed`}):null]})]})]})}function K(){let t=b({queryKey:[`templates`],queryFn:E.templates}),n=b({queryKey:[`plugins`],queryFn:E.pluginsRegistry}),r=b({queryKey:[`pluginsDirectory`],queryFn:E.pluginsDirectory});return(0,I.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-3`,children:[(0,I.jsx)(c,{title:`Templates`,result:t.data,children:e=>(0,I.jsx)(o,{items:e.templates,titleKey:`name`,metaKey:`kind`})}),(0,I.jsx)(c,{title:`Installed plugins`,result:n.data,children:e=>(0,I.jsx)(o,{items:e.plugins,titleKey:`name`,metaKey:`status`})}),(0,I.jsx)(c,{title:`Plugin directory`,result:r.data,children:e=>(0,I.jsx)(o,{items:e.plugins,titleKey:`name`,metaKey:`category`})}),(0,I.jsxs)(s,{className:`xl:col-span-3`,children:[(0,I.jsxs)(e,{children:[(0,I.jsxs)(p,{className:`flex items-center gap-2`,children:[(0,I.jsx)(M,{className:`h-4 w-4`}),` Template install`]}),(0,I.jsx)(i,{children:`Start from a reusable workspace pattern.`})]}),(0,I.jsx)(a,{children:C(t.data?.data?.templates).length?(0,I.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:C(t.data?.data?.templates).slice(0,6).map(e=>(0,I.jsx)(d,{label:`Install ${String(e.name||e.id)}`,action:()=>E.installTemplate(e)},String(e.id||e.name)))}):(0,I.jsx)(o,{items:[]})})]})]})}export{R as LibraryPage};
|
|
2
|
+
//# sourceMappingURL=Library-DAtDDLdg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Library-B_hW4AwR.js","names":["__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../../../node_modules/lucide-react/dist/esm/icons/boxes.mjs","../../../node_modules/lucide-react/dist/esm/icons/circle-play.mjs","../../../node_modules/lucide-react/dist/esm/icons/package-plus.mjs","../../../node_modules/lucide-react/dist/esm/icons/plug.mjs","../../../node_modules/lucide-react/dist/esm/icons/shield-alert.mjs","../../../frontend/src/pages/Library.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z\",\n key: \"lc1i9w\"\n }\n ],\n [\"path\", { d: \"m7 16.5-4.74-2.85\", key: \"1o9zyk\" }],\n [\"path\", { d: \"m7 16.5 5-3\", key: \"va8pkn\" }],\n [\"path\", { d: \"M7 16.5v5.17\", key: \"jnp8gn\" }],\n [\n \"path\",\n {\n d: \"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z\",\n key: \"8zsnat\"\n }\n ],\n [\"path\", { d: \"m17 16.5-5-3\", key: \"8arw3v\" }],\n [\"path\", { d: \"m17 16.5 4.74-2.85\", key: \"8rfmw\" }],\n [\"path\", { d: \"M17 16.5v5.17\", key: \"k6z78m\" }],\n [\n \"path\",\n {\n d: \"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z\",\n key: \"1xygjf\"\n }\n ],\n [\"path\", { d: \"M12 8 7.26 5.15\", key: \"1vbdud\" }],\n [\"path\", { d: \"m12 8 4.74-2.85\", key: \"3rx089\" }],\n [\"path\", { d: \"M12 13.5V8\", key: \"1io7kd\" }]\n];\nconst Boxes = createLucideIcon(\"boxes\", __iconNode);\n\nexport { __iconNode, Boxes as default };\n//# sourceMappingURL=boxes.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z\",\n key: \"kmsa83\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n];\nconst CirclePlay = createLucideIcon(\"circle-play\", __iconNode);\n\nexport { __iconNode, CirclePlay as default };\n//# sourceMappingURL=circle-play.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 22V12\", key: \"d0xqtd\" }],\n [\"path\", { d: \"M16 17h6\", key: \"1ook5g\" }],\n [\"path\", { d: \"M19 14v6\", key: \"1ckrd5\" }],\n [\n \"path\",\n {\n d: \"M21 10.535V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.729l7 4a2 2 0 0 0 2 .001l1.675-.955\",\n key: \"28k6lz\"\n }\n ],\n [\"path\", { d: \"M3.29 7 12 12l8.71-5\", key: \"19ckod\" }],\n [\"path\", { d: \"m7.5 4.27 8.997 5.148\", key: \"9yrvtv\" }]\n];\nconst PackagePlus = createLucideIcon(\"package-plus\", __iconNode);\n\nexport { __iconNode, PackagePlus as default };\n//# sourceMappingURL=package-plus.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 22v-5\", key: \"1ega77\" }],\n [\"path\", { d: \"M15 8V2\", key: \"18g5xt\" }],\n [\n \"path\",\n { d: \"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z\", key: \"1xoxul\" }\n ],\n [\"path\", { d: \"M9 8V2\", key: \"14iosj\" }]\n];\nconst Plug = createLucideIcon(\"plug\", __iconNode);\n\nexport { __iconNode, Plug as default };\n//# sourceMappingURL=plug.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"M12 8v4\", key: \"1got3b\" }],\n [\"path\", { d: \"M12 16h.01\", key: \"1drbdi\" }]\n];\nconst ShieldAlert = createLucideIcon(\"shield-alert\", __iconNode);\n\nexport { __iconNode, ShieldAlert as default };\n//# sourceMappingURL=shield-alert.mjs.map\n","import * as React from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Boxes, CheckCircle2, Cpu, Download, PackagePlus, PlayCircle, Plug, ShieldAlert } from \"lucide-react\";\nimport { latticeApi } from \"@/api/client\";\nimport { ActionButton, DataPanel, EmptyState, EntityList, OperationResult, StatGrid, StructuredView, Tabs, ValuePreview } from \"@/components/primitives\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { useAppStore } from \"@/store/appStore\";\nimport { asArray } from \"@/lib/utils\";\n\ntype LibraryTab = \"models\" | \"skills\" | \"mcp\" | \"marketplace\";\n\nconst tabs: Array<{ id: LibraryTab; label: string }> = [\n { id: \"models\", label: \"Models\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"mcp\", label: \"Connections\" },\n { id: \"marketplace\", label: \"Marketplace\" },\n];\n\nexport function LibraryPage({ initialTab }: { initialTab?: string }) {\n const mode = useAppStore((state) => state.mode);\n const [tab, setTab] = React.useState<LibraryTab>((initialTab as LibraryTab) || \"models\");\n React.useEffect(() => {\n if (tabs.some((item) => item.id === initialTab)) setTab(initialTab as LibraryTab);\n }, [initialTab]);\n const visibleTabs = tabs.map((item) => item.id === \"mcp\" && mode !== \"basic\" ? { ...item, label: \"MCP / tools\" } : item);\n return (\n <div className=\"space-y-5\">\n <header className=\"page-hero\">\n <div className=\"page-kicker\"><Boxes className=\"h-4 w-4\" /> Library</div>\n <h1 className=\"page-title\">Choose your Brain's voice.</h1>\n <p className=\"page-copy\">Start with a short local model recommendation. Your Brain and memories stay durable when you switch later.</p>\n </header>\n <Tabs tabs={visibleTabs} value={tab} onChange={(id) => setTab(id as LibraryTab)} />\n {tab === \"models\" ? <ModelsPanel /> : null}\n {tab === \"skills\" ? <SkillsPanel /> : null}\n {tab === \"mcp\" ? <McpPanel /> : null}\n {tab === \"marketplace\" ? <MarketplacePanel /> : null}\n </div>\n );\n}\n\nfunction ModelsPanel() {\n const qc = useQueryClient();\n const mode = useAppStore((state) => state.mode);\n const models = useQuery({ queryKey: [\"models\"], queryFn: latticeApi.models });\n const recs = useQuery({ queryKey: [\"modelRecommendations\", \"local_mlx\"], queryFn: () => latticeApi.modelRecommendations(\"local_mlx\") });\n const emb = useQuery({ queryKey: [\"embeddings\"], queryFn: latticeApi.embeddingsStatus });\n const [consent, setConsent] = React.useState(false);\n const [activeModel, setActiveModel] = React.useState<string | null>(null);\n const [progress, setProgress] = React.useState<Record<string, unknown>[]>([]);\n const [lastResult, setLastResult] = React.useState<Record<string, unknown> | null>(null);\n const [lastError, setLastError] = React.useState<Record<string, unknown> | null>(null);\n const [busy, setBusy] = React.useState(false);\n const catalog = [\n ...asArray<Record<string, unknown>>((models.data?.data as Record<string, unknown>)?.catalog),\n ...asArray<Record<string, unknown>>((models.data?.data as Record<string, unknown>)?.recommended),\n ];\n const recommendationRows = asArray<Record<string, unknown>>(\n ((recs.data?.data as Record<string, unknown>)?.recommendations as Record<string, unknown> | undefined)?.models,\n );\n const recommendationById = new Map(recommendationRows.map((item) => [String(item.id), item]));\n const loadedIds = asArray<string>((models.data?.data as Record<string, unknown> | undefined)?.loaded);\n const currentId = String((models.data?.data as Record<string, unknown> | undefined)?.current || \"\");\n const current = catalog.find((model) => loadedIds.includes(String(model.id)) || String(model.id) === currentId);\n const topPick = (((recs.data?.data as Record<string, unknown> | undefined)?.recommendations as Record<string, unknown> | undefined)?.top_pick || null) as Record<string, unknown> | null;\n const latestProgress = progress[progress.length - 1] || null;\n\n const modelMessage = React.useCallback((message: unknown) => {\n const text = String(message || \"This model is not ready to load yet.\");\n if (mode !== \"basic\") return text;\n return text\n .replace(/gemma4_unified/gi, \"this local model format\")\n .replace(/mlx[-_ ]?vlm|mlx[-_ ]?lm|local_mlx|\\bmlx\\b|\\bgguf\\b|\\bollama\\b|hugging face/gi, \"local model support\")\n .replace(/runtime/gi, \"model support\")\n .replace(/model_type/gi, \"model format\")\n .replace(/this local model format local model support format/gi, \"this local model format\")\n .replace(/local model support model support/gi, \"local model support\");\n }, [mode]);\n\n async function prepareModel(loadId: string, engine: string, allowDownload: boolean) {\n setBusy(true);\n setActiveModel(loadId);\n setProgress([]);\n setLastResult(null);\n setLastError(null);\n const result = await latticeApi.streamModelPrepare(\n { model: loadId, engine: engine || \"local_mlx\", allow_download: allowDownload },\n {\n onProgress: (event) => setProgress((items) => [...items.slice(-8), event]),\n onDone: (event) => setLastResult(event),\n onError: (event) => setLastError(event),\n },\n );\n setBusy(false);\n await qc.invalidateQueries({ queryKey: [\"models\"] });\n await qc.invalidateQueries({ queryKey: [\"modelRecommendations\", \"local_mlx\"] });\n if (!result.ok && !lastError) setLastError(result.data as Record<string, unknown>);\n }\n\n return (\n <div className=\"grid gap-4 xl:grid-cols-[1.2fr_0.8fr]\">\n <div className=\"space-y-4\">\n <DataPanel title=\"Guided model setup\" description=\"Lattice recommends a small set first, explains internet/download needs, and keeps every model download behind consent.\" result={recs.data}>\n {(data) => {\n const recommendation = (data as Record<string, unknown>).recommendations as Record<string, unknown> | undefined;\n const profile = (data as Record<string, unknown>).profile as Record<string, unknown> | undefined;\n return (\n <div className=\"space-y-4\">\n <ModelRuntimeSummary\n profile={profile || {}}\n recommendation={recommendation || {}}\n current={current}\n currentId={currentId}\n latestProgress={latestProgress}\n lastResult={lastResult}\n onReload={() => {\n if (current) void prepareModel(String(current.recommended_load_id || current.id || currentId), String(current.recommended_engine || current.engine || \"local_mlx\"), consent);\n }}\n onUnload={() => {\n if (currentId) void latticeApi.unloadModel(currentId).then(() => qc.invalidateQueries({ queryKey: [\"models\"] }));\n }}\n />\n <div className=\"grid gap-2 md:grid-cols-3 xl:grid-cols-6\">\n {[\n [\"Environment Analysis\", true, Cpu],\n [\"Recommended Models\", Boolean(topPick || catalog.length), CheckCircle2],\n [\"Install\", Boolean(current || latestProgress?.stage === \"engine\"), PackagePlus],\n [\"Download Progress\", Boolean(current || latestProgress?.stage === \"download\"), Download],\n [\"Validate\", Boolean(current || latestProgress?.stage === \"smoke_test\"), ShieldAlert],\n [\"Load / Ready\", Boolean(current || lastResult), PlayCircle],\n ].map(([label, done, Icon]) => (\n <div key={String(label)} className=\"rounded-lg border border-border bg-background/55 p-3\">\n {React.createElement(Icon as typeof Cpu, { className: \"h-4 w-4 text-primary\" })}\n <div className=\"mt-2 text-sm font-medium\">{String(label)}</div>\n <Badge variant={done ? \"success\" : \"muted\"}>{done ? \"ready\" : \"pending\"}</Badge>\n </div>\n ))}\n </div>\n <label className=\"flex items-start gap-2 rounded-lg border border-border bg-background/55 p-3 text-sm leading-6\">\n <input className=\"mt-1\" type=\"checkbox\" checked={consent} onChange={(event) => setConsent(event.target.checked)} />\n <span>\n Allow Lattice to install a missing local model component or download model files for this action. Download uses the internet; running the model stays local.\n </span>\n </label>\n {latestProgress ? (\n <div className=\"rounded-lg border border-border bg-background/55 p-3 text-sm\">\n <div className=\"font-medium\">{String(latestProgress.message || \"Preparing model\")}</div>\n <div className=\"mt-2 h-2 overflow-hidden rounded-full bg-muted\">\n <div className=\"h-full bg-primary\" style={{ width: `${Number(latestProgress.percent || 8)}%` }} />\n </div>\n {latestProgress.detail ? <div className=\"mt-2 text-xs text-muted-foreground\">{String(latestProgress.detail)}</div> : null}\n </div>\n ) : null}\n {lastError ? <ModelRecovery error={lastError} /> : null}\n </div>\n );\n }}\n </DataPanel>\n <DataPanel title={mode === \"basic\" ? \"Recommended models\" : \"Recommended and advanced models\"} result={models.data}>\n {(data) => (\n <div className=\"grid gap-2\">\n {(catalog.length ? catalog : asArray<Record<string, unknown>>((data as Record<string, unknown>).loaded)).slice(0, mode === \"basic\" ? 3 : 14).map((model, index) => {\n const id = String(model.id || model.model_id || model.name || index);\n const loaded = asArray<string>((data as Record<string, unknown>).loaded).includes(id) || (data as Record<string, unknown>).current === id || model.state === \"loaded\";\n const loadId = String(model.recommended_load_id || id);\n const engine = String(model.recommended_engine || model.engine || \"\");\n const recommendation = recommendationById.get(id) || recommendationById.get(loadId) || {};\n const modelVerification = asRecord(model.verification);\n const recommendationVerification = asRecord(recommendation.verification);\n const modelHardware = asRecord(model.hardware);\n const recommendationHardware = asRecord(recommendation.hardware);\n const hardwareNote = modelHardware.notes || recommendationHardware.notes || (modelHardware.recommended_ram_gb ? `~${modelHardware.recommended_ram_gb}GB RAM rec` : \"\");\n const safetyNotes = model.safety_notes || recommendation.safety_notes;\n const licenseText = model.license || recommendation.license;\n const compatibility = (model.runtime_compatibility || recommendation.runtime_compatibility || {}) as Record<string, unknown>;\n const fallbackAvailable = String(compatibility.status || \"\") === \"fallback_available\";\n const unsupported = model.load_status === \"unsupported\" || compatibility.supported === false;\n const downloadRequired = Boolean(model.download_required);\n const loadAvailable = (Boolean(model.load_available) || loaded) && !unsupported;\n const loadStatus = String(model.load_status || (loaded ? \"loaded\" : \"unavailable\"));\n const unavailableReason = modelMessage(model.unavailable_reason || \"This model is not ready to load yet.\");\n const runtimeLabel = String(model.runtime_label || compatibility.preferred_runtime || engine || \"local_mlx\");\n const actionLabel = String(compatibility.action || loadStatus.replace(/_/g, \" \"));\n const badgeLabel = unsupported && mode === \"basic\" ? \"needs attention\" : unsupported ? actionLabel : loadStatus;\n const canPrepare = loadAvailable || downloadRequired;\n const downloadSize = model.download_size || model.estimated_size || recommendation.download_size || recommendation.estimated_size || model.size || recommendation.size;\n const maker = model.provider || recommendation.provider || model.organization || recommendation.organization;\n return (\n <div key={id} className=\"grid gap-3 rounded-lg border border-border bg-background/55 p-4 md:grid-cols-[1fr_auto]\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"text-base font-semibold\">{String(model.name || id)}</div>\n {topPick?.id === id || model.recommended_default ? <Badge variant=\"success\">recommended</Badge> : null}\n {String(model.modality || recommendation.modality || \"\").includes(\"multi\") || String(model.modality || \"\") === \"multimodal\" ? <Badge variant=\"muted\">multimodal</Badge> : null}\n {modelVerification.verified || recommendationVerification.verified ? <Badge variant=\"success\" title=\"HF verified (config+tokenizer present)\">✓ HF</Badge> : null}\n </div>\n <div className=\"mt-1 text-sm text-muted-foreground\">\n {mode === \"basic\"\n ? [\n modelMessage(model.family || recommendation.family || \"Local model\"),\n /mlx|gguf|ollama/i.test(String(model.size || recommendation.size || \"\")) ? \"\" : model.size || recommendation.size,\n ].filter(Boolean).map(String).join(\" · \")\n : [model.family || recommendation.family || \"local\", model.size || recommendation.size].filter(Boolean).map(String).join(\" · \")}\n </div>\n {(model.hardware || recommendation.hardware) ? (\n <div className=\"mt-1 text-[11px] text-muted-foreground/80\">\n {String(hardwareNote)}\n </div>\n ) : null}\n <div className=\"mt-2 flex flex-wrap gap-1 text-[11px] text-muted-foreground\">\n <Badge variant=\"muted\">{downloadRequired ? `Download: ${String(downloadSize || \"required\")}` : \"No download needed now\"}</Badge>\n <Badge variant=\"muted\">{downloadRequired ? \"Internet only during download\" : \"Runs locally when loaded\"}</Badge>\n {maker ? <Badge variant=\"muted\">{String(maker)}</Badge> : null}\n </div>\n {unsupported ? (\n <div className=\"mt-3 rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm\">\n <div className=\"font-medium\">{mode === \"basic\" ? \"Needs attention before loading\" : actionLabel}</div>\n <div className=\"text-muted-foreground\">{modelMessage(compatibility.user_message || unavailableReason)}</div>\n </div>\n ) : fallbackAvailable ? (\n <div className=\"mt-3 rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm\">\n <div className=\"font-medium\">{mode === \"basic\" ? \"Compatible loading path available\" : \"Runtime fallback available\"}</div>\n <div className=\"text-muted-foreground\">{modelMessage(compatibility.user_message || \"Lattice will try the compatible local runtime path before showing this model as unsupported.\")}</div>\n </div>\n ) : !loaded && !loadAvailable ? <div className=\"mt-1 text-xs text-muted-foreground\">{unavailableReason}</div> : null}\n {mode !== \"basic\" ? (\n <div className=\"mt-2 space-y-1 text-xs text-muted-foreground\">\n <div>\n {runtimeLabel} · {loadId}\n {model.load_strategy || recommendation.load_strategy ? ` · ${String(model.load_strategy || recommendation.load_strategy)}` : \"\"}\n {modelVerification.notes ? ` · ${String(modelVerification.notes).slice(0,60)}` : \"\"}\n </div>\n {safetyNotes || licenseText ? (\n <div>{[licenseText ? `License: ${String(licenseText)}` : \"\", safetyNotes ? String(safetyNotes) : \"\"].filter(Boolean).join(\" · \")}</div>\n ) : null}\n </div>\n ) : null}\n {unsupported || fallbackAvailable ? <AlternativeModels compatibility={compatibility} /> : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-2 md:justify-end\">\n <Badge variant={loaded ? \"success\" : loadAvailable ? \"muted\" : \"warning\"}>{loaded ? \"loaded\" : badgeLabel}</Badge>\n {loaded ? (\n <ActionButton label=\"Unload\" action={() => latticeApi.unloadModel(loadId)} invalidate={[\"models\"]} />\n ) : (\n <Button\n variant=\"outline\"\n disabled={busy || unsupported || !canPrepare || (downloadRequired && !consent)}\n onClick={() => prepareModel(loadId, engine || \"local_mlx\", consent)}\n >\n {activeModel === loadId && busy ? \"Preparing\" : downloadRequired ? \"Install & Load\" : \"Validate & Load\"}\n </Button>\n )}\n </div>\n </div>\n );\n })}\n {mode === \"basic\" && catalog.length > 3 ? (\n <div className=\"rounded-lg border border-border bg-background/55 p-3 text-sm text-muted-foreground\">\n Showing the safest short list. Switch to Advanced for the full registry, runtime details, licenses, and safety notes.\n </div>\n ) : null}\n </div>\n )}\n </DataPanel>\n </div>\n <div className=\"space-y-4\">\n <DataPanel title={mode === \"basic\" ? \"Memory search support\" : \"Embedding provider\"} result={emb.data}>\n {(data) => mode === \"basic\" ? <ValuePreview value={(data as Record<string, unknown>).state || \"ready\"} /> : <StructuredView value={data} />}\n </DataPanel>\n <DataPanel title=\"Model validation\" result={models.data}>\n {(data) => {\n const profiles = asArray<Record<string, unknown>>((data as Record<string, unknown>).compat_profiles);\n return profiles.length ? (\n <EntityList items={profiles.map((profile) => ({\n ...profile,\n name: mode === \"basic\" ? profile.name || profile.display_name || \"Loaded model\" : profile.name || profile.display_name || profile.model_id,\n status: profile.quality_status || profile.load_status || \"checked\",\n }))} titleKey=\"name\" metaKey=\"status\" limit={6} />\n ) : (\n <EmptyState title=\"No model checked yet\" detail=\"Load a model to confirm it can answer before you start using it.\" />\n );\n }}\n </DataPanel>\n </div>\n </div>\n );\n}\n\nfunction AlternativeModels({ compatibility }: { compatibility: Record<string, unknown> }) {\n const mode = useAppStore((state) => state.mode);\n const alternatives = asArray<Record<string, unknown>>(compatibility.alternatives);\n if (!alternatives.length) return null;\n return (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {alternatives.slice(0, 3).map((item) => (\n <Badge key={String(item.id || item.name)} variant=\"muted\">\n {mode === \"basic\" && /mlx|gguf|ollama|lm studio/i.test(String(item.name || item.id)) ? \"Compatible alternative\" : String(item.name || item.id)}\n </Badge>\n ))}\n </div>\n );\n}\n\nfunction ModelRuntimeSummary({\n profile,\n recommendation,\n current,\n currentId,\n latestProgress,\n lastResult,\n onReload,\n onUnload,\n}: {\n profile: Record<string, unknown>;\n recommendation: Record<string, unknown>;\n current?: Record<string, unknown>;\n currentId: string;\n latestProgress: Record<string, unknown> | null;\n lastResult: Record<string, unknown> | null;\n onReload: () => void;\n onUnload: () => void;\n}) {\n const loadedName = String(current?.name || current?.id || currentId || \"\");\n const engine = String(current?.engine || current?.recommended_engine || latestProgress?.engine || \"local_mlx\");\n const cachePath = String(current?.local_path || current?.storage_location || recommendation.cache_path || recommendation.storage_location || \"~/.cache/huggingface / ~/.latticeai/models\");\n const progressStage = String(latestProgress?.stage || lastResult?.stage || (loadedName ? \"ready\" : \"idle\"));\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Computer\", value: profile?.os ? `${String(profile.os)} ${String(profile.arch || \"\")}` : \"detected\" },\n { label: \"Engine\", value: engine },\n { label: \"Loaded model\", value: loadedName || \"No local model loaded\" },\n { label: \"Runtime state\", value: progressStage },\n ]} />\n <div className=\"rounded-lg border border-border bg-background/55 p-3 text-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"font-medium\">{loadedName ? \"Local model runtime is available\" : \"No model is loaded yet\"}</div>\n <div className=\"mt-1 text-muted-foreground\">Cache/storage: {cachePath}</div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" size=\"sm\" disabled={!loadedName} onClick={onReload}>Reload</Button>\n <Button variant=\"outline\" size=\"sm\" disabled={!loadedName} onClick={onUnload}>Unload</Button>\n </div>\n </div>\n {latestProgress ? (\n <div className=\"mt-3\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{String(latestProgress.message || \"Preparing model\")}</span>\n <span>{Number(latestProgress.percent || 0)}%</span>\n </div>\n <div className=\"mt-1 h-2 overflow-hidden rounded-full bg-muted\">\n <div className=\"h-full bg-primary\" style={{ width: `${Number(latestProgress.percent || 8)}%` }} />\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction ModelRecovery({ error }: { error: Record<string, unknown> }) {\n const guidance = asArray<string>(error.recovery_guidance);\n return (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm\">\n <div className=\"font-medium\">{String(error.user_message || \"Model setup needs attention.\")}</div>\n {guidance.length ? (\n <ul className=\"mt-2 list-inside list-disc text-muted-foreground\">\n {guidance.slice(0, 3).map((item) => <li key={item}>{item}</li>)}\n </ul>\n ) : null}\n </div>\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction SkillsPanel() {\n const qc = useQueryClient();\n const skills = useQuery({ queryKey: [\"skills\"], queryFn: latticeApi.skills });\n const market = useQuery({ queryKey: [\"skillsMarketplace\"], queryFn: latticeApi.skillsMarketplace });\n const install = useMutation({\n mutationFn: (skill: Record<string, unknown>) => latticeApi.skillInstall(String(skill.name || skill.id), String(skill.plugin || \"\")),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"skills\"] }),\n });\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Installed skills\" result={skills.data}>\n {(data) => (\n <div className=\"grid gap-2\">\n {asArray<Record<string, unknown>>((data as Record<string, unknown>).skills).map((skill) => (\n <div key={String(skill.name || skill.id)} className=\"flex items-center justify-between gap-3 rounded-md border border-border p-3\">\n <div>\n <div className=\"font-medium\">{String(skill.name || skill.id)}</div>\n <div className=\"text-sm text-muted-foreground\">{String(skill.plugin || skill.description || \"\")}</div>\n </div>\n <ActionButton label={skill.enabled ? \"Disable\" : \"Enable\"} action={() => latticeApi.skillToggle(String(skill.name || skill.id), Boolean(skill.enabled))} invalidate={[\"skills\"]} />\n </div>\n ))}\n </div>\n )}\n </DataPanel>\n <DataPanel title=\"Skill marketplace\" result={market.data}>\n {(data) => (\n <div className=\"grid gap-2\">\n {asArray<Record<string, unknown>>((data as Record<string, unknown>).skills).slice(0, 10).map((skill) => (\n <div key={String(skill.name || skill.id)} className=\"flex items-center justify-between gap-3 rounded-md border border-border p-3\">\n <div>\n <div className=\"font-medium\">{String(skill.name || skill.id)}</div>\n <div className=\"text-sm text-muted-foreground\">{String(skill.description || skill.category || \"\")}</div>\n </div>\n <Button variant=\"outline\" disabled={install.isPending} onClick={() => install.mutate(skill)}>Install</Button>\n </div>\n ))}\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n\nfunction McpPanel() {\n const mode = useAppStore((state) => state.mode);\n const [query, setQuery] = React.useState(\"github\");\n const tools = useQuery({ queryKey: [\"mcpTools\"], queryFn: latticeApi.mcpTools });\n const rec = useMutation({ mutationFn: () => latticeApi.mcpRecommend(query) });\n return (\n <div className=\"grid gap-4 xl:grid-cols-[1fr_1fr]\">\n <DataPanel title={mode === \"basic\" ? \"Tool connections\" : \"MCP tools\"} result={tools.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).tools || (data as Record<string, unknown>).installed_mcps} titleKey=\"name\" metaKey=\"status\" />}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Plug className=\"h-4 w-4\" /> Recommend connector</CardTitle>\n <CardDescription>Describe what you want to connect and Lattice will suggest a connector.</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex gap-2\">\n <Input value={query} onChange={(e) => setQuery(e.target.value)} />\n <Button onClick={() => rec.mutate()} disabled={!query.trim() || rec.isPending}>Recommend</Button>\n </div>\n {rec.data ? <OperationResult result={rec.data} successLabel=\"Recommendation completed\" /> : null}\n </CardContent>\n </Card>\n </div>\n );\n}\n\nfunction MarketplacePanel() {\n const templates = useQuery({ queryKey: [\"templates\"], queryFn: latticeApi.templates });\n const plugins = useQuery({ queryKey: [\"plugins\"], queryFn: latticeApi.pluginsRegistry });\n const dir = useQuery({ queryKey: [\"pluginsDirectory\"], queryFn: latticeApi.pluginsDirectory });\n return (\n <div className=\"grid gap-4 xl:grid-cols-3\">\n <DataPanel title=\"Templates\" result={templates.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).templates} titleKey=\"name\" metaKey=\"kind\" />}\n </DataPanel>\n <DataPanel title=\"Installed plugins\" result={plugins.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).plugins} titleKey=\"name\" metaKey=\"status\" />}\n </DataPanel>\n <DataPanel title=\"Plugin directory\" result={dir.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).plugins} titleKey=\"name\" metaKey=\"category\" />}\n </DataPanel>\n <Card className=\"xl:col-span-3\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><PackagePlus className=\"h-4 w-4\" /> Template install</CardTitle>\n <CardDescription>Start from a reusable workspace pattern.</CardDescription>\n </CardHeader>\n <CardContent>\n {asArray<Record<string, unknown>>((templates.data?.data as Record<string, unknown>)?.templates).length ? (\n <div className=\"flex flex-wrap gap-2\">\n {asArray<Record<string, unknown>>((templates.data?.data as Record<string, unknown>)?.templates).slice(0, 6).map((template) => (\n <ActionButton key={String(template.id || template.name)} label={`Install ${String(template.name || template.id)}`} action={() => latticeApi.installTemplate(template)} />\n ))}\n </div>\n ) : <EntityList items={[]} />}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Library-DAtDDLdg.js","names":["__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../../../node_modules/lucide-react/dist/esm/icons/boxes.mjs","../../../node_modules/lucide-react/dist/esm/icons/circle-play.mjs","../../../node_modules/lucide-react/dist/esm/icons/package-plus.mjs","../../../node_modules/lucide-react/dist/esm/icons/plug.mjs","../../../node_modules/lucide-react/dist/esm/icons/shield-alert.mjs","../../../frontend/src/pages/Library.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z\",\n key: \"lc1i9w\"\n }\n ],\n [\"path\", { d: \"m7 16.5-4.74-2.85\", key: \"1o9zyk\" }],\n [\"path\", { d: \"m7 16.5 5-3\", key: \"va8pkn\" }],\n [\"path\", { d: \"M7 16.5v5.17\", key: \"jnp8gn\" }],\n [\n \"path\",\n {\n d: \"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z\",\n key: \"8zsnat\"\n }\n ],\n [\"path\", { d: \"m17 16.5-5-3\", key: \"8arw3v\" }],\n [\"path\", { d: \"m17 16.5 4.74-2.85\", key: \"8rfmw\" }],\n [\"path\", { d: \"M17 16.5v5.17\", key: \"k6z78m\" }],\n [\n \"path\",\n {\n d: \"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z\",\n key: \"1xygjf\"\n }\n ],\n [\"path\", { d: \"M12 8 7.26 5.15\", key: \"1vbdud\" }],\n [\"path\", { d: \"m12 8 4.74-2.85\", key: \"3rx089\" }],\n [\"path\", { d: \"M12 13.5V8\", key: \"1io7kd\" }]\n];\nconst Boxes = createLucideIcon(\"boxes\", __iconNode);\n\nexport { __iconNode, Boxes as default };\n//# sourceMappingURL=boxes.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z\",\n key: \"kmsa83\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n];\nconst CirclePlay = createLucideIcon(\"circle-play\", __iconNode);\n\nexport { __iconNode, CirclePlay as default };\n//# sourceMappingURL=circle-play.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 22V12\", key: \"d0xqtd\" }],\n [\"path\", { d: \"M16 17h6\", key: \"1ook5g\" }],\n [\"path\", { d: \"M19 14v6\", key: \"1ckrd5\" }],\n [\n \"path\",\n {\n d: \"M21 10.535V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.729l7 4a2 2 0 0 0 2 .001l1.675-.955\",\n key: \"28k6lz\"\n }\n ],\n [\"path\", { d: \"M3.29 7 12 12l8.71-5\", key: \"19ckod\" }],\n [\"path\", { d: \"m7.5 4.27 8.997 5.148\", key: \"9yrvtv\" }]\n];\nconst PackagePlus = createLucideIcon(\"package-plus\", __iconNode);\n\nexport { __iconNode, PackagePlus as default };\n//# sourceMappingURL=package-plus.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 22v-5\", key: \"1ega77\" }],\n [\"path\", { d: \"M15 8V2\", key: \"18g5xt\" }],\n [\n \"path\",\n { d: \"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z\", key: \"1xoxul\" }\n ],\n [\"path\", { d: \"M9 8V2\", key: \"14iosj\" }]\n];\nconst Plug = createLucideIcon(\"plug\", __iconNode);\n\nexport { __iconNode, Plug as default };\n//# sourceMappingURL=plug.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"M12 8v4\", key: \"1got3b\" }],\n [\"path\", { d: \"M12 16h.01\", key: \"1drbdi\" }]\n];\nconst ShieldAlert = createLucideIcon(\"shield-alert\", __iconNode);\n\nexport { __iconNode, ShieldAlert as default };\n//# sourceMappingURL=shield-alert.mjs.map\n","import * as React from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Boxes, CheckCircle2, Cpu, Download, PackagePlus, PlayCircle, Plug, ShieldAlert } from \"lucide-react\";\nimport { latticeApi } from \"@/api/client\";\nimport { ActionButton, DataPanel, EmptyState, EntityList, OperationResult, StatGrid, StructuredView, Tabs, ValuePreview } from \"@/components/primitives\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { useAppStore } from \"@/store/appStore\";\nimport { asArray } from \"@/lib/utils\";\n\ntype LibraryTab = \"models\" | \"skills\" | \"mcp\" | \"marketplace\";\n\nconst tabs: Array<{ id: LibraryTab; label: string }> = [\n { id: \"models\", label: \"Models\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"mcp\", label: \"Connections\" },\n { id: \"marketplace\", label: \"Marketplace\" },\n];\n\nexport function LibraryPage({ initialTab }: { initialTab?: string }) {\n const mode = useAppStore((state) => state.mode);\n const [tab, setTab] = React.useState<LibraryTab>((initialTab as LibraryTab) || \"models\");\n React.useEffect(() => {\n if (tabs.some((item) => item.id === initialTab)) setTab(initialTab as LibraryTab);\n }, [initialTab]);\n const visibleTabs = tabs.map((item) => item.id === \"mcp\" && mode !== \"basic\" ? { ...item, label: \"MCP / tools\" } : item);\n return (\n <div className=\"space-y-5\">\n <header className=\"page-hero\">\n <div className=\"page-kicker\"><Boxes className=\"h-4 w-4\" /> Library</div>\n <h1 className=\"page-title\">Choose your Brain's voice.</h1>\n <p className=\"page-copy\">Start with a short local model recommendation. Your Brain and memories stay durable when you switch later.</p>\n </header>\n <Tabs tabs={visibleTabs} value={tab} onChange={(id) => setTab(id as LibraryTab)} />\n {tab === \"models\" ? <ModelsPanel /> : null}\n {tab === \"skills\" ? <SkillsPanel /> : null}\n {tab === \"mcp\" ? <McpPanel /> : null}\n {tab === \"marketplace\" ? <MarketplacePanel /> : null}\n </div>\n );\n}\n\nfunction ModelsPanel() {\n const qc = useQueryClient();\n const mode = useAppStore((state) => state.mode);\n const models = useQuery({ queryKey: [\"models\"], queryFn: latticeApi.models });\n const recs = useQuery({ queryKey: [\"modelRecommendations\", \"local_mlx\"], queryFn: () => latticeApi.modelRecommendations(\"local_mlx\") });\n const emb = useQuery({ queryKey: [\"embeddings\"], queryFn: latticeApi.embeddingsStatus });\n const [consent, setConsent] = React.useState(false);\n const [activeModel, setActiveModel] = React.useState<string | null>(null);\n const [progress, setProgress] = React.useState<Record<string, unknown>[]>([]);\n const [lastResult, setLastResult] = React.useState<Record<string, unknown> | null>(null);\n const [lastError, setLastError] = React.useState<Record<string, unknown> | null>(null);\n const [busy, setBusy] = React.useState(false);\n const catalog = [\n ...asArray<Record<string, unknown>>((models.data?.data as Record<string, unknown>)?.catalog),\n ...asArray<Record<string, unknown>>((models.data?.data as Record<string, unknown>)?.recommended),\n ];\n const recommendationRows = asArray<Record<string, unknown>>(\n ((recs.data?.data as Record<string, unknown>)?.recommendations as Record<string, unknown> | undefined)?.models,\n );\n const recommendationById = new Map(recommendationRows.map((item) => [String(item.id), item]));\n const loadedIds = asArray<string>((models.data?.data as Record<string, unknown> | undefined)?.loaded);\n const currentId = String((models.data?.data as Record<string, unknown> | undefined)?.current || \"\");\n const current = catalog.find((model) => loadedIds.includes(String(model.id)) || String(model.id) === currentId);\n const topPick = (((recs.data?.data as Record<string, unknown> | undefined)?.recommendations as Record<string, unknown> | undefined)?.top_pick || null) as Record<string, unknown> | null;\n const latestProgress = progress[progress.length - 1] || null;\n\n const modelMessage = React.useCallback((message: unknown) => {\n const text = String(message || \"This model is not ready to load yet.\");\n if (mode !== \"basic\") return text;\n return text\n .replace(/gemma4_unified/gi, \"this local model format\")\n .replace(/mlx[-_ ]?vlm|mlx[-_ ]?lm|local_mlx|\\bmlx\\b|\\bgguf\\b|\\bollama\\b|hugging face/gi, \"local model support\")\n .replace(/runtime/gi, \"model support\")\n .replace(/model_type/gi, \"model format\")\n .replace(/this local model format local model support format/gi, \"this local model format\")\n .replace(/local model support model support/gi, \"local model support\");\n }, [mode]);\n\n async function prepareModel(loadId: string, engine: string, allowDownload: boolean) {\n setBusy(true);\n setActiveModel(loadId);\n setProgress([]);\n setLastResult(null);\n setLastError(null);\n const result = await latticeApi.streamModelPrepare(\n { model: loadId, engine: engine || \"local_mlx\", allow_download: allowDownload },\n {\n onProgress: (event) => setProgress((items) => [...items.slice(-8), event]),\n onDone: (event) => setLastResult(event),\n onError: (event) => setLastError(event),\n },\n );\n setBusy(false);\n await qc.invalidateQueries({ queryKey: [\"models\"] });\n await qc.invalidateQueries({ queryKey: [\"modelRecommendations\", \"local_mlx\"] });\n if (!result.ok && !lastError) setLastError(result.data as Record<string, unknown>);\n }\n\n return (\n <div className=\"grid gap-4 xl:grid-cols-[1.2fr_0.8fr]\">\n <div className=\"space-y-4\">\n <DataPanel title=\"Guided model setup\" description=\"Lattice recommends a small set first, explains internet/download needs, and keeps every model download behind consent.\" result={recs.data}>\n {(data) => {\n const recommendation = (data as Record<string, unknown>).recommendations as Record<string, unknown> | undefined;\n const profile = (data as Record<string, unknown>).profile as Record<string, unknown> | undefined;\n return (\n <div className=\"space-y-4\">\n <ModelRuntimeSummary\n profile={profile || {}}\n recommendation={recommendation || {}}\n current={current}\n currentId={currentId}\n latestProgress={latestProgress}\n lastResult={lastResult}\n onReload={() => {\n if (current) void prepareModel(String(current.recommended_load_id || current.id || currentId), String(current.recommended_engine || current.engine || \"local_mlx\"), consent);\n }}\n onUnload={() => {\n if (currentId) void latticeApi.unloadModel(currentId).then(() => qc.invalidateQueries({ queryKey: [\"models\"] }));\n }}\n />\n <div className=\"grid gap-2 md:grid-cols-3 xl:grid-cols-6\">\n {[\n [\"Environment Analysis\", true, Cpu],\n [\"Recommended Models\", Boolean(topPick || catalog.length), CheckCircle2],\n [\"Install\", Boolean(current || latestProgress?.stage === \"engine\"), PackagePlus],\n [\"Download Progress\", Boolean(current || latestProgress?.stage === \"download\"), Download],\n [\"Validate\", Boolean(current || latestProgress?.stage === \"smoke_test\"), ShieldAlert],\n [\"Load / Ready\", Boolean(current || lastResult), PlayCircle],\n ].map(([label, done, Icon]) => (\n <div key={String(label)} className=\"rounded-lg border border-border bg-background/55 p-3\">\n {React.createElement(Icon as typeof Cpu, { className: \"h-4 w-4 text-primary\" })}\n <div className=\"mt-2 text-sm font-medium\">{String(label)}</div>\n <Badge variant={done ? \"success\" : \"muted\"}>{done ? \"ready\" : \"pending\"}</Badge>\n </div>\n ))}\n </div>\n <label className=\"flex items-start gap-2 rounded-lg border border-border bg-background/55 p-3 text-sm leading-6\">\n <input className=\"mt-1\" type=\"checkbox\" checked={consent} onChange={(event) => setConsent(event.target.checked)} />\n <span>\n Allow Lattice to install a missing local model component or download model files for this action. Download uses the internet; running the model stays local.\n </span>\n </label>\n {latestProgress ? (\n <div className=\"rounded-lg border border-border bg-background/55 p-3 text-sm\">\n <div className=\"font-medium\">{String(latestProgress.message || \"Preparing model\")}</div>\n <div className=\"mt-2 h-2 overflow-hidden rounded-full bg-muted\">\n <div className=\"h-full bg-primary\" style={{ width: `${Number(latestProgress.percent || 8)}%` }} />\n </div>\n {latestProgress.detail ? <div className=\"mt-2 text-xs text-muted-foreground\">{String(latestProgress.detail)}</div> : null}\n </div>\n ) : null}\n {lastError ? <ModelRecovery error={lastError} /> : null}\n </div>\n );\n }}\n </DataPanel>\n <DataPanel title={mode === \"basic\" ? \"Recommended models\" : \"Recommended and advanced models\"} result={models.data}>\n {(data) => (\n <div className=\"grid gap-2\">\n {(catalog.length ? catalog : asArray<Record<string, unknown>>((data as Record<string, unknown>).loaded)).slice(0, mode === \"basic\" ? 3 : 14).map((model, index) => {\n const id = String(model.id || model.model_id || model.name || index);\n const loaded = asArray<string>((data as Record<string, unknown>).loaded).includes(id) || (data as Record<string, unknown>).current === id || model.state === \"loaded\";\n const loadId = String(model.recommended_load_id || id);\n const engine = String(model.recommended_engine || model.engine || \"\");\n const recommendation = recommendationById.get(id) || recommendationById.get(loadId) || {};\n const modelVerification = asRecord(model.verification);\n const recommendationVerification = asRecord(recommendation.verification);\n const modelHardware = asRecord(model.hardware);\n const recommendationHardware = asRecord(recommendation.hardware);\n const hardwareNote = modelHardware.notes || recommendationHardware.notes || (modelHardware.recommended_ram_gb ? `~${modelHardware.recommended_ram_gb}GB RAM rec` : \"\");\n const safetyNotes = model.safety_notes || recommendation.safety_notes;\n const licenseText = model.license || recommendation.license;\n const compatibility = (model.runtime_compatibility || recommendation.runtime_compatibility || {}) as Record<string, unknown>;\n const fallbackAvailable = String(compatibility.status || \"\") === \"fallback_available\";\n const unsupported = model.load_status === \"unsupported\" || compatibility.supported === false;\n const downloadRequired = Boolean(model.download_required);\n const loadAvailable = (Boolean(model.load_available) || loaded) && !unsupported;\n const loadStatus = String(model.load_status || (loaded ? \"loaded\" : \"unavailable\"));\n const unavailableReason = modelMessage(model.unavailable_reason || \"This model is not ready to load yet.\");\n const runtimeLabel = String(model.runtime_label || compatibility.preferred_runtime || engine || \"local_mlx\");\n const actionLabel = String(compatibility.action || loadStatus.replace(/_/g, \" \"));\n const badgeLabel = unsupported && mode === \"basic\" ? \"needs attention\" : unsupported ? actionLabel : loadStatus;\n const canPrepare = loadAvailable || downloadRequired;\n const downloadSize = model.download_size || model.estimated_size || recommendation.download_size || recommendation.estimated_size || model.size || recommendation.size;\n const maker = model.provider || recommendation.provider || model.organization || recommendation.organization;\n return (\n <div key={id} className=\"grid gap-3 rounded-lg border border-border bg-background/55 p-4 md:grid-cols-[1fr_auto]\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"text-base font-semibold\">{String(model.name || id)}</div>\n {topPick?.id === id || model.recommended_default ? <Badge variant=\"success\">recommended</Badge> : null}\n {String(model.modality || recommendation.modality || \"\").includes(\"multi\") || String(model.modality || \"\") === \"multimodal\" ? <Badge variant=\"muted\">multimodal</Badge> : null}\n {modelVerification.verified || recommendationVerification.verified ? <Badge variant=\"success\" title=\"HF verified (config+tokenizer present)\">✓ HF</Badge> : null}\n </div>\n <div className=\"mt-1 text-sm text-muted-foreground\">\n {mode === \"basic\"\n ? [\n modelMessage(model.family || recommendation.family || \"Local model\"),\n /mlx|gguf|ollama/i.test(String(model.size || recommendation.size || \"\")) ? \"\" : model.size || recommendation.size,\n ].filter(Boolean).map(String).join(\" · \")\n : [model.family || recommendation.family || \"local\", model.size || recommendation.size].filter(Boolean).map(String).join(\" · \")}\n </div>\n {(model.hardware || recommendation.hardware) ? (\n <div className=\"mt-1 text-[11px] text-muted-foreground/80\">\n {String(hardwareNote)}\n </div>\n ) : null}\n <div className=\"mt-2 flex flex-wrap gap-1 text-[11px] text-muted-foreground\">\n <Badge variant=\"muted\">{downloadRequired ? `Download: ${String(downloadSize || \"required\")}` : \"No download needed now\"}</Badge>\n <Badge variant=\"muted\">{downloadRequired ? \"Internet only during download\" : \"Runs locally when loaded\"}</Badge>\n {maker ? <Badge variant=\"muted\">{String(maker)}</Badge> : null}\n </div>\n {unsupported ? (\n <div className=\"mt-3 rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm\">\n <div className=\"font-medium\">{mode === \"basic\" ? \"Needs attention before loading\" : actionLabel}</div>\n <div className=\"text-muted-foreground\">{modelMessage(compatibility.user_message || unavailableReason)}</div>\n </div>\n ) : fallbackAvailable ? (\n <div className=\"mt-3 rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm\">\n <div className=\"font-medium\">{mode === \"basic\" ? \"Compatible loading path available\" : \"Runtime fallback available\"}</div>\n <div className=\"text-muted-foreground\">{modelMessage(compatibility.user_message || \"Lattice will try the compatible local runtime path before showing this model as unsupported.\")}</div>\n </div>\n ) : !loaded && !loadAvailable ? <div className=\"mt-1 text-xs text-muted-foreground\">{unavailableReason}</div> : null}\n {mode !== \"basic\" ? (\n <div className=\"mt-2 space-y-1 text-xs text-muted-foreground\">\n <div>\n {runtimeLabel} · {loadId}\n {model.load_strategy || recommendation.load_strategy ? ` · ${String(model.load_strategy || recommendation.load_strategy)}` : \"\"}\n {modelVerification.notes ? ` · ${String(modelVerification.notes).slice(0,60)}` : \"\"}\n </div>\n {safetyNotes || licenseText ? (\n <div>{[licenseText ? `License: ${String(licenseText)}` : \"\", safetyNotes ? String(safetyNotes) : \"\"].filter(Boolean).join(\" · \")}</div>\n ) : null}\n </div>\n ) : null}\n {unsupported || fallbackAvailable ? <AlternativeModels compatibility={compatibility} /> : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-2 md:justify-end\">\n <Badge variant={loaded ? \"success\" : loadAvailable ? \"muted\" : \"warning\"}>{loaded ? \"loaded\" : badgeLabel}</Badge>\n {loaded ? (\n <ActionButton label=\"Unload\" action={() => latticeApi.unloadModel(loadId)} invalidate={[\"models\"]} />\n ) : (\n <Button\n variant=\"outline\"\n disabled={busy || unsupported || !canPrepare || (downloadRequired && !consent)}\n onClick={() => prepareModel(loadId, engine || \"local_mlx\", consent)}\n >\n {activeModel === loadId && busy ? \"Preparing\" : downloadRequired ? \"Install & Load\" : \"Validate & Load\"}\n </Button>\n )}\n </div>\n </div>\n );\n })}\n {mode === \"basic\" && catalog.length > 3 ? (\n <div className=\"rounded-lg border border-border bg-background/55 p-3 text-sm text-muted-foreground\">\n Showing the safest short list. Switch to Advanced for the full registry, runtime details, licenses, and safety notes.\n </div>\n ) : null}\n </div>\n )}\n </DataPanel>\n </div>\n <div className=\"space-y-4\">\n <DataPanel title={mode === \"basic\" ? \"Memory search support\" : \"Embedding provider\"} result={emb.data}>\n {(data) => mode === \"basic\" ? <ValuePreview value={(data as Record<string, unknown>).state || \"ready\"} /> : <StructuredView value={data} />}\n </DataPanel>\n <DataPanel title=\"Model validation\" result={models.data}>\n {(data) => {\n const profiles = asArray<Record<string, unknown>>((data as Record<string, unknown>).compat_profiles);\n return profiles.length ? (\n <EntityList items={profiles.map((profile) => ({\n ...profile,\n name: mode === \"basic\" ? profile.name || profile.display_name || \"Loaded model\" : profile.name || profile.display_name || profile.model_id,\n status: profile.quality_status || profile.load_status || \"checked\",\n }))} titleKey=\"name\" metaKey=\"status\" limit={6} />\n ) : (\n <EmptyState title=\"No model checked yet\" detail=\"Load a model to confirm it can answer before you start using it.\" />\n );\n }}\n </DataPanel>\n </div>\n </div>\n );\n}\n\nfunction AlternativeModels({ compatibility }: { compatibility: Record<string, unknown> }) {\n const mode = useAppStore((state) => state.mode);\n const alternatives = asArray<Record<string, unknown>>(compatibility.alternatives);\n if (!alternatives.length) return null;\n return (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {alternatives.slice(0, 3).map((item) => (\n <Badge key={String(item.id || item.name)} variant=\"muted\">\n {mode === \"basic\" && /mlx|gguf|ollama|lm studio/i.test(String(item.name || item.id)) ? \"Compatible alternative\" : String(item.name || item.id)}\n </Badge>\n ))}\n </div>\n );\n}\n\nfunction ModelRuntimeSummary({\n profile,\n recommendation,\n current,\n currentId,\n latestProgress,\n lastResult,\n onReload,\n onUnload,\n}: {\n profile: Record<string, unknown>;\n recommendation: Record<string, unknown>;\n current?: Record<string, unknown>;\n currentId: string;\n latestProgress: Record<string, unknown> | null;\n lastResult: Record<string, unknown> | null;\n onReload: () => void;\n onUnload: () => void;\n}) {\n const loadedName = String(current?.name || current?.id || currentId || \"\");\n const engine = String(current?.engine || current?.recommended_engine || latestProgress?.engine || \"local_mlx\");\n const cachePath = String(current?.local_path || current?.storage_location || recommendation.cache_path || recommendation.storage_location || \"~/.cache/huggingface / ~/.latticeai/models\");\n const progressStage = String(latestProgress?.stage || lastResult?.stage || (loadedName ? \"ready\" : \"idle\"));\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Computer\", value: profile?.os ? `${String(profile.os)} ${String(profile.arch || \"\")}` : \"detected\" },\n { label: \"Engine\", value: engine },\n { label: \"Loaded model\", value: loadedName || \"No local model loaded\" },\n { label: \"Runtime state\", value: progressStage },\n ]} />\n <div className=\"rounded-lg border border-border bg-background/55 p-3 text-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"font-medium\">{loadedName ? \"Local model runtime is available\" : \"No model is loaded yet\"}</div>\n <div className=\"mt-1 text-muted-foreground\">Cache/storage: {cachePath}</div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" size=\"sm\" disabled={!loadedName} onClick={onReload}>Reload</Button>\n <Button variant=\"outline\" size=\"sm\" disabled={!loadedName} onClick={onUnload}>Unload</Button>\n </div>\n </div>\n {latestProgress ? (\n <div className=\"mt-3\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{String(latestProgress.message || \"Preparing model\")}</span>\n <span>{Number(latestProgress.percent || 0)}%</span>\n </div>\n <div className=\"mt-1 h-2 overflow-hidden rounded-full bg-muted\">\n <div className=\"h-full bg-primary\" style={{ width: `${Number(latestProgress.percent || 8)}%` }} />\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction ModelRecovery({ error }: { error: Record<string, unknown> }) {\n const guidance = asArray<string>(error.recovery_guidance);\n return (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-sm\">\n <div className=\"font-medium\">{String(error.user_message || \"Model setup needs attention.\")}</div>\n {guidance.length ? (\n <ul className=\"mt-2 list-inside list-disc text-muted-foreground\">\n {guidance.slice(0, 3).map((item) => <li key={item}>{item}</li>)}\n </ul>\n ) : null}\n </div>\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction SkillsPanel() {\n const qc = useQueryClient();\n const skills = useQuery({ queryKey: [\"skills\"], queryFn: latticeApi.skills });\n const market = useQuery({ queryKey: [\"skillsMarketplace\"], queryFn: latticeApi.skillsMarketplace });\n const install = useMutation({\n mutationFn: (skill: Record<string, unknown>) => latticeApi.skillInstall(String(skill.name || skill.id), String(skill.plugin || \"\")),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"skills\"] }),\n });\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Installed skills\" result={skills.data}>\n {(data) => (\n <div className=\"grid gap-2\">\n {asArray<Record<string, unknown>>((data as Record<string, unknown>).skills).map((skill) => (\n <div key={String(skill.name || skill.id)} className=\"flex items-center justify-between gap-3 rounded-md border border-border p-3\">\n <div>\n <div className=\"font-medium\">{String(skill.name || skill.id)}</div>\n <div className=\"text-sm text-muted-foreground\">{String(skill.plugin || skill.description || \"\")}</div>\n </div>\n <ActionButton label={skill.enabled ? \"Disable\" : \"Enable\"} action={() => latticeApi.skillToggle(String(skill.name || skill.id), Boolean(skill.enabled))} invalidate={[\"skills\"]} />\n </div>\n ))}\n </div>\n )}\n </DataPanel>\n <DataPanel title=\"Skill marketplace\" result={market.data}>\n {(data) => (\n <div className=\"grid gap-2\">\n {asArray<Record<string, unknown>>((data as Record<string, unknown>).skills).slice(0, 10).map((skill) => (\n <div key={String(skill.name || skill.id)} className=\"flex items-center justify-between gap-3 rounded-md border border-border p-3\">\n <div>\n <div className=\"font-medium\">{String(skill.name || skill.id)}</div>\n <div className=\"text-sm text-muted-foreground\">{String(skill.description || skill.category || \"\")}</div>\n </div>\n <Button variant=\"outline\" disabled={install.isPending} onClick={() => install.mutate(skill)}>Install</Button>\n </div>\n ))}\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n\nfunction McpPanel() {\n const mode = useAppStore((state) => state.mode);\n const [query, setQuery] = React.useState(\"github\");\n const tools = useQuery({ queryKey: [\"mcpTools\"], queryFn: latticeApi.mcpTools });\n const rec = useMutation({ mutationFn: () => latticeApi.mcpRecommend(query) });\n return (\n <div className=\"grid gap-4 xl:grid-cols-[1fr_1fr]\">\n <DataPanel title={mode === \"basic\" ? \"Tool connections\" : \"MCP tools\"} result={tools.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).tools || (data as Record<string, unknown>).installed_mcps} titleKey=\"name\" metaKey=\"status\" />}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Plug className=\"h-4 w-4\" /> Recommend connector</CardTitle>\n <CardDescription>Describe what you want to connect and Lattice will suggest a connector.</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex gap-2\">\n <Input value={query} onChange={(e) => setQuery(e.target.value)} />\n <Button onClick={() => rec.mutate()} disabled={!query.trim() || rec.isPending}>Recommend</Button>\n </div>\n {rec.data ? <OperationResult result={rec.data} successLabel=\"Recommendation completed\" /> : null}\n </CardContent>\n </Card>\n </div>\n );\n}\n\nfunction MarketplacePanel() {\n const templates = useQuery({ queryKey: [\"templates\"], queryFn: latticeApi.templates });\n const plugins = useQuery({ queryKey: [\"plugins\"], queryFn: latticeApi.pluginsRegistry });\n const dir = useQuery({ queryKey: [\"pluginsDirectory\"], queryFn: latticeApi.pluginsDirectory });\n return (\n <div className=\"grid gap-4 xl:grid-cols-3\">\n <DataPanel title=\"Templates\" result={templates.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).templates} titleKey=\"name\" metaKey=\"kind\" />}\n </DataPanel>\n <DataPanel title=\"Installed plugins\" result={plugins.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).plugins} titleKey=\"name\" metaKey=\"status\" />}\n </DataPanel>\n <DataPanel title=\"Plugin directory\" result={dir.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).plugins} titleKey=\"name\" metaKey=\"category\" />}\n </DataPanel>\n <Card className=\"xl:col-span-3\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><PackagePlus className=\"h-4 w-4\" /> Template install</CardTitle>\n <CardDescription>Start from a reusable workspace pattern.</CardDescription>\n </CardHeader>\n <CardContent>\n {asArray<Record<string, unknown>>((templates.data?.data as Record<string, unknown>)?.templates).length ? (\n <div className=\"flex flex-wrap gap-2\">\n {asArray<Record<string, unknown>>((templates.data?.data as Record<string, unknown>)?.templates).slice(0, 6).map((template) => (\n <ActionButton key={String(template.id || template.name)} label={`Install ${String(template.name || template.id)}`} action={() => latticeApi.installTemplate(template)} />\n ))}\n </div>\n ) : <EntityList items={[]} />}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,m as c,n as l,r as u,s as d,t as f,u as p,v as m,y as h}from"./primitives-CdwcE--L.js";import{A as g,B as _,F as v,I as y,M as b,N as x,P as S,R as C,S as w,T,a as E,j as D,k as O,n as k,r as A,s as j,y as M}from"./index-COuGp7_5.js";var N=w(`network`,[[`rect`,{x:`16`,y:`16`,width:`6`,height:`6`,rx:`1`,key:`4q2zg0`}],[`rect`,{x:`2`,y:`16`,width:`6`,height:`6`,rx:`1`,key:`8cvhb9`}],[`rect`,{x:`9`,y:`2`,width:`6`,height:`6`,rx:`1`,key:`1egb70`}],[`path`,{d:`M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3`,key:`1jsf9p`}],[`path`,{d:`M12 12V8`,key:`2874zd`}]]),P=_(C()),F=y(),I=[{id:`account`,label:`Account`},{id:`workspaces`,label:`Spaces`},{id:`snapshots`,label:`Snapshots`},{id:`activity`,label:`History`},{id:`network`,label:`Devices`},{id:`settings`,label:`Preferences`},{id:`admin`,label:`Admin Console`}];function L({initialTab:e}){let t=b(e=>e.mode),[n,r]=P.useState(e||`account`);return P.useEffect(()=>{I.some(t=>t.id===e)&&r(e)},[e]),(0,F.jsxs)(`div`,{className:`space-y-5`,children:[(0,F.jsxs)(`header`,{className:`page-hero`,children:[(0,F.jsxs)(`div`,{className:`page-kicker`,children:[(0,F.jsx)(j,{className:`h-4 w-4`}),` Care`]}),(0,F.jsx)(`h1`,{className:`page-title`,children:`Keep your brain safe and portable.`}),(0,F.jsx)(`p`,{className:`page-copy`,children:`Manage identity, spaces, backups, trusted devices, and safeguards from one calm place.`})]}),(0,F.jsx)(i,{tabs:t===`basic`?I.filter(e=>e.id!==`admin`):I,value:n,onChange:e=>r(e)}),n===`account`?(0,F.jsx)(R,{}):null,n===`workspaces`?(0,F.jsx)(z,{}):null,n===`snapshots`?(0,F.jsx)(B,{}):null,n===`activity`?(0,F.jsx)(V,{}):null,n===`network`?(0,F.jsx)(H,{}):null,n===`settings`?(0,F.jsx)(ee,{}):null,n===`admin`?(0,F.jsx)(X,{}):null]})}function R(){let i=v(),s=S({queryKey:[`profile`],queryFn:D.profile}),u=S({queryKey:[`sso`],queryFn:D.ssoConfig}),[d,p]=P.useState(``),[h,g]=P.useState(``),[_,y]=P.useState(``),[b,C]=P.useState(``),[w,T]=P.useState(``),E=x({mutationFn:()=>D.login(d,h),onSuccess:()=>i.invalidateQueries({queryKey:[`profile`]})}),O=x({mutationFn:()=>D.register({email:d,password:h,name:_,nickname:b}),onSuccess:()=>i.invalidateQueries({queryKey:[`profile`]})}),j=x({mutationFn:()=>D.updateProfile({name:_,nickname:b}),onSuccess:()=>i.invalidateQueries({queryKey:[`profile`]})}),N=x({mutationFn:()=>D.changePassword(h,w)});return(0,F.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,F.jsx)(l,{title:`Profile`,result:s.data,children:e=>(0,F.jsx)(t,{data:e})}),(0,F.jsxs)(c,{children:[(0,F.jsxs)(e,{children:[(0,F.jsxs)(m,{className:`flex items-center gap-2`,children:[(0,F.jsx)(M,{className:`h-4 w-4`}),` Account`]}),(0,F.jsx)(a,{children:`Sign in, create a local account, and keep your profile current.`})]}),(0,F.jsxs)(o,{className:`grid gap-3`,children:[(0,F.jsx)(k,{value:d,onChange:e=>p(e.target.value),placeholder:`email`}),(0,F.jsx)(k,{type:`password`,value:h,onChange:e=>g(e.target.value),placeholder:`current password`}),(0,F.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[(0,F.jsx)(k,{value:_,onChange:e=>y(e.target.value),placeholder:`name`}),(0,F.jsx)(k,{value:b,onChange:e=>C(e.target.value),placeholder:`nickname`})]}),(0,F.jsx)(k,{type:`password`,value:w,onChange:e=>T(e.target.value),placeholder:`new password`}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(A,{onClick:()=>E.mutate(),disabled:!d||!h||E.isPending,children:`Login`}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>O.mutate(),disabled:!d||!h||O.isPending,children:`Register`}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>j.mutate(),disabled:j.isPending,children:`Save profile`}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>N.mutate(),disabled:!h||!w||N.isPending,children:`Change password`}),(0,F.jsx)(f,{label:`Logout`,action:()=>D.logout(),invalidate:[`profile`]})]}),[E.data,O.data,j.data,N.data].filter(Boolean).map((e,t)=>(0,F.jsx)(n,{result:e,successLabel:`Account request completed`},t))]})]}),(0,F.jsx)(l,{title:`Sign-in options`,result:u.data,className:`xl:col-span-2`,children:e=>(0,F.jsx)(r,{value:e})})]})}function z(){let t=v(),{setWorkspaceId:n}=b(),r=S({queryKey:[`workspaceRegistry`],queryFn:D.workspaceRegistry}),i=S({queryKey:[`invitations`],queryFn:D.invitations}),[u,d]=P.useState(``),[p,h]=P.useState(``),[g,_]=P.useState(``),y=x({mutationFn:()=>D.createOrg(u),onSuccess:()=>t.invalidateQueries({queryKey:[`workspaceRegistry`]})}),C=x({mutationFn:()=>D.createInvitation({email:p||null,role:`member`,expires_hours:168}),onSuccess:()=>t.invalidateQueries({queryKey:[`invitations`]})}),w=x({mutationFn:()=>D.acceptInvitation(g),onSuccess:()=>t.invalidateQueries({queryKey:[`workspaceRegistry`]})}),O=T(r.data?.data?.workspaces);return(0,F.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[1.1fr_0.9fr]`,children:[(0,F.jsx)(l,{title:`Your workspaces`,result:r.data,children:()=>(0,F.jsx)(`div`,{className:`grid gap-2`,children:O.map(e=>{let t=String(e.workspace_id||e.id);return(0,F.jsx)(`div`,{className:`rounded-md border border-border p-3`,children:(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`div`,{className:`font-medium`,children:String(e.name||t)}),(0,F.jsxs)(`div`,{className:`text-sm text-muted-foreground`,children:[String(e.type||``),` · `,String(e.your_role||e.role||``)]})]}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(A,{variant:`outline`,onClick:()=>n(t),children:`Use`}),(0,F.jsx)(f,{label:`Activate`,action:()=>D.activateWorkspace(t),invalidate:[`workspaceRegistry`]}),(0,F.jsx)(f,{label:`Archive`,action:()=>D.archiveWorkspace(t),invalidate:[`workspaceRegistry`],variant:`destructive`})]})]})},t)})})}),(0,F.jsxs)(c,{children:[(0,F.jsxs)(e,{children:[(0,F.jsxs)(m,{className:`flex items-center gap-2`,children:[(0,F.jsx)(E,{className:`h-4 w-4`}),` Organizations and invitations`]}),(0,F.jsx)(a,{children:`Create or join a workspace before adding knowledge.`})]}),(0,F.jsxs)(o,{className:`grid gap-3`,children:[(0,F.jsx)(k,{value:u,onChange:e=>d(e.target.value),placeholder:`New organization name`}),(0,F.jsx)(A,{disabled:!u.trim()||y.isPending,onClick:()=>y.mutate(),children:`Create organization`}),(0,F.jsx)(k,{value:p,onChange:e=>h(e.target.value),placeholder:`invitee email`}),(0,F.jsx)(A,{variant:`outline`,disabled:C.isPending,onClick:()=>C.mutate(),children:`Create invitation`}),(0,F.jsx)(k,{value:g,onChange:e=>_(e.target.value),placeholder:`invitation token`}),(0,F.jsx)(A,{variant:`outline`,disabled:!g.trim()||w.isPending,onClick:()=>w.mutate(),children:`Accept invitation`}),(0,F.jsx)(l,{title:`Invitations`,result:i.data,children:e=>(0,F.jsx)(s,{items:e.invitations,titleKey:`token`,metaKey:`role`})})]})]})]})}function B(){let t=S({queryKey:[`snapshots`],queryFn:D.snapshots}),r=S({queryKey:[`timeMachine`],queryFn:D.timeMachine}),[i,u]=P.useState(``),[d,p]=P.useState(``),[h,g]=P.useState(``),_=x({mutationFn:()=>D.createSnapshot(i||`desktop checkpoint`)}),v=x({mutationFn:()=>D.compareSnapshots(d,h)}),y=T(t.data?.data?.snapshots);return(0,F.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,F.jsx)(l,{title:`Snapshots`,result:t.data,children:()=>(0,F.jsx)(`div`,{className:`space-y-2`,children:y.map(e=>{let t=String(e.id||e.snapshot_id);return(0,F.jsxs)(`div`,{className:`rounded-md border border-border p-3`,children:[(0,F.jsx)(`div`,{className:`font-medium`,children:String(e.name||t)}),(0,F.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[(0,F.jsx)(f,{label:`Export`,action:()=>D.exportSnapshot(t)}),(0,F.jsx)(f,{label:`Merge restore`,action:()=>D.restoreSnapshot(t),variant:`outline`})]})]},t)})})}),(0,F.jsxs)(c,{children:[(0,F.jsxs)(e,{children:[(0,F.jsx)(m,{children:`Snapshot actions`}),(0,F.jsx)(a,{children:`Create checkpoints and compare changes over time.`})]}),(0,F.jsxs)(o,{className:`grid gap-3`,children:[(0,F.jsx)(k,{value:i,onChange:e=>u(e.target.value),placeholder:`snapshot name`}),(0,F.jsx)(A,{onClick:()=>_.mutate(),disabled:_.isPending,children:`Create snapshot`}),(0,F.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[(0,F.jsx)(k,{value:d,onChange:e=>p(e.target.value),placeholder:`before id`}),(0,F.jsx)(k,{value:h,onChange:e=>g(e.target.value),placeholder:`after id`})]}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>v.mutate(),disabled:!d||!h||v.isPending,children:`Compare`}),v.data?(0,F.jsx)(n,{result:v.data,successLabel:`Snapshot comparison completed`}):null]})]}),(0,F.jsx)(l,{title:`Time machine`,result:r.data,className:`xl:col-span-2`,children:e=>(0,F.jsx)(s,{items:e.events||e,titleKey:`event`,metaKey:`type`,limit:14})})]})}function V(){let e=S({queryKey:[`realtimeFeed`],queryFn:D.realtimeFeed}),t=S({queryKey:[`presence`],queryFn:D.presence});return(0,F.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,F.jsx)(l,{title:`Realtime feed`,result:e.data,children:e=>(0,F.jsx)(s,{items:e.events,titleKey:`event_type`,metaKey:`area`,limit:14})}),(0,F.jsx)(l,{title:`Presence`,result:t.data,children:e=>(0,F.jsx)(G,{data:e})})]})}function H(){let t=v(),r=S({queryKey:[`networkIdentity`],queryFn:D.networkIdentity}),i=S({queryKey:[`networkPeers`],queryFn:D.networkPeers}),[s,u]=P.useState(``),[d,p]=P.useState(``),[h,g]=P.useState(``),_=x({mutationFn:()=>D.pairPeer({name:s,base_url:d,public_key:h}),onSuccess:()=>t.invalidateQueries({queryKey:[`networkPeers`]})});return(0,F.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[0.8fr_1.2fr]`,children:[(0,F.jsx)(l,{title:`Device identity`,result:r.data,children:e=>(0,F.jsx)(K,{data:e})}),(0,F.jsxs)(c,{children:[(0,F.jsxs)(e,{children:[(0,F.jsxs)(m,{className:`flex items-center gap-2`,children:[(0,F.jsx)(N,{className:`h-4 w-4`}),` Pair device`]}),(0,F.jsx)(a,{children:`Pair a trusted device for workspace exchange.`})]}),(0,F.jsxs)(o,{className:`grid gap-3`,children:[(0,F.jsx)(k,{value:s,onChange:e=>u(e.target.value),placeholder:`device name`}),(0,F.jsx)(k,{value:d,onChange:e=>p(e.target.value),placeholder:`trusted device address`}),(0,F.jsx)(k,{value:h,onChange:e=>g(e.target.value),placeholder:`trusted public key`}),(0,F.jsx)(A,{disabled:!s||!d||!h||_.isPending,onClick:()=>_.mutate(),children:`Pair device`}),_.data?(0,F.jsx)(n,{result:_.data,successLabel:`Peer pairing request completed`}):null]})]}),(0,F.jsx)(l,{title:`Peers`,result:i.data,className:`xl:col-span-2`,children:e=>(0,F.jsx)(`div`,{className:`grid gap-2`,children:T(e.peers).map(e=>{let t=String(e.peer_id||e.id);return(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 rounded-md border border-border p-3`,children:[(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`div`,{className:`font-medium`,children:String(e.name||t)}),(0,F.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:String(e.base_url||``)})]}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(f,{label:`Push workspace`,action:()=>D.pushPeer(t,b.getState().workspaceId)}),(0,F.jsx)(f,{label:`Unpair`,action:()=>D.unpairPeer(t),invalidate:[`networkPeers`],variant:`destructive`})]})]},t)})})})]})}function ee(){let t=v(),{theme:i,setTheme:s,mode:u,setMode:d}=b(),h=S({queryKey:[`health`],queryFn:D.health}),_=S({queryKey:[`sysinfo`],queryFn:D.sysinfo}),y=S({queryKey:[`computerMemory`],queryFn:D.computerMemory}),C=S({queryKey:[`brainStorage`],queryFn:D.brainStorage}),w=S({queryKey:[`backupHealth`],queryFn:D.backupHealth}),[T,E]=P.useState(``),[O,j]=P.useState(`lattice_brain`),[M,N]=P.useState(!1),[I,L]=P.useState(``),[R,z]=P.useState(``),[B,V]=P.useState(``),[H,ee]=P.useState(!1),[U,W]=P.useState(!1),G=x({mutationFn:e=>D.dockerPostgres({consent:e,dry_run:!e,port:5432})}),K=x({mutationFn:()=>D.migratePostgres({dsn:T,schema_name:O||`lattice_brain`,dry_run:!0})}),q=x({mutationFn:()=>D.brainArchive({path:I.trim()||null,passphrase:B}),onSuccess:()=>t.invalidateQueries({queryKey:[`backupHealth`]})}),J=x({mutationFn:()=>D.brainArchiveInspect({path:R,passphrase:B||null})}),Y=x({mutationFn:()=>D.brainArchiveVerify({path:R,passphrase:B})}),X=x({mutationFn:()=>D.brainArchiveRestore({path:R,passphrase:B,dry_run:!0,confirm:!1})}),Z=x({mutationFn:()=>D.brainArchiveRestore({path:R,passphrase:B,dry_run:!1,confirm:H}),onSuccess:()=>{t.invalidateQueries({queryKey:[`brainStorage`]}),t.invalidateQueries({queryKey:[`backupHealth`]})}}),Q=x({mutationFn:()=>D.brainArchiveImport({path:R,passphrase:B,dry_run:!0,confirm:!1})}),$=x({mutationFn:()=>D.brainArchiveImport({path:R,passphrase:B,dry_run:!1,confirm:U}),onSuccess:()=>{t.invalidateQueries({queryKey:[`brainStorage`]}),t.invalidateQueries({queryKey:[`backupHealth`]})}});return(0,F.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-3`,children:[(0,F.jsxs)(c,{children:[(0,F.jsxs)(e,{children:[(0,F.jsx)(m,{children:`Appearance`}),(0,F.jsx)(a,{children:`Local browser settings only.`})]}),(0,F.jsxs)(o,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(A,{variant:i===`dark`?`default`:`outline`,onClick:()=>s(`dark`),children:`Dark`}),(0,F.jsx)(A,{variant:i===`light`?`default`:`outline`,onClick:()=>s(`light`),children:`Light`}),[`basic`,`advanced`,`admin`].map(e=>(0,F.jsx)(A,{variant:u===e?`default`:`outline`,onClick:()=>d(e),children:g(e)},e))]})]}),(0,F.jsx)(l,{title:`Server health`,result:h.data,children:e=>(0,F.jsx)(te,{data:e})}),(0,F.jsx)(l,{title:u===`basic`?`Computer readiness`:`Host telemetry`,result:_.data,children:e=>u===`basic`?(0,F.jsx)(p,{stats:[{label:`CPU`,value:`${String(e.cpu_pct||`0`)}%`},{label:`Memory`,value:`${String(e.ram_pct||`0`)}%`},{label:`GPU memory`,value:`${String(e.gpu_mem_pct||`0`)}%`},{label:`Local status`,value:`ready`}]}):(0,F.jsx)(r,{value:e})}),(0,F.jsx)(l,{title:`Brain storage`,result:C.data,className:`xl:col-span-3`,children:e=>(0,F.jsx)(ne,{data:e})}),(0,F.jsx)(l,{title:`Backup health`,result:w.data,className:`xl:col-span-3`,children:e=>(0,F.jsx)(re,{data:e})}),(0,F.jsxs)(c,{className:`xl:col-span-3`,children:[(0,F.jsxs)(e,{children:[(0,F.jsx)(m,{children:`.latticebrain portability`}),(0,F.jsx)(a,{children:`Create an encrypted portable brain file, verify one, or preview a restore before applying it.`})]}),(0,F.jsxs)(o,{className:`grid gap-3`,children:[(0,F.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-[1fr_1fr]`,children:[(0,F.jsx)(k,{value:I,onChange:e=>L(e.target.value),placeholder:`export path (optional)`}),(0,F.jsx)(k,{value:R,onChange:e=>z(e.target.value),placeholder:`archive path for inspect/restore`})]}),(0,F.jsx)(k,{type:`password`,value:B,onChange:e=>V(e.target.value),placeholder:`archive passphrase`}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(A,{onClick:()=>q.mutate(),disabled:!B||q.isPending,children:`Export archive`}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>J.mutate(),disabled:!R||J.isPending,children:`Inspect`}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>Y.mutate(),disabled:!R||!B||Y.isPending,children:`Verify`}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>X.mutate(),disabled:!R||!B||X.isPending,children:`Restore dry run`}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>Q.mutate(),disabled:!R||!B||Q.isPending,children:`Import dry run`}),(0,F.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,F.jsx)(`input`,{type:`checkbox`,checked:H,onChange:e=>ee(e.target.checked)}),`Confirm restore`]}),(0,F.jsx)(A,{variant:`destructive`,onClick:()=>Z.mutate(),disabled:!R||!B||!H||Z.isPending,children:`Restore`}),(0,F.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,F.jsx)(`input`,{type:`checkbox`,checked:U,onChange:e=>W(e.target.checked)}),`Confirm import`]}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>$.mutate(),disabled:!R||!B||!U||$.isPending,children:`Import`})]}),[q.data,J.data,Y.data,X.data,Z.data,Q.data,$.data].filter(Boolean).map((e,t)=>(0,F.jsx)(n,{result:e,successLabel:`Archive request completed`},t))]})]}),u===`basic`?null:(0,F.jsxs)(c,{className:`xl:col-span-3`,children:[(0,F.jsxs)(e,{children:[(0,F.jsx)(m,{children:`Scale mode`}),(0,F.jsx)(a,{children:`Optional advanced storage. Local SQLite remains the default.`})]}),(0,F.jsxs)(o,{className:`grid gap-3`,children:[(0,F.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-[1fr_220px]`,children:[(0,F.jsx)(k,{value:T,onChange:e=>E(e.target.value),placeholder:`Postgres connection string`}),(0,F.jsx)(k,{value:O,onChange:e=>j(e.target.value),placeholder:`database schema`})]}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(A,{variant:`outline`,onClick:()=>G.mutate(!1),disabled:G.isPending,children:`Docker plan`}),(0,F.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,F.jsx)(`input`,{type:`checkbox`,checked:M,onChange:e=>N(e.target.checked)}),`Consent to start Docker`]}),(0,F.jsx)(A,{onClick:()=>G.mutate(!0),disabled:!M||G.isPending,children:`Start Docker`}),(0,F.jsx)(A,{variant:`outline`,onClick:()=>K.mutate(),disabled:!T||K.isPending,children:`Plan migration`})]}),G.data?(0,F.jsx)(n,{result:G.data,successLabel:`Docker setup request completed`}):null,K.data?(0,F.jsx)(n,{result:K.data,successLabel:`Migration plan completed`}):null]})]}),(0,F.jsx)(l,{title:`Computer memory`,result:y.data,className:`xl:col-span-3`,children:e=>(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(r,{value:e}),(0,F.jsxs)(`div`,{className:`flex gap-2`,children:[(0,F.jsx)(f,{label:`Enable memory`,action:()=>D.setComputerMemory(!0),invalidate:[`computerMemory`]}),(0,F.jsx)(f,{label:`Disable memory`,action:()=>D.setComputerMemory(!1),invalidate:[`computerMemory`],variant:`destructive`})]})]})})]})}function U(e){return!!(e&&typeof e==`object`&&!Array.isArray(e))}function W(e,t=`not reported`){return e==null||e===``?t:typeof e==`boolean`?e?`enabled`:`disabled`:String(e)}function G({data:e}){let t=T(e.presence||e.clients||e);return t.length?(0,F.jsx)(s,{items:t,titleKey:`user`,metaKey:`workspace_id`}):(0,F.jsx)(u,{title:`No active presence`,detail:`No live collaborators or realtime clients are currently reported.`})}function K({data:e}){let n=b(e=>e.mode),r=W(e.public_key,``);return n===`basic`?(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(q,{title:`This Mac`,status:`trusted`,detail:`This device can participate in local workspace exchange when you pair another trusted device.`}),(0,F.jsx)(h,{variant:`muted`,children:W(e.algorithm,`local identity`)})]}):(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,F.jsx)(h,{variant:`success`,children:`local device`}),(0,F.jsx)(h,{variant:`muted`,children:W(e.algorithm,`identity key`)})]}),(0,F.jsx)(t,{data:{device_id:e.device_id||e.id||`not reported`,fingerprint:e.fingerprint||`not reported`,public_key:r?O(r.replace(/\s+/g,` `),72):`not reported`}})]})}function te({data:e}){let t=b(e=>e.mode);return(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(p,{stats:[{label:`Status`,value:e.status||e.ok||`reported`},{label:`Version`,value:e.version||`not reported`},{label:`Mode`,value:e.mode||e.environment||`local`},...t===`basic`?[]:[{label:`Port`,value:e.port||e.backend_port||`configured`}]]}),t===`basic`?null:(0,F.jsx)(r,{value:e})]})}function ne({data:e}){let t=U(e.active)?e.active:e,n=U(e.postgres)?e.postgres:{},i=U(e.backup_health)?e.backup_health:{},a=t.vector_search||t.vector||e.vector_search||e.sqlite_vec,o=!!(n.available||n.connected||n.enabled);return(0,F.jsxs)(`div`,{className:`space-y-4`,children:[(0,F.jsx)(p,{stats:[{label:`Active engine`,value:t.engine||e.engine||`sqlite`},{label:`SQLite default`,value:t.engine===`postgres`?`scale mode`:`enabled`},{label:`Vector search`,value:a||`not reported`},{label:`Postgres`,value:o?`available`:`optional`}]}),(0,F.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-3`,children:[(0,F.jsx)(q,{title:`SQLite`,status:t.available===!1?`unavailable`:`default`,detail:W(t.reason||t.path||e.path,`Local brain storage is active by default.`)}),(0,F.jsx)(q,{title:`Vector search`,status:W(a,`reported`),detail:W(t.vector_reason||t.sqlite_vec_reason||e.vector_reason,`Uses the configured local vector capability or reports why it is unavailable.`)}),(0,F.jsx)(q,{title:`Postgres`,status:o?`available`:`not enabled`,detail:W(n.reason||n.dsn||n.status,`Postgres scale mode is opt-in and never required for local use.`)})]}),Object.keys(i).length?(0,F.jsx)(r,{value:{backup_health:i}}):null]})}function re({data:e}){return(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(p,{stats:[{label:`Available`,value:e.available===!1?`no`:`yes`},{label:`Backups`,value:e.count||e.backups||0},{label:`Encrypted`,value:e.encrypted_archives||0},{label:`Zip backups`,value:e.zip_backups||0}]}),(0,F.jsx)(t,{data:{directory:e.directory||`not reported`,latest:e.latest||`none reported`,last_verified:e.last_verified||e.verified_at||`not reported`,failure:e.error||e.reason||`none reported`}})]})}function q({title:e,status:t,detail:n}){let r=/unavailable|failed|denied|disabled|not enabled/i.test(t)?`warning`:`success`;return(0,F.jsxs)(`div`,{className:`rounded-md border border-border bg-background p-3`,children:[(0,F.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,F.jsx)(`div`,{className:`font-medium`,children:e}),(0,F.jsx)(h,{variant:r,children:t})]}),(0,F.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:n})]})}function J({data:e}){let t=U(e.startup)?e.startup:{},n=U(e.privacy)?e.privacy:{},r=U(e.storage)?e.storage:{},i=U(e.backup)?e.backup:{},a=U(e.device_identity)?e.device_identity:{},o=U(e.permissions)?e.permissions:{};return(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(p,{stats:[{label:`Version`,value:e.version||`reported`},{label:`Local only`,value:n.local_only_default??t.local_only_default??`reported`},{label:`Storage`,value:U(r.active)?r.active.engine:`reported`},{label:`Backups`,value:i.count||i.available||`reported`}]}),(0,F.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[(0,F.jsx)(q,{title:`Startup`,status:t.network_exposed?`network exposed`:`local-only`,detail:`Lattice starts locally by default and reports when network access is enabled.`}),(0,F.jsx)(q,{title:`Integrations`,status:n.local_only_default===!1?`review required`:`opt-in`,detail:`External integrations remain disabled until the user explicitly enables them.`}),(0,F.jsx)(q,{title:`Device identity`,status:W(a.algorithm||a.fingerprint,`reported`),detail:W(a.storage,`Stored locally and used for signed bundle exchange.`)}),(0,F.jsx)(q,{title:`Permissions`,status:o.destructive_restore_requires_confirmation===!1?`review required`:`guarded`,detail:`Export, import, and destructive restore permissions are surfaced through admin status.`})]})]})}function Y({data:e}){let t=U(e.cards)?e.cards:{},n=U(e.severity_counts)?e.severity_counts:{};return(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(p,{stats:[{label:`Events today`,value:t.events_today||0},{label:`High risk`,value:t.high_risk_events||n.high||0},{label:`Review`,value:t.review_required||0},{label:`Risk rate`,value:e.risk_rate||0}]}),(0,F.jsx)(r,{value:{severity_counts:n,sensitive_fields:e.field_counts||{}}})]})}function X(){let e=b(e=>e.mode),n=S({queryKey:[`adminSummary`],queryFn:D.adminSummary}),i=S({queryKey:[`adminUsers`],queryFn:D.adminUsers}),a=S({queryKey:[`adminAudit`],queryFn:()=>D.adminAudit()}),o=S({queryKey:[`adminRoles`],queryFn:D.adminRoles}),c=S({queryKey:[`adminPolicies`],queryFn:D.adminPolicies}),u=S({queryKey:[`adminProductHardening`],queryFn:D.adminProductHardening}),f=S({queryKey:[`adminSecurity`],queryFn:D.adminSecurity}),p=S({queryKey:[`vpcStatus`],queryFn:D.vpcStatus});return e===`admin`?(0,F.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,F.jsx)(l,{title:`Admin summary`,result:n.data,children:e=>(0,F.jsx)(t,{data:e})}),(0,F.jsx)(l,{title:`Users`,result:i.data,children:e=>(0,F.jsx)(s,{items:e,titleKey:`email`,metaKey:`role`})}),(0,F.jsx)(l,{title:`Audit`,result:a.data,children:e=>(0,F.jsx)(s,{items:e.recent_events||e,titleKey:`act`,metaKey:`sev`})}),(0,F.jsx)(l,{title:`Roles`,result:o.data,children:e=>(0,F.jsx)(s,{items:e.roles||e,titleKey:`role`,metaKey:`members`})}),(0,F.jsx)(l,{title:`Policies`,result:c.data,children:e=>(0,F.jsx)(s,{items:e.policies||e,titleKey:`label`,metaKey:`enforced`})}),(0,F.jsx)(l,{title:`Product hardening`,result:u.data,children:e=>(0,F.jsx)(J,{data:e})}),(0,F.jsx)(l,{title:`Security overview`,result:f.data,children:e=>(0,F.jsx)(Y,{data:e})}),(0,F.jsx)(l,{title:`Private VPC`,result:p.data,className:`xl:col-span-2`,children:e=>(0,F.jsxs)(`div`,{className:`space-y-2`,children:[(0,F.jsx)(h,{variant:`muted`,children:`Community-disabled features remain honest unavailable states.`}),(0,F.jsx)(r,{value:e})]})})]}):(0,F.jsx)(d,{title:`Admin controls`,detail:`Switch to Admin mode to review users, audit events, policies, security posture, and private networking diagnostics.`,target:`admin`})}export{L as SystemPage};
|
|
2
|
+
//# sourceMappingURL=System-DEu0xNUc.js.map
|