ltcai 6.7.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +29 -31
  2. package/docs/CHANGELOG.md +25 -0
  3. package/frontend/src/api/client.ts +5 -0
  4. package/frontend/src/features/brain/BrainConversation.tsx +163 -1
  5. package/frontend/src/features/brain/BrainHome.tsx +108 -1
  6. package/frontend/src/features/brain/types.ts +13 -0
  7. package/frontend/src/i18n.ts +70 -0
  8. package/frontend/src/styles.css +212 -0
  9. package/lattice_brain/__init__.py +1 -1
  10. package/lattice_brain/runtime/multi_agent.py +1 -1
  11. package/latticeai/__init__.py +1 -1
  12. package/latticeai/core/marketplace.py +1 -1
  13. package/latticeai/core/workspace_os.py +1 -1
  14. package/package.json +1 -1
  15. package/scripts/brain_quality_eval.py +118 -0
  16. package/src-tauri/Cargo.lock +1 -1
  17. package/src-tauri/Cargo.toml +1 -1
  18. package/src-tauri/tauri.conf.json +1 -1
  19. package/static/app/asset-manifest.json +28 -28
  20. package/static/app/assets/{Act-DGN37eR4.js → Act-DhLaHnrT.js} +2 -2
  21. package/static/app/assets/{Act-DGN37eR4.js.map → Act-DhLaHnrT.js.map} +1 -1
  22. package/static/app/assets/{Brain-HDcIwPHW.js → Brain-DS7NULyY.js} +3 -3
  23. package/static/app/assets/{Brain-HDcIwPHW.js.map → Brain-DS7NULyY.js.map} +1 -1
  24. package/static/app/assets/Capture-CAKouj52.js +2 -0
  25. package/static/app/assets/Capture-CAKouj52.js.map +1 -0
  26. package/static/app/assets/{Library-BbagRFyd.js → Library-B_hW4AwR.js} +2 -2
  27. package/static/app/assets/{Library-BbagRFyd.js.map → Library-B_hW4AwR.js.map} +1 -1
  28. package/static/app/assets/{System-C6pd3Mp_.js → System-9OAoXWPz.js} +2 -2
  29. package/static/app/assets/{System-C6pd3Mp_.js.map → System-9OAoXWPz.js.map} +1 -1
  30. package/static/app/assets/index-C-7aHabu.js +17 -0
  31. package/static/app/assets/index-C-7aHabu.js.map +1 -0
  32. package/static/app/assets/{index-ztppMg0c.css → index-DKFpn5Kn.css} +1 -1
  33. package/static/app/assets/{primitives-Bcm5lZRu.js → primitives-DcO2H3yh.js} +2 -2
  34. package/static/app/assets/{primitives-Bcm5lZRu.js.map → primitives-DcO2H3yh.js.map} +1 -1
  35. package/static/app/assets/{textarea-C2PLu6_O.js → textarea-DR2Tyy_6.js} +2 -2
  36. package/static/app/assets/{textarea-C2PLu6_O.js.map → textarea-DR2Tyy_6.js.map} +1 -1
  37. package/static/app/index.html +2 -2
  38. package/static/app/assets/Capture--eZfb_Ex.js +0 -2
  39. package/static/app/assets/Capture--eZfb_Ex.js.map +0 -1
  40. package/static/app/assets/index-C950aES_.js +0 -17
  41. package/static/app/assets/index-C950aES_.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{A as e,C as t,D as n,E as r,M as i,P as a,a as o,b as s,g as c,k as l,m as u,n as d,w as f,x as p,y as m}from"./index-C950aES_.js";var h=c(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]),g=c(`loader-circle`,[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]]),_=c(`lock-keyhole`,[[`circle`,{cx:`12`,cy:`16`,r:`1`,key:`1au0dj`}],[`rect`,{x:`3`,y:`10`,width:`18`,height:`12`,rx:`2`,key:`6s8ecr`}],[`path`,{d:`M7 10V7a5 5 0 0 1 10 0v3`,key:`1pqi11`}]]),v=a(i()),y=e(),b={default:`border-primary/25 bg-primary/12 text-primary`,success:`border-emerald-500/25 bg-emerald-500/12 text-emerald-300`,warning:`border-amber-500/25 bg-amber-500/12 text-amber-300`,muted:`border-border bg-muted/70 text-muted-foreground`,danger:`border-destructive/30 bg-destructive/12 text-destructive`};function x({className:e,variant:t=`default`,...n}){return(0,y.jsx)(`span`,{className:s(`inline-flex min-h-6 max-w-full items-center rounded-md border px-2 py-0.5 text-xs font-semibold leading-none`,b[t],e),...n})}function S({className:e,...t}){return(0,y.jsx)(`section`,{className:s(`premium-surface rounded-lg text-card-foreground`,e),...t})}function C({className:e,...t}){return(0,y.jsx)(`div`,{className:s(`flex flex-col gap-1.5 p-5`,e),...t})}function w({className:e,...t}){return(0,y.jsx)(`h2`,{className:s(`text-base font-semibold tracking-normal`,e),...t})}function T({className:e,...t}){return(0,y.jsx)(`p`,{className:s(`text-sm leading-6 text-muted-foreground`,e),...t})}function E({className:e,...t}){return(0,y.jsx)(`div`,{className:s(`p-5 pt-0`,e),...t})}function D({result:e}){let t=r(e=>e.mode);return e?e.source===`live`&&e.ok?(0,y.jsx)(x,{variant:`success`,children:t===`basic`?`ready`:`connected`}):(0,y.jsx)(x,{variant:`warning`,children:t===`basic`?`needs setup`:`unavailable`}):(0,y.jsx)(x,{variant:`muted`,children:`not loaded`})}function O({title:e=`Unavailable`,detail:t}){return(0,y.jsxs)(`div`,{className:`flex min-h-36 flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border bg-muted/24 p-6 text-center text-sm text-muted-foreground`,children:[(0,y.jsx)(`div`,{className:`grid h-10 w-10 place-items-center rounded-md border border-border bg-card`,children:(0,y.jsx)(o,{className:`h-5 w-5 text-primary`})}),(0,y.jsx)(`div`,{className:`text-base font-semibold text-foreground`,children:e}),t?(0,y.jsx)(`div`,{className:`max-w-md leading-6`,children:t}):null]})}function k({title:e,description:t,result:n,children:i,className:a}){let o=r(e=>e.mode);return(0,y.jsxs)(S,{className:s(`overflow-hidden`,a),children:[(0,y.jsxs)(C,{className:`flex-row items-start justify-between gap-3`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(w,{children:e}),t?(0,y.jsx)(T,{children:t}):null]}),(0,y.jsx)(D,{result:n})]}),(0,y.jsx)(E,{children:n?.ok?i(n.data):(0,y.jsx)(O,{detail:o===`basic`?`This area needs setup or is not available yet.`:n?.error||`This capability is not reporting right now.`})})]})}function A({title:e}){return(0,y.jsxs)(S,{children:[(0,y.jsx)(C,{children:(0,y.jsx)(w,{children:e})}),(0,y.jsx)(E,{children:(0,y.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,y.jsx)(g,{className:`h-4 w-4 animate-spin`}),` Loading`]})})]})}function j({stats:e}){return(0,y.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:e.map(e=>(0,y.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/55 p-4`,children:[(0,y.jsx)(`div`,{className:`text-xs uppercase text-muted-foreground`,children:e.label}),(0,y.jsx)(`div`,{className:`mt-2 text-2xl font-semibold leading-tight`,children:typeof e.value==`number`?p(e.value):String(e.value??`-`)}),e.hint?(0,y.jsx)(`div`,{className:`mt-2 text-xs leading-5 text-muted-foreground`,children:e.hint}):null]},e.label))})}function M(e){return!!(e&&typeof e==`object`&&!Array.isArray(e))}function N(e){return e==null||e===``?`-`:typeof e==`number`?Number.isFinite(e)?p(e):`-`:typeof e==`boolean`?e?`Enabled`:`Disabled`:String(e)}var P=/(^id$|_id$|token|secret|passphrase|fingerprint|public_key|private_key|dsn|schema|endpoint|base_url|localhost|127\.0\.0\.1|stack|trace|raw|runtime|engine|module|port|host|api|internal)/i;function F(e){return P.test(e)}function I(e){let t=N(e);return t===`-`||t.includes(`/`)||t.includes(`@`)||/\.[a-z0-9]{2,5}$/i.test(t)?t:f(t.replace(/^agent:/i,``).replace(/^tool:/i,``))}function L(e){for(let t of[`documents`,`sources`,`items`,`agents`,`workflows`,`runs`,`events`,`permissions`,`models`,`peers`,`invitations`,`roles`,`policies`,`hooks`,`tools`,`templates`,`plugins`,`recent_events`]){let n=m(e[t]);if(n.length)return n}return[]}function R({value:e}){if(typeof e==`boolean`)return(0,y.jsx)(x,{variant:e?`success`:`muted`,children:e?`enabled`:`disabled`});if(Array.isArray(e))return e.length?e.every(e=>e===null||[`string`,`number`,`boolean`].includes(typeof e))?(0,y.jsxs)(`span`,{className:`flex flex-wrap gap-1`,children:[e.slice(0,5).map((e,t)=>(0,y.jsx)(x,{variant:`muted`,children:N(e)},`${String(e)}-${t}`)),e.length>5?(0,y.jsxs)(x,{variant:`muted`,children:[`+`,e.length-5]}):null]}):(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[p(e.length),` records`]}):(0,y.jsx)(`span`,{className:`text-muted-foreground`,children:`None`});if(M(e)){let t=Object.keys(e);return t.length?(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[t.slice(0,4).map(f).join(`, `),t.length>4?` +${t.length-4}`:``]}):(0,y.jsx)(`span`,{className:`text-muted-foreground`,children:`No fields`})}let n=N(e);return(0,y.jsx)(`span`,{className:`break-words`,children:n.length>96?t(n,96):n})}function z({data:e,limit:t=8}){let n=r(e=>e.mode),i=Object.entries(e||{}).filter(([e])=>n!==`basic`||!F(e)).slice(0,t);return i.length?(0,y.jsx)(`div`,{className:`divide-y divide-border rounded-md border border-border`,children:i.map(([e,t])=>(0,y.jsxs)(`div`,{className:`grid grid-cols-[minmax(9rem,0.5fr)_1fr] gap-3 p-3 text-sm`,children:[(0,y.jsx)(`span`,{className:`font-medium text-muted-foreground`,children:f(e)}),(0,y.jsx)(`span`,{className:`min-w-0 break-words`,children:(0,y.jsx)(R,{value:t})})]},e))}):(0,y.jsx)(O,{title:`No values`})}function B({value:e,titleKey:t=`title`,metaKey:n=`status`,limit:i=8}){return r(e=>e.mode)===`basic`?(0,y.jsx)(V,{value:e,titleKey:t,metaKey:n,limit:i}):Array.isArray(e)?e.length?e.every(e=>M(e))?(0,y.jsx)(U,{items:e,titleKey:t,metaKey:n,limit:i}):(0,y.jsxs)(`div`,{className:`flex flex-wrap gap-1 rounded-md border border-border bg-background p-3`,children:[e.slice(0,i).map((e,t)=>(0,y.jsx)(x,{variant:`muted`,children:N(e)},`${String(e)}-${t}`)),e.length>i?(0,y.jsxs)(x,{variant:`muted`,children:[`+`,e.length-i]}):null]}):(0,y.jsx)(O,{title:`Nothing here yet`,detail:`New items will appear here when Lattice has something to show.`}):M(e)?(0,y.jsx)(z,{data:e,limit:i}):(0,y.jsx)(`div`,{className:`rounded-md border border-border bg-background p-3 text-sm`,children:(0,y.jsx)(R,{value:e})})}function V({value:e,titleKey:t=`title`,metaKey:n=`status`,limit:r=6}){if(Array.isArray(e))return e.length?e.every(e=>M(e))?(0,y.jsx)(U,{items:e,titleKey:t,metaKey:n,limit:r}):(0,y.jsxs)(`div`,{className:`flex flex-wrap gap-1 rounded-md border border-border bg-background/55 p-3`,children:[e.slice(0,r).map((e,t)=>(0,y.jsx)(x,{variant:`muted`,children:I(e)},`${String(e)}-${t}`)),e.length>r?(0,y.jsxs)(x,{variant:`muted`,children:[`+`,e.length-r]}):null]}):(0,y.jsx)(O,{title:`Nothing here yet`,detail:`New items will appear here when Lattice has something to show.`});if(M(e)){let i=L(e);return i.length?(0,y.jsx)(U,{items:i,titleKey:t,metaKey:n,limit:r}):(0,y.jsx)(z,{data:Object.fromEntries(Object.entries(e).filter(([e])=>!F(e)).map(([e,t])=>[e,Array.isArray(t)?`${p(t.length)} items`:M(t)?`available`:t])),limit:r})}return(0,y.jsx)(`div`,{className:`rounded-md border border-border bg-background/55 p-3 text-sm`,children:I(e)})}function H({result:e,successLabel:t=`Request completed`}){let n=r(e=>e.mode);return e?e.ok?(0,y.jsxs)(`div`,{className:`space-y-2 rounded-md border border-border bg-background p-3`,children:[(0,y.jsx)(x,{variant:`success`,children:t}),n===`basic`?(0,y.jsx)(V,{value:e.data}):(0,y.jsx)(B,{value:e.data})]}):(0,y.jsx)(O,{title:`Request unavailable`,detail:e.error||(0,y.jsx)(R,{value:e.data})}):null}function U({items:e,titleKey:n=`title`,metaKey:i=`type`,limit:a=8}){let o=r(e=>e.mode),s=m(e).slice(0,a);return s.length?(0,y.jsx)(`div`,{className:`grid gap-2`,children:s.map((e,r)=>(0,y.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/55 p-3`,children:[(0,y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,y.jsx)(`div`,{className:`font-medium`,children:o===`basic`?I(e[n]||e.name||e.label||`Item ${r+1}`):String(e[n]||e.name||e.id||`Record ${r+1}`)}),(0,y.jsx)(x,{variant:`muted`,children:o===`basic`?I(e[i]||e.status||e.state||`ready`):String(e[i]||e.status||e.state||`record`)})]}),e.summary||e.description||e.path||e.id&&e[n]!==e.id?(0,y.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:String(e.summary||e.description||e.path||e.id)}):null,o!==`basic`&&e.id&&e[n]!==e.id?(0,y.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:t(e.id,48)}):null]},String(e.id||e.name||r)))}):(0,y.jsx)(O,{title:`Nothing here yet`,detail:`New items will appear here when Lattice has something to show.`})}function W({title:e=`Advanced controls`,detail:t=`Switch modes when you want diagnostics or administrative controls. Basic mode keeps the product focused on everyday use.`,target:n=`advanced`}){let i=r(e=>e.setMode);return(0,y.jsx)(S,{children:(0,y.jsxs)(E,{className:`flex flex-col items-start gap-3 p-6`,children:[(0,y.jsx)(`div`,{className:`grid h-10 w-10 place-items-center rounded-md border border-border bg-background/70`,children:(0,y.jsx)(_,{className:`h-5 w-5 text-primary`})}),(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`text-lg font-semibold`,children:e}),(0,y.jsx)(`p`,{className:`mt-1 max-w-2xl text-sm leading-6 text-muted-foreground`,children:t})]}),(0,y.jsx)(d,{onClick:()=>i(n),children:n===`admin`?`Switch to Admin Console`:`Switch to Advanced`})]})})}function G({label:e,successLabel:t=`Done`,action:r,invalidate:i,variant:a=`outline`,disabled:o}){let c=l(),[f,p]=v.useState(null),m=n({mutationFn:r,onSuccess:async e=>{p(e.ok?t:e.error||`Unavailable`),i&&await Promise.all(i.map(e=>c.invalidateQueries({queryKey:[e]})))}});return(0,y.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,y.jsxs)(d,{variant:a,disabled:o||m.isPending,onClick:()=>m.mutate(),children:[m.isPending?(0,y.jsx)(g,{className:`h-4 w-4 animate-spin`}):null,e]}),f?(0,y.jsxs)(`span`,{className:s(`inline-flex items-center gap-1 text-xs`,f===t?`text-emerald-300`:`text-amber-300`),children:[f===t?(0,y.jsx)(u,{className:`h-3.5 w-3.5`}):(0,y.jsx)(h,{className:`h-3.5 w-3.5`}),f]}):null]})}function K({tabs:e,value:t,onChange:n}){return(0,y.jsx)(`div`,{className:`inline-flex max-w-full flex-wrap gap-1 rounded-lg border border-border bg-muted/28 p-1`,children:e.map(e=>(0,y.jsx)(`button`,{onClick:()=>n(e.id),className:s(`h-9 rounded-md px-3.5 text-sm font-semibold transition`,t===e.id?`bg-card text-foreground shadow-sm`:`text-muted-foreground hover:bg-card/60 hover:text-foreground`),children:e.label},e.id))})}export{C as _,z as a,g as b,H as c,B as d,K as f,T as g,E as h,U as i,D as l,S as m,k as n,A as o,R as p,O as r,W as s,G as t,j as u,w as v,h as x,x as y};
2
- //# sourceMappingURL=primitives-Bcm5lZRu.js.map
1
+ import{C as e,E as t,I as n,M as r,O as i,P as a,S as o,T as s,a as c,g as l,j as u,k as d,n as f,v as p,x as m}from"./index-C-7aHabu.js";var h=p(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]),g=p(`loader-circle`,[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]]),_=p(`lock-keyhole`,[[`circle`,{cx:`12`,cy:`16`,r:`1`,key:`1au0dj`}],[`rect`,{x:`3`,y:`10`,width:`18`,height:`12`,rx:`2`,key:`6s8ecr`}],[`path`,{d:`M7 10V7a5 5 0 0 1 10 0v3`,key:`1pqi11`}]]),v=n(a()),y=r(),b={default:`border-primary/25 bg-primary/12 text-primary`,success:`border-emerald-500/25 bg-emerald-500/12 text-emerald-300`,warning:`border-amber-500/25 bg-amber-500/12 text-amber-300`,muted:`border-border bg-muted/70 text-muted-foreground`,danger:`border-destructive/30 bg-destructive/12 text-destructive`};function x({className:e,variant:t=`default`,...n}){return(0,y.jsx)(`span`,{className:o(`inline-flex min-h-6 max-w-full items-center rounded-md border px-2 py-0.5 text-xs font-semibold leading-none`,b[t],e),...n})}function S({className:e,...t}){return(0,y.jsx)(`section`,{className:o(`premium-surface rounded-lg text-card-foreground`,e),...t})}function C({className:e,...t}){return(0,y.jsx)(`div`,{className:o(`flex flex-col gap-1.5 p-5`,e),...t})}function w({className:e,...t}){return(0,y.jsx)(`h2`,{className:o(`text-base font-semibold tracking-normal`,e),...t})}function T({className:e,...t}){return(0,y.jsx)(`p`,{className:o(`text-sm leading-6 text-muted-foreground`,e),...t})}function E({className:e,...t}){return(0,y.jsx)(`div`,{className:o(`p-5 pt-0`,e),...t})}function D({result:e}){let t=i(e=>e.mode);return e?e.source===`live`&&e.ok?(0,y.jsx)(x,{variant:`success`,children:t===`basic`?`ready`:`connected`}):(0,y.jsx)(x,{variant:`warning`,children:t===`basic`?`needs setup`:`unavailable`}):(0,y.jsx)(x,{variant:`muted`,children:`not loaded`})}function O({title:e=`Unavailable`,detail:t}){return(0,y.jsxs)(`div`,{className:`flex min-h-36 flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border bg-muted/24 p-6 text-center text-sm text-muted-foreground`,children:[(0,y.jsx)(`div`,{className:`grid h-10 w-10 place-items-center rounded-md border border-border bg-card`,children:(0,y.jsx)(c,{className:`h-5 w-5 text-primary`})}),(0,y.jsx)(`div`,{className:`text-base font-semibold text-foreground`,children:e}),t?(0,y.jsx)(`div`,{className:`max-w-md leading-6`,children:t}):null]})}function k({title:e,description:t,result:n,children:r,className:a}){let s=i(e=>e.mode);return(0,y.jsxs)(S,{className:o(`overflow-hidden`,a),children:[(0,y.jsxs)(C,{className:`flex-row items-start justify-between gap-3`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(w,{children:e}),t?(0,y.jsx)(T,{children:t}):null]}),(0,y.jsx)(D,{result:n})]}),(0,y.jsx)(E,{children:n?.ok?r(n.data):(0,y.jsx)(O,{detail:s===`basic`?`This area needs setup or is not available yet.`:n?.error||`This capability is not reporting right now.`})})]})}function A({title:e}){return(0,y.jsxs)(S,{children:[(0,y.jsx)(C,{children:(0,y.jsx)(w,{children:e})}),(0,y.jsx)(E,{children:(0,y.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,y.jsx)(g,{className:`h-4 w-4 animate-spin`}),` Loading`]})})]})}function j({stats:t}){return(0,y.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:t.map(t=>(0,y.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/55 p-4`,children:[(0,y.jsx)(`div`,{className:`text-xs uppercase text-muted-foreground`,children:t.label}),(0,y.jsx)(`div`,{className:`mt-2 text-2xl font-semibold leading-tight`,children:typeof t.value==`number`?e(t.value):String(t.value??`-`)}),t.hint?(0,y.jsx)(`div`,{className:`mt-2 text-xs leading-5 text-muted-foreground`,children:t.hint}):null]},t.label))})}function M(e){return!!(e&&typeof e==`object`&&!Array.isArray(e))}function N(t){return t==null||t===``?`-`:typeof t==`number`?Number.isFinite(t)?e(t):`-`:typeof t==`boolean`?t?`Enabled`:`Disabled`:String(t)}var P=/(^id$|_id$|token|secret|passphrase|fingerprint|public_key|private_key|dsn|schema|endpoint|base_url|localhost|127\.0\.0\.1|stack|trace|raw|runtime|engine|module|port|host|api|internal)/i;function F(e){return P.test(e)}function I(e){let n=N(e);return n===`-`||n.includes(`/`)||n.includes(`@`)||/\.[a-z0-9]{2,5}$/i.test(n)?n:t(n.replace(/^agent:/i,``).replace(/^tool:/i,``))}function L(e){for(let t of[`documents`,`sources`,`items`,`agents`,`workflows`,`runs`,`events`,`permissions`,`models`,`peers`,`invitations`,`roles`,`policies`,`hooks`,`tools`,`templates`,`plugins`,`recent_events`]){let n=m(e[t]);if(n.length)return n}return[]}function R({value:n}){if(typeof n==`boolean`)return(0,y.jsx)(x,{variant:n?`success`:`muted`,children:n?`enabled`:`disabled`});if(Array.isArray(n))return n.length?n.every(e=>e===null||[`string`,`number`,`boolean`].includes(typeof e))?(0,y.jsxs)(`span`,{className:`flex flex-wrap gap-1`,children:[n.slice(0,5).map((e,t)=>(0,y.jsx)(x,{variant:`muted`,children:N(e)},`${String(e)}-${t}`)),n.length>5?(0,y.jsxs)(x,{variant:`muted`,children:[`+`,n.length-5]}):null]}):(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[e(n.length),` records`]}):(0,y.jsx)(`span`,{className:`text-muted-foreground`,children:`None`});if(M(n)){let e=Object.keys(n);return e.length?(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.slice(0,4).map(t).join(`, `),e.length>4?` +${e.length-4}`:``]}):(0,y.jsx)(`span`,{className:`text-muted-foreground`,children:`No fields`})}let r=N(n);return(0,y.jsx)(`span`,{className:`break-words`,children:r.length>96?s(r,96):r})}function z({data:e,limit:n=8}){let r=i(e=>e.mode),a=Object.entries(e||{}).filter(([e])=>r!==`basic`||!F(e)).slice(0,n);return a.length?(0,y.jsx)(`div`,{className:`divide-y divide-border rounded-md border border-border`,children:a.map(([e,n])=>(0,y.jsxs)(`div`,{className:`grid grid-cols-[minmax(9rem,0.5fr)_1fr] gap-3 p-3 text-sm`,children:[(0,y.jsx)(`span`,{className:`font-medium text-muted-foreground`,children:t(e)}),(0,y.jsx)(`span`,{className:`min-w-0 break-words`,children:(0,y.jsx)(R,{value:n})})]},e))}):(0,y.jsx)(O,{title:`No values`})}function B({value:e,titleKey:t=`title`,metaKey:n=`status`,limit:r=8}){return i(e=>e.mode)===`basic`?(0,y.jsx)(V,{value:e,titleKey:t,metaKey:n,limit:r}):Array.isArray(e)?e.length?e.every(e=>M(e))?(0,y.jsx)(U,{items:e,titleKey:t,metaKey:n,limit:r}):(0,y.jsxs)(`div`,{className:`flex flex-wrap gap-1 rounded-md border border-border bg-background p-3`,children:[e.slice(0,r).map((e,t)=>(0,y.jsx)(x,{variant:`muted`,children:N(e)},`${String(e)}-${t}`)),e.length>r?(0,y.jsxs)(x,{variant:`muted`,children:[`+`,e.length-r]}):null]}):(0,y.jsx)(O,{title:`Nothing here yet`,detail:`New items will appear here when Lattice has something to show.`}):M(e)?(0,y.jsx)(z,{data:e,limit:r}):(0,y.jsx)(`div`,{className:`rounded-md border border-border bg-background p-3 text-sm`,children:(0,y.jsx)(R,{value:e})})}function V({value:t,titleKey:n=`title`,metaKey:r=`status`,limit:i=6}){if(Array.isArray(t))return t.length?t.every(e=>M(e))?(0,y.jsx)(U,{items:t,titleKey:n,metaKey:r,limit:i}):(0,y.jsxs)(`div`,{className:`flex flex-wrap gap-1 rounded-md border border-border bg-background/55 p-3`,children:[t.slice(0,i).map((e,t)=>(0,y.jsx)(x,{variant:`muted`,children:I(e)},`${String(e)}-${t}`)),t.length>i?(0,y.jsxs)(x,{variant:`muted`,children:[`+`,t.length-i]}):null]}):(0,y.jsx)(O,{title:`Nothing here yet`,detail:`New items will appear here when Lattice has something to show.`});if(M(t)){let a=L(t);return a.length?(0,y.jsx)(U,{items:a,titleKey:n,metaKey:r,limit:i}):(0,y.jsx)(z,{data:Object.fromEntries(Object.entries(t).filter(([e])=>!F(e)).map(([t,n])=>[t,Array.isArray(n)?`${e(n.length)} items`:M(n)?`available`:n])),limit:i})}return(0,y.jsx)(`div`,{className:`rounded-md border border-border bg-background/55 p-3 text-sm`,children:I(t)})}function H({result:e,successLabel:t=`Request completed`}){let n=i(e=>e.mode);return e?e.ok?(0,y.jsxs)(`div`,{className:`space-y-2 rounded-md border border-border bg-background p-3`,children:[(0,y.jsx)(x,{variant:`success`,children:t}),n===`basic`?(0,y.jsx)(V,{value:e.data}):(0,y.jsx)(B,{value:e.data})]}):(0,y.jsx)(O,{title:`Request unavailable`,detail:e.error||(0,y.jsx)(R,{value:e.data})}):null}function U({items:e,titleKey:t=`title`,metaKey:n=`type`,limit:r=8}){let a=i(e=>e.mode),o=m(e).slice(0,r);return o.length?(0,y.jsx)(`div`,{className:`grid gap-2`,children:o.map((e,r)=>(0,y.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/55 p-3`,children:[(0,y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,y.jsx)(`div`,{className:`font-medium`,children:a===`basic`?I(e[t]||e.name||e.label||`Item ${r+1}`):String(e[t]||e.name||e.id||`Record ${r+1}`)}),(0,y.jsx)(x,{variant:`muted`,children:a===`basic`?I(e[n]||e.status||e.state||`ready`):String(e[n]||e.status||e.state||`record`)})]}),e.summary||e.description||e.path||e.id&&e[t]!==e.id?(0,y.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:String(e.summary||e.description||e.path||e.id)}):null,a!==`basic`&&e.id&&e[t]!==e.id?(0,y.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:s(e.id,48)}):null]},String(e.id||e.name||r)))}):(0,y.jsx)(O,{title:`Nothing here yet`,detail:`New items will appear here when Lattice has something to show.`})}function W({title:e=`Advanced controls`,detail:t=`Switch modes when you want diagnostics or administrative controls. Basic mode keeps the product focused on everyday use.`,target:n=`advanced`}){let r=i(e=>e.setMode);return(0,y.jsx)(S,{children:(0,y.jsxs)(E,{className:`flex flex-col items-start gap-3 p-6`,children:[(0,y.jsx)(`div`,{className:`grid h-10 w-10 place-items-center rounded-md border border-border bg-background/70`,children:(0,y.jsx)(_,{className:`h-5 w-5 text-primary`})}),(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`text-lg font-semibold`,children:e}),(0,y.jsx)(`p`,{className:`mt-1 max-w-2xl text-sm leading-6 text-muted-foreground`,children:t})]}),(0,y.jsx)(f,{onClick:()=>r(n),children:n===`admin`?`Switch to Admin Console`:`Switch to Advanced`})]})})}function G({label:e,successLabel:t=`Done`,action:n,invalidate:r,variant:i=`outline`,disabled:a}){let s=u(),[c,p]=v.useState(null),m=d({mutationFn:n,onSuccess:async e=>{p(e.ok?t:e.error||`Unavailable`),r&&await Promise.all(r.map(e=>s.invalidateQueries({queryKey:[e]})))}});return(0,y.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,y.jsxs)(f,{variant:i,disabled:a||m.isPending,onClick:()=>m.mutate(),children:[m.isPending?(0,y.jsx)(g,{className:`h-4 w-4 animate-spin`}):null,e]}),c?(0,y.jsxs)(`span`,{className:o(`inline-flex items-center gap-1 text-xs`,c===t?`text-emerald-300`:`text-amber-300`),children:[c===t?(0,y.jsx)(l,{className:`h-3.5 w-3.5`}):(0,y.jsx)(h,{className:`h-3.5 w-3.5`}),c]}):null]})}function K({tabs:e,value:t,onChange:n}){return(0,y.jsx)(`div`,{className:`inline-flex max-w-full flex-wrap gap-1 rounded-lg border border-border bg-muted/28 p-1`,children:e.map(e=>(0,y.jsx)(`button`,{onClick:()=>n(e.id),className:o(`h-9 rounded-md px-3.5 text-sm font-semibold transition`,t===e.id?`bg-card text-foreground shadow-sm`:`text-muted-foreground hover:bg-card/60 hover:text-foreground`),children:e.label},e.id))})}export{C as _,z as a,g as b,H as c,B as d,K as f,T as g,E as h,U as i,D as l,S as m,k as n,A as o,R as p,O as r,W as s,G as t,j as u,w as v,h as x,x as y};
2
+ //# sourceMappingURL=primitives-DcO2H3yh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"primitives-Bcm5lZRu.js","names":["__iconNode","__iconNode"],"sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-alert.mjs","../../../node_modules/lucide-react/dist/esm/icons/loader-circle.mjs","../../../node_modules/lucide-react/dist/esm/icons/lock-keyhole.mjs","../../../frontend/src/components/ui/badge.tsx","../../../frontend/src/components/ui/card.tsx","../../../frontend/src/components/primitives.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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]];\nconst LoaderCircle = createLucideIcon(\"loader-circle\", __iconNode);\n\nexport { __iconNode, LoaderCircle as default };\n//# sourceMappingURL=loader-circle.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"16\", r: \"1\", key: \"1au0dj\" }],\n [\"rect\", { x: \"3\", y: \"10\", width: \"18\", height: \"12\", rx: \"2\", key: \"6s8ecr\" }],\n [\"path\", { d: \"M7 10V7a5 5 0 0 1 10 0v3\", key: \"1pqi11\" }]\n];\nconst LockKeyhole = createLucideIcon(\"lock-keyhole\", __iconNode);\n\nexport { __iconNode, LockKeyhole as default };\n//# sourceMappingURL=lock-keyhole.mjs.map\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\ntype BadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n variant?: \"default\" | \"success\" | \"warning\" | \"muted\" | \"danger\";\n};\n\nconst variants = {\n default: \"border-primary/25 bg-primary/12 text-primary\",\n success: \"border-emerald-500/25 bg-emerald-500/12 text-emerald-300\",\n warning: \"border-amber-500/25 bg-amber-500/12 text-amber-300\",\n muted: \"border-border bg-muted/70 text-muted-foreground\",\n danger: \"border-destructive/30 bg-destructive/12 text-destructive\",\n};\n\nexport function Badge({ className, variant = \"default\", ...props }: BadgeProps) {\n return (\n <span\n className={cn(\n \"inline-flex min-h-6 max-w-full items-center rounded-md border px-2 py-0.5 text-xs font-semibold leading-none\",\n variants[variant],\n className,\n )}\n {...props}\n />\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <section className={cn(\"premium-surface rounded-lg text-card-foreground\", className)} {...props} />;\n}\n\nexport function CardHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"flex flex-col gap-1.5 p-5\", className)} {...props} />;\n}\n\nexport function CardTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return <h2 className={cn(\"text-base font-semibold tracking-normal\", className)} {...props} />;\n}\n\nexport function CardDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return <p className={cn(\"text-sm leading-6 text-muted-foreground\", className)} {...props} />;\n}\n\nexport function CardContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"p-5 pt-0\", className)} {...props} />;\n}\n","import * as React from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { AlertCircle, CheckCircle2, Loader2, LockKeyhole, Sparkles } from \"lucide-react\";\nimport type { ApiResult } from \"@/api/client\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { useAppStore } from \"@/store/appStore\";\nimport { cn, asArray, fmtNumber, shortId, titleize } from \"@/lib/utils\";\n\nexport function SourceBadge({ result }: { result?: Pick<ApiResult, \"source\" | \"ok\" | \"status\"> }) {\n const mode = useAppStore((state) => state.mode);\n if (!result) return <Badge variant=\"muted\">not loaded</Badge>;\n if (result.source === \"live\" && result.ok) return <Badge variant=\"success\">{mode === \"basic\" ? \"ready\" : \"connected\"}</Badge>;\n return <Badge variant=\"warning\">{mode === \"basic\" ? \"needs setup\" : \"unavailable\"}</Badge>;\n}\n\nexport function EmptyState({ title = \"Unavailable\", detail }: { title?: string; detail?: React.ReactNode }) {\n return (\n <div className=\"flex min-h-36 flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border bg-muted/24 p-6 text-center text-sm text-muted-foreground\">\n <div className=\"grid h-10 w-10 place-items-center rounded-md border border-border bg-card\">\n <Sparkles className=\"h-5 w-5 text-primary\" />\n </div>\n <div className=\"text-base font-semibold text-foreground\">{title}</div>\n {detail ? <div className=\"max-w-md leading-6\">{detail}</div> : null}\n </div>\n );\n}\n\nexport function DataPanel<T>({\n title,\n description,\n result,\n children,\n className,\n}: {\n title: string;\n description?: string;\n result?: ApiResult<T>;\n children: (data: T) => React.ReactNode;\n className?: string;\n}) {\n const mode = useAppStore((state) => state.mode);\n return (\n <Card className={cn(\"overflow-hidden\", className)}>\n <CardHeader className=\"flex-row items-start justify-between gap-3\">\n <div>\n <CardTitle>{title}</CardTitle>\n {description ? <CardDescription>{description}</CardDescription> : null}\n </div>\n <SourceBadge result={result} />\n </CardHeader>\n <CardContent>\n {result?.ok ? children(result.data) : (\n <EmptyState detail={mode === \"basic\" ? \"This area needs setup or is not available yet.\" : result?.error || \"This capability is not reporting right now.\"} />\n )}\n </CardContent>\n </Card>\n );\n}\n\nexport function LoadingPanel({ title }: { title: string }) {\n return (\n <Card>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" /> Loading\n </div>\n </CardContent>\n </Card>\n );\n}\n\nexport function StatGrid({ stats }: { stats: Array<{ label: string; value: unknown; hint?: string }> }) {\n return (\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-4\">\n {stats.map((stat) => (\n <div key={stat.label} className=\"rounded-lg border border-border bg-background/55 p-4\">\n <div className=\"text-xs uppercase text-muted-foreground\">{stat.label}</div>\n <div className=\"mt-2 text-2xl font-semibold leading-tight\">{typeof stat.value === \"number\" ? fmtNumber(stat.value) : String(stat.value ?? \"-\")}</div>\n {stat.hint ? <div className=\"mt-2 text-xs leading-5 text-muted-foreground\">{stat.hint}</div> : null}\n </div>\n ))}\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 scalarText(value: unknown) {\n if (value === null || value === undefined || value === \"\") return \"-\";\n if (typeof value === \"number\") return Number.isFinite(value) ? fmtNumber(value) : \"-\";\n if (typeof value === \"boolean\") return value ? \"Enabled\" : \"Disabled\";\n return String(value);\n}\n\nconst BASIC_HIDDEN_KEY = /(^id$|_id$|token|secret|passphrase|fingerprint|public_key|private_key|dsn|schema|endpoint|base_url|localhost|127\\.0\\.0\\.1|stack|trace|raw|runtime|engine|module|port|host|api|internal)/i;\n\nfunction hideInBasic(key: string) {\n return BASIC_HIDDEN_KEY.test(key);\n}\n\nfunction humanText(value: unknown) {\n const text = scalarText(value);\n if (text === \"-\") return text;\n if (text.includes(\"/\") || text.includes(\"@\") || /\\.[a-z0-9]{2,5}$/i.test(text)) return text;\n return titleize(text.replace(/^agent:/i, \"\").replace(/^tool:/i, \"\"));\n}\n\nfunction firstRecordList(value: Record<string, unknown>) {\n const preferred = [\n \"documents\", \"sources\", \"items\", \"agents\", \"workflows\", \"runs\", \"events\",\n \"permissions\", \"models\", \"peers\", \"invitations\", \"roles\", \"policies\",\n \"hooks\", \"tools\", \"templates\", \"plugins\", \"recent_events\",\n ];\n for (const key of preferred) {\n const rows = asArray<Record<string, unknown>>(value[key]);\n if (rows.length) return rows;\n }\n return [];\n}\n\nexport function ValuePreview({ value }: { value: unknown }) {\n if (typeof value === \"boolean\") {\n return <Badge variant={value ? \"success\" : \"muted\"}>{value ? \"enabled\" : \"disabled\"}</Badge>;\n }\n if (Array.isArray(value)) {\n if (!value.length) return <span className=\"text-muted-foreground\">None</span>;\n const primitive = value.every((item) => item === null || [\"string\", \"number\", \"boolean\"].includes(typeof item));\n if (primitive) {\n return (\n <span className=\"flex flex-wrap gap-1\">\n {value.slice(0, 5).map((item, index) => <Badge key={`${String(item)}-${index}`} variant=\"muted\">{scalarText(item)}</Badge>)}\n {value.length > 5 ? <Badge variant=\"muted\">+{value.length - 5}</Badge> : null}\n </span>\n );\n }\n return <span className=\"text-muted-foreground\">{fmtNumber(value.length)} records</span>;\n }\n if (isRecord(value)) {\n const keys = Object.keys(value);\n if (!keys.length) return <span className=\"text-muted-foreground\">No fields</span>;\n return <span className=\"text-muted-foreground\">{keys.slice(0, 4).map(titleize).join(\", \")}{keys.length > 4 ? ` +${keys.length - 4}` : \"\"}</span>;\n }\n const text = scalarText(value);\n return <span className=\"break-words\">{text.length > 96 ? shortId(text, 96) : text}</span>;\n}\n\nexport function KeyValueList({ data, limit = 8 }: { data: Record<string, unknown>; limit?: number }) {\n const mode = useAppStore((state) => state.mode);\n const rows = Object.entries(data || {})\n .filter(([key]) => mode !== \"basic\" || !hideInBasic(key))\n .slice(0, limit);\n if (!rows.length) return <EmptyState title=\"No values\" />;\n return (\n <div className=\"divide-y divide-border rounded-md border border-border\">\n {rows.map(([key, value]) => (\n <div key={key} className=\"grid grid-cols-[minmax(9rem,0.5fr)_1fr] gap-3 p-3 text-sm\">\n <span className=\"font-medium text-muted-foreground\">{titleize(key)}</span>\n <span className=\"min-w-0 break-words\"><ValuePreview value={value} /></span>\n </div>\n ))}\n </div>\n );\n}\n\nexport function StructuredView({\n value,\n titleKey = \"title\",\n metaKey = \"status\",\n limit = 8,\n}: {\n value: unknown;\n titleKey?: string;\n metaKey?: string;\n limit?: number;\n}) {\n const mode = useAppStore((state) => state.mode);\n if (mode === \"basic\") return <FriendlySummary value={value} titleKey={titleKey} metaKey={metaKey} limit={limit} />;\n if (Array.isArray(value)) {\n if (!value.length) return <EmptyState title=\"Nothing here yet\" detail=\"New items will appear here when Lattice has something to show.\" />;\n if (value.every((item) => isRecord(item))) {\n return <EntityList items={value} titleKey={titleKey} metaKey={metaKey} limit={limit} />;\n }\n return (\n <div className=\"flex flex-wrap gap-1 rounded-md border border-border bg-background p-3\">\n {value.slice(0, limit).map((item, index) => <Badge key={`${String(item)}-${index}`} variant=\"muted\">{scalarText(item)}</Badge>)}\n {value.length > limit ? <Badge variant=\"muted\">+{value.length - limit}</Badge> : null}\n </div>\n );\n }\n if (isRecord(value)) return <KeyValueList data={value} limit={limit} />;\n return (\n <div className=\"rounded-md border border-border bg-background p-3 text-sm\">\n <ValuePreview value={value} />\n </div>\n );\n}\n\nexport function FriendlySummary({\n value,\n titleKey = \"title\",\n metaKey = \"status\",\n limit = 6,\n}: {\n value: unknown;\n titleKey?: string;\n metaKey?: string;\n limit?: number;\n}) {\n if (Array.isArray(value)) {\n if (!value.length) return <EmptyState title=\"Nothing here yet\" detail=\"New items will appear here when Lattice has something to show.\" />;\n if (value.every((item) => isRecord(item))) {\n return <EntityList items={value} titleKey={titleKey} metaKey={metaKey} limit={limit} />;\n }\n return (\n <div className=\"flex flex-wrap gap-1 rounded-md border border-border bg-background/55 p-3\">\n {value.slice(0, limit).map((item, index) => <Badge key={`${String(item)}-${index}`} variant=\"muted\">{humanText(item)}</Badge>)}\n {value.length > limit ? <Badge variant=\"muted\">+{value.length - limit}</Badge> : null}\n </div>\n );\n }\n if (isRecord(value)) {\n const list = firstRecordList(value);\n if (list.length) return <EntityList items={list} titleKey={titleKey} metaKey={metaKey} limit={limit} />;\n const friendly = Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => !hideInBasic(key))\n .map(([key, item]) => [key, Array.isArray(item) ? `${fmtNumber(item.length)} items` : isRecord(item) ? \"available\" : item]),\n );\n return <KeyValueList data={friendly} limit={limit} />;\n }\n return (\n <div className=\"rounded-md border border-border bg-background/55 p-3 text-sm\">\n {humanText(value)}\n </div>\n );\n}\n\nexport function OperationResult({\n result,\n successLabel = \"Request completed\",\n}: {\n result?: ApiResult<unknown> | null;\n successLabel?: string;\n}) {\n const mode = useAppStore((state) => state.mode);\n if (!result) return null;\n if (!result.ok) {\n return <EmptyState title=\"Request unavailable\" detail={result.error || <ValuePreview value={result.data} />} />;\n }\n return (\n <div className=\"space-y-2 rounded-md border border-border bg-background p-3\">\n <Badge variant=\"success\">{successLabel}</Badge>\n {mode === \"basic\" ? <FriendlySummary value={result.data} /> : <StructuredView value={result.data} />}\n </div>\n );\n}\n\nexport function EntityList({\n items,\n titleKey = \"title\",\n metaKey = \"type\",\n limit = 8,\n}: {\n items: unknown;\n titleKey?: string;\n metaKey?: string;\n limit?: number;\n}) {\n const mode = useAppStore((state) => state.mode);\n const rows = asArray<Record<string, unknown>>(items).slice(0, limit);\n if (!rows.length) return <EmptyState title=\"Nothing here yet\" detail=\"New items will appear here when Lattice has something to show.\" />;\n return (\n <div className=\"grid gap-2\">\n {rows.map((item, index) => (\n <div key={String(item.id || item.name || index)} className=\"rounded-lg border border-border bg-background/55 p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"font-medium\">{mode === \"basic\" ? humanText(item[titleKey] || item.name || item.label || `Item ${index + 1}`) : String(item[titleKey] || item.name || item.id || `Record ${index + 1}`)}</div>\n <Badge variant=\"muted\">{mode === \"basic\" ? humanText(item[metaKey] || item.status || item.state || \"ready\") : String(item[metaKey] || item.status || item.state || \"record\")}</Badge>\n </div>\n {item.summary || item.description || item.path || (item.id && item[titleKey] !== item.id) ? (\n <p className=\"mt-1 text-sm text-muted-foreground\">{String(item.summary || item.description || item.path || item.id)}</p>\n ) : null}\n {mode !== \"basic\" && item.id && item[titleKey] !== item.id ? (\n <div className=\"mt-1 text-xs text-muted-foreground\">{shortId(item.id, 48)}</div>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n\nexport function ModeGate({\n title = \"Advanced controls\",\n detail = \"Switch modes when you want diagnostics or administrative controls. Basic mode keeps the product focused on everyday use.\",\n target = \"advanced\",\n}: {\n title?: string;\n detail?: string;\n target?: \"advanced\" | \"admin\";\n}) {\n const setMode = useAppStore((state) => state.setMode);\n return (\n <Card>\n <CardContent className=\"flex flex-col items-start gap-3 p-6\">\n <div className=\"grid h-10 w-10 place-items-center rounded-md border border-border bg-background/70\">\n <LockKeyhole className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <div className=\"text-lg font-semibold\">{title}</div>\n <p className=\"mt-1 max-w-2xl text-sm leading-6 text-muted-foreground\">{detail}</p>\n </div>\n <Button onClick={() => setMode(target)}>{target === \"admin\" ? \"Switch to Admin Console\" : \"Switch to Advanced\"}</Button>\n </CardContent>\n </Card>\n );\n}\n\nexport function ActionButton({\n label,\n successLabel = \"Done\",\n action,\n invalidate,\n variant = \"outline\",\n disabled,\n}: {\n label: string;\n successLabel?: string;\n action: () => Promise<ApiResult<unknown>>;\n invalidate?: string[];\n variant?: React.ComponentProps<typeof Button>[\"variant\"];\n disabled?: boolean;\n}) {\n const qc = useQueryClient();\n const [result, setResult] = React.useState<string | null>(null);\n const mut = useMutation({\n mutationFn: action,\n onSuccess: async (res) => {\n setResult(res.ok ? successLabel : res.error || \"Unavailable\");\n if (invalidate) {\n await Promise.all(invalidate.map((key) => qc.invalidateQueries({ queryKey: [key] })));\n }\n },\n });\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant={variant} disabled={disabled || mut.isPending} onClick={() => mut.mutate()}>\n {mut.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : null}\n {label}\n </Button>\n {result ? (\n <span className={cn(\"inline-flex items-center gap-1 text-xs\", result === successLabel ? \"text-emerald-300\" : \"text-amber-300\")}>\n {result === successLabel ? <CheckCircle2 className=\"h-3.5 w-3.5\" /> : <AlertCircle className=\"h-3.5 w-3.5\" />}\n {result}\n </span>\n ) : null}\n </div>\n );\n}\n\nexport function Tabs({\n tabs,\n value,\n onChange,\n}: {\n tabs: Array<{ id: string; label: string }>;\n value: string;\n onChange: (id: string) => void;\n}) {\n return (\n <div className=\"inline-flex max-w-full flex-wrap gap-1 rounded-lg border border-border bg-muted/28 p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"h-9 rounded-md px-3.5 text-sm font-semibold transition\",\n value === tab.id ? \"bg-card text-foreground shadow-sm\" : \"text-muted-foreground hover:bg-card/60 hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
1
+ {"version":3,"file":"primitives-DcO2H3yh.js","names":["__iconNode","__iconNode"],"sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-alert.mjs","../../../node_modules/lucide-react/dist/esm/icons/loader-circle.mjs","../../../node_modules/lucide-react/dist/esm/icons/lock-keyhole.mjs","../../../frontend/src/components/ui/badge.tsx","../../../frontend/src/components/ui/card.tsx","../../../frontend/src/components/primitives.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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]];\nconst LoaderCircle = createLucideIcon(\"loader-circle\", __iconNode);\n\nexport { __iconNode, LoaderCircle as default };\n//# sourceMappingURL=loader-circle.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"16\", r: \"1\", key: \"1au0dj\" }],\n [\"rect\", { x: \"3\", y: \"10\", width: \"18\", height: \"12\", rx: \"2\", key: \"6s8ecr\" }],\n [\"path\", { d: \"M7 10V7a5 5 0 0 1 10 0v3\", key: \"1pqi11\" }]\n];\nconst LockKeyhole = createLucideIcon(\"lock-keyhole\", __iconNode);\n\nexport { __iconNode, LockKeyhole as default };\n//# sourceMappingURL=lock-keyhole.mjs.map\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\ntype BadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n variant?: \"default\" | \"success\" | \"warning\" | \"muted\" | \"danger\";\n};\n\nconst variants = {\n default: \"border-primary/25 bg-primary/12 text-primary\",\n success: \"border-emerald-500/25 bg-emerald-500/12 text-emerald-300\",\n warning: \"border-amber-500/25 bg-amber-500/12 text-amber-300\",\n muted: \"border-border bg-muted/70 text-muted-foreground\",\n danger: \"border-destructive/30 bg-destructive/12 text-destructive\",\n};\n\nexport function Badge({ className, variant = \"default\", ...props }: BadgeProps) {\n return (\n <span\n className={cn(\n \"inline-flex min-h-6 max-w-full items-center rounded-md border px-2 py-0.5 text-xs font-semibold leading-none\",\n variants[variant],\n className,\n )}\n {...props}\n />\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <section className={cn(\"premium-surface rounded-lg text-card-foreground\", className)} {...props} />;\n}\n\nexport function CardHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"flex flex-col gap-1.5 p-5\", className)} {...props} />;\n}\n\nexport function CardTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return <h2 className={cn(\"text-base font-semibold tracking-normal\", className)} {...props} />;\n}\n\nexport function CardDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return <p className={cn(\"text-sm leading-6 text-muted-foreground\", className)} {...props} />;\n}\n\nexport function CardContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"p-5 pt-0\", className)} {...props} />;\n}\n","import * as React from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { AlertCircle, CheckCircle2, Loader2, LockKeyhole, Sparkles } from \"lucide-react\";\nimport type { ApiResult } from \"@/api/client\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { useAppStore } from \"@/store/appStore\";\nimport { cn, asArray, fmtNumber, shortId, titleize } from \"@/lib/utils\";\n\nexport function SourceBadge({ result }: { result?: Pick<ApiResult, \"source\" | \"ok\" | \"status\"> }) {\n const mode = useAppStore((state) => state.mode);\n if (!result) return <Badge variant=\"muted\">not loaded</Badge>;\n if (result.source === \"live\" && result.ok) return <Badge variant=\"success\">{mode === \"basic\" ? \"ready\" : \"connected\"}</Badge>;\n return <Badge variant=\"warning\">{mode === \"basic\" ? \"needs setup\" : \"unavailable\"}</Badge>;\n}\n\nexport function EmptyState({ title = \"Unavailable\", detail }: { title?: string; detail?: React.ReactNode }) {\n return (\n <div className=\"flex min-h-36 flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border bg-muted/24 p-6 text-center text-sm text-muted-foreground\">\n <div className=\"grid h-10 w-10 place-items-center rounded-md border border-border bg-card\">\n <Sparkles className=\"h-5 w-5 text-primary\" />\n </div>\n <div className=\"text-base font-semibold text-foreground\">{title}</div>\n {detail ? <div className=\"max-w-md leading-6\">{detail}</div> : null}\n </div>\n );\n}\n\nexport function DataPanel<T>({\n title,\n description,\n result,\n children,\n className,\n}: {\n title: string;\n description?: string;\n result?: ApiResult<T>;\n children: (data: T) => React.ReactNode;\n className?: string;\n}) {\n const mode = useAppStore((state) => state.mode);\n return (\n <Card className={cn(\"overflow-hidden\", className)}>\n <CardHeader className=\"flex-row items-start justify-between gap-3\">\n <div>\n <CardTitle>{title}</CardTitle>\n {description ? <CardDescription>{description}</CardDescription> : null}\n </div>\n <SourceBadge result={result} />\n </CardHeader>\n <CardContent>\n {result?.ok ? children(result.data) : (\n <EmptyState detail={mode === \"basic\" ? \"This area needs setup or is not available yet.\" : result?.error || \"This capability is not reporting right now.\"} />\n )}\n </CardContent>\n </Card>\n );\n}\n\nexport function LoadingPanel({ title }: { title: string }) {\n return (\n <Card>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" /> Loading\n </div>\n </CardContent>\n </Card>\n );\n}\n\nexport function StatGrid({ stats }: { stats: Array<{ label: string; value: unknown; hint?: string }> }) {\n return (\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-4\">\n {stats.map((stat) => (\n <div key={stat.label} className=\"rounded-lg border border-border bg-background/55 p-4\">\n <div className=\"text-xs uppercase text-muted-foreground\">{stat.label}</div>\n <div className=\"mt-2 text-2xl font-semibold leading-tight\">{typeof stat.value === \"number\" ? fmtNumber(stat.value) : String(stat.value ?? \"-\")}</div>\n {stat.hint ? <div className=\"mt-2 text-xs leading-5 text-muted-foreground\">{stat.hint}</div> : null}\n </div>\n ))}\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 scalarText(value: unknown) {\n if (value === null || value === undefined || value === \"\") return \"-\";\n if (typeof value === \"number\") return Number.isFinite(value) ? fmtNumber(value) : \"-\";\n if (typeof value === \"boolean\") return value ? \"Enabled\" : \"Disabled\";\n return String(value);\n}\n\nconst BASIC_HIDDEN_KEY = /(^id$|_id$|token|secret|passphrase|fingerprint|public_key|private_key|dsn|schema|endpoint|base_url|localhost|127\\.0\\.0\\.1|stack|trace|raw|runtime|engine|module|port|host|api|internal)/i;\n\nfunction hideInBasic(key: string) {\n return BASIC_HIDDEN_KEY.test(key);\n}\n\nfunction humanText(value: unknown) {\n const text = scalarText(value);\n if (text === \"-\") return text;\n if (text.includes(\"/\") || text.includes(\"@\") || /\\.[a-z0-9]{2,5}$/i.test(text)) return text;\n return titleize(text.replace(/^agent:/i, \"\").replace(/^tool:/i, \"\"));\n}\n\nfunction firstRecordList(value: Record<string, unknown>) {\n const preferred = [\n \"documents\", \"sources\", \"items\", \"agents\", \"workflows\", \"runs\", \"events\",\n \"permissions\", \"models\", \"peers\", \"invitations\", \"roles\", \"policies\",\n \"hooks\", \"tools\", \"templates\", \"plugins\", \"recent_events\",\n ];\n for (const key of preferred) {\n const rows = asArray<Record<string, unknown>>(value[key]);\n if (rows.length) return rows;\n }\n return [];\n}\n\nexport function ValuePreview({ value }: { value: unknown }) {\n if (typeof value === \"boolean\") {\n return <Badge variant={value ? \"success\" : \"muted\"}>{value ? \"enabled\" : \"disabled\"}</Badge>;\n }\n if (Array.isArray(value)) {\n if (!value.length) return <span className=\"text-muted-foreground\">None</span>;\n const primitive = value.every((item) => item === null || [\"string\", \"number\", \"boolean\"].includes(typeof item));\n if (primitive) {\n return (\n <span className=\"flex flex-wrap gap-1\">\n {value.slice(0, 5).map((item, index) => <Badge key={`${String(item)}-${index}`} variant=\"muted\">{scalarText(item)}</Badge>)}\n {value.length > 5 ? <Badge variant=\"muted\">+{value.length - 5}</Badge> : null}\n </span>\n );\n }\n return <span className=\"text-muted-foreground\">{fmtNumber(value.length)} records</span>;\n }\n if (isRecord(value)) {\n const keys = Object.keys(value);\n if (!keys.length) return <span className=\"text-muted-foreground\">No fields</span>;\n return <span className=\"text-muted-foreground\">{keys.slice(0, 4).map(titleize).join(\", \")}{keys.length > 4 ? ` +${keys.length - 4}` : \"\"}</span>;\n }\n const text = scalarText(value);\n return <span className=\"break-words\">{text.length > 96 ? shortId(text, 96) : text}</span>;\n}\n\nexport function KeyValueList({ data, limit = 8 }: { data: Record<string, unknown>; limit?: number }) {\n const mode = useAppStore((state) => state.mode);\n const rows = Object.entries(data || {})\n .filter(([key]) => mode !== \"basic\" || !hideInBasic(key))\n .slice(0, limit);\n if (!rows.length) return <EmptyState title=\"No values\" />;\n return (\n <div className=\"divide-y divide-border rounded-md border border-border\">\n {rows.map(([key, value]) => (\n <div key={key} className=\"grid grid-cols-[minmax(9rem,0.5fr)_1fr] gap-3 p-3 text-sm\">\n <span className=\"font-medium text-muted-foreground\">{titleize(key)}</span>\n <span className=\"min-w-0 break-words\"><ValuePreview value={value} /></span>\n </div>\n ))}\n </div>\n );\n}\n\nexport function StructuredView({\n value,\n titleKey = \"title\",\n metaKey = \"status\",\n limit = 8,\n}: {\n value: unknown;\n titleKey?: string;\n metaKey?: string;\n limit?: number;\n}) {\n const mode = useAppStore((state) => state.mode);\n if (mode === \"basic\") return <FriendlySummary value={value} titleKey={titleKey} metaKey={metaKey} limit={limit} />;\n if (Array.isArray(value)) {\n if (!value.length) return <EmptyState title=\"Nothing here yet\" detail=\"New items will appear here when Lattice has something to show.\" />;\n if (value.every((item) => isRecord(item))) {\n return <EntityList items={value} titleKey={titleKey} metaKey={metaKey} limit={limit} />;\n }\n return (\n <div className=\"flex flex-wrap gap-1 rounded-md border border-border bg-background p-3\">\n {value.slice(0, limit).map((item, index) => <Badge key={`${String(item)}-${index}`} variant=\"muted\">{scalarText(item)}</Badge>)}\n {value.length > limit ? <Badge variant=\"muted\">+{value.length - limit}</Badge> : null}\n </div>\n );\n }\n if (isRecord(value)) return <KeyValueList data={value} limit={limit} />;\n return (\n <div className=\"rounded-md border border-border bg-background p-3 text-sm\">\n <ValuePreview value={value} />\n </div>\n );\n}\n\nexport function FriendlySummary({\n value,\n titleKey = \"title\",\n metaKey = \"status\",\n limit = 6,\n}: {\n value: unknown;\n titleKey?: string;\n metaKey?: string;\n limit?: number;\n}) {\n if (Array.isArray(value)) {\n if (!value.length) return <EmptyState title=\"Nothing here yet\" detail=\"New items will appear here when Lattice has something to show.\" />;\n if (value.every((item) => isRecord(item))) {\n return <EntityList items={value} titleKey={titleKey} metaKey={metaKey} limit={limit} />;\n }\n return (\n <div className=\"flex flex-wrap gap-1 rounded-md border border-border bg-background/55 p-3\">\n {value.slice(0, limit).map((item, index) => <Badge key={`${String(item)}-${index}`} variant=\"muted\">{humanText(item)}</Badge>)}\n {value.length > limit ? <Badge variant=\"muted\">+{value.length - limit}</Badge> : null}\n </div>\n );\n }\n if (isRecord(value)) {\n const list = firstRecordList(value);\n if (list.length) return <EntityList items={list} titleKey={titleKey} metaKey={metaKey} limit={limit} />;\n const friendly = Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => !hideInBasic(key))\n .map(([key, item]) => [key, Array.isArray(item) ? `${fmtNumber(item.length)} items` : isRecord(item) ? \"available\" : item]),\n );\n return <KeyValueList data={friendly} limit={limit} />;\n }\n return (\n <div className=\"rounded-md border border-border bg-background/55 p-3 text-sm\">\n {humanText(value)}\n </div>\n );\n}\n\nexport function OperationResult({\n result,\n successLabel = \"Request completed\",\n}: {\n result?: ApiResult<unknown> | null;\n successLabel?: string;\n}) {\n const mode = useAppStore((state) => state.mode);\n if (!result) return null;\n if (!result.ok) {\n return <EmptyState title=\"Request unavailable\" detail={result.error || <ValuePreview value={result.data} />} />;\n }\n return (\n <div className=\"space-y-2 rounded-md border border-border bg-background p-3\">\n <Badge variant=\"success\">{successLabel}</Badge>\n {mode === \"basic\" ? <FriendlySummary value={result.data} /> : <StructuredView value={result.data} />}\n </div>\n );\n}\n\nexport function EntityList({\n items,\n titleKey = \"title\",\n metaKey = \"type\",\n limit = 8,\n}: {\n items: unknown;\n titleKey?: string;\n metaKey?: string;\n limit?: number;\n}) {\n const mode = useAppStore((state) => state.mode);\n const rows = asArray<Record<string, unknown>>(items).slice(0, limit);\n if (!rows.length) return <EmptyState title=\"Nothing here yet\" detail=\"New items will appear here when Lattice has something to show.\" />;\n return (\n <div className=\"grid gap-2\">\n {rows.map((item, index) => (\n <div key={String(item.id || item.name || index)} className=\"rounded-lg border border-border bg-background/55 p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"font-medium\">{mode === \"basic\" ? humanText(item[titleKey] || item.name || item.label || `Item ${index + 1}`) : String(item[titleKey] || item.name || item.id || `Record ${index + 1}`)}</div>\n <Badge variant=\"muted\">{mode === \"basic\" ? humanText(item[metaKey] || item.status || item.state || \"ready\") : String(item[metaKey] || item.status || item.state || \"record\")}</Badge>\n </div>\n {item.summary || item.description || item.path || (item.id && item[titleKey] !== item.id) ? (\n <p className=\"mt-1 text-sm text-muted-foreground\">{String(item.summary || item.description || item.path || item.id)}</p>\n ) : null}\n {mode !== \"basic\" && item.id && item[titleKey] !== item.id ? (\n <div className=\"mt-1 text-xs text-muted-foreground\">{shortId(item.id, 48)}</div>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n\nexport function ModeGate({\n title = \"Advanced controls\",\n detail = \"Switch modes when you want diagnostics or administrative controls. Basic mode keeps the product focused on everyday use.\",\n target = \"advanced\",\n}: {\n title?: string;\n detail?: string;\n target?: \"advanced\" | \"admin\";\n}) {\n const setMode = useAppStore((state) => state.setMode);\n return (\n <Card>\n <CardContent className=\"flex flex-col items-start gap-3 p-6\">\n <div className=\"grid h-10 w-10 place-items-center rounded-md border border-border bg-background/70\">\n <LockKeyhole className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <div className=\"text-lg font-semibold\">{title}</div>\n <p className=\"mt-1 max-w-2xl text-sm leading-6 text-muted-foreground\">{detail}</p>\n </div>\n <Button onClick={() => setMode(target)}>{target === \"admin\" ? \"Switch to Admin Console\" : \"Switch to Advanced\"}</Button>\n </CardContent>\n </Card>\n );\n}\n\nexport function ActionButton({\n label,\n successLabel = \"Done\",\n action,\n invalidate,\n variant = \"outline\",\n disabled,\n}: {\n label: string;\n successLabel?: string;\n action: () => Promise<ApiResult<unknown>>;\n invalidate?: string[];\n variant?: React.ComponentProps<typeof Button>[\"variant\"];\n disabled?: boolean;\n}) {\n const qc = useQueryClient();\n const [result, setResult] = React.useState<string | null>(null);\n const mut = useMutation({\n mutationFn: action,\n onSuccess: async (res) => {\n setResult(res.ok ? successLabel : res.error || \"Unavailable\");\n if (invalidate) {\n await Promise.all(invalidate.map((key) => qc.invalidateQueries({ queryKey: [key] })));\n }\n },\n });\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant={variant} disabled={disabled || mut.isPending} onClick={() => mut.mutate()}>\n {mut.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : null}\n {label}\n </Button>\n {result ? (\n <span className={cn(\"inline-flex items-center gap-1 text-xs\", result === successLabel ? \"text-emerald-300\" : \"text-amber-300\")}>\n {result === successLabel ? <CheckCircle2 className=\"h-3.5 w-3.5\" /> : <AlertCircle className=\"h-3.5 w-3.5\" />}\n {result}\n </span>\n ) : null}\n </div>\n );\n}\n\nexport function Tabs({\n tabs,\n value,\n onChange,\n}: {\n tabs: Array<{ id: string; label: string }>;\n value: string;\n onChange: (id: string) => void;\n}) {\n return (\n <div className=\"inline-flex max-w-full flex-wrap gap-1 rounded-lg border border-border bg-muted/28 p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"h-9 rounded-md px-3.5 text-sm font-semibold transition\",\n value === tab.id ? \"bg-card text-foreground shadow-sm\" : \"text-muted-foreground hover:bg-card/60 hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{A as e,M as t,P as n,b as r}from"./index-C950aES_.js";var i=n(t()),a=e(),o=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`textarea`,{ref:n,className:r(`min-h-28 w-full resize-y rounded-md border border-input bg-background/70 px-3 py-3 text-sm leading-6 outline-none transition placeholder:text-muted-foreground focus:border-ring focus:ring-2 focus:ring-ring/35 disabled:cursor-not-allowed disabled:opacity-50`,e),...t}));o.displayName=`Textarea`;export{o as t};
2
- //# sourceMappingURL=textarea-C2PLu6_O.js.map
1
+ import{I as e,M as t,P as n,S as r}from"./index-C-7aHabu.js";var i=e(n()),a=t(),o=i.forwardRef(({className:e,...t},n)=>(0,a.jsx)(`textarea`,{ref:n,className:r(`min-h-28 w-full resize-y rounded-md border border-input bg-background/70 px-3 py-3 text-sm leading-6 outline-none transition placeholder:text-muted-foreground focus:border-ring focus:ring-2 focus:ring-ring/35 disabled:cursor-not-allowed disabled:opacity-50`,e),...t}));o.displayName=`Textarea`;export{o as t};
2
+ //# sourceMappingURL=textarea-DR2Tyy_6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"textarea-C2PLu6_O.js","names":[],"sources":["../../../frontend/src/components/ui/textarea.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, React.TextareaHTMLAttributes<HTMLTextAreaElement>>(\n ({ className, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n \"min-h-28 w-full resize-y rounded-md border border-input bg-background/70 px-3 py-3 text-sm leading-6 outline-none transition placeholder:text-muted-foreground focus:border-ring focus:ring-2 focus:ring-ring/35 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n ),\n);\nTextarea.displayName = \"Textarea\";\n"],"mappings":"gFAGa,EAAA,EAAiB,YAC3B,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,KAAC,WAAD,CACO,MACL,UAAW,EACT,mQACA,CACF,EACA,GAAI,CACL,CAAA,CAEL,EACA,EAAS,YAAc"}
1
+ {"version":3,"file":"textarea-DR2Tyy_6.js","names":[],"sources":["../../../frontend/src/components/ui/textarea.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, React.TextareaHTMLAttributes<HTMLTextAreaElement>>(\n ({ className, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n \"min-h-28 w-full resize-y rounded-md border border-input bg-background/70 px-3 py-3 text-sm leading-6 outline-none transition placeholder:text-muted-foreground focus:border-ring focus:ring-2 focus:ring-ring/35 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n ),\n);\nTextarea.displayName = \"Textarea\";\n"],"mappings":"gFAGa,EAAA,EAAiB,YAC3B,CAAE,YAAW,GAAG,GAAS,KACxB,EAAA,EAAA,KAAC,WAAD,CACO,MACL,UAAW,EACT,mQACA,CACF,EACA,GAAI,CACL,CAAA,CAEL,EACA,EAAS,YAAc"}
@@ -15,8 +15,8 @@
15
15
  } catch (e) {}
16
16
  })();
17
17
  </script>
18
- <script type="module" crossorigin src="/static/app/assets/index-C950aES_.js"></script>
19
- <link rel="stylesheet" crossorigin href="/static/app/assets/index-ztppMg0c.css">
18
+ <script type="module" crossorigin src="/static/app/assets/index-C-7aHabu.js"></script>
19
+ <link rel="stylesheet" crossorigin href="/static/app/assets/index-DKFpn5Kn.css">
20
20
  </head>
21
21
  <body>
22
22
  <div id="root"></div>
@@ -1,2 +0,0 @@
1
- import{_ as e,b as t,c as n,d as r,f as i,g as a,h as o,i as s,m as c,n as l,t as u,v as d,x as f}from"./primitives-Bcm5lZRu.js";import{A as p,D as m,E as h,M as g,O as _,P as v,T as y,_ as b,g as x,k as S,l as C,m as w,n as T,t as E,y as D}from"./index-C950aES_.js";var O=x(`earth`,[[`path`,{d:`M21.54 15H17a2 2 0 0 0-2 2v4.54`,key:`1djwo0`}],[`path`,{d:`M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17`,key:`1tzkfa`}],[`path`,{d:`M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05`,key:`14pb5j`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),k=x(`folder-plus`,[[`path`,{d:`M12 10v6`,key:`1bos4e`}],[`path`,{d:`M9 13h6`,key:`1uhe8q`}],[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]),A=x(`hard-drive`,[[`path`,{d:`M10 16h.01`,key:`1bzywj`}],[`path`,{d:`M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`18tbho`}],[`path`,{d:`M21.946 12.013H2.054`,key:`zqlbp7`}],[`path`,{d:`M6 16h.01`,key:`1pmjb7`}]]),j=x(`upload`,[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]]),M=v(g()),N=p();function P({initialTab:e}){let t=h(e=>e.language),[n,r]=M.useState(e||`files`),a=[{id:`files`,label:b(t,`capture.tab.files`)},{id:`local`,label:b(t,`capture.tab.local`)},{id:`browser`,label:b(t,`capture.tab.browser`)},{id:`pipeline`,label:b(t,`capture.tab.pipeline`)}];return M.useEffect(()=>{(e===`pipeline`||e===`local`||e===`files`)&&r(e)},[e]),(0,N.jsxs)(`div`,{className:`space-y-5`,children:[(0,N.jsxs)(`header`,{className:`page-hero`,children:[(0,N.jsxs)(`div`,{className:`page-kicker`,children:[(0,N.jsx)(j,{className:`h-4 w-4`}),` `,b(t,`capture.kicker`)]}),(0,N.jsx)(`h1`,{className:`page-title`,children:b(t,`capture.title`)}),(0,N.jsx)(`p`,{className:`page-copy`,children:b(t,`capture.body`)})]}),(0,N.jsx)(i,{tabs:a,value:n,onChange:e=>r(e)}),n===`files`?(0,N.jsx)(F,{}):null,n===`local`?(0,N.jsx)(z,{}):null,n===`browser`?(0,N.jsx)(B,{}):null,n===`pipeline`?(0,N.jsx)(V,{}):null]})}function F(){let t=h(e=>e.language),n=S(),r=_({queryKey:[`documents`],queryFn:()=>y.documents(200)}),[i,u]=M.useState([]),f=m({mutationFn:e=>I(e,u),onSuccess:()=>{n.invalidateQueries({queryKey:[`documents`]}),n.invalidateQueries({queryKey:[`graphStats`]}),n.invalidateQueries({queryKey:[`memoryManager`]})}}),p=M.useCallback(e=>{let t=Array.from(e);t.length&&f.mutate(t)},[f]);return(0,N.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[0.75fr_1.25fr]`,children:[(0,N.jsxs)(c,{children:[(0,N.jsxs)(e,{children:[(0,N.jsxs)(d,{className:`flex items-center gap-2`,children:[(0,N.jsx)(j,{className:`h-4 w-4`}),` `,b(t,`capture.files.title`)]}),(0,N.jsx)(a,{children:b(t,`capture.files.description`)})]}),(0,N.jsxs)(o,{children:[(0,N.jsxs)(`label`,{className:`flex min-h-56 cursor-pointer flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-muted/30 p-6 text-center transition hover:bg-muted/50`,onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault(),p(e.dataTransfer.files)},children:[(0,N.jsx)(j,{className:`h-7 w-7 text-primary`}),(0,N.jsx)(`span`,{className:`text-lg font-semibold`,children:b(t,`capture.files.drop`)}),(0,N.jsx)(`span`,{className:`max-w-sm text-sm leading-6 text-muted-foreground`,children:b(t,`capture.files.dropDetail`)}),(0,N.jsx)(`input`,{type:`file`,multiple:!0,className:`sr-only`,onChange:e=>e.target.files&&p(e.target.files)})]}),(0,N.jsx)(L,{queue:i,onRetry:e=>p([e])})]})]}),(0,N.jsx)(l,{title:b(t,`capture.files.uploaded`),result:r.data,children:e=>(0,N.jsxs)(`div`,{className:`space-y-3`,children:[(0,N.jsx)(s,{items:e.documents||e,titleKey:`filename`,metaKey:`ingest_state`,limit:12}),(0,N.jsx)(`div`,{className:`rounded-md border border-border bg-background/55 p-3 text-sm text-muted-foreground`,children:b(t,`capture.files.completed`)})]})})]})}async function I(e,t){let n=e.map(e=>({id:`${e.name}-${e.size}-${e.lastModified}-${Date.now()}`,file:e,name:e.name,size:e.size,status:`queued`}));t(e=>[...n,...e].slice(0,12));let r=[];for(let e of n){t(t=>t.map(t=>t.id===e.id?{...t,status:`uploading`}:t));let n=await y.uploadDocument(e.file);r.push(n),t(t=>t.map(t=>t.id===e.id?{...t,status:n.ok?`done`:`failed`,result:n}:t))}return r}function L({queue:e,onRetry:r}){let i=h(e=>e.language);return e.length?(0,N.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.map(e=>{let a=R(e,i);return(0,N.jsxs)(`div`,{className:`rounded-md border border-border bg-background/55 p-3 text-sm`,children:[(0,N.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2 font-medium`,children:[e.status===`done`?(0,N.jsx)(w,{className:`h-4 w-4 text-emerald-400`}):e.status===`failed`?(0,N.jsx)(f,{className:`h-4 w-4 text-amber-400`}):(0,N.jsx)(t,{className:`h-4 w-4 animate-spin text-primary`}),e.name]}),(0,N.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[Math.max(1,Math.round(e.size/1024)),` KB · `,a]})]}),e.status===`failed`?(0,N.jsxs)(T,{size:`sm`,variant:`outline`,onClick:()=>r(e.file),children:[(0,N.jsx)(C,{className:`h-3.5 w-3.5`}),` `,b(i,`capture.retry`)]}):null]}),e.result?(0,N.jsx)(n,{result:e.result,successLabel:b(i,`capture.files.success`)}):null]},e.id)})}):null}function R(e,t){if(e.status===`queued`)return b(t,`capture.files.queued`);if(e.status===`uploading`)return b(t,`capture.files.uploading`);if(!e.result?.ok)return e.result?.error||b(t,`capture.files.failed`);let n=e.result.data||{},r=String(n.node_id||n.graph_node||n.provenance_id||``);return r?b(t,`capture.files.capturedWithNode`,{node:r}):b(t,`capture.files.captured`)}function z(){let t=h(e=>e.language),i=S(),[f,p]=M.useState(``),g=_({queryKey:[`localSources`],queryFn:y.localSources}),v=_({queryKey:[`localAgent`],queryFn:y.localAgent}),x=m({mutationFn:()=>y.connectFolder(f),onSuccess:()=>i.invalidateQueries({queryKey:[`localSources`]})});return(0,N.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[0.9fr_1.1fr]`,children:[(0,N.jsxs)(c,{children:[(0,N.jsxs)(e,{children:[(0,N.jsxs)(d,{className:`flex items-center gap-2`,children:[(0,N.jsx)(k,{className:`h-4 w-4`}),` `,b(t,`capture.local.title`)]}),(0,N.jsx)(a,{children:b(t,`capture.local.description`)})]}),(0,N.jsxs)(o,{className:`space-y-3`,children:[(0,N.jsx)(E,{value:f,onChange:e=>p(e.target.value),placeholder:b(t,`capture.local.placeholder`)}),(0,N.jsx)(T,{disabled:!f.trim()||x.isPending,onClick:()=>x.mutate(),children:b(t,`capture.local.connect`)}),x.data?(0,N.jsx)(n,{result:x.data,successLabel:b(t,`capture.local.success`)}):null]})]}),(0,N.jsx)(l,{title:b(t,`capture.local.sources`),result:g.data,children:e=>(0,N.jsxs)(`div`,{className:`space-y-3`,children:[(0,N.jsx)(s,{items:e.sources,titleKey:`path`,metaKey:`status`}),D(e.sources).map(e=>(0,N.jsx)(u,{label:`Stop ${String(e.path||e.id||`source`)}`,action:()=>y.localWatchStop(String(e.id||e.source_id)),invalidate:[`localSources`]},String(e.id||e.source_id||e.path)))]})}),(0,N.jsx)(l,{title:b(t,`capture.local.access`),result:v.data,className:`xl:col-span-2`,children:e=>(0,N.jsx)(r,{value:e})})]})}function B(){let t=h(e=>e.language),[r,i]=M.useState(``),s=m({mutationFn:()=>y.browserReadUrl(r)});return(0,N.jsxs)(c,{children:[(0,N.jsxs)(e,{children:[(0,N.jsxs)(d,{className:`flex items-center gap-2`,children:[(0,N.jsx)(O,{className:`h-4 w-4`}),` `,b(t,`capture.browser.title`)]}),(0,N.jsx)(a,{children:b(t,`capture.browser.description`)})]}),(0,N.jsxs)(o,{className:`space-y-3`,children:[(0,N.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,N.jsx)(E,{value:r,onChange:e=>i(e.target.value),placeholder:b(t,`capture.browser.placeholder`)}),(0,N.jsx)(T,{disabled:!r.trim()||s.isPending,onClick:()=>s.mutate(),children:b(t,`capture.browser.capture`)})]}),s.data?(0,N.jsx)(n,{result:s.data,successLabel:b(t,`capture.browser.success`)}):null]})]})}function V(){let t=h(e=>e.language),n=_({queryKey:[`index`],queryFn:y.indexStatus}),i=_({queryKey:[`graphStats`],queryFn:y.graphStats});return(0,N.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,N.jsx)(l,{title:b(t,`capture.pipeline.status`),result:n.data,children:e=>(0,N.jsx)(r,{value:e})}),(0,N.jsx)(l,{title:b(t,`capture.pipeline.growth`),result:i.data,children:e=>(0,N.jsx)(r,{value:e})}),(0,N.jsxs)(c,{className:`xl:col-span-2`,children:[(0,N.jsxs)(e,{children:[(0,N.jsxs)(d,{className:`flex items-center gap-2`,children:[(0,N.jsx)(A,{className:`h-4 w-4`}),` `,b(t,`capture.pipeline.refresh`)]}),(0,N.jsx)(a,{children:b(t,`capture.pipeline.description`)})]}),(0,N.jsx)(o,{children:(0,N.jsx)(u,{label:b(t,`capture.pipeline.rebuild`),action:()=>y.rebuildIndex(),invalidate:[`index`]})})]})]})}export{P as CapturePage};
2
- //# sourceMappingURL=Capture--eZfb_Ex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Capture--eZfb_Ex.js","names":["__iconNode","__iconNode","__iconNode"],"sources":["../../../node_modules/lucide-react/dist/esm/icons/earth.mjs","../../../node_modules/lucide-react/dist/esm/icons/folder-plus.mjs","../../../node_modules/lucide-react/dist/esm/icons/hard-drive.mjs","../../../node_modules/lucide-react/dist/esm/icons/upload.mjs","../../../frontend/src/pages/Capture.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M21.54 15H17a2 2 0 0 0-2 2v4.54\", key: \"1djwo0\" }],\n [\n \"path\",\n {\n d: \"M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17\",\n key: \"1tzkfa\"\n }\n ],\n [\"path\", { d: \"M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05\", key: \"14pb5j\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n];\nconst Earth = createLucideIcon(\"earth\", __iconNode);\n\nexport { __iconNode, Earth as default };\n//# sourceMappingURL=earth.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 10v6\", key: \"1bos4e\" }],\n [\"path\", { d: \"M9 13h6\", key: \"1uhe8q\" }],\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst FolderPlus = createLucideIcon(\"folder-plus\", __iconNode);\n\nexport { __iconNode, FolderPlus as default };\n//# sourceMappingURL=folder-plus.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 16h.01\", key: \"1bzywj\" }],\n [\n \"path\",\n {\n d: \"M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"18tbho\"\n }\n ],\n [\"path\", { d: \"M21.946 12.013H2.054\", key: \"zqlbp7\" }],\n [\"path\", { d: \"M6 16h.01\", key: \"1pmjb7\" }]\n];\nconst HardDrive = createLucideIcon(\"hard-drive\", __iconNode);\n\nexport { __iconNode, HardDrive as default };\n//# sourceMappingURL=hard-drive.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.mjs.map\n","import * as React from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { AlertCircle, CheckCircle2, FolderPlus, Globe2, HardDrive, Loader2, RotateCcw, Upload } from \"lucide-react\";\nimport { latticeApi } from \"@/api/client\";\nimport { ActionButton, DataPanel, EntityList, OperationResult, StructuredView, Tabs } from \"@/components/primitives\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { t, type Language } from \"@/i18n\";\nimport { asArray } from \"@/lib/utils\";\nimport { useAppStore } from \"@/store/appStore\";\n\ntype CaptureTab = \"files\" | \"local\" | \"browser\" | \"pipeline\";\n\nexport function CapturePage({ initialTab }: { initialTab?: string }) {\n const language = useAppStore((state) => state.language);\n const [tab, setTab] = React.useState<CaptureTab>((initialTab as CaptureTab) || \"files\");\n const tabs: Array<{ id: CaptureTab; label: string }> = [\n { id: \"files\", label: t(language, \"capture.tab.files\") },\n { id: \"local\", label: t(language, \"capture.tab.local\") },\n { id: \"browser\", label: t(language, \"capture.tab.browser\") },\n { id: \"pipeline\", label: t(language, \"capture.tab.pipeline\") },\n ];\n React.useEffect(() => {\n if (initialTab === \"pipeline\" || initialTab === \"local\" || initialTab === \"files\") setTab(initialTab);\n }, [initialTab]);\n return (\n <div className=\"space-y-5\">\n <header className=\"page-hero\">\n <div className=\"page-kicker\"><Upload className=\"h-4 w-4\" /> {t(language, \"capture.kicker\")}</div>\n <h1 className=\"page-title\">{t(language, \"capture.title\")}</h1>\n <p className=\"page-copy\">{t(language, \"capture.body\")}</p>\n </header>\n <Tabs tabs={tabs} value={tab} onChange={(id) => setTab(id as CaptureTab)} />\n {tab === \"files\" ? <FilesPanel /> : null}\n {tab === \"local\" ? <LocalPanel /> : null}\n {tab === \"browser\" ? <BrowserPanel /> : null}\n {tab === \"pipeline\" ? <PipelinePanel /> : null}\n </div>\n );\n}\n\nfunction FilesPanel() {\n const language = useAppStore((state) => state.language);\n const qc = useQueryClient();\n const docs = useQuery({ queryKey: [\"documents\"], queryFn: () => latticeApi.documents(200) });\n const [queue, setQueue] = React.useState<UploadQueueItem[]>([]);\n const upload = useMutation({\n mutationFn: (files: File[]) => uploadFiles(files, setQueue),\n onSuccess: () => {\n void qc.invalidateQueries({ queryKey: [\"documents\"] });\n void qc.invalidateQueries({ queryKey: [\"graphStats\"] });\n void qc.invalidateQueries({ queryKey: [\"memoryManager\"] });\n },\n });\n const beginUpload = React.useCallback((files: FileList | File[]) => {\n const nextFiles = Array.from(files);\n if (!nextFiles.length) return;\n upload.mutate(nextFiles);\n }, [upload]);\n return (\n <div className=\"grid gap-4 xl:grid-cols-[0.75fr_1.25fr]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Upload className=\"h-4 w-4\" /> {t(language, \"capture.files.title\")}</CardTitle>\n <CardDescription>{t(language, \"capture.files.description\")}</CardDescription>\n </CardHeader>\n <CardContent>\n <label\n className=\"flex min-h-56 cursor-pointer flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border bg-muted/30 p-6 text-center transition hover:bg-muted/50\"\n onDragOver={(event) => event.preventDefault()}\n onDrop={(event) => {\n event.preventDefault();\n beginUpload(event.dataTransfer.files);\n }}\n >\n <Upload className=\"h-7 w-7 text-primary\" />\n <span className=\"text-lg font-semibold\">{t(language, \"capture.files.drop\")}</span>\n <span className=\"max-w-sm text-sm leading-6 text-muted-foreground\">{t(language, \"capture.files.dropDetail\")}</span>\n <input type=\"file\" multiple className=\"sr-only\" onChange={(e) => e.target.files && beginUpload(e.target.files)} />\n </label>\n <DocumentUploadQueue queue={queue} onRetry={(file) => beginUpload([file])} />\n </CardContent>\n </Card>\n <DataPanel title={t(language, \"capture.files.uploaded\")} result={docs.data}>\n {(data) => (\n <div className=\"space-y-3\">\n <EntityList items={(data as Record<string, unknown>).documents || data} titleKey=\"filename\" metaKey=\"ingest_state\" limit={12} />\n <div className=\"rounded-md border border-border bg-background/55 p-3 text-sm text-muted-foreground\">\n {t(language, \"capture.files.completed\")}\n </div>\n </div>\n )}\n </DataPanel>\n </div>\n );\n}\n\ntype UploadQueueItem = {\n id: string;\n file: File;\n name: string;\n size: number;\n status: \"queued\" | \"uploading\" | \"done\" | \"failed\";\n result?: Awaited<ReturnType<typeof latticeApi.uploadDocument>>;\n};\n\nasync function uploadFiles(files: File[], setQueue: React.Dispatch<React.SetStateAction<UploadQueueItem[]>>) {\n const rows = files.map((file) => ({\n id: `${file.name}-${file.size}-${file.lastModified}-${Date.now()}`,\n file,\n name: file.name,\n size: file.size,\n status: \"queued\" as const,\n }));\n setQueue((items) => [...rows, ...items].slice(0, 12));\n const results = [];\n for (const row of rows) {\n setQueue((items) => items.map((item) => item.id === row.id ? { ...item, status: \"uploading\" } : item));\n const result = await latticeApi.uploadDocument(row.file);\n results.push(result);\n setQueue((items) => items.map((item) => item.id === row.id ? { ...item, status: result.ok ? \"done\" : \"failed\", result } : item));\n }\n return results;\n}\n\nfunction DocumentUploadQueue({ queue, onRetry }: { queue: UploadQueueItem[]; onRetry: (file: File) => void }) {\n const language = useAppStore((state) => state.language);\n if (!queue.length) return null;\n return (\n <div className=\"mt-4 space-y-2\">\n {queue.map((item) => {\n const detail = uploadResultDetail(item, language);\n return (\n <div key={item.id} className=\"rounded-md border border-border bg-background/55 p-3 text-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"flex items-center gap-2 font-medium\">\n {item.status === \"done\" ? <CheckCircle2 className=\"h-4 w-4 text-emerald-400\" /> : item.status === \"failed\" ? <AlertCircle className=\"h-4 w-4 text-amber-400\" /> : <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />}\n {item.name}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {Math.max(1, Math.round(item.size / 1024))} KB · {detail}\n </div>\n </div>\n {item.status === \"failed\" ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => onRetry(item.file)}>\n <RotateCcw className=\"h-3.5 w-3.5\" /> {t(language, \"capture.retry\")}\n </Button>\n ) : null}\n </div>\n {item.result ? <OperationResult result={item.result} successLabel={t(language, \"capture.files.success\")} /> : null}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction uploadResultDetail(item: UploadQueueItem, language: Language) {\n if (item.status === \"queued\") return t(language, \"capture.files.queued\");\n if (item.status === \"uploading\") return t(language, \"capture.files.uploading\");\n if (!item.result?.ok) return item.result?.error || t(language, \"capture.files.failed\");\n const data = item.result.data || {};\n const node = String(data.node_id || data.graph_node || data.provenance_id || \"\");\n return node ? t(language, \"capture.files.capturedWithNode\", { node }) : t(language, \"capture.files.captured\");\n}\n\nfunction LocalPanel() {\n const language = useAppStore((state) => state.language);\n const qc = useQueryClient();\n const [path, setPath] = React.useState(\"\");\n const local = useQuery({ queryKey: [\"localSources\"], queryFn: latticeApi.localSources });\n const agent = useQuery({ queryKey: [\"localAgent\"], queryFn: latticeApi.localAgent });\n const connect = useMutation({\n mutationFn: () => latticeApi.connectFolder(path),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"localSources\"] }),\n });\n return (\n <div className=\"grid gap-4 xl:grid-cols-[0.9fr_1.1fr]\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><FolderPlus className=\"h-4 w-4\" /> {t(language, \"capture.local.title\")}</CardTitle>\n <CardDescription>{t(language, \"capture.local.description\")}</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Input value={path} onChange={(e) => setPath(e.target.value)} placeholder={t(language, \"capture.local.placeholder\")} />\n <Button disabled={!path.trim() || connect.isPending} onClick={() => connect.mutate()}>{t(language, \"capture.local.connect\")}</Button>\n {connect.data ? <OperationResult result={connect.data} successLabel={t(language, \"capture.local.success\")} /> : null}\n </CardContent>\n </Card>\n <DataPanel title={t(language, \"capture.local.sources\")} result={local.data}>\n {(data) => (\n <div className=\"space-y-3\">\n <EntityList items={(data as Record<string, unknown>).sources} titleKey=\"path\" metaKey=\"status\" />\n {asArray<Record<string, unknown>>((data as Record<string, unknown>).sources).map((source) => (\n <ActionButton\n key={String(source.id || source.source_id || source.path)}\n label={`Stop ${String(source.path || source.id || \"source\")}`}\n action={() => latticeApi.localWatchStop(String(source.id || source.source_id))}\n invalidate={[\"localSources\"]}\n />\n ))}\n </div>\n )}\n </DataPanel>\n <DataPanel title={t(language, \"capture.local.access\")} result={agent.data} className=\"xl:col-span-2\">\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n </div>\n );\n}\n\nfunction BrowserPanel() {\n const language = useAppStore((state) => state.language);\n const [url, setUrl] = React.useState(\"\");\n const read = useMutation({ mutationFn: () => latticeApi.browserReadUrl(url) });\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><Globe2 className=\"h-4 w-4\" /> {t(language, \"capture.browser.title\")}</CardTitle>\n <CardDescription>{t(language, \"capture.browser.description\")}</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input value={url} onChange={(e) => setUrl(e.target.value)} placeholder={t(language, \"capture.browser.placeholder\")} />\n <Button disabled={!url.trim() || read.isPending} onClick={() => read.mutate()}>{t(language, \"capture.browser.capture\")}</Button>\n </div>\n {read.data ? <OperationResult result={read.data} successLabel={t(language, \"capture.browser.success\")} /> : null}\n </CardContent>\n </Card>\n );\n}\n\nfunction PipelinePanel() {\n const language = useAppStore((state) => state.language);\n const index = useQuery({ queryKey: [\"index\"], queryFn: latticeApi.indexStatus });\n const stats = useQuery({ queryKey: [\"graphStats\"], queryFn: latticeApi.graphStats });\n return (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n <DataPanel title={t(language, \"capture.pipeline.status\")} result={index.data}>\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n <DataPanel title={t(language, \"capture.pipeline.growth\")} result={stats.data}>\n {(data) => <StructuredView value={data} />}\n </DataPanel>\n <Card className=\"xl:col-span-2\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\"><HardDrive className=\"h-4 w-4\" /> {t(language, \"capture.pipeline.refresh\")}</CardTitle>\n <CardDescription>{t(language, \"capture.pipeline.description\")}</CardDescription>\n </CardHeader>\n <CardContent>\n <ActionButton label={t(language, \"capture.pipeline.rebuild\")} action={() => latticeApi.rebuildIndex()} invalidate={[\"index\"]} />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3],"mappings":"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"}