ltcai 7.4.0 → 7.6.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 +50 -41
- package/docs/CHANGELOG.md +52 -0
- package/docs/ROADMAP_RECOMMENDATIONS.md +15 -1
- package/frontend/src/components/ProductFlow.tsx +36 -1
- package/frontend/src/components/onboarding/recommendationModel.ts +1 -1
- package/frontend/src/features/brain/BrainHome.tsx +29 -0
- package/frontend/src/i18n.ts +31 -1
- package/frontend/src/styles.css +156 -0
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/retrieval_benchmark_fixtures.py +48 -12
- package/lattice_brain/runtime/agent_runtime.py +20 -4
- package/lattice_brain/runtime/contracts.py +55 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/agents.py +3 -3
- package/latticeai/api/realtime.py +3 -1
- package/latticeai/core/local_embeddings.py +4 -3
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/sessions.py +8 -2
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/models/router.py +19 -0
- package/latticeai/services/architecture_readiness.py +101 -0
- package/latticeai/services/model_runtime.py +8 -3
- package/package.json +6 -3
- package/scripts/brain_quality_eval.py +11 -8
- package/scripts/pts-claudecode-discord-bridge.mjs +20 -3
- package/src-tauri/Cargo.lock +626 -1089
- package/src-tauri/Cargo.toml +3 -6
- package/src-tauri/src/main.rs +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 → Act-CSeeIWB4.js} +2 -2
- package/static/app/assets/{Act-Di4tRFWY.js.map → Act-CSeeIWB4.js.map} +1 -1
- package/static/app/assets/{Brain-BZB3Gy9w.js → Brain-D_Ne4YoR.js} +2 -2
- package/static/app/assets/{Brain-BZB3Gy9w.js.map → Brain-D_Ne4YoR.js.map} +1 -1
- package/static/app/assets/{Capture-tNyYWxnh.js → Capture-YFRAO4bJ.js} +2 -2
- package/static/app/assets/{Capture-tNyYWxnh.js.map → Capture-YFRAO4bJ.js.map} +1 -1
- package/static/app/assets/{Library-DAtDDLdg.js → Library-C4zmA8O2.js} +2 -2
- package/static/app/assets/{Library-DAtDDLdg.js.map → Library-C4zmA8O2.js.map} +1 -1
- package/static/app/assets/{System-DEu0xNUc.js → System-Da-Kxwiz.js} +2 -2
- package/static/app/assets/{System-DEu0xNUc.js.map → System-Da-Kxwiz.js.map} +1 -1
- package/static/app/assets/core-CwxXejkd.js.map +1 -1
- package/static/app/assets/{index-Bi_bpigM.css → index-BwmCpRoW.css} +1 -1
- package/static/app/assets/index-D1hsexMt.js +17 -0
- package/static/app/assets/index-D1hsexMt.js.map +1 -0
- package/static/app/assets/{primitives-CdwcE--L.js → primitives-CSsF_Ymb.js} +2 -2
- package/static/app/assets/{primitives-CdwcE--L.js.map → primitives-CSsF_Ymb.js.map} +1 -1
- package/static/app/assets/{textarea-CqOdBPL1.js → textarea-CJMFSyfQ.js} +2 -2
- package/static/app/assets/{textarea-CqOdBPL1.js.map → textarea-CJMFSyfQ.js.map} +1 -1
- package/static/app/index.html +2 -2
- package/static/app/assets/index-COuGp7_5.js +0 -17
- package/static/app/assets/index-COuGp7_5.js.map +0 -1
|
@@ -1,2 +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-
|
|
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-CSsF_Ymb.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-D1hsexMt.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-Da-Kxwiz.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"System-DEu0xNUc.js","names":[],"sources":["../../../node_modules/lucide-react/dist/esm/icons/network.mjs","../../../frontend/src/pages/System.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 [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n];\nconst Network = createLucideIcon(\"network\", __iconNode);\n\nexport { __iconNode, Network as default };\n//# sourceMappingURL=network.mjs.map\n","import * as React from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Network, ShieldCheck, UserCircle, Users } from \"lucide-react\";\nimport { latticeApi } from \"@/api/client\";\nimport { ActionButton, DataPanel, EmptyState, EntityList, KeyValueList, ModeGate, OperationResult, StatGrid, StructuredView, Tabs } 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, shortId, titleize } from \"@/lib/utils\";\n\ntype SystemTab = \"account\" | \"workspaces\" | \"snapshots\" | \"activity\" | \"network\" | \"settings\" | \"admin\";\n\nconst tabs: Array<{ id: SystemTab; label: string }> = [\n { id: \"account\", label: \"Account\" },\n { id: \"workspaces\", label: \"Spaces\" },\n { id: \"snapshots\", label: \"Snapshots\" },\n { id: \"activity\", label: \"History\" },\n { id: \"network\", label: \"Devices\" },\n { id: \"settings\", label: \"Preferences\" },\n { id: \"admin\", label: \"Admin Console\" },\n];\n\nexport function SystemPage({ initialTab }: { initialTab?: string }) {\n const mode = useAppStore((state) => state.mode);\n const [tab, setTab] = React.useState<SystemTab>((initialTab as SystemTab) || \"account\");\n React.useEffect(() => {\n if (tabs.some((item) => item.id === initialTab)) setTab(initialTab as SystemTab);\n }, [initialTab]);\n return (\n <div className=\"space-y-5\">\n <header className=\"page-hero\">\n <div className=\"page-kicker\"><ShieldCheck className=\"h-4 w-4\" /> Care</div>\n <h1 className=\"page-title\">Keep your brain safe and portable.</h1>\n <p className=\"page-copy\">Manage identity, spaces, backups, trusted devices, and safeguards from one calm place.</p>\n </header>\n <Tabs tabs={mode === \"basic\" ? tabs.filter((item) => item.id !== \"admin\") : tabs} value={tab} onChange={(id) => setTab(id as SystemTab)} />\n {tab === \"account\" ? <AccountPanel /> : null}\n {tab === \"workspaces\" ? <WorkspacePanel /> : null}\n {tab === \"snapshots\" ? <SnapshotsPanel /> : null}\n {tab === \"activity\" ? <ActivityPanel /> : null}\n {tab === \"network\" ? <NetworkPanel /> : null}\n {tab === \"settings\" ? <SettingsPanel /> : null}\n {tab === \"admin\" ? <AdminPanel /> : null}\n </div>\n );\n}\n\nfunction AccountPanel() {\n const qc = useQueryClient();\n const profile = useQuery({ queryKey: [\"profile\"], queryFn: latticeApi.profile });\n const sso = useQuery({ queryKey: [\"sso\"], queryFn: latticeApi.ssoConfig });\n const [email, setEmail] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n const [name, setName] = React.useState(\"\");\n const [nickname, setNickname] = React.useState(\"\");\n const [newPassword, setNewPassword] = React.useState(\"\");\n const login = useMutation({ mutationFn: () => latticeApi.login(email, password), onSuccess: () => qc.invalidateQueries({ queryKey: [\"profile\"] }) });\n const register = useMutation({ mutationFn: () => latticeApi.register({ email, password, name, nickname }), onSuccess: () => qc.invalidateQueries({ queryKey: [\"profile\"] }) });\n const saveProfile = useMutation({ mutationFn: () => latticeApi.updateProfile({ name, nickname }), onSuccess: () => qc.invalidateQueries({ queryKey: [\"profile\"] }) });\n const changePassword = useMutation({ mutationFn: () => latticeApi.changePassword(password, newPassword) });\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Profile\" result={profile.data}>\n {(data) => <KeyValueList data={data as Record<string, unknown>} />}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><UserCircle className=\"h-4 w-4\" /> Account</CardTitle>\n <CardDescription>Sign in, create a local account, and keep your profile current.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <Input value={email} onChange={(e) => setEmail(e.target.value)} placeholder=\"email\" />\n <Input type=\"password\" value={password} onChange={(e) => setPassword(e.target.value)} placeholder=\"current password\" />\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder=\"name\" />\n <Input value={nickname} onChange={(e) => setNickname(e.target.value)} placeholder=\"nickname\" />\n </div>\n <Input type=\"password\" value={newPassword} onChange={(e) => setNewPassword(e.target.value)} placeholder=\"new password\" />\n <div className=\"flex flex-wrap gap-2\">\n <Button onClick={() => login.mutate()} disabled={!email || !password || login.isPending}>Login</Button>\n <Button variant=\"outline\" onClick={() => register.mutate()} disabled={!email || !password || register.isPending}>Register</Button>\n <Button variant=\"outline\" onClick={() => saveProfile.mutate()} disabled={saveProfile.isPending}>Save profile</Button>\n <Button variant=\"outline\" onClick={() => changePassword.mutate()} disabled={!password || !newPassword || changePassword.isPending}>Change password</Button>\n <ActionButton label=\"Logout\" action={() => latticeApi.logout()} invalidate={[\"profile\"]} />\n </div>\n {[login.data, register.data, saveProfile.data, changePassword.data].filter(Boolean).map((item, i) => (\n <OperationResult key={i} result={item} successLabel=\"Account request completed\" />\n ))}\n </CardContent>\n </Card>\n <DataPanel title=\"Sign-in options\" result={sso.data} className=\"xl:col-span-2\">\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n </div>\n );\n}\n\nfunction WorkspacePanel() {\n const qc = useQueryClient();\n const { setWorkspaceId } = useAppStore();\n const registry = useQuery({ queryKey: [\"workspaceRegistry\"], queryFn: latticeApi.workspaceRegistry });\n const invites = useQuery({ queryKey: [\"invitations\"], queryFn: latticeApi.invitations });\n const [orgName, setOrgName] = React.useState(\"\");\n const [inviteEmail, setInviteEmail] = React.useState(\"\");\n const [inviteToken, setInviteToken] = React.useState(\"\");\n const createOrg = useMutation({ mutationFn: () => latticeApi.createOrg(orgName), onSuccess: () => qc.invalidateQueries({ queryKey: [\"workspaceRegistry\"] }) });\n const createInvite = useMutation({ mutationFn: () => latticeApi.createInvitation({ email: inviteEmail || null, role: \"member\", expires_hours: 168 }), onSuccess: () => qc.invalidateQueries({ queryKey: [\"invitations\"] }) });\n const accept = useMutation({ mutationFn: () => latticeApi.acceptInvitation(inviteToken), onSuccess: () => qc.invalidateQueries({ queryKey: [\"workspaceRegistry\"] }) });\n const workspaces = asArray<Record<string, unknown>>((registry.data?.data as Record<string, unknown>)?.workspaces);\n return (\n <div className=\"grid gap-4 xl:grid-cols-[1.1fr_0.9fr]\">\n <DataPanel title=\"Your workspaces\" result={registry.data}>\n {() => (\n <div className=\"grid gap-2\">\n {workspaces.map((workspace) => {\n const id = String(workspace.workspace_id || workspace.id);\n return (\n <div key={id} className=\"rounded-md border border-border p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div>\n <div className=\"font-medium\">{String(workspace.name || id)}</div>\n <div className=\"text-sm text-muted-foreground\">{String(workspace.type || \"\")} · {String(workspace.your_role || workspace.role || \"\")}</div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" onClick={() => setWorkspaceId(id)}>Use</Button>\n <ActionButton label=\"Activate\" action={() => latticeApi.activateWorkspace(id)} invalidate={[\"workspaceRegistry\"]} />\n <ActionButton label=\"Archive\" action={() => latticeApi.archiveWorkspace(id)} invalidate={[\"workspaceRegistry\"]} variant=\"destructive\" />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Users className=\"h-4 w-4\" /> Organizations and invitations</CardTitle>\n <CardDescription>Create or join a workspace before adding knowledge.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <Input value={orgName} onChange={(e) => setOrgName(e.target.value)} placeholder=\"New organization name\" />\n <Button disabled={!orgName.trim() || createOrg.isPending} onClick={() => createOrg.mutate()}>Create organization</Button>\n <Input value={inviteEmail} onChange={(e) => setInviteEmail(e.target.value)} placeholder=\"invitee email\" />\n <Button variant=\"outline\" disabled={createInvite.isPending} onClick={() => createInvite.mutate()}>Create invitation</Button>\n <Input value={inviteToken} onChange={(e) => setInviteToken(e.target.value)} placeholder=\"invitation token\" />\n <Button variant=\"outline\" disabled={!inviteToken.trim() || accept.isPending} onClick={() => accept.mutate()}>Accept invitation</Button>\n <DataPanel title=\"Invitations\" result={invites.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).invitations} titleKey=\"token\" metaKey=\"role\" />}\n </DataPanel>\n </CardContent>\n </Card>\n </div>\n );\n}\n\nfunction SnapshotsPanel() {\n const snaps = useQuery({ queryKey: [\"snapshots\"], queryFn: latticeApi.snapshots });\n const timeline = useQuery({ queryKey: [\"timeMachine\"], queryFn: latticeApi.timeMachine });\n const [name, setName] = React.useState(\"\");\n const [before, setBefore] = React.useState(\"\");\n const [after, setAfter] = React.useState(\"\");\n const create = useMutation({ mutationFn: () => latticeApi.createSnapshot(name || \"desktop checkpoint\") });\n const compare = useMutation({ mutationFn: () => latticeApi.compareSnapshots(before, after) });\n const rows = asArray<Record<string, unknown>>((snaps.data?.data as Record<string, unknown>)?.snapshots);\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Snapshots\" result={snaps.data}>\n {() => (\n <div className=\"space-y-2\">\n {rows.map((snap) => {\n const id = String(snap.id || snap.snapshot_id);\n return (\n <div key={id} className=\"rounded-md border border-border p-3\">\n <div className=\"font-medium\">{String(snap.name || id)}</div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <ActionButton label=\"Export\" action={() => latticeApi.exportSnapshot(id)} />\n <ActionButton label=\"Merge restore\" action={() => latticeApi.restoreSnapshot(id)} variant=\"outline\" />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle>Snapshot actions</CardTitle>\n <CardDescription>Create checkpoints and compare changes over time.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder=\"snapshot name\" />\n <Button onClick={() => create.mutate()} disabled={create.isPending}>Create snapshot</Button>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <Input value={before} onChange={(e) => setBefore(e.target.value)} placeholder=\"before id\" />\n <Input value={after} onChange={(e) => setAfter(e.target.value)} placeholder=\"after id\" />\n </div>\n <Button variant=\"outline\" onClick={() => compare.mutate()} disabled={!before || !after || compare.isPending}>Compare</Button>\n {compare.data ? <OperationResult result={compare.data} successLabel=\"Snapshot comparison completed\" /> : null}\n </CardContent>\n </Card>\n <DataPanel title=\"Time machine\" result={timeline.data} className=\"xl:col-span-2\">\n {(data) => <EntityList items={(data as Record<string, unknown>).events || data} titleKey=\"event\" metaKey=\"type\" limit={14} />}\n </DataPanel>\n </div>\n );\n}\n\nfunction ActivityPanel() {\n const feed = useQuery({ queryKey: [\"realtimeFeed\"], queryFn: latticeApi.realtimeFeed });\n const presence = useQuery({ queryKey: [\"presence\"], queryFn: latticeApi.presence });\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Realtime feed\" result={feed.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).events} titleKey=\"event_type\" metaKey=\"area\" limit={14} />}\n </DataPanel>\n <DataPanel title=\"Presence\" result={presence.data}>\n {(data) => <PresenceView data={data as Record<string, unknown>} />}\n </DataPanel>\n </div>\n );\n}\n\nfunction NetworkPanel() {\n const qc = useQueryClient();\n const identity = useQuery({ queryKey: [\"networkIdentity\"], queryFn: latticeApi.networkIdentity });\n const peers = useQuery({ queryKey: [\"networkPeers\"], queryFn: latticeApi.networkPeers });\n const [name, setName] = React.useState(\"\");\n const [baseUrl, setBaseUrl] = React.useState(\"\");\n const [publicKey, setPublicKey] = React.useState(\"\");\n const pair = useMutation({\n mutationFn: () => latticeApi.pairPeer({ name, base_url: baseUrl, public_key: publicKey }),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"networkPeers\"] }),\n });\n return (\n <div className=\"grid gap-4 xl:grid-cols-[0.8fr_1.2fr]\">\n <DataPanel title=\"Device identity\" result={identity.data}>\n {(data) => <DeviceIdentityView data={data as Record<string, unknown>} />}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Network className=\"h-4 w-4\" /> Pair device</CardTitle>\n <CardDescription>Pair a trusted device for workspace exchange.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder=\"device name\" />\n <Input value={baseUrl} onChange={(e) => setBaseUrl(e.target.value)} placeholder=\"trusted device address\" />\n <Input value={publicKey} onChange={(e) => setPublicKey(e.target.value)} placeholder=\"trusted public key\" />\n <Button disabled={!name || !baseUrl || !publicKey || pair.isPending} onClick={() => pair.mutate()}>Pair device</Button>\n {pair.data ? <OperationResult result={pair.data} successLabel=\"Peer pairing request completed\" /> : null}\n </CardContent>\n </Card>\n <DataPanel title=\"Peers\" result={peers.data} className=\"xl:col-span-2\">\n {(data) => (\n <div className=\"grid gap-2\">\n {asArray<Record<string, unknown>>((data as Record<string, unknown>).peers).map((peer) => {\n const id = String(peer.peer_id || peer.id);\n return (\n <div key={id} className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border p-3\">\n <div>\n <div className=\"font-medium\">{String(peer.name || id)}</div>\n <div className=\"text-sm text-muted-foreground\">{String(peer.base_url || \"\")}</div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <ActionButton label=\"Push workspace\" action={() => latticeApi.pushPeer(id, useAppStore.getState().workspaceId)} />\n <ActionButton label=\"Unpair\" action={() => latticeApi.unpairPeer(id)} invalidate={[\"networkPeers\"]} variant=\"destructive\" />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n\nfunction SettingsPanel() {\n const qc = useQueryClient();\n const { theme, setTheme, mode, setMode } = useAppStore();\n const health = useQuery({ queryKey: [\"health\"], queryFn: latticeApi.health });\n const sys = useQuery({ queryKey: [\"sysinfo\"], queryFn: latticeApi.sysinfo });\n const comp = useQuery({ queryKey: [\"computerMemory\"], queryFn: latticeApi.computerMemory });\n const storage = useQuery({ queryKey: [\"brainStorage\"], queryFn: latticeApi.brainStorage });\n const backupHealth = useQuery({ queryKey: [\"backupHealth\"], queryFn: latticeApi.backupHealth });\n const [dsn, setDsn] = React.useState(\"\");\n const [schema, setSchema] = React.useState(\"lattice_brain\");\n const [dockerConsent, setDockerConsent] = React.useState(false);\n const [archivePath, setArchivePath] = React.useState(\"\");\n const [restorePath, setRestorePath] = React.useState(\"\");\n const [archivePassphrase, setArchivePassphrase] = React.useState(\"\");\n const [restoreConfirm, setRestoreConfirm] = React.useState(false);\n const [importConfirm, setImportConfirm] = React.useState(false);\n const docker = useMutation({ mutationFn: (consent: boolean) => latticeApi.dockerPostgres({ consent, dry_run: !consent, port: 5432 }) });\n const migration = useMutation({\n mutationFn: () => latticeApi.migratePostgres({ dsn, schema_name: schema || \"lattice_brain\", dry_run: true }),\n });\n const archiveCreate = useMutation({\n mutationFn: () => latticeApi.brainArchive({ path: archivePath.trim() || null, passphrase: archivePassphrase }),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"backupHealth\"] }),\n });\n const archiveInspect = useMutation({\n mutationFn: () => latticeApi.brainArchiveInspect({ path: restorePath, passphrase: archivePassphrase || null }),\n });\n const archiveVerify = useMutation({\n mutationFn: () => latticeApi.brainArchiveVerify({ path: restorePath, passphrase: archivePassphrase }),\n });\n const archiveDryRun = useMutation({\n mutationFn: () => latticeApi.brainArchiveRestore({ path: restorePath, passphrase: archivePassphrase, dry_run: true, confirm: false }),\n });\n const archiveRestore = useMutation({\n mutationFn: () => latticeApi.brainArchiveRestore({ path: restorePath, passphrase: archivePassphrase, dry_run: false, confirm: restoreConfirm }),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [\"brainStorage\"] });\n qc.invalidateQueries({ queryKey: [\"backupHealth\"] });\n },\n });\n const archiveImportDryRun = useMutation({\n mutationFn: () => latticeApi.brainArchiveImport({ path: restorePath, passphrase: archivePassphrase, dry_run: true, confirm: false }),\n });\n const archiveImport = useMutation({\n mutationFn: () => latticeApi.brainArchiveImport({ path: restorePath, passphrase: archivePassphrase, dry_run: false, confirm: importConfirm }),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [\"brainStorage\"] });\n qc.invalidateQueries({ queryKey: [\"backupHealth\"] });\n },\n });\n return (\n <div className=\"grid gap-4 xl:grid-cols-3\">\n <Card>\n <CardHeader>\n <CardTitle>Appearance</CardTitle>\n <CardDescription>Local browser settings only.</CardDescription>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-2\">\n <Button variant={theme === \"dark\" ? \"default\" : \"outline\"} onClick={() => setTheme(\"dark\")}>Dark</Button>\n <Button variant={theme === \"light\" ? \"default\" : \"outline\"} onClick={() => setTheme(\"light\")}>Light</Button>\n {([\"basic\", \"advanced\", \"admin\"] as const).map((item) => (\n <Button key={item} variant={mode === item ? \"default\" : \"outline\"} onClick={() => setMode(item)}>{titleize(item)}</Button>\n ))}\n </CardContent>\n </Card>\n <DataPanel title=\"Server health\" result={health.data}>\n {(data) => <HealthView data={data as Record<string, unknown>} />}\n </DataPanel>\n <DataPanel title={mode === \"basic\" ? \"Computer readiness\" : \"Host telemetry\"} result={sys.data}>\n {(data) => mode === \"basic\" ? (\n <StatGrid stats={[\n { label: \"CPU\", value: `${String((data as Record<string, unknown>).cpu_pct || \"0\")}%` },\n { label: \"Memory\", value: `${String((data as Record<string, unknown>).ram_pct || \"0\")}%` },\n { label: \"GPU memory\", value: `${String((data as Record<string, unknown>).gpu_mem_pct || \"0\")}%` },\n { label: \"Local status\", value: \"ready\" },\n ]} />\n ) : <StructuredView value={data} />}\n </DataPanel>\n <DataPanel title=\"Brain storage\" result={storage.data} className=\"xl:col-span-3\">\n {(data) => <StorageView data={data as Record<string, unknown>} />}\n </DataPanel>\n <DataPanel title=\"Backup health\" result={backupHealth.data} className=\"xl:col-span-3\">\n {(data) => <BackupHealthView data={data as Record<string, unknown>} />}\n </DataPanel>\n <Card className=\"xl:col-span-3\">\n <CardHeader>\n <CardTitle>.latticebrain portability</CardTitle>\n <CardDescription>Create an encrypted portable brain file, verify one, or preview a restore before applying it.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <div className=\"grid gap-2 sm:grid-cols-[1fr_1fr]\">\n <Input value={archivePath} onChange={(e) => setArchivePath(e.target.value)} placeholder=\"export path (optional)\" />\n <Input value={restorePath} onChange={(e) => setRestorePath(e.target.value)} placeholder=\"archive path for inspect/restore\" />\n </div>\n <Input type=\"password\" value={archivePassphrase} onChange={(e) => setArchivePassphrase(e.target.value)} placeholder=\"archive passphrase\" />\n <div className=\"flex flex-wrap gap-2\">\n <Button onClick={() => archiveCreate.mutate()} disabled={!archivePassphrase || archiveCreate.isPending}>Export archive</Button>\n <Button variant=\"outline\" onClick={() => archiveInspect.mutate()} disabled={!restorePath || archiveInspect.isPending}>Inspect</Button>\n <Button variant=\"outline\" onClick={() => archiveVerify.mutate()} disabled={!restorePath || !archivePassphrase || archiveVerify.isPending}>Verify</Button>\n <Button variant=\"outline\" onClick={() => archiveDryRun.mutate()} disabled={!restorePath || !archivePassphrase || archiveDryRun.isPending}>Restore dry run</Button>\n <Button variant=\"outline\" onClick={() => archiveImportDryRun.mutate()} disabled={!restorePath || !archivePassphrase || archiveImportDryRun.isPending}>Import dry run</Button>\n <label className=\"flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm\">\n <input type=\"checkbox\" checked={restoreConfirm} onChange={(e) => setRestoreConfirm(e.target.checked)} />\n Confirm restore\n </label>\n <Button variant=\"destructive\" onClick={() => archiveRestore.mutate()} disabled={!restorePath || !archivePassphrase || !restoreConfirm || archiveRestore.isPending}>Restore</Button>\n <label className=\"flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm\">\n <input type=\"checkbox\" checked={importConfirm} onChange={(e) => setImportConfirm(e.target.checked)} />\n Confirm import\n </label>\n <Button variant=\"outline\" onClick={() => archiveImport.mutate()} disabled={!restorePath || !archivePassphrase || !importConfirm || archiveImport.isPending}>Import</Button>\n </div>\n {[archiveCreate.data, archiveInspect.data, archiveVerify.data, archiveDryRun.data, archiveRestore.data, archiveImportDryRun.data, archiveImport.data].filter(Boolean).map((item, i) => (\n <OperationResult key={i} result={item} successLabel=\"Archive request completed\" />\n ))}\n </CardContent>\n </Card>\n {mode !== \"basic\" ? <Card className=\"xl:col-span-3\">\n <CardHeader>\n <CardTitle>Scale mode</CardTitle>\n <CardDescription>Optional advanced storage. Local SQLite remains the default.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <div className=\"grid gap-2 sm:grid-cols-[1fr_220px]\">\n <Input value={dsn} onChange={(e) => setDsn(e.target.value)} placeholder=\"Postgres connection string\" />\n <Input value={schema} onChange={(e) => setSchema(e.target.value)} placeholder=\"database schema\" />\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" onClick={() => docker.mutate(false)} disabled={docker.isPending}>Docker plan</Button>\n <label className=\"flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm\">\n <input type=\"checkbox\" checked={dockerConsent} onChange={(e) => setDockerConsent(e.target.checked)} />\n Consent to start Docker\n </label>\n <Button onClick={() => docker.mutate(true)} disabled={!dockerConsent || docker.isPending}>Start Docker</Button>\n <Button variant=\"outline\" onClick={() => migration.mutate()} disabled={!dsn || migration.isPending}>Plan migration</Button>\n </div>\n {docker.data ? <OperationResult result={docker.data} successLabel=\"Docker setup request completed\" /> : null}\n {migration.data ? <OperationResult result={migration.data} successLabel=\"Migration plan completed\" /> : null}\n </CardContent>\n </Card> : null}\n <DataPanel title=\"Computer memory\" result={comp.data} className=\"xl:col-span-3\">\n {(data) => (\n <div className=\"space-y-3\">\n <StructuredView value={data} />\n <div className=\"flex gap-2\">\n <ActionButton label=\"Enable memory\" action={() => latticeApi.setComputerMemory(true)} invalidate={[\"computerMemory\"]} />\n <ActionButton label=\"Disable memory\" action={() => latticeApi.setComputerMemory(false)} invalidate={[\"computerMemory\"]} variant=\"destructive\" />\n </div>\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction textValue(value: unknown, fallback = \"not reported\") {\n if (value === null || value === undefined || value === \"\") return fallback;\n if (typeof value === \"boolean\") return value ? \"enabled\" : \"disabled\";\n return String(value);\n}\n\nfunction PresenceView({ data }: { data: Record<string, unknown> }) {\n const rows = asArray<Record<string, unknown>>(data.presence || data.clients || data);\n if (!rows.length) return <EmptyState title=\"No active presence\" detail=\"No live collaborators or realtime clients are currently reported.\" />;\n return <EntityList items={rows} titleKey=\"user\" metaKey=\"workspace_id\" />;\n}\n\nfunction DeviceIdentityView({ data }: { data: Record<string, unknown> }) {\n const mode = useAppStore((state) => state.mode);\n const publicKey = textValue(data.public_key, \"\");\n if (mode === \"basic\") {\n return (\n <div className=\"space-y-3\">\n <StatusCard title=\"This Mac\" status=\"trusted\" detail=\"This device can participate in local workspace exchange when you pair another trusted device.\" />\n <Badge variant=\"muted\">{textValue(data.algorithm, \"local identity\")}</Badge>\n </div>\n );\n }\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"success\">local device</Badge>\n <Badge variant=\"muted\">{textValue(data.algorithm, \"identity key\")}</Badge>\n </div>\n <KeyValueList data={{\n device_id: data.device_id || data.id || \"not reported\",\n fingerprint: data.fingerprint || \"not reported\",\n public_key: publicKey ? shortId(publicKey.replace(/\\s+/g, \" \"), 72) : \"not reported\",\n }} />\n </div>\n );\n}\n\nfunction HealthView({ data }: { data: Record<string, unknown> }) {\n const mode = useAppStore((state) => state.mode);\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Status\", value: data.status || data.ok || \"reported\" },\n { label: \"Version\", value: data.version || \"not reported\" },\n { label: \"Mode\", value: data.mode || data.environment || \"local\" },\n ...(mode === \"basic\" ? [] : [{ label: \"Port\", value: data.port || data.backend_port || \"configured\" }]),\n ]} />\n {mode === \"basic\" ? null : <StructuredView value={data} />}\n </div>\n );\n}\n\nfunction StorageView({ data }: { data: Record<string, unknown> }) {\n const active = isRecord(data.active) ? data.active : data;\n const postgres = isRecord(data.postgres) ? data.postgres : {};\n const backup = isRecord(data.backup_health) ? data.backup_health : {};\n const vector = active.vector_search || active.vector || data.vector_search || data.sqlite_vec;\n const postgresAvailable = Boolean(postgres.available || postgres.connected || postgres.enabled);\n return (\n <div className=\"space-y-4\">\n <StatGrid stats={[\n { label: \"Active engine\", value: active.engine || data.engine || \"sqlite\" },\n { label: \"SQLite default\", value: active.engine === \"postgres\" ? \"scale mode\" : \"enabled\" },\n { label: \"Vector search\", value: vector || \"not reported\" },\n { label: \"Postgres\", value: postgresAvailable ? \"available\" : \"optional\" },\n ]} />\n <div className=\"grid gap-3 md:grid-cols-3\">\n <StatusCard title=\"SQLite\" status={active.available === false ? \"unavailable\" : \"default\"} detail={textValue(active.reason || active.path || data.path, \"Local brain storage is active by default.\")} />\n <StatusCard title=\"Vector search\" status={textValue(vector, \"reported\")} detail={textValue(active.vector_reason || active.sqlite_vec_reason || data.vector_reason, \"Uses the configured local vector capability or reports why it is unavailable.\")} />\n <StatusCard title=\"Postgres\" status={postgresAvailable ? \"available\" : \"not enabled\"} detail={textValue(postgres.reason || postgres.dsn || postgres.status, \"Postgres scale mode is opt-in and never required for local use.\")} />\n </div>\n {Object.keys(backup).length ? <StructuredView value={{ backup_health: backup }} /> : null}\n </div>\n );\n}\n\nfunction BackupHealthView({ data }: { data: Record<string, unknown> }) {\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Available\", value: data.available === false ? \"no\" : \"yes\" },\n { label: \"Backups\", value: data.count || data.backups || 0 },\n { label: \"Encrypted\", value: data.encrypted_archives || 0 },\n { label: \"Zip backups\", value: data.zip_backups || 0 },\n ]} />\n <KeyValueList data={{\n directory: data.directory || \"not reported\",\n latest: data.latest || \"none reported\",\n last_verified: data.last_verified || data.verified_at || \"not reported\",\n failure: data.error || data.reason || \"none reported\",\n }} />\n </div>\n );\n}\n\nfunction StatusCard({ title, status, detail }: { title: string; status: string; detail: string }) {\n const variant = /unavailable|failed|denied|disabled|not enabled/i.test(status) ? \"warning\" : \"success\";\n return (\n <div className=\"rounded-md border border-border bg-background p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"font-medium\">{title}</div>\n <Badge variant={variant}>{status}</Badge>\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">{detail}</p>\n </div>\n );\n}\n\nfunction HardeningView({ data }: { data: Record<string, unknown> }) {\n const startup = isRecord(data.startup) ? data.startup : {};\n const privacy = isRecord(data.privacy) ? data.privacy : {};\n const storage = isRecord(data.storage) ? data.storage : {};\n const backup = isRecord(data.backup) ? data.backup : {};\n const identity = isRecord(data.device_identity) ? data.device_identity : {};\n const permissions = isRecord(data.permissions) ? data.permissions : {};\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Version\", value: data.version || \"reported\" },\n { label: \"Local only\", value: privacy.local_only_default ?? startup.local_only_default ?? \"reported\" },\n { label: \"Storage\", value: isRecord(storage.active) ? (storage.active as Record<string, unknown>).engine : \"reported\" },\n { label: \"Backups\", value: backup.count || backup.available || \"reported\" },\n ]} />\n <div className=\"grid gap-3 md:grid-cols-2\">\n <StatusCard title=\"Startup\" status={startup.network_exposed ? \"network exposed\" : \"local-only\"} detail=\"Lattice starts locally by default and reports when network access is enabled.\" />\n <StatusCard title=\"Integrations\" status={privacy.local_only_default === false ? \"review required\" : \"opt-in\"} detail=\"External integrations remain disabled until the user explicitly enables them.\" />\n <StatusCard title=\"Device identity\" status={textValue(identity.algorithm || identity.fingerprint, \"reported\")} detail={textValue(identity.storage, \"Stored locally and used for signed bundle exchange.\")} />\n <StatusCard title=\"Permissions\" status={permissions.destructive_restore_requires_confirmation === false ? \"review required\" : \"guarded\"} detail=\"Export, import, and destructive restore permissions are surfaced through admin status.\" />\n </div>\n </div>\n );\n}\n\nfunction SecurityView({ data }: { data: Record<string, unknown> }) {\n const cards = isRecord(data.cards) ? data.cards : {};\n const severities = isRecord(data.severity_counts) ? data.severity_counts : {};\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Events today\", value: cards.events_today || 0 },\n { label: \"High risk\", value: cards.high_risk_events || severities.high || 0 },\n { label: \"Review\", value: cards.review_required || 0 },\n { label: \"Risk rate\", value: data.risk_rate || 0 },\n ]} />\n <StructuredView value={{ severity_counts: severities, sensitive_fields: data.field_counts || {} }} />\n </div>\n );\n}\n\nfunction AdminPanel() {\n const mode = useAppStore((state) => state.mode);\n const summary = useQuery({ queryKey: [\"adminSummary\"], queryFn: latticeApi.adminSummary });\n const users = useQuery({ queryKey: [\"adminUsers\"], queryFn: latticeApi.adminUsers });\n const audit = useQuery({ queryKey: [\"adminAudit\"], queryFn: () => latticeApi.adminAudit() });\n const roles = useQuery({ queryKey: [\"adminRoles\"], queryFn: latticeApi.adminRoles });\n const policies = useQuery({ queryKey: [\"adminPolicies\"], queryFn: latticeApi.adminPolicies });\n const hardening = useQuery({ queryKey: [\"adminProductHardening\"], queryFn: latticeApi.adminProductHardening });\n const security = useQuery({ queryKey: [\"adminSecurity\"], queryFn: latticeApi.adminSecurity });\n const vpc = useQuery({ queryKey: [\"vpcStatus\"], queryFn: latticeApi.vpcStatus });\n if (mode !== \"admin\") {\n return <ModeGate title=\"Admin controls\" detail=\"Switch to Admin mode to review users, audit events, policies, security posture, and private networking diagnostics.\" target=\"admin\" />;\n }\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Admin summary\" result={summary.data}>{(data) => <KeyValueList data={data as Record<string, unknown>} />}</DataPanel>\n <DataPanel title=\"Users\" result={users.data}>{(data) => <EntityList items={data} titleKey=\"email\" metaKey=\"role\" />}</DataPanel>\n <DataPanel title=\"Audit\" result={audit.data}>{(data) => <EntityList items={(data as Record<string, unknown>).recent_events || data} titleKey=\"act\" metaKey=\"sev\" />}</DataPanel>\n <DataPanel title=\"Roles\" result={roles.data}>{(data) => <EntityList items={(data as Record<string, unknown>).roles || data} titleKey=\"role\" metaKey=\"members\" />}</DataPanel>\n <DataPanel title=\"Policies\" result={policies.data}>{(data) => <EntityList items={(data as Record<string, unknown>).policies || data} titleKey=\"label\" metaKey=\"enforced\" />}</DataPanel>\n <DataPanel title=\"Product hardening\" result={hardening.data}>{(data) => <HardeningView data={data as Record<string, unknown>} />}</DataPanel>\n <DataPanel title=\"Security overview\" result={security.data}>{(data) => <SecurityView data={data as Record<string, unknown>} />}</DataPanel>\n <DataPanel title=\"Private VPC\" result={vpc.data} className=\"xl:col-span-2\">\n {(data) => (\n <div className=\"space-y-2\">\n <Badge variant=\"muted\">Community-disabled features remain honest unavailable states.</Badge>\n <StructuredView value={data} />\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"System-Da-Kxwiz.js","names":[],"sources":["../../../node_modules/lucide-react/dist/esm/icons/network.mjs","../../../frontend/src/pages/System.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 [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n];\nconst Network = createLucideIcon(\"network\", __iconNode);\n\nexport { __iconNode, Network as default };\n//# sourceMappingURL=network.mjs.map\n","import * as React from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Network, ShieldCheck, UserCircle, Users } from \"lucide-react\";\nimport { latticeApi } from \"@/api/client\";\nimport { ActionButton, DataPanel, EmptyState, EntityList, KeyValueList, ModeGate, OperationResult, StatGrid, StructuredView, Tabs } 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, shortId, titleize } from \"@/lib/utils\";\n\ntype SystemTab = \"account\" | \"workspaces\" | \"snapshots\" | \"activity\" | \"network\" | \"settings\" | \"admin\";\n\nconst tabs: Array<{ id: SystemTab; label: string }> = [\n { id: \"account\", label: \"Account\" },\n { id: \"workspaces\", label: \"Spaces\" },\n { id: \"snapshots\", label: \"Snapshots\" },\n { id: \"activity\", label: \"History\" },\n { id: \"network\", label: \"Devices\" },\n { id: \"settings\", label: \"Preferences\" },\n { id: \"admin\", label: \"Admin Console\" },\n];\n\nexport function SystemPage({ initialTab }: { initialTab?: string }) {\n const mode = useAppStore((state) => state.mode);\n const [tab, setTab] = React.useState<SystemTab>((initialTab as SystemTab) || \"account\");\n React.useEffect(() => {\n if (tabs.some((item) => item.id === initialTab)) setTab(initialTab as SystemTab);\n }, [initialTab]);\n return (\n <div className=\"space-y-5\">\n <header className=\"page-hero\">\n <div className=\"page-kicker\"><ShieldCheck className=\"h-4 w-4\" /> Care</div>\n <h1 className=\"page-title\">Keep your brain safe and portable.</h1>\n <p className=\"page-copy\">Manage identity, spaces, backups, trusted devices, and safeguards from one calm place.</p>\n </header>\n <Tabs tabs={mode === \"basic\" ? tabs.filter((item) => item.id !== \"admin\") : tabs} value={tab} onChange={(id) => setTab(id as SystemTab)} />\n {tab === \"account\" ? <AccountPanel /> : null}\n {tab === \"workspaces\" ? <WorkspacePanel /> : null}\n {tab === \"snapshots\" ? <SnapshotsPanel /> : null}\n {tab === \"activity\" ? <ActivityPanel /> : null}\n {tab === \"network\" ? <NetworkPanel /> : null}\n {tab === \"settings\" ? <SettingsPanel /> : null}\n {tab === \"admin\" ? <AdminPanel /> : null}\n </div>\n );\n}\n\nfunction AccountPanel() {\n const qc = useQueryClient();\n const profile = useQuery({ queryKey: [\"profile\"], queryFn: latticeApi.profile });\n const sso = useQuery({ queryKey: [\"sso\"], queryFn: latticeApi.ssoConfig });\n const [email, setEmail] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n const [name, setName] = React.useState(\"\");\n const [nickname, setNickname] = React.useState(\"\");\n const [newPassword, setNewPassword] = React.useState(\"\");\n const login = useMutation({ mutationFn: () => latticeApi.login(email, password), onSuccess: () => qc.invalidateQueries({ queryKey: [\"profile\"] }) });\n const register = useMutation({ mutationFn: () => latticeApi.register({ email, password, name, nickname }), onSuccess: () => qc.invalidateQueries({ queryKey: [\"profile\"] }) });\n const saveProfile = useMutation({ mutationFn: () => latticeApi.updateProfile({ name, nickname }), onSuccess: () => qc.invalidateQueries({ queryKey: [\"profile\"] }) });\n const changePassword = useMutation({ mutationFn: () => latticeApi.changePassword(password, newPassword) });\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Profile\" result={profile.data}>\n {(data) => <KeyValueList data={data as Record<string, unknown>} />}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><UserCircle className=\"h-4 w-4\" /> Account</CardTitle>\n <CardDescription>Sign in, create a local account, and keep your profile current.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <Input value={email} onChange={(e) => setEmail(e.target.value)} placeholder=\"email\" />\n <Input type=\"password\" value={password} onChange={(e) => setPassword(e.target.value)} placeholder=\"current password\" />\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder=\"name\" />\n <Input value={nickname} onChange={(e) => setNickname(e.target.value)} placeholder=\"nickname\" />\n </div>\n <Input type=\"password\" value={newPassword} onChange={(e) => setNewPassword(e.target.value)} placeholder=\"new password\" />\n <div className=\"flex flex-wrap gap-2\">\n <Button onClick={() => login.mutate()} disabled={!email || !password || login.isPending}>Login</Button>\n <Button variant=\"outline\" onClick={() => register.mutate()} disabled={!email || !password || register.isPending}>Register</Button>\n <Button variant=\"outline\" onClick={() => saveProfile.mutate()} disabled={saveProfile.isPending}>Save profile</Button>\n <Button variant=\"outline\" onClick={() => changePassword.mutate()} disabled={!password || !newPassword || changePassword.isPending}>Change password</Button>\n <ActionButton label=\"Logout\" action={() => latticeApi.logout()} invalidate={[\"profile\"]} />\n </div>\n {[login.data, register.data, saveProfile.data, changePassword.data].filter(Boolean).map((item, i) => (\n <OperationResult key={i} result={item} successLabel=\"Account request completed\" />\n ))}\n </CardContent>\n </Card>\n <DataPanel title=\"Sign-in options\" result={sso.data} className=\"xl:col-span-2\">\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n </div>\n );\n}\n\nfunction WorkspacePanel() {\n const qc = useQueryClient();\n const { setWorkspaceId } = useAppStore();\n const registry = useQuery({ queryKey: [\"workspaceRegistry\"], queryFn: latticeApi.workspaceRegistry });\n const invites = useQuery({ queryKey: [\"invitations\"], queryFn: latticeApi.invitations });\n const [orgName, setOrgName] = React.useState(\"\");\n const [inviteEmail, setInviteEmail] = React.useState(\"\");\n const [inviteToken, setInviteToken] = React.useState(\"\");\n const createOrg = useMutation({ mutationFn: () => latticeApi.createOrg(orgName), onSuccess: () => qc.invalidateQueries({ queryKey: [\"workspaceRegistry\"] }) });\n const createInvite = useMutation({ mutationFn: () => latticeApi.createInvitation({ email: inviteEmail || null, role: \"member\", expires_hours: 168 }), onSuccess: () => qc.invalidateQueries({ queryKey: [\"invitations\"] }) });\n const accept = useMutation({ mutationFn: () => latticeApi.acceptInvitation(inviteToken), onSuccess: () => qc.invalidateQueries({ queryKey: [\"workspaceRegistry\"] }) });\n const workspaces = asArray<Record<string, unknown>>((registry.data?.data as Record<string, unknown>)?.workspaces);\n return (\n <div className=\"grid gap-4 xl:grid-cols-[1.1fr_0.9fr]\">\n <DataPanel title=\"Your workspaces\" result={registry.data}>\n {() => (\n <div className=\"grid gap-2\">\n {workspaces.map((workspace) => {\n const id = String(workspace.workspace_id || workspace.id);\n return (\n <div key={id} className=\"rounded-md border border-border p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div>\n <div className=\"font-medium\">{String(workspace.name || id)}</div>\n <div className=\"text-sm text-muted-foreground\">{String(workspace.type || \"\")} · {String(workspace.your_role || workspace.role || \"\")}</div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" onClick={() => setWorkspaceId(id)}>Use</Button>\n <ActionButton label=\"Activate\" action={() => latticeApi.activateWorkspace(id)} invalidate={[\"workspaceRegistry\"]} />\n <ActionButton label=\"Archive\" action={() => latticeApi.archiveWorkspace(id)} invalidate={[\"workspaceRegistry\"]} variant=\"destructive\" />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Users className=\"h-4 w-4\" /> Organizations and invitations</CardTitle>\n <CardDescription>Create or join a workspace before adding knowledge.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <Input value={orgName} onChange={(e) => setOrgName(e.target.value)} placeholder=\"New organization name\" />\n <Button disabled={!orgName.trim() || createOrg.isPending} onClick={() => createOrg.mutate()}>Create organization</Button>\n <Input value={inviteEmail} onChange={(e) => setInviteEmail(e.target.value)} placeholder=\"invitee email\" />\n <Button variant=\"outline\" disabled={createInvite.isPending} onClick={() => createInvite.mutate()}>Create invitation</Button>\n <Input value={inviteToken} onChange={(e) => setInviteToken(e.target.value)} placeholder=\"invitation token\" />\n <Button variant=\"outline\" disabled={!inviteToken.trim() || accept.isPending} onClick={() => accept.mutate()}>Accept invitation</Button>\n <DataPanel title=\"Invitations\" result={invites.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).invitations} titleKey=\"token\" metaKey=\"role\" />}\n </DataPanel>\n </CardContent>\n </Card>\n </div>\n );\n}\n\nfunction SnapshotsPanel() {\n const snaps = useQuery({ queryKey: [\"snapshots\"], queryFn: latticeApi.snapshots });\n const timeline = useQuery({ queryKey: [\"timeMachine\"], queryFn: latticeApi.timeMachine });\n const [name, setName] = React.useState(\"\");\n const [before, setBefore] = React.useState(\"\");\n const [after, setAfter] = React.useState(\"\");\n const create = useMutation({ mutationFn: () => latticeApi.createSnapshot(name || \"desktop checkpoint\") });\n const compare = useMutation({ mutationFn: () => latticeApi.compareSnapshots(before, after) });\n const rows = asArray<Record<string, unknown>>((snaps.data?.data as Record<string, unknown>)?.snapshots);\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Snapshots\" result={snaps.data}>\n {() => (\n <div className=\"space-y-2\">\n {rows.map((snap) => {\n const id = String(snap.id || snap.snapshot_id);\n return (\n <div key={id} className=\"rounded-md border border-border p-3\">\n <div className=\"font-medium\">{String(snap.name || id)}</div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <ActionButton label=\"Export\" action={() => latticeApi.exportSnapshot(id)} />\n <ActionButton label=\"Merge restore\" action={() => latticeApi.restoreSnapshot(id)} variant=\"outline\" />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle>Snapshot actions</CardTitle>\n <CardDescription>Create checkpoints and compare changes over time.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder=\"snapshot name\" />\n <Button onClick={() => create.mutate()} disabled={create.isPending}>Create snapshot</Button>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <Input value={before} onChange={(e) => setBefore(e.target.value)} placeholder=\"before id\" />\n <Input value={after} onChange={(e) => setAfter(e.target.value)} placeholder=\"after id\" />\n </div>\n <Button variant=\"outline\" onClick={() => compare.mutate()} disabled={!before || !after || compare.isPending}>Compare</Button>\n {compare.data ? <OperationResult result={compare.data} successLabel=\"Snapshot comparison completed\" /> : null}\n </CardContent>\n </Card>\n <DataPanel title=\"Time machine\" result={timeline.data} className=\"xl:col-span-2\">\n {(data) => <EntityList items={(data as Record<string, unknown>).events || data} titleKey=\"event\" metaKey=\"type\" limit={14} />}\n </DataPanel>\n </div>\n );\n}\n\nfunction ActivityPanel() {\n const feed = useQuery({ queryKey: [\"realtimeFeed\"], queryFn: latticeApi.realtimeFeed });\n const presence = useQuery({ queryKey: [\"presence\"], queryFn: latticeApi.presence });\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Realtime feed\" result={feed.data}>\n {(data) => <EntityList items={(data as Record<string, unknown>).events} titleKey=\"event_type\" metaKey=\"area\" limit={14} />}\n </DataPanel>\n <DataPanel title=\"Presence\" result={presence.data}>\n {(data) => <PresenceView data={data as Record<string, unknown>} />}\n </DataPanel>\n </div>\n );\n}\n\nfunction NetworkPanel() {\n const qc = useQueryClient();\n const identity = useQuery({ queryKey: [\"networkIdentity\"], queryFn: latticeApi.networkIdentity });\n const peers = useQuery({ queryKey: [\"networkPeers\"], queryFn: latticeApi.networkPeers });\n const [name, setName] = React.useState(\"\");\n const [baseUrl, setBaseUrl] = React.useState(\"\");\n const [publicKey, setPublicKey] = React.useState(\"\");\n const pair = useMutation({\n mutationFn: () => latticeApi.pairPeer({ name, base_url: baseUrl, public_key: publicKey }),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"networkPeers\"] }),\n });\n return (\n <div className=\"grid gap-4 xl:grid-cols-[0.8fr_1.2fr]\">\n <DataPanel title=\"Device identity\" result={identity.data}>\n {(data) => <DeviceIdentityView data={data as Record<string, unknown>} />}\n </DataPanel>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Network className=\"h-4 w-4\" /> Pair device</CardTitle>\n <CardDescription>Pair a trusted device for workspace exchange.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder=\"device name\" />\n <Input value={baseUrl} onChange={(e) => setBaseUrl(e.target.value)} placeholder=\"trusted device address\" />\n <Input value={publicKey} onChange={(e) => setPublicKey(e.target.value)} placeholder=\"trusted public key\" />\n <Button disabled={!name || !baseUrl || !publicKey || pair.isPending} onClick={() => pair.mutate()}>Pair device</Button>\n {pair.data ? <OperationResult result={pair.data} successLabel=\"Peer pairing request completed\" /> : null}\n </CardContent>\n </Card>\n <DataPanel title=\"Peers\" result={peers.data} className=\"xl:col-span-2\">\n {(data) => (\n <div className=\"grid gap-2\">\n {asArray<Record<string, unknown>>((data as Record<string, unknown>).peers).map((peer) => {\n const id = String(peer.peer_id || peer.id);\n return (\n <div key={id} className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border p-3\">\n <div>\n <div className=\"font-medium\">{String(peer.name || id)}</div>\n <div className=\"text-sm text-muted-foreground\">{String(peer.base_url || \"\")}</div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <ActionButton label=\"Push workspace\" action={() => latticeApi.pushPeer(id, useAppStore.getState().workspaceId)} />\n <ActionButton label=\"Unpair\" action={() => latticeApi.unpairPeer(id)} invalidate={[\"networkPeers\"]} variant=\"destructive\" />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n\nfunction SettingsPanel() {\n const qc = useQueryClient();\n const { theme, setTheme, mode, setMode } = useAppStore();\n const health = useQuery({ queryKey: [\"health\"], queryFn: latticeApi.health });\n const sys = useQuery({ queryKey: [\"sysinfo\"], queryFn: latticeApi.sysinfo });\n const comp = useQuery({ queryKey: [\"computerMemory\"], queryFn: latticeApi.computerMemory });\n const storage = useQuery({ queryKey: [\"brainStorage\"], queryFn: latticeApi.brainStorage });\n const backupHealth = useQuery({ queryKey: [\"backupHealth\"], queryFn: latticeApi.backupHealth });\n const [dsn, setDsn] = React.useState(\"\");\n const [schema, setSchema] = React.useState(\"lattice_brain\");\n const [dockerConsent, setDockerConsent] = React.useState(false);\n const [archivePath, setArchivePath] = React.useState(\"\");\n const [restorePath, setRestorePath] = React.useState(\"\");\n const [archivePassphrase, setArchivePassphrase] = React.useState(\"\");\n const [restoreConfirm, setRestoreConfirm] = React.useState(false);\n const [importConfirm, setImportConfirm] = React.useState(false);\n const docker = useMutation({ mutationFn: (consent: boolean) => latticeApi.dockerPostgres({ consent, dry_run: !consent, port: 5432 }) });\n const migration = useMutation({\n mutationFn: () => latticeApi.migratePostgres({ dsn, schema_name: schema || \"lattice_brain\", dry_run: true }),\n });\n const archiveCreate = useMutation({\n mutationFn: () => latticeApi.brainArchive({ path: archivePath.trim() || null, passphrase: archivePassphrase }),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"backupHealth\"] }),\n });\n const archiveInspect = useMutation({\n mutationFn: () => latticeApi.brainArchiveInspect({ path: restorePath, passphrase: archivePassphrase || null }),\n });\n const archiveVerify = useMutation({\n mutationFn: () => latticeApi.brainArchiveVerify({ path: restorePath, passphrase: archivePassphrase }),\n });\n const archiveDryRun = useMutation({\n mutationFn: () => latticeApi.brainArchiveRestore({ path: restorePath, passphrase: archivePassphrase, dry_run: true, confirm: false }),\n });\n const archiveRestore = useMutation({\n mutationFn: () => latticeApi.brainArchiveRestore({ path: restorePath, passphrase: archivePassphrase, dry_run: false, confirm: restoreConfirm }),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [\"brainStorage\"] });\n qc.invalidateQueries({ queryKey: [\"backupHealth\"] });\n },\n });\n const archiveImportDryRun = useMutation({\n mutationFn: () => latticeApi.brainArchiveImport({ path: restorePath, passphrase: archivePassphrase, dry_run: true, confirm: false }),\n });\n const archiveImport = useMutation({\n mutationFn: () => latticeApi.brainArchiveImport({ path: restorePath, passphrase: archivePassphrase, dry_run: false, confirm: importConfirm }),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [\"brainStorage\"] });\n qc.invalidateQueries({ queryKey: [\"backupHealth\"] });\n },\n });\n return (\n <div className=\"grid gap-4 xl:grid-cols-3\">\n <Card>\n <CardHeader>\n <CardTitle>Appearance</CardTitle>\n <CardDescription>Local browser settings only.</CardDescription>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-2\">\n <Button variant={theme === \"dark\" ? \"default\" : \"outline\"} onClick={() => setTheme(\"dark\")}>Dark</Button>\n <Button variant={theme === \"light\" ? \"default\" : \"outline\"} onClick={() => setTheme(\"light\")}>Light</Button>\n {([\"basic\", \"advanced\", \"admin\"] as const).map((item) => (\n <Button key={item} variant={mode === item ? \"default\" : \"outline\"} onClick={() => setMode(item)}>{titleize(item)}</Button>\n ))}\n </CardContent>\n </Card>\n <DataPanel title=\"Server health\" result={health.data}>\n {(data) => <HealthView data={data as Record<string, unknown>} />}\n </DataPanel>\n <DataPanel title={mode === \"basic\" ? \"Computer readiness\" : \"Host telemetry\"} result={sys.data}>\n {(data) => mode === \"basic\" ? (\n <StatGrid stats={[\n { label: \"CPU\", value: `${String((data as Record<string, unknown>).cpu_pct || \"0\")}%` },\n { label: \"Memory\", value: `${String((data as Record<string, unknown>).ram_pct || \"0\")}%` },\n { label: \"GPU memory\", value: `${String((data as Record<string, unknown>).gpu_mem_pct || \"0\")}%` },\n { label: \"Local status\", value: \"ready\" },\n ]} />\n ) : <StructuredView value={data} />}\n </DataPanel>\n <DataPanel title=\"Brain storage\" result={storage.data} className=\"xl:col-span-3\">\n {(data) => <StorageView data={data as Record<string, unknown>} />}\n </DataPanel>\n <DataPanel title=\"Backup health\" result={backupHealth.data} className=\"xl:col-span-3\">\n {(data) => <BackupHealthView data={data as Record<string, unknown>} />}\n </DataPanel>\n <Card className=\"xl:col-span-3\">\n <CardHeader>\n <CardTitle>.latticebrain portability</CardTitle>\n <CardDescription>Create an encrypted portable brain file, verify one, or preview a restore before applying it.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <div className=\"grid gap-2 sm:grid-cols-[1fr_1fr]\">\n <Input value={archivePath} onChange={(e) => setArchivePath(e.target.value)} placeholder=\"export path (optional)\" />\n <Input value={restorePath} onChange={(e) => setRestorePath(e.target.value)} placeholder=\"archive path for inspect/restore\" />\n </div>\n <Input type=\"password\" value={archivePassphrase} onChange={(e) => setArchivePassphrase(e.target.value)} placeholder=\"archive passphrase\" />\n <div className=\"flex flex-wrap gap-2\">\n <Button onClick={() => archiveCreate.mutate()} disabled={!archivePassphrase || archiveCreate.isPending}>Export archive</Button>\n <Button variant=\"outline\" onClick={() => archiveInspect.mutate()} disabled={!restorePath || archiveInspect.isPending}>Inspect</Button>\n <Button variant=\"outline\" onClick={() => archiveVerify.mutate()} disabled={!restorePath || !archivePassphrase || archiveVerify.isPending}>Verify</Button>\n <Button variant=\"outline\" onClick={() => archiveDryRun.mutate()} disabled={!restorePath || !archivePassphrase || archiveDryRun.isPending}>Restore dry run</Button>\n <Button variant=\"outline\" onClick={() => archiveImportDryRun.mutate()} disabled={!restorePath || !archivePassphrase || archiveImportDryRun.isPending}>Import dry run</Button>\n <label className=\"flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm\">\n <input type=\"checkbox\" checked={restoreConfirm} onChange={(e) => setRestoreConfirm(e.target.checked)} />\n Confirm restore\n </label>\n <Button variant=\"destructive\" onClick={() => archiveRestore.mutate()} disabled={!restorePath || !archivePassphrase || !restoreConfirm || archiveRestore.isPending}>Restore</Button>\n <label className=\"flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm\">\n <input type=\"checkbox\" checked={importConfirm} onChange={(e) => setImportConfirm(e.target.checked)} />\n Confirm import\n </label>\n <Button variant=\"outline\" onClick={() => archiveImport.mutate()} disabled={!restorePath || !archivePassphrase || !importConfirm || archiveImport.isPending}>Import</Button>\n </div>\n {[archiveCreate.data, archiveInspect.data, archiveVerify.data, archiveDryRun.data, archiveRestore.data, archiveImportDryRun.data, archiveImport.data].filter(Boolean).map((item, i) => (\n <OperationResult key={i} result={item} successLabel=\"Archive request completed\" />\n ))}\n </CardContent>\n </Card>\n {mode !== \"basic\" ? <Card className=\"xl:col-span-3\">\n <CardHeader>\n <CardTitle>Scale mode</CardTitle>\n <CardDescription>Optional advanced storage. Local SQLite remains the default.</CardDescription>\n </CardHeader>\n <CardContent className=\"grid gap-3\">\n <div className=\"grid gap-2 sm:grid-cols-[1fr_220px]\">\n <Input value={dsn} onChange={(e) => setDsn(e.target.value)} placeholder=\"Postgres connection string\" />\n <Input value={schema} onChange={(e) => setSchema(e.target.value)} placeholder=\"database schema\" />\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" onClick={() => docker.mutate(false)} disabled={docker.isPending}>Docker plan</Button>\n <label className=\"flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm\">\n <input type=\"checkbox\" checked={dockerConsent} onChange={(e) => setDockerConsent(e.target.checked)} />\n Consent to start Docker\n </label>\n <Button onClick={() => docker.mutate(true)} disabled={!dockerConsent || docker.isPending}>Start Docker</Button>\n <Button variant=\"outline\" onClick={() => migration.mutate()} disabled={!dsn || migration.isPending}>Plan migration</Button>\n </div>\n {docker.data ? <OperationResult result={docker.data} successLabel=\"Docker setup request completed\" /> : null}\n {migration.data ? <OperationResult result={migration.data} successLabel=\"Migration plan completed\" /> : null}\n </CardContent>\n </Card> : null}\n <DataPanel title=\"Computer memory\" result={comp.data} className=\"xl:col-span-3\">\n {(data) => (\n <div className=\"space-y-3\">\n <StructuredView value={data} />\n <div className=\"flex gap-2\">\n <ActionButton label=\"Enable memory\" action={() => latticeApi.setComputerMemory(true)} invalidate={[\"computerMemory\"]} />\n <ActionButton label=\"Disable memory\" action={() => latticeApi.setComputerMemory(false)} invalidate={[\"computerMemory\"]} variant=\"destructive\" />\n </div>\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction textValue(value: unknown, fallback = \"not reported\") {\n if (value === null || value === undefined || value === \"\") return fallback;\n if (typeof value === \"boolean\") return value ? \"enabled\" : \"disabled\";\n return String(value);\n}\n\nfunction PresenceView({ data }: { data: Record<string, unknown> }) {\n const rows = asArray<Record<string, unknown>>(data.presence || data.clients || data);\n if (!rows.length) return <EmptyState title=\"No active presence\" detail=\"No live collaborators or realtime clients are currently reported.\" />;\n return <EntityList items={rows} titleKey=\"user\" metaKey=\"workspace_id\" />;\n}\n\nfunction DeviceIdentityView({ data }: { data: Record<string, unknown> }) {\n const mode = useAppStore((state) => state.mode);\n const publicKey = textValue(data.public_key, \"\");\n if (mode === \"basic\") {\n return (\n <div className=\"space-y-3\">\n <StatusCard title=\"This Mac\" status=\"trusted\" detail=\"This device can participate in local workspace exchange when you pair another trusted device.\" />\n <Badge variant=\"muted\">{textValue(data.algorithm, \"local identity\")}</Badge>\n </div>\n );\n }\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"success\">local device</Badge>\n <Badge variant=\"muted\">{textValue(data.algorithm, \"identity key\")}</Badge>\n </div>\n <KeyValueList data={{\n device_id: data.device_id || data.id || \"not reported\",\n fingerprint: data.fingerprint || \"not reported\",\n public_key: publicKey ? shortId(publicKey.replace(/\\s+/g, \" \"), 72) : \"not reported\",\n }} />\n </div>\n );\n}\n\nfunction HealthView({ data }: { data: Record<string, unknown> }) {\n const mode = useAppStore((state) => state.mode);\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Status\", value: data.status || data.ok || \"reported\" },\n { label: \"Version\", value: data.version || \"not reported\" },\n { label: \"Mode\", value: data.mode || data.environment || \"local\" },\n ...(mode === \"basic\" ? [] : [{ label: \"Port\", value: data.port || data.backend_port || \"configured\" }]),\n ]} />\n {mode === \"basic\" ? null : <StructuredView value={data} />}\n </div>\n );\n}\n\nfunction StorageView({ data }: { data: Record<string, unknown> }) {\n const active = isRecord(data.active) ? data.active : data;\n const postgres = isRecord(data.postgres) ? data.postgres : {};\n const backup = isRecord(data.backup_health) ? data.backup_health : {};\n const vector = active.vector_search || active.vector || data.vector_search || data.sqlite_vec;\n const postgresAvailable = Boolean(postgres.available || postgres.connected || postgres.enabled);\n return (\n <div className=\"space-y-4\">\n <StatGrid stats={[\n { label: \"Active engine\", value: active.engine || data.engine || \"sqlite\" },\n { label: \"SQLite default\", value: active.engine === \"postgres\" ? \"scale mode\" : \"enabled\" },\n { label: \"Vector search\", value: vector || \"not reported\" },\n { label: \"Postgres\", value: postgresAvailable ? \"available\" : \"optional\" },\n ]} />\n <div className=\"grid gap-3 md:grid-cols-3\">\n <StatusCard title=\"SQLite\" status={active.available === false ? \"unavailable\" : \"default\"} detail={textValue(active.reason || active.path || data.path, \"Local brain storage is active by default.\")} />\n <StatusCard title=\"Vector search\" status={textValue(vector, \"reported\")} detail={textValue(active.vector_reason || active.sqlite_vec_reason || data.vector_reason, \"Uses the configured local vector capability or reports why it is unavailable.\")} />\n <StatusCard title=\"Postgres\" status={postgresAvailable ? \"available\" : \"not enabled\"} detail={textValue(postgres.reason || postgres.dsn || postgres.status, \"Postgres scale mode is opt-in and never required for local use.\")} />\n </div>\n {Object.keys(backup).length ? <StructuredView value={{ backup_health: backup }} /> : null}\n </div>\n );\n}\n\nfunction BackupHealthView({ data }: { data: Record<string, unknown> }) {\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Available\", value: data.available === false ? \"no\" : \"yes\" },\n { label: \"Backups\", value: data.count || data.backups || 0 },\n { label: \"Encrypted\", value: data.encrypted_archives || 0 },\n { label: \"Zip backups\", value: data.zip_backups || 0 },\n ]} />\n <KeyValueList data={{\n directory: data.directory || \"not reported\",\n latest: data.latest || \"none reported\",\n last_verified: data.last_verified || data.verified_at || \"not reported\",\n failure: data.error || data.reason || \"none reported\",\n }} />\n </div>\n );\n}\n\nfunction StatusCard({ title, status, detail }: { title: string; status: string; detail: string }) {\n const variant = /unavailable|failed|denied|disabled|not enabled/i.test(status) ? \"warning\" : \"success\";\n return (\n <div className=\"rounded-md border border-border bg-background p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"font-medium\">{title}</div>\n <Badge variant={variant}>{status}</Badge>\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">{detail}</p>\n </div>\n );\n}\n\nfunction HardeningView({ data }: { data: Record<string, unknown> }) {\n const startup = isRecord(data.startup) ? data.startup : {};\n const privacy = isRecord(data.privacy) ? data.privacy : {};\n const storage = isRecord(data.storage) ? data.storage : {};\n const backup = isRecord(data.backup) ? data.backup : {};\n const identity = isRecord(data.device_identity) ? data.device_identity : {};\n const permissions = isRecord(data.permissions) ? data.permissions : {};\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Version\", value: data.version || \"reported\" },\n { label: \"Local only\", value: privacy.local_only_default ?? startup.local_only_default ?? \"reported\" },\n { label: \"Storage\", value: isRecord(storage.active) ? (storage.active as Record<string, unknown>).engine : \"reported\" },\n { label: \"Backups\", value: backup.count || backup.available || \"reported\" },\n ]} />\n <div className=\"grid gap-3 md:grid-cols-2\">\n <StatusCard title=\"Startup\" status={startup.network_exposed ? \"network exposed\" : \"local-only\"} detail=\"Lattice starts locally by default and reports when network access is enabled.\" />\n <StatusCard title=\"Integrations\" status={privacy.local_only_default === false ? \"review required\" : \"opt-in\"} detail=\"External integrations remain disabled until the user explicitly enables them.\" />\n <StatusCard title=\"Device identity\" status={textValue(identity.algorithm || identity.fingerprint, \"reported\")} detail={textValue(identity.storage, \"Stored locally and used for signed bundle exchange.\")} />\n <StatusCard title=\"Permissions\" status={permissions.destructive_restore_requires_confirmation === false ? \"review required\" : \"guarded\"} detail=\"Export, import, and destructive restore permissions are surfaced through admin status.\" />\n </div>\n </div>\n );\n}\n\nfunction SecurityView({ data }: { data: Record<string, unknown> }) {\n const cards = isRecord(data.cards) ? data.cards : {};\n const severities = isRecord(data.severity_counts) ? data.severity_counts : {};\n return (\n <div className=\"space-y-3\">\n <StatGrid stats={[\n { label: \"Events today\", value: cards.events_today || 0 },\n { label: \"High risk\", value: cards.high_risk_events || severities.high || 0 },\n { label: \"Review\", value: cards.review_required || 0 },\n { label: \"Risk rate\", value: data.risk_rate || 0 },\n ]} />\n <StructuredView value={{ severity_counts: severities, sensitive_fields: data.field_counts || {} }} />\n </div>\n );\n}\n\nfunction AdminPanel() {\n const mode = useAppStore((state) => state.mode);\n const summary = useQuery({ queryKey: [\"adminSummary\"], queryFn: latticeApi.adminSummary });\n const users = useQuery({ queryKey: [\"adminUsers\"], queryFn: latticeApi.adminUsers });\n const audit = useQuery({ queryKey: [\"adminAudit\"], queryFn: () => latticeApi.adminAudit() });\n const roles = useQuery({ queryKey: [\"adminRoles\"], queryFn: latticeApi.adminRoles });\n const policies = useQuery({ queryKey: [\"adminPolicies\"], queryFn: latticeApi.adminPolicies });\n const hardening = useQuery({ queryKey: [\"adminProductHardening\"], queryFn: latticeApi.adminProductHardening });\n const security = useQuery({ queryKey: [\"adminSecurity\"], queryFn: latticeApi.adminSecurity });\n const vpc = useQuery({ queryKey: [\"vpcStatus\"], queryFn: latticeApi.vpcStatus });\n if (mode !== \"admin\") {\n return <ModeGate title=\"Admin controls\" detail=\"Switch to Admin mode to review users, audit events, policies, security posture, and private networking diagnostics.\" target=\"admin\" />;\n }\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title=\"Admin summary\" result={summary.data}>{(data) => <KeyValueList data={data as Record<string, unknown>} />}</DataPanel>\n <DataPanel title=\"Users\" result={users.data}>{(data) => <EntityList items={data} titleKey=\"email\" metaKey=\"role\" />}</DataPanel>\n <DataPanel title=\"Audit\" result={audit.data}>{(data) => <EntityList items={(data as Record<string, unknown>).recent_events || data} titleKey=\"act\" metaKey=\"sev\" />}</DataPanel>\n <DataPanel title=\"Roles\" result={roles.data}>{(data) => <EntityList items={(data as Record<string, unknown>).roles || data} titleKey=\"role\" metaKey=\"members\" />}</DataPanel>\n <DataPanel title=\"Policies\" result={policies.data}>{(data) => <EntityList items={(data as Record<string, unknown>).policies || data} titleKey=\"label\" metaKey=\"enforced\" />}</DataPanel>\n <DataPanel title=\"Product hardening\" result={hardening.data}>{(data) => <HardeningView data={data as Record<string, unknown>} />}</DataPanel>\n <DataPanel title=\"Security overview\" result={security.data}>{(data) => <SecurityView data={data as Record<string, unknown>} />}</DataPanel>\n <DataPanel title=\"Private VPC\" result={vpc.data} className=\"xl:col-span-2\">\n {(data) => (\n <div className=\"space-y-2\">\n <Badge variant=\"muted\">Community-disabled features remain honest unavailable states.</Badge>\n <StructuredView value={data} />\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-CwxXejkd.js","names":[],"sources":["../../../node_modules/@tauri-apps/api/core.js"],"sourcesContent":["import { __classPrivateFieldGet, __classPrivateFieldSet } from './external/tslib/tslib.es6.js';\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\nvar _Channel_onmessage, _Channel_nextMessageId, _Channel_pendingMessages, _Resource_rid;\n/**\n * Invoke your custom commands.\n *\n * This package is also accessible with `window.__TAURI__.tauri` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * Transforms a callback function to a string identifier that can be passed to the backend.\n * The backend uses the identifier to `eval()` the callback.\n *\n * @return A unique identifier associated with the callback function.\n *\n * @since 1.0.0\n */\nfunction transformCallback(callback, once = false) {\n return window.__TAURI_INTERNALS__.transformCallback(callback, once);\n}\nclass Channel {\n constructor() {\n // @ts-expect-error field used by the IPC serializer\n this.__TAURI_CHANNEL_MARKER__ = true;\n _Channel_onmessage.set(this, () => {\n // no-op\n });\n _Channel_nextMessageId.set(this, 0);\n _Channel_pendingMessages.set(this, {});\n this.id = transformCallback(({ message, id }) => {\n // the id is used as a mechanism to preserve message order\n if (id === __classPrivateFieldGet(this, _Channel_nextMessageId, \"f\")) {\n __classPrivateFieldSet(this, _Channel_nextMessageId, id + 1, \"f\");\n __classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n // process pending messages\n const pendingMessageIds = Object.keys(__classPrivateFieldGet(this, _Channel_pendingMessages, \"f\"));\n if (pendingMessageIds.length > 0) {\n let nextId = id + 1;\n for (const pendingId of pendingMessageIds.sort()) {\n // if we have the next message, process it\n if (parseInt(pendingId) === nextId) {\n // eslint-disable-next-line security/detect-object-injection\n const message = __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[pendingId];\n // eslint-disable-next-line security/detect-object-injection\n delete __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[pendingId];\n __classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n // move the id counter to the next message to check\n nextId += 1;\n }\n else {\n // we do not have the next message, let's wait\n break;\n }\n }\n __classPrivateFieldSet(this, _Channel_nextMessageId, nextId, \"f\");\n }\n }\n else {\n __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[id.toString()] = message;\n }\n });\n }\n set onmessage(handler) {\n __classPrivateFieldSet(this, _Channel_onmessage, handler, \"f\");\n }\n get onmessage() {\n return __classPrivateFieldGet(this, _Channel_onmessage, \"f\");\n }\n toJSON() {\n return `__CHANNEL__:${this.id}`;\n }\n}\n_Channel_onmessage = new WeakMap(), _Channel_nextMessageId = new WeakMap(), _Channel_pendingMessages = new WeakMap();\nclass PluginListener {\n constructor(plugin, event, channelId) {\n this.plugin = plugin;\n this.event = event;\n this.channelId = channelId;\n }\n async unregister() {\n return invoke(`plugin:${this.plugin}|remove_listener`, {\n event: this.event,\n channelId: this.channelId\n });\n }\n}\n/**\n * Adds a listener to a plugin event.\n *\n * @returns The listener object to stop listening to the events.\n *\n * @since 2.0.0\n */\nasync function addPluginListener(plugin, event, cb) {\n const handler = new Channel();\n handler.onmessage = cb;\n return invoke(`plugin:${plugin}|register_listener`, { event, handler }).then(() => new PluginListener(plugin, event, handler.id));\n}\n/**\n * Get permission state for a plugin.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function checkPermissions(plugin) {\n return invoke(`plugin:${plugin}|check_permissions`);\n}\n/**\n * Request permissions.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function requestPermissions(plugin) {\n return invoke(`plugin:${plugin}|request_permissions`);\n}\n/**\n * Sends a message to the backend.\n * @example\n * ```typescript\n * import { invoke } from '@tauri-apps/api/core';\n * await invoke('login', { user: 'tauri', password: 'poiwe3h4r5ip3yrhtew9ty' });\n * ```\n *\n * @param cmd The command name.\n * @param args The optional arguments to pass to the command.\n * @param options The request options.\n * @return A promise resolving or rejecting to the backend response.\n *\n * @since 1.0.0\n */\nasync function invoke(cmd, args = {}, options) {\n return window.__TAURI_INTERNALS__.invoke(cmd, args, options);\n}\n/**\n * Convert a device file path to an URL that can be loaded by the webview.\n * Note that `asset:` and `http://asset.localhost` must be added to [`app.security.csp`](https://v2.tauri.app/reference/config/#csp-1) in `tauri.conf.json`.\n * Example CSP value: `\"csp\": \"default-src 'self' ipc: http://ipc.localhost; img-src 'self' asset: http://asset.localhost\"` to use the asset protocol on image sources.\n *\n * Additionally, `\"enable\" : \"true\"` must be added to [`app.security.assetProtocol`](https://v2.tauri.app/reference/config/#assetprotocolconfig)\n * in `tauri.conf.json` and its access scope must be defined on the `scope` array on the same `assetProtocol` object.\n *\n * @param filePath The file path.\n * @param protocol The protocol to use. Defaults to `asset`. You only need to set this when using a custom protocol.\n * @example\n * ```typescript\n * import { appDataDir, join } from '@tauri-apps/api/path';\n * import { convertFileSrc } from '@tauri-apps/api/core';\n * const appDataDirPath = await appDataDir();\n * const filePath = await join(appDataDirPath, 'assets/video.mp4');\n * const assetUrl = convertFileSrc(filePath);\n *\n * const video = document.getElementById('my-video');\n * const source = document.createElement('source');\n * source.type = 'video/mp4';\n * source.src = assetUrl;\n * video.appendChild(source);\n * video.load();\n * ```\n *\n * @return the URL that can be used as source on the webview.\n *\n * @since 1.0.0\n */\nfunction convertFileSrc(filePath, protocol = 'asset') {\n return window.__TAURI_INTERNALS__.convertFileSrc(filePath, protocol);\n}\n/**\n * A rust-backed resource stored through `tauri::Manager::resources_table` API.\n *\n * The resource lives in the main process and does not exist\n * in the Javascript world, and thus will not be cleaned up automatiacally\n * except on application exit. If you want to clean it up early, call {@linkcode Resource.close}\n *\n * @example\n * ```typescript\n * import { Resource, invoke } from '@tauri-apps/api/core';\n * export class DatabaseHandle extends Resource {\n * static async open(path: string): Promise<DatabaseHandle> {\n * const rid: number = await invoke('open_db', { path });\n * return new DatabaseHandle(rid);\n * }\n *\n * async execute(sql: string): Promise<void> {\n * await invoke('execute_sql', { rid: this.rid, sql });\n * }\n * }\n * ```\n */\nclass Resource {\n get rid() {\n return __classPrivateFieldGet(this, _Resource_rid, \"f\");\n }\n constructor(rid) {\n _Resource_rid.set(this, void 0);\n __classPrivateFieldSet(this, _Resource_rid, rid, \"f\");\n }\n /**\n * Destroys and cleans up this resource from memory.\n * **You should not call any method on this object anymore and should drop any reference to it.**\n */\n async close() {\n return invoke('plugin:resources|close', {\n rid: this.rid\n });\n }\n}\n_Resource_rid = new WeakMap();\nfunction isTauri() {\n return 'isTauri' in window && !!window.isTauri;\n}\n\nexport { Channel, PluginListener, Resource, addPluginListener, checkPermissions, convertFileSrc, invoke, isTauri, requestPermissions, transformCallback };\n"],"x_google_ignoreList":[0],"mappings":"AAoIA,eAAe,EAAO,EAAK,EAAO,CAAC,EAAG,EAAS,CAC3C,OAAO,OAAO,oBAAoB,OAAO,EAAK,EAAM,CAAO,CAC/D"}
|
|
1
|
+
{"version":3,"file":"core-CwxXejkd.js","names":[],"sources":["../../../node_modules/@tauri-apps/api/external/tslib/tslib.es6.js","../../../node_modules/@tauri-apps/api/core.js"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nexport { __classPrivateFieldGet, __classPrivateFieldSet };\n","import { __classPrivateFieldSet, __classPrivateFieldGet } from './external/tslib/tslib.es6.js';\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\nvar _Channel_onmessage, _Channel_nextMessageIndex, _Channel_pendingMessages, _Channel_messageEndIndex, _Resource_rid;\n/**\n * Invoke your custom commands.\n *\n * This package is also accessible with `window.__TAURI__.core` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * A key to be used to implement a special function\n * on your types that define how your type should be serialized\n * when passing across the IPC.\n * @example\n * Given a type in Rust that looks like this\n * ```rs\n * #[derive(serde::Serialize, serde::Deserialize)\n * enum UserId {\n * String(String),\n * Number(u32),\n * }\n * ```\n * `UserId::String(\"id\")` would be serialized into `{ String: \"id\" }`\n * and so we need to pass the same structure back to Rust\n * ```ts\n * import { SERIALIZE_TO_IPC_FN } from \"@tauri-apps/api/core\"\n *\n * class UserIdString {\n * id\n * constructor(id) {\n * this.id = id\n * }\n *\n * [SERIALIZE_TO_IPC_FN]() {\n * return { String: this.id }\n * }\n * }\n *\n * class UserIdNumber {\n * id\n * constructor(id) {\n * this.id = id\n * }\n *\n * [SERIALIZE_TO_IPC_FN]() {\n * return { Number: this.id }\n * }\n * }\n *\n * type UserId = UserIdString | UserIdNumber\n * ```\n *\n */\n// if this value changes, make sure to update it in:\n// 1. ipc.js\n// 2. process-ipc-message-fn.js\nconst SERIALIZE_TO_IPC_FN = '__TAURI_TO_IPC_KEY__';\n/**\n * Stores the callback in a known location, and returns an identifier that can be passed to the backend.\n * The backend uses the identifier to `eval()` the callback.\n *\n * @return An unique identifier associated with the callback function.\n *\n * @since 1.0.0\n */\nfunction transformCallback(\n// TODO: Make this not optional in v3\ncallback, once = false) {\n return window.__TAURI_INTERNALS__.transformCallback(callback, once);\n}\nclass Channel {\n constructor(onmessage) {\n _Channel_onmessage.set(this, void 0);\n // the index is used as a mechanism to preserve message order\n _Channel_nextMessageIndex.set(this, 0);\n _Channel_pendingMessages.set(this, []);\n _Channel_messageEndIndex.set(this, void 0);\n __classPrivateFieldSet(this, _Channel_onmessage, onmessage || (() => { }), \"f\");\n this.id = transformCallback((rawMessage) => {\n const index = rawMessage.index;\n if ('end' in rawMessage) {\n if (index == __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n this.cleanupCallback();\n }\n else {\n __classPrivateFieldSet(this, _Channel_messageEndIndex, index, \"f\");\n }\n return;\n }\n const message = rawMessage.message;\n // Process the message if we're at the right order\n if (index == __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n __classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n __classPrivateFieldSet(this, _Channel_nextMessageIndex, __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n // process pending messages\n while (__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") in __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")) {\n const message = __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n __classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n // eslint-disable-next-line @typescript-eslint/no-array-delete\n delete __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n __classPrivateFieldSet(this, _Channel_nextMessageIndex, __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n }\n if (__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") === __classPrivateFieldGet(this, _Channel_messageEndIndex, \"f\")) {\n this.cleanupCallback();\n }\n }\n // Queue the message if we're not\n else {\n // eslint-disable-next-line security/detect-object-injection\n __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[index] = message;\n }\n });\n }\n cleanupCallback() {\n window.__TAURI_INTERNALS__.unregisterCallback(this.id);\n }\n set onmessage(handler) {\n __classPrivateFieldSet(this, _Channel_onmessage, handler, \"f\");\n }\n get onmessage() {\n return __classPrivateFieldGet(this, _Channel_onmessage, \"f\");\n }\n [(_Channel_onmessage = new WeakMap(), _Channel_nextMessageIndex = new WeakMap(), _Channel_pendingMessages = new WeakMap(), _Channel_messageEndIndex = new WeakMap(), SERIALIZE_TO_IPC_FN)]() {\n return `__CHANNEL__:${this.id}`;\n }\n toJSON() {\n // eslint-disable-next-line security/detect-object-injection\n return this[SERIALIZE_TO_IPC_FN]();\n }\n}\nclass PluginListener {\n constructor(plugin, event, channelId) {\n this.plugin = plugin;\n this.event = event;\n this.channelId = channelId;\n }\n async unregister() {\n return invoke(`plugin:${this.plugin}|remove_listener`, {\n event: this.event,\n channelId: this.channelId\n });\n }\n}\n/**\n * Adds a listener to a plugin event.\n *\n * @returns The listener object to stop listening to the events.\n *\n * @since 2.0.0\n */\nasync function addPluginListener(plugin, event, cb) {\n const handler = new Channel(cb);\n try {\n await invoke(`plugin:${plugin}|register_listener`, {\n event,\n handler\n });\n return new PluginListener(plugin, event, handler.id);\n }\n catch {\n // TODO(v3): remove this fallback\n // note: we must try with camelCase here for backwards compatibility\n await invoke(`plugin:${plugin}|registerListener`, { event, handler });\n return new PluginListener(plugin, event, handler.id);\n }\n}\n/**\n * Get permission state for a plugin.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function checkPermissions(plugin) {\n return invoke(`plugin:${plugin}|check_permissions`);\n}\n/**\n * Request permissions.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function requestPermissions(plugin) {\n return invoke(`plugin:${plugin}|request_permissions`);\n}\n/**\n * Sends a message to the backend.\n * @example\n * ```typescript\n * import { invoke } from '@tauri-apps/api/core';\n * await invoke('login', { user: 'tauri', password: 'poiwe3h4r5ip3yrhtew9ty' });\n * ```\n *\n * @param cmd The command name.\n * @param args The optional arguments to pass to the command.\n * @param options The request options.\n * @return A promise resolving or rejecting to the backend response.\n *\n * @since 1.0.0\n */\nasync function invoke(cmd, args = {}, options) {\n return window.__TAURI_INTERNALS__.invoke(cmd, args, options);\n}\n/**\n * Convert a device file path to an URL that can be loaded by the webview.\n * Note that `asset:` and `http://asset.localhost` must be added to [`app.security.csp`](https://v2.tauri.app/reference/config/#csp-1) in `tauri.conf.json`.\n * Example CSP value: `\"csp\": \"default-src 'self' ipc: http://ipc.localhost; img-src 'self' asset: http://asset.localhost\"` to use the asset protocol on image sources.\n *\n * Additionally, `\"enable\" : \"true\"` must be added to [`app.security.assetProtocol`](https://v2.tauri.app/reference/config/#assetprotocolconfig)\n * in `tauri.conf.json` and its access scope must be defined on the `scope` array on the same `assetProtocol` object.\n *\n * @param filePath The file path.\n * @param protocol The protocol to use. Defaults to `asset`. You only need to set this when using a custom protocol.\n * @example\n * ```typescript\n * import { appDataDir, join } from '@tauri-apps/api/path';\n * import { convertFileSrc } from '@tauri-apps/api/core';\n * const appDataDirPath = await appDataDir();\n * const filePath = await join(appDataDirPath, 'assets/video.mp4');\n * const assetUrl = convertFileSrc(filePath);\n *\n * const video = document.getElementById('my-video');\n * const source = document.createElement('source');\n * source.type = 'video/mp4';\n * source.src = assetUrl;\n * video.appendChild(source);\n * video.load();\n * ```\n *\n * @return the URL that can be used as source on the webview.\n *\n * @since 1.0.0\n */\nfunction convertFileSrc(filePath, protocol = 'asset') {\n return window.__TAURI_INTERNALS__.convertFileSrc(filePath, protocol);\n}\n/**\n * A rust-backed resource stored through `tauri::Manager::resources_table` API.\n *\n * The resource lives in the main process and does not exist\n * in the Javascript world, and thus will not be cleaned up automatically\n * except on application exit. If you want to clean it up early, call {@linkcode Resource.close}\n *\n * @example\n * ```typescript\n * import { Resource, invoke } from '@tauri-apps/api/core';\n * export class DatabaseHandle extends Resource {\n * static async open(path: string): Promise<DatabaseHandle> {\n * const rid: number = await invoke('open_db', { path });\n * return new DatabaseHandle(rid);\n * }\n *\n * async execute(sql: string): Promise<void> {\n * await invoke('execute_sql', { rid: this.rid, sql });\n * }\n * }\n * ```\n */\nclass Resource {\n get rid() {\n return __classPrivateFieldGet(this, _Resource_rid, \"f\");\n }\n constructor(rid) {\n _Resource_rid.set(this, void 0);\n __classPrivateFieldSet(this, _Resource_rid, rid, \"f\");\n }\n /**\n * Destroys and cleans up this resource from memory.\n * **You should not call any method on this object anymore and should drop any reference to it.**\n */\n async close() {\n return invoke('plugin:resources|close', {\n rid: this.rid\n });\n }\n}\n_Resource_rid = new WeakMap();\nfunction isTauri() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n return !!(globalThis || window).isTauri;\n}\n\nexport { Channel, PluginListener, Resource, SERIALIZE_TO_IPC_FN, addPluginListener, checkPermissions, convertFileSrc, invoke, isTauri, requestPermissions, transformCallback };\n"],"x_google_ignoreList":[0,1],"mappings":"ACwMA,eAAe,EAAO,EAAK,EAAO,CAAC,EAAG,EAAS,CAC3C,OAAO,OAAO,oBAAoB,OAAO,EAAK,EAAM,CAAO,CAC/D"}
|