ltcai 8.8.0 → 9.0.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 +33 -37
- package/auto_setup.py +84 -70
- package/docs/CHANGELOG.md +113 -237
- package/docs/CODE_REVIEW_2026-07-06.md +764 -0
- package/docs/COMMUNITY_AND_PLUGINS.md +3 -3
- package/docs/DEVELOPMENT.md +10 -10
- package/docs/LEGACY_COMPATIBILITY.md +1 -1
- package/docs/ONBOARDING.md +2 -2
- package/docs/PRODUCT_DIRECTION_REVIEW.md +3 -2
- package/docs/ROADMAP_RECOMMENDATIONS.md +61 -36
- package/docs/TRUST_MODEL.md +5 -1
- package/docs/WHY_LATTICE.md +4 -3
- package/docs/architecture.md +4 -0
- package/docs/kg-schema.md +1 -1
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/archive.py +4 -9
- package/lattice_brain/conversations.py +156 -21
- package/lattice_brain/embeddings.py +38 -2
- package/lattice_brain/graph/_kg_common.py +39 -496
- package/lattice_brain/graph/_kg_constants.py +243 -0
- package/lattice_brain/graph/_kg_fsutil.py +297 -0
- package/lattice_brain/graph/discovery.py +0 -948
- package/lattice_brain/graph/discovery_index.py +972 -0
- package/lattice_brain/graph/json_utils.py +25 -0
- package/lattice_brain/graph/retrieval.py +66 -597
- package/lattice_brain/graph/retrieval_docgen.py +210 -0
- package/lattice_brain/graph/retrieval_vector.py +460 -0
- package/lattice_brain/graph/runtime.py +16 -0
- package/lattice_brain/graph/store.py +6 -0
- package/lattice_brain/ingestion.py +68 -0
- package/lattice_brain/portability.py +1 -9
- package/lattice_brain/quality.py +98 -4
- package/lattice_brain/runtime/agent_runtime.py +166 -0
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/lattice_brain/utils.py +28 -0
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/chat.py +368 -418
- package/latticeai/api/chat_helpers.py +227 -0
- package/latticeai/api/computer_use.py +149 -31
- package/latticeai/api/marketplace.py +11 -0
- package/latticeai/api/mcp.py +3 -2
- package/latticeai/api/models.py +4 -1
- package/latticeai/api/permissions.py +72 -33
- package/latticeai/api/setup.py +17 -2
- package/latticeai/api/tools.py +105 -62
- package/latticeai/app_factory.py +101 -296
- package/latticeai/core/agent.py +25 -7
- package/latticeai/core/io_utils.py +37 -0
- package/latticeai/core/legacy_compatibility.py +1 -1
- package/latticeai/core/local_embeddings.py +2 -4
- package/latticeai/core/marketplace.py +33 -2
- package/latticeai/core/mcp_catalog.py +450 -0
- package/latticeai/core/mcp_registry.py +2 -441
- package/latticeai/core/sessions.py +11 -3
- package/latticeai/core/tool_registry.py +15 -4
- package/latticeai/core/users.py +4 -9
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/core/workspace_os_utils.py +3 -17
- package/latticeai/integrations/telegram_bot.py +7 -2
- package/latticeai/models/model_providers.py +111 -0
- package/latticeai/models/router.py +58 -136
- package/latticeai/runtime/audit_runtime.py +27 -16
- package/latticeai/runtime/automation_runtime.py +9 -0
- package/latticeai/runtime/bootstrap.py +1 -1
- package/latticeai/runtime/history_runtime.py +163 -0
- package/latticeai/runtime/namespace_runtime.py +173 -0
- package/latticeai/runtime/network_config_runtime.py +56 -0
- package/latticeai/runtime/sso_config_runtime.py +128 -0
- package/latticeai/runtime/user_key_runtime.py +106 -0
- package/latticeai/services/app_context.py +1 -0
- package/latticeai/services/architecture_readiness.py +2 -2
- package/latticeai/services/memory_service.py +213 -0
- package/latticeai/services/model_engines.py +79 -12
- package/latticeai/services/model_runtime.py +24 -4
- package/latticeai/services/platform_runtime.py +9 -1
- package/latticeai/services/process_audit.py +208 -0
- package/latticeai/services/product_readiness.py +11 -11
- package/latticeai/services/review_queue.py +64 -11
- package/latticeai/services/run_executor.py +21 -0
- package/latticeai/services/search_service.py +106 -30
- package/latticeai/services/setup_detection.py +80 -0
- package/latticeai/services/tool_dispatch.py +66 -0
- package/latticeai/services/workspace_service.py +15 -0
- package/package.json +1 -1
- package/scripts/check_i18n_literals.mjs +20 -8
- package/scripts/i18n_literal_allowlist.json +34 -0
- package/scripts/lint_frontend.mjs +6 -2
- package/setup_wizard.py +196 -74
- 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 +11 -11
- package/static/app/assets/{Act-C7K9wsO9.js → Act-21lIXx2E.js} +1 -1
- package/static/app/assets/Brain-BqUd5UJJ.js +321 -0
- package/static/app/assets/{Capture-B3V4_5Xp.js → Capture-BA7Z2Q1u.js} +1 -1
- package/static/app/assets/{Library-Cgj-EF50.js → Library-bFMtyni3.js} +1 -1
- package/static/app/assets/System-K6krGCqn.js +1 -0
- package/static/app/assets/index-C4R3ws30.js +17 -0
- package/static/app/assets/index-ChSeOB02.css +2 -0
- package/static/app/assets/primitives-sQU3it5I.js +1 -0
- package/static/app/assets/{textarea-CVQkN2Tk.js → textarea-DK3Fd_lR.js} +1 -1
- package/static/app/index.html +2 -2
- package/static/css/tokens.css +4 -2
- package/static/sw.js +1 -1
- package/tools/local_files.py +6 -0
- package/latticeai/runtime/sso_runtime.py +0 -52
- package/static/app/assets/Brain-I1OSzxJu.js +0 -321
- package/static/app/assets/System-D1Lkei3I.js +0 -1
- package/static/app/assets/index--P0ksosz.js +0 -17
- package/static/app/assets/index-DCh5AoXt.css +0 -2
- package/static/app/assets/primitives-BLqaKk5g.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e,a as t,c as n,d as r,g as i,h as a,i as o,l as s,m as c,n as l,p as u,r as d,s as f,t as p,u as m,v as h}from"./primitives-BLqaKk5g.js";import{A as g,D as _,I as v,M as y,O as b,P as x,T as S,b as C,g as w,i as T,j as E,k as D,n as O,o as k,t as A,x as j,y as M}from"./index--P0ksosz.js";var N=M(`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=v(x()),F=y(),I=[{id:`account`,labelKey:`system.tab.account`},{id:`workspaces`,labelKey:`system.tab.workspaces`},{id:`snapshots`,labelKey:`system.tab.snapshots`},{id:`activity`,labelKey:`system.tab.activity`},{id:`network`,labelKey:`system.tab.network`},{id:`settings`,labelKey:`system.tab.settings`},{id:`admin`,labelKey:`system.tab.admin`}];function L({initialTab:e}){let t=b(e=>e.mode),n=b(e=>e.language),[i,a]=P.useState(e||`account`);return P.useEffect(()=>{I.some(t=>t.id===e)&&a(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)(k,{className:`h-4 w-4`}),` `,C(n,`system.kicker`)]}),(0,F.jsx)(`h1`,{className:`page-title`,children:C(n,`system.title`)}),(0,F.jsx)(`p`,{className:`page-copy`,children:C(n,`system.body`)})]}),(0,F.jsx)(r,{tabs:(t===`basic`?I.filter(e=>e.id!==`admin`):I).map(e=>({id:e.id,label:C(n,e.labelKey)})),value:i,onChange:e=>a(e)}),i===`account`?(0,F.jsx)(R,{}):null,i===`workspaces`?(0,F.jsx)(z,{}):null,i===`snapshots`?(0,F.jsx)(B,{}):null,i===`activity`?(0,F.jsx)(V,{}):null,i===`network`?(0,F.jsx)(ee,{}):null,i===`settings`?(0,F.jsx)(H,{}):null,i===`admin`?(0,F.jsx)(Y,{}):null]})}function R(){let r=E(),o=g({queryKey:[`profile`],queryFn:_.profile}),s=g({queryKey:[`sso`],queryFn:_.ssoConfig}),[d,f]=P.useState(``),[h,v]=P.useState(``),[y,b]=P.useState(``),[x,S]=P.useState(``),[C,T]=P.useState(``),k=D({mutationFn:()=>_.login(d,h),onSuccess:()=>r.invalidateQueries({queryKey:[`profile`]})}),j=D({mutationFn:()=>_.register({email:d,password:h,name:y,nickname:x}),onSuccess:()=>r.invalidateQueries({queryKey:[`profile`]})}),M=D({mutationFn:()=>_.updateProfile({name:y,nickname:x}),onSuccess:()=>r.invalidateQueries({queryKey:[`profile`]})}),N=D({mutationFn:()=>_.changePassword(h,C)});return(0,F.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,F.jsx)(l,{title:`Profile`,result:o.data,children:e=>(0,F.jsx)(t,{data:e})}),(0,F.jsxs)(u,{children:[(0,F.jsxs)(i,{children:[(0,F.jsxs)(e,{className:`flex items-center gap-2`,children:[(0,F.jsx)(w,{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)(c,{className:`grid gap-3`,children:[(0,F.jsx)(A,{value:d,onChange:e=>f(e.target.value),placeholder:`email`}),(0,F.jsx)(A,{type:`password`,value:h,onChange:e=>v(e.target.value),placeholder:`current password`}),(0,F.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[(0,F.jsx)(A,{value:y,onChange:e=>b(e.target.value),placeholder:`name`}),(0,F.jsx)(A,{value:x,onChange:e=>S(e.target.value),placeholder:`nickname`})]}),(0,F.jsx)(A,{type:`password`,value:C,onChange:e=>T(e.target.value),placeholder:`new password`}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(O,{onClick:()=>k.mutate(),disabled:!d||!h||k.isPending,children:`Login`}),(0,F.jsx)(O,{variant:`outline`,onClick:()=>j.mutate(),disabled:!d||!h||j.isPending,children:`Register`}),(0,F.jsx)(O,{variant:`outline`,onClick:()=>M.mutate(),disabled:M.isPending,children:`Save profile`}),(0,F.jsx)(O,{variant:`outline`,onClick:()=>N.mutate(),disabled:!h||!C||N.isPending,children:`Change password`}),(0,F.jsx)(p,{label:`Logout`,action:()=>_.logout(),invalidate:[`profile`]})]}),[k.data,j.data,M.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:s.data,className:`xl:col-span-2`,children:e=>(0,F.jsx)(m,{value:e})})]})}function z(){let t=E(),{setWorkspaceId:n}=b(),r=g({queryKey:[`workspaceRegistry`],queryFn:_.workspaceRegistry}),s=g({queryKey:[`invitations`],queryFn:_.invitations}),[d,f]=P.useState(``),[m,h]=P.useState(``),[v,y]=P.useState(``),x=D({mutationFn:()=>_.createOrg(d),onSuccess:()=>t.invalidateQueries({queryKey:[`workspaceRegistry`]})}),S=D({mutationFn:()=>_.createInvitation({email:m||null,role:`member`,expires_hours:168}),onSuccess:()=>t.invalidateQueries({queryKey:[`invitations`]})}),C=D({mutationFn:()=>_.acceptInvitation(v),onSuccess:()=>t.invalidateQueries({queryKey:[`workspaceRegistry`]})}),w=j(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:w.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)(O,{variant:`outline`,onClick:()=>n(t),children:`Use`}),(0,F.jsx)(p,{label:`Activate`,action:()=>_.activateWorkspace(t),invalidate:[`workspaceRegistry`]}),(0,F.jsx)(p,{label:`Archive`,action:()=>_.archiveWorkspace(t),invalidate:[`workspaceRegistry`],variant:`destructive`})]})]})},t)})})}),(0,F.jsxs)(u,{children:[(0,F.jsxs)(i,{children:[(0,F.jsxs)(e,{className:`flex items-center gap-2`,children:[(0,F.jsx)(T,{className:`h-4 w-4`}),` Organizations and invitations`]}),(0,F.jsx)(a,{children:`Create or join a workspace before adding knowledge.`})]}),(0,F.jsxs)(c,{className:`grid gap-3`,children:[(0,F.jsx)(A,{value:d,onChange:e=>f(e.target.value),placeholder:`New organization name`}),(0,F.jsx)(O,{disabled:!d.trim()||x.isPending,onClick:()=>x.mutate(),children:`Create organization`}),(0,F.jsx)(A,{value:m,onChange:e=>h(e.target.value),placeholder:`invitee email`}),(0,F.jsx)(O,{variant:`outline`,disabled:S.isPending,onClick:()=>S.mutate(),children:`Create invitation`}),(0,F.jsx)(A,{value:v,onChange:e=>y(e.target.value),placeholder:`invitation token`}),(0,F.jsx)(O,{variant:`outline`,disabled:!v.trim()||C.isPending,onClick:()=>C.mutate(),children:`Accept invitation`}),(0,F.jsx)(l,{title:`Invitations`,result:s.data,children:e=>(0,F.jsx)(o,{items:e.invitations,titleKey:`token`,metaKey:`role`})})]})]})]})}function B(){let t=g({queryKey:[`snapshots`],queryFn:_.snapshots}),r=g({queryKey:[`timeMachine`],queryFn:_.timeMachine}),[s,d]=P.useState(``),[f,m]=P.useState(``),[h,v]=P.useState(``),y=D({mutationFn:()=>_.createSnapshot(s||`desktop checkpoint`)}),b=D({mutationFn:()=>_.compareSnapshots(f,h)}),x=j(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:x.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)(p,{label:`Export`,action:()=>_.exportSnapshot(t)}),(0,F.jsx)(p,{label:`Merge restore`,action:()=>_.restoreSnapshot(t),variant:`outline`})]})]},t)})})}),(0,F.jsxs)(u,{children:[(0,F.jsxs)(i,{children:[(0,F.jsx)(e,{children:`Snapshot actions`}),(0,F.jsx)(a,{children:`Create checkpoints and compare changes over time.`})]}),(0,F.jsxs)(c,{className:`grid gap-3`,children:[(0,F.jsx)(A,{value:s,onChange:e=>d(e.target.value),placeholder:`snapshot name`}),(0,F.jsx)(O,{onClick:()=>y.mutate(),disabled:y.isPending,children:`Create snapshot`}),(0,F.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[(0,F.jsx)(A,{value:f,onChange:e=>m(e.target.value),placeholder:`before id`}),(0,F.jsx)(A,{value:h,onChange:e=>v(e.target.value),placeholder:`after id`})]}),(0,F.jsx)(O,{variant:`outline`,onClick:()=>b.mutate(),disabled:!f||!h||b.isPending,children:`Compare`}),b.data?(0,F.jsx)(n,{result:b.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)(o,{items:e.events||e,titleKey:`event`,metaKey:`type`,limit:14})})]})}function V(){let e=g({queryKey:[`realtimeFeed`],queryFn:_.realtimeFeed}),t=g({queryKey:[`presence`],queryFn:_.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)(o,{items:e.events,titleKey:`event_type`,metaKey:`area`,limit:14})}),(0,F.jsx)(l,{title:`Presence`,result:t.data,children:e=>(0,F.jsx)(te,{data:e})})]})}function ee(){let t=E(),r=g({queryKey:[`networkIdentity`],queryFn:_.networkIdentity}),o=g({queryKey:[`networkPeers`],queryFn:_.networkPeers}),[s,d]=P.useState(``),[f,m]=P.useState(``),[h,v]=P.useState(``),y=D({mutationFn:()=>_.pairPeer({name:s,base_url:f,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)(G,{data:e})}),(0,F.jsxs)(u,{children:[(0,F.jsxs)(i,{children:[(0,F.jsxs)(e,{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)(c,{className:`grid gap-3`,children:[(0,F.jsx)(A,{value:s,onChange:e=>d(e.target.value),placeholder:`device name`}),(0,F.jsx)(A,{value:f,onChange:e=>m(e.target.value),placeholder:`trusted device address`}),(0,F.jsx)(A,{value:h,onChange:e=>v(e.target.value),placeholder:`trusted public key`}),(0,F.jsx)(O,{disabled:!s||!f||!h||y.isPending,onClick:()=>y.mutate(),children:`Pair device`}),y.data?(0,F.jsx)(n,{result:y.data,successLabel:`Peer pairing request completed`}):null]})]}),(0,F.jsx)(l,{title:`Peers`,result:o.data,className:`xl:col-span-2`,children:e=>(0,F.jsx)(`div`,{className:`grid gap-2`,children:j(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)(p,{label:`Push workspace`,action:()=>_.pushPeer(t,b.getState().workspaceId)}),(0,F.jsx)(p,{label:`Unpair`,action:()=>_.unpairPeer(t),invalidate:[`networkPeers`],variant:`destructive`})]})]},t)})})})]})}function H(){let t=E(),{theme:r,setTheme:o,mode:d,setMode:f}=b(),h=b(e=>e.language),v=g({queryKey:[`health`],queryFn:_.health}),y=g({queryKey:[`sysinfo`],queryFn:_.sysinfo}),x=g({queryKey:[`computerMemory`],queryFn:_.computerMemory}),S=g({queryKey:[`brainStorage`],queryFn:_.brainStorage}),w=g({queryKey:[`backupHealth`],queryFn:_.backupHealth}),[T,k]=P.useState(``),[j,M]=P.useState(`lattice_brain`),[N,I]=P.useState(!1),[L,R]=P.useState(``),[z,B]=P.useState(``),[V,ee]=P.useState(``),[H,U]=P.useState(!1),[W,te]=P.useState(!1),G=D({mutationFn:e=>_.dockerPostgres({consent:e,dry_run:!e,port:5432})}),K=D({mutationFn:()=>_.migratePostgres({dsn:T,schema_name:j||`lattice_brain`,dry_run:!0})}),q=D({mutationFn:()=>_.brainArchive({path:L.trim()||null,passphrase:V}),onSuccess:()=>t.invalidateQueries({queryKey:[`backupHealth`]})}),J=D({mutationFn:()=>_.brainArchiveInspect({path:z,passphrase:V||null})}),Y=D({mutationFn:()=>_.brainArchiveVerify({path:z,passphrase:V})}),X=D({mutationFn:()=>_.brainArchiveRestore({path:z,passphrase:V,dry_run:!0,confirm:!1})}),Z=D({mutationFn:()=>_.brainArchiveRestore({path:z,passphrase:V,dry_run:!1,confirm:H}),onSuccess:()=>{t.invalidateQueries({queryKey:[`brainStorage`]}),t.invalidateQueries({queryKey:[`backupHealth`]})}}),Q=D({mutationFn:()=>_.brainArchiveImport({path:z,passphrase:V,dry_run:!0,confirm:!1})}),$=D({mutationFn:()=>_.brainArchiveImport({path:z,passphrase:V,dry_run:!1,confirm:W}),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)(u,{children:[(0,F.jsxs)(i,{children:[(0,F.jsx)(e,{children:C(h,`system.panel.appearance`)}),(0,F.jsx)(a,{children:C(h,`system.panel.appearance.hint`)})]}),(0,F.jsxs)(c,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(O,{variant:r===`dark`?`default`:`outline`,onClick:()=>o(`dark`),children:C(h,`system.theme.dark`)}),(0,F.jsx)(O,{variant:r===`light`?`default`:`outline`,onClick:()=>o(`light`),children:C(h,`system.theme.light`)}),[`basic`,`advanced`,`admin`].map(e=>(0,F.jsx)(O,{variant:d===e?`default`:`outline`,onClick:()=>f(e),children:C(h,`shell.mode.${e}`)},e))]})]}),(0,F.jsx)(l,{title:d===`basic`?C(h,`system.panel.brainStatus`):`Server health`,result:v.data,children:e=>(0,F.jsx)(ne,{data:e})}),(0,F.jsx)(l,{title:d===`basic`?C(h,`system.panel.readiness`):`Host telemetry`,result:y.data,children:e=>d===`basic`?(0,F.jsx)(s,{stats:[{label:C(h,`system.stat.cpu`),value:`${String(e.cpu_pct||`0`)}%`},{label:C(h,`system.stat.memory`),value:`${String(e.ram_pct||`0`)}%`},{label:C(h,`system.stat.gpu`),value:`${String(e.gpu_mem_pct||`0`)}%`},{label:C(h,`system.stat.localStatus`),value:C(h,`system.stat.ready`)}]}):(0,F.jsx)(m,{value:e})}),(0,F.jsx)(l,{title:d===`basic`?C(h,`system.storage.title`):`Brain storage`,result:S.data,className:`xl:col-span-3`,children:e=>(0,F.jsx)(re,{data:e,mode:d,language:h})}),d===`basic`?null:(0,F.jsx)(l,{title:`Backup health`,result:w.data,className:`xl:col-span-3`,children:e=>(0,F.jsx)(ie,{data:e})}),d===`basic`?null:(0,F.jsxs)(u,{className:`xl:col-span-3`,children:[(0,F.jsxs)(i,{children:[(0,F.jsx)(e,{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)(c,{className:`grid gap-3`,children:[(0,F.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-[1fr_1fr]`,children:[(0,F.jsx)(A,{value:L,onChange:e=>R(e.target.value),placeholder:`export path (optional)`}),(0,F.jsx)(A,{value:z,onChange:e=>B(e.target.value),placeholder:`archive path for inspect/restore`})]}),(0,F.jsx)(A,{type:`password`,value:V,onChange:e=>ee(e.target.value),placeholder:`archive passphrase`}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(O,{onClick:()=>q.mutate(),disabled:!V||q.isPending,children:`Export archive`}),(0,F.jsx)(O,{variant:`outline`,onClick:()=>J.mutate(),disabled:!z||J.isPending,children:`Inspect`}),(0,F.jsx)(O,{variant:`outline`,onClick:()=>Y.mutate(),disabled:!z||!V||Y.isPending,children:`Verify`}),(0,F.jsx)(O,{variant:`outline`,onClick:()=>X.mutate(),disabled:!z||!V||X.isPending,children:`Restore dry run`}),(0,F.jsx)(O,{variant:`outline`,onClick:()=>Q.mutate(),disabled:!z||!V||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=>U(e.target.checked)}),`Confirm restore`]}),(0,F.jsx)(O,{variant:`destructive`,onClick:()=>Z.mutate(),disabled:!z||!V||!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:W,onChange:e=>te(e.target.checked)}),`Confirm import`]}),(0,F.jsx)(O,{variant:`outline`,onClick:()=>$.mutate(),disabled:!z||!V||!W||$.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))]})]}),d===`basic`?null:(0,F.jsxs)(u,{className:`xl:col-span-3`,children:[(0,F.jsxs)(i,{children:[(0,F.jsx)(e,{children:`Scale mode`}),(0,F.jsx)(a,{children:`Optional advanced storage. Local SQLite remains the default.`})]}),(0,F.jsxs)(c,{className:`grid gap-3`,children:[(0,F.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-[1fr_220px]`,children:[(0,F.jsx)(A,{value:T,onChange:e=>k(e.target.value),placeholder:`Postgres connection string`}),(0,F.jsx)(A,{value:j,onChange:e=>M(e.target.value),placeholder:`database schema`})]}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,F.jsx)(O,{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:N,onChange:e=>I(e.target.checked)}),`Consent to start Docker`]}),(0,F.jsx)(O,{onClick:()=>G.mutate(!0),disabled:!N||G.isPending,children:`Start Docker`}),(0,F.jsx)(O,{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]})]}),d===`basic`?null:(0,F.jsx)(l,{title:`Computer memory`,result:x.data,className:`xl:col-span-3`,children:e=>(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(m,{value:e}),(0,F.jsxs)(`div`,{className:`flex gap-2`,children:[(0,F.jsx)(p,{label:`Enable memory`,action:()=>_.setComputerMemory(!0),invalidate:[`computerMemory`]}),(0,F.jsx)(p,{label:`Disable memory`,action:()=>_.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 te({data:e}){let t=j(e.presence||e.clients||e);return t.length?(0,F.jsx)(o,{items:t,titleKey:`user`,metaKey:`workspace_id`}):(0,F.jsx)(d,{title:`No active presence`,detail:`No live collaborators or realtime clients are currently reported.`})}function G({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)(K,{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?S(r.replace(/\s+/g,` `),72):`not reported`}})]})}function ne({data:e}){let t=b(e=>e.mode),n=b(e=>e.language);return t===`basic`?(0,F.jsx)(K,{title:C(n,`system.health.title`),status:C(n,`system.health.ok`),detail:C(n,`system.health.detail`)}):(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(s,{stats:[{label:`Status`,value:e.status||e.ok||`reported`},{label:`Version`,value:e.version||`not reported`},{label:`Mode`,value:e.mode||e.environment||`local`},{label:`Port`,value:e.port||e.backend_port||`configured`}]}),(0,F.jsx)(m,{value:e})]})}function re({data:e,mode:t=`advanced`,language:n=`en`}){let r=U(e.active)?e.active:e,i=U(e.postgres)?e.postgres:{},a=U(e.backup_health)?e.backup_health:{},o=r.vector_search||r.vector||e.vector_search||e.sqlite_vec,c=!!(i.available||i.connected||i.enabled),l=!!o&&String(o).toLowerCase()!==`not reported`;return t===`basic`?(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(K,{title:C(n,`system.storage.local.title`),status:C(n,`system.storage.local.badge`),detail:C(n,`system.storage.local.detail`)}),(0,F.jsx)(K,{title:C(n,`system.storage.search.title`),status:l?C(n,`system.storage.search.on`):C(n,`system.storage.search.pending`),detail:l?C(n,`system.storage.search.detailOn`):C(n,`system.storage.search.detailPending`)})]}):(0,F.jsxs)(`div`,{className:`space-y-4`,children:[(0,F.jsx)(s,{stats:[{label:`Active engine`,value:r.engine||e.engine||`sqlite`},{label:`SQLite default`,value:r.engine===`postgres`?`scale mode`:`enabled`},{label:`Vector search`,value:o||`not reported`},{label:`Postgres`,value:c?`available`:`optional`}]}),(0,F.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-3`,children:[(0,F.jsx)(K,{title:`SQLite`,status:r.available===!1?`unavailable`:`default`,detail:W(r.reason||r.path||e.path,`Local brain storage is active by default.`)}),(0,F.jsx)(K,{title:`Vector search`,status:W(o,`reported`),detail:W(r.vector_reason||r.sqlite_vec_reason||e.vector_reason,`Uses the configured local vector capability or reports why it is unavailable.`)}),(0,F.jsx)(K,{title:`Postgres`,status:c?`available`:`not enabled`,detail:W(i.reason||i.dsn||i.status,`Postgres scale mode is opt-in and never required for local use.`)})]}),Object.keys(a).length?(0,F.jsx)(m,{value:{backup_health:a}}):null]})}function ie({data:e}){return(0,F.jsxs)(`div`,{className:`space-y-3`,children:[(0,F.jsx)(s,{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 K({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 q({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)(s,{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)(K,{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)(K,{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)(K,{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)(K,{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 J({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)(s,{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)(m,{value:{severity_counts:n,sensitive_fields:e.field_counts||{}}})]})}function Y(){let e=b(e=>e.mode),n=g({queryKey:[`adminSummary`],queryFn:_.adminSummary}),r=g({queryKey:[`adminUsers`],queryFn:_.adminUsers}),i=g({queryKey:[`adminAudit`],queryFn:()=>_.adminAudit()}),a=g({queryKey:[`adminRoles`],queryFn:_.adminRoles}),s=g({queryKey:[`adminPolicies`],queryFn:_.adminPolicies}),c=g({queryKey:[`adminProductHardening`],queryFn:_.adminProductHardening}),u=g({queryKey:[`adminSecurity`],queryFn:_.adminSecurity}),d=g({queryKey:[`vpcStatus`],queryFn:_.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:r.data,children:e=>(0,F.jsx)(o,{items:e,titleKey:`email`,metaKey:`role`})}),(0,F.jsx)(l,{title:`Audit`,result:i.data,children:e=>(0,F.jsx)(o,{items:e.recent_events||e,titleKey:`act`,metaKey:`sev`})}),(0,F.jsx)(l,{title:`Roles`,result:a.data,children:e=>(0,F.jsx)(o,{items:e.roles||e,titleKey:`role`,metaKey:`members`})}),(0,F.jsx)(l,{title:`Policies`,result:s.data,children:e=>(0,F.jsx)(o,{items:e.policies||e,titleKey:`label`,metaKey:`enforced`})}),(0,F.jsx)(l,{title:`Product hardening`,result:c.data,children:e=>(0,F.jsx)(q,{data:e})}),(0,F.jsx)(l,{title:`Security overview`,result:u.data,children:e=>(0,F.jsx)(J,{data:e})}),(0,F.jsx)(l,{title:`Private VPC`,result:d.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)(m,{value:e})]})})]}):(0,F.jsx)(f,{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};
|