@flexkit/studio 0.2.21 → 0.2.22

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 (75) hide show
  1. package/dist/astro.js +1 -1
  2. package/dist/{chat-page-QKSMDM7A.js → chat-page-WLKJ3QNZ.js} +3 -3
  3. package/dist/{chat-page-QKSMDM7A.js.map → chat-page-WLKJ3QNZ.js.map} +1 -1
  4. package/dist/{chunk-D5WYD5M4.js → chunk-4LVMCUHR.js} +2 -2
  5. package/dist/{chunk-D5WYD5M4.js.map → chunk-4LVMCUHR.js.map} +1 -1
  6. package/dist/{chunk-PLZUH56T.js → chunk-6AI7322C.js} +3 -3
  7. package/dist/{chunk-PLZUH56T.js.map → chunk-6AI7322C.js.map} +1 -1
  8. package/dist/{chunk-T2DOW23R.js → chunk-BM7INZL3.js} +3 -3
  9. package/dist/{chunk-T2DOW23R.js.map → chunk-BM7INZL3.js.map} +1 -1
  10. package/dist/{chunk-GFAOY74A.js → chunk-GGC75EMC.js} +2 -0
  11. package/dist/{chunk-I4INIJFN.js → chunk-HBTMGDOM.js} +2 -2
  12. package/dist/{chunk-I4INIJFN.js.map → chunk-HBTMGDOM.js.map} +1 -1
  13. package/dist/{chunk-YBLY77TV.js → chunk-HGXYSP47.js} +3 -3
  14. package/dist/{chunk-YBLY77TV.js.map → chunk-HGXYSP47.js.map} +1 -1
  15. package/dist/chunk-JIB4PRLH.js +3 -0
  16. package/dist/chunk-JIB4PRLH.js.map +1 -0
  17. package/dist/{chunk-7KRDPQXX.js → chunk-K2KW6UYG.js} +2 -2
  18. package/dist/{chunk-7KRDPQXX.js.map → chunk-K2KW6UYG.js.map} +1 -1
  19. package/dist/{chunk-ZZRA4567.js → chunk-LIMXKPEK.js} +2 -2
  20. package/dist/{chunk-ZZRA4567.js.map → chunk-LIMXKPEK.js.map} +1 -1
  21. package/dist/{chunk-BXUW6OXZ.js → chunk-MHVZXDVL.js} +2 -2
  22. package/dist/{chunk-BXUW6OXZ.js.map → chunk-MHVZXDVL.js.map} +1 -1
  23. package/dist/{chunk-AFLZA2R5.js → chunk-QTFFVG7C.js} +2 -2
  24. package/dist/{chunk-AFLZA2R5.js.map → chunk-QTFFVG7C.js.map} +1 -1
  25. package/dist/{chunk-3TAYSYYW.js → chunk-RPLKJVDQ.js} +3 -3
  26. package/dist/{chunk-3TAYSYYW.js.map → chunk-RPLKJVDQ.js.map} +1 -1
  27. package/dist/{chunk-MJICM7YP.js → chunk-SE4HJCGA.js} +2 -2
  28. package/dist/{chunk-MJICM7YP.js.map → chunk-SE4HJCGA.js.map} +1 -1
  29. package/dist/{chunk-DZS344SD.js → chunk-UCHWUGRT.js} +3 -3
  30. package/dist/{chunk-DZS344SD.js.map → chunk-UCHWUGRT.js.map} +1 -1
  31. package/dist/{chunk-YJM2RPTA.js → chunk-UJEDL3IZ.js} +2 -2
  32. package/dist/{chunk-YJM2RPTA.js.map → chunk-UJEDL3IZ.js.map} +1 -1
  33. package/dist/{chunk-AHR2EZGG.js → chunk-YXUEPR7K.js} +3 -3
  34. package/dist/{chunk-AHR2EZGG.js.map → chunk-YXUEPR7K.js.map} +1 -1
  35. package/dist/electron.js +1 -1
  36. package/dist/{entry-BKWT63OH.js → entry-GWZ7DELK.js} +2 -2
  37. package/dist/{entry-BKWT63OH.js.map → entry-GWZ7DELK.js.map} +1 -1
  38. package/dist/index.js +10 -8
  39. package/dist/index.js.map +1 -1
  40. package/dist/{list-F2MN4VI4.js → list-FQZII7QD.js} +3 -3
  41. package/dist/{list-F2MN4VI4.js.map → list-FQZII7QD.js.map} +1 -1
  42. package/dist/{list-RFIARR7J.js → list-LMIKCT2W.js} +2 -2
  43. package/dist/{list-RFIARR7J.js.map → list-LMIKCT2W.js.map} +1 -1
  44. package/dist/nextjs.js +1 -1
  45. package/dist/{pages-6YG37BSV.js → pages-NKE7FV34.js} +3 -3
  46. package/dist/{pages-6YG37BSV.js.map → pages-NKE7FV34.js.map} +1 -1
  47. package/dist/{plugin-pages-R5QCB5GZ.js → plugin-pages-4HTADSK3.js} +2 -2
  48. package/dist/{plugin-pages-R5QCB5GZ.js.map → plugin-pages-4HTADSK3.js.map} +1 -1
  49. package/dist/record-links-FDWV4X5W.js +2 -0
  50. package/dist/{record-links-BACU2DWS.js.map → record-links-FDWV4X5W.js.map} +1 -1
  51. package/dist/{root-U4QMDA3Q.js → root-GYJGAS22.js} +2 -2
  52. package/dist/{root-U4QMDA3Q.js.map → root-GYJGAS22.js.map} +1 -1
  53. package/dist/{root-UCQDMHDV.js → root-OSXC52GL.js} +2 -2
  54. package/dist/{root-UCQDMHDV.js.map → root-OSXC52GL.js.map} +1 -1
  55. package/dist/{root-6FML7PJC.js → root-VL4EM2IS.js} +3 -3
  56. package/dist/{root-6FML7PJC.js.map → root-VL4EM2IS.js.map} +1 -1
  57. package/dist/{root-MQ5FZRMQ.js → root-X3V4NC2D.js} +2 -2
  58. package/dist/{root-MQ5FZRMQ.js.map → root-X3V4NC2D.js.map} +1 -1
  59. package/dist/{root-MTJAYVPT.js → root-YDHREGTF.js} +3 -3
  60. package/dist/{root-MTJAYVPT.js.map → root-YDHREGTF.js.map} +1 -1
  61. package/dist/{root-FCO3MQTE.js → root-ZYUSZZWR.js} +3 -3
  62. package/dist/{root-FCO3MQTE.js.map → root-ZYUSZZWR.js.map} +1 -1
  63. package/dist/{search-7DVZZIZ6.js → search-UW7WE2CS.js} +2 -2
  64. package/dist/{search-7DVZZIZ6.js.map → search-UW7WE2CS.js.map} +1 -1
  65. package/dist/{skills-pages-EPIBHZVO.js → skills-pages-Q4YSUQVZ.js} +2 -2
  66. package/dist/{skills-pages-EPIBHZVO.js.map → skills-pages-Q4YSUQVZ.js.map} +1 -1
  67. package/dist/{source-F6B2UBWX.js → source-PGSWL4DQ.js} +2 -2
  68. package/dist/{source-F6B2UBWX.js.map → source-PGSWL4DQ.js.map} +1 -1
  69. package/dist/tanstack-start.js +1 -1
  70. package/dist/{user-nav-36ACWXOW.js → user-nav-B37OEVQN.js} +2 -2
  71. package/dist/{user-nav-36ACWXOW.js.map → user-nav-B37OEVQN.js.map} +1 -1
  72. package/package.json +4 -4
  73. package/dist/chunk-2HYQVMP3.js +0 -3
  74. package/dist/chunk-2HYQVMP3.js.map +0 -1
  75. package/dist/record-links-BACU2DWS.js +0 -2
@@ -1,2 +1,2 @@
1
- import'./index.css';import {c as c$2}from'./chunk-BXUW6OXZ.js';import {e,c as c$1,b as b$1,j as j$1,o,m,k as k$1,h,f as f$1}from'./chunk-7KRDPQXX.js';import'./chunk-2NXQF2F7.js';import {c}from'./chunk-CAZ6EUR2.js';import'./chunk-DZS344SD.js';import {b}from'./chunk-ZZRA4567.js';import'./chunk-T2DOW23R.js';import'./chunk-XMOSCJOI.js';import {j,k,i,f,m as m$1,a,n,l,b as b$4}from'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import'./chunk-PLZUH56T.js';import {g}from'./chunk-2HYQVMP3.js';import'./chunk-5CVDMZUI.js';import {na,Tc,Vc,qa,O,e as e$2,s,_,o as o$1}from'./chunk-DGIY4SKN.js';import {t}from'./chunk-SZEGGBOC.js';import {v}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$3,c as c$3,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$2}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useEffect}from'react';import {formatDistance}from'date-fns';import {ExternalLinkIcon,LoaderCircle,RefreshCwIcon,BookOpenIcon,ArrowLeft}from'lucide-react';import {useParams,useNavigate,Link}from'react-router-dom';import me from'swr';import Se from'swr/infinite';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var Ne=2e3;function be({actions:f,title:i}){return jsxs(Fragment,{children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4",children:[jsxs(b$3,{children:[jsx(c$3,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h1",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:i}),f]}),jsx(b$2,{asChild:true,className:"fk:w-fit fk:shrink-0",size:"sm",variant:"ghost",children:jsxs(Link,{relative:"path",to:"..",children:[jsx(ArrowLeft,{className:"fk:mr-2 fk:size-4"}),"All documents"]})})]})}function we(){return jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6",children:[jsx("span",{className:"fk:sr-only",children:"Loading document"}),jsx(t,{className:"fk:h-6 fk:w-64"}),jsx(t,{className:"fk:h-4 fk:w-96"}),jsx(t,{className:"fk:h-32 fk:w-full"})]})}function ce({children:f}){return jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:f})}function ye({projectId:f,source:i}){let h=i.currentVersion?.status==="published"?i.currentVersion:null,n=h?.passageCount??0,u=h?.id??null,N=o=>{if(!u||o*b$4>=n)return null;let l=o*b$4;return `${c$1(f).passages(i.id,{from:l,to:Math.min(l+b$4-1,n-1)})}&version=${encodeURIComponent(u)}`},{data:b,error:S,isLoading:x,setSize:p,size:r}=Se(N,b$1,{revalidateFirstPage:false}),d=b?.flatMap(o=>o.passages)??[],v=d.length;return useEffect(()=>{p(1);},[p,u]),n===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Passages appear here once the document is indexed."}):S?jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The passages could not be loaded."}):jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3",children:[d.map(o=>{let l$1=l(o.locator);return jsxs("article",{className:"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle",children:[jsxs("header",{className:"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground",children:[jsxs("span",{className:"fk:font-medium",children:["#",String(o.order+1)]}),l$1?jsx("span",{className:"fk:truncate",children:l$1}):null]}),jsx("p",{className:"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed",children:o.text})]},o.id)}),x?jsxs("div",{className:"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),"Loading passages\u2026"]}):null,v<n&&!x?jsxs(b$2,{className:"fk:w-fit",size:"sm",variant:"outline",onClick:()=>{p(r+1);},children:["Show more (",String(v)," of ",String(n),")"]}):null]})}function Te({api:f,onSaved:i,projectId:h$1,source:n$1}){let u=b(),[,N]=g(),{data:b$3}=me(c$1(h$1).spaces,b$1),S=N.user?.spaces??[],x=b$3?.spaces??[],p=x.filter(a=>S.includes(a.code)),r=n$1.spaces.filter(a=>!S.includes(a)),[d,v]=useState(n$1.title),[o,l]=useState(false),s$1=d.trim()!==n$1.title&&d.trim().length>0;useEffect(()=>{v(n$1.title);},[n$1.title]);async function m(a){if(u){l(true);try{let g=await f.updateSource(n$1.id,a);i(g.source),f$1();}catch(g){qa.error(h(g,"The document could not be updated."));}finally{l(false);}}}let k=!u||o||r.length>0,w="This project has no spaces yet, so every member can read it.";return x.length>0&&(w="You are not a member of any space in this project."),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-5",children:[r.length>0?jsx(Tc,{children:jsxs(Vc,{children:["This document is shared with spaces you are not a member of (",r.join(", "),"), so only an owner or a member of all of them can change it."]})}):null,jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1.5",children:[jsx(e$2,{htmlFor:"knowledge-title",children:"Title"}),jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(s,{className:"fk:max-w-md",disabled:k,id:"knowledge-title",maxLength:a,value:d,onChange:a=>v(a.target.value),onKeyDown:a=>{a.key==="Enter"&&s$1&&(a.preventDefault(),m({title:d.trim()}));}}),s$1?jsx(b$2,{disabled:k,size:"sm",variant:"outline",onClick:()=>{m({title:d.trim()});},children:"Save"}):null]}),jsx("p",{className:"fk:text-xs fk:text-muted-foreground",children:"The agent cites the document by this title."})]}),jsxs("label",{className:"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3",children:[jsx(_,{checked:n$1.agentVisible,disabled:k,onCheckedChange:a=>{m({agentVisible:a});}}),jsxs("span",{className:"fk:flex fk:flex-col",children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:"Visible to the agent"}),jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:"Off keeps the document in the list for people but out of the agent's searches."})]})]}),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:"Spaces"}),jsx("p",{className:"fk:text-xs fk:text-muted-foreground",children:n$1.spaces.length===0?"Every project member can read this document. Pick spaces to limit it to their members.":"Only members of the selected spaces (and the agent working for them) can read this document."}),p.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:w}):jsx("div",{className:"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2",children:p.map(a=>jsxs("label",{className:"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm",children:[jsx(o$1,{checked:n$1.spaces.includes(a.code),disabled:k,onCheckedChange:()=>{m({spaces:n(n$1.spaces,a.code)});}}),a.label]},a.id))})]})]})}function Xe(){let{api:f$1,projectId:i$1}=e(),{sourceId:h$1}=useParams(),n=useNavigate(),u=b(),N=c(),[b$3,S]=useState(false),[x,p]=useState(false),{data:r,error:d,isLoading:v$1,mutate:o$1}=me(i$1&&h$1?c$1(i$1).source(h$1):null,b$1,{refreshInterval:N&&b$3?Ne:0});if(useEffect(()=>{S(r?j(r.source,r.job):false);},[r]),!i$1||!f$1||!h$1)return jsx(j$1,{children:"Select a document."});if(d&&!r)return jsx(j$1,{children:"This document does not exist or is not shared with you."});if(v$1||!r)return jsx(we,{});let{job:l,source:s}=r,m$2=k(s,l),k$2=s.currentVersion,w=x;async function a(){p(true);try{let c=await f$1.reingestSource(s.id);qa.success("Re-indexing started."),await o$1({job:c.job,source:{...s,status:"processing"}},{revalidate:!0});}catch(c){qa.error(h(c,"The document could not be re-indexed."));}finally{p(false);}}let g=[{label:"Type",value:i(s)}];return s.originUrl&&g.push({label:"Address",value:jsxs("a",{className:"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2",href:s.originUrl,rel:"noreferrer",target:"_blank",children:[jsx("span",{className:"fk:truncate",children:s.originUrl}),jsx(ExternalLinkIcon,{className:"fk:size-3.5 fk:shrink-0"})]})}),s.size!==null&&g.push({label:"Size",value:f(s.size)}),g.push({label:"Added",value:formatDistance(new Date(s.createdAt),new Date,{addSuffix:true})}),k$2?.publishedAt&&g.push({label:"Indexed",value:formatDistance(new Date(k$2.publishedAt),new Date,{addSuffix:true})}),jsxs("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3",children:[jsx(be,{actions:jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(na,{disabled:!u,children:jsxs(b$2,{disabled:!u||w||m$2.tone==="busy",size:"sm",variant:"outline",onClick:()=>{a();},children:[x?jsx(LoaderCircle,{className:"fk:animate-spin"}):jsx(RefreshCwIcon,{}),"Re-index"]})}),jsx(o,{isBusy:w,source:s,trigger:"page",onRemoved:()=>n("..",{relative:"path"})})]}),title:s.title}),jsx("div",{className:"fk:min-h-0 fk:flex-1 fk:overflow-auto",children:jsxs("div",{className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6",children:[jsxs("section",{className:"fk:flex fk:items-start fk:gap-4",children:[jsx(m,{source:s}),jsxs("div",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2",children:[jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-2",children:[jsx(k$1,{label:m$2.label,tone:m$2.tone}),jsx("span",{className:"fk:text-sm fk:text-muted-foreground",children:m$2.detail})]}),l?.error?.hint&&(m$2.tone==="error"||l.state==="failed")?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:l.error.hint}):null,jsx("dl",{className:"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm",children:g.map(c=>jsxs("div",{className:"fk:contents",children:[jsx("dt",{className:"fk:text-muted-foreground",children:c.label}),jsx("dd",{className:"fk:min-w-0 fk:truncate",children:c.value})]},c.label))}),k$2&&k$2.warnings.length>0?jsx(Tc,{children:jsx(Vc,{children:jsx("ul",{className:"fk:list-disc fk:pl-4",children:k$2.warnings.map(c=>jsx("li",{children:m$1(c)},c))})})}):null]})]}),jsx(v,{}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-4",children:[jsx(ce,{children:"Settings"}),jsx(Te,{api:f$1,projectId:i$1,source:s,onSaved:c=>{o$1({job:l,source:c},{revalidate:false});}})]}),jsx(v,{}),jsx("section",{className:"fk:flex fk:flex-col fk:gap-4",children:jsx(c$2,{api:f$1,projectId:i$1,source:s})}),jsx(v,{}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-4",children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(BookOpenIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx(ce,{children:"Passages"})]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"The document is split into passages the agent searches and cites. Each one keeps its page, slide or section so a citation points back to the right place."}),jsx(ye,{projectId:i$1,source:s})]})]})})]})}export{Xe as Source};//# sourceMappingURL=source-F6B2UBWX.js.map
2
- //# sourceMappingURL=source-F6B2UBWX.js.map
1
+ import'./index.css';import {c as c$2}from'./chunk-MHVZXDVL.js';import {e,c as c$1,b as b$1,j as j$1,o,m,k as k$1,h,f as f$1}from'./chunk-K2KW6UYG.js';import'./chunk-2NXQF2F7.js';import {c}from'./chunk-CAZ6EUR2.js';import'./chunk-UCHWUGRT.js';import {b}from'./chunk-LIMXKPEK.js';import'./chunk-BM7INZL3.js';import'./chunk-XMOSCJOI.js';import {j,k,i,f,m as m$1,a,n,l,b as b$4}from'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import'./chunk-6AI7322C.js';import {g}from'./chunk-JIB4PRLH.js';import'./chunk-5CVDMZUI.js';import {na,Tc,Vc,qa,O,e as e$2,s,_,o as o$1}from'./chunk-DGIY4SKN.js';import {t}from'./chunk-SZEGGBOC.js';import {v}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$3,c as c$3,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$2}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useEffect}from'react';import {formatDistance}from'date-fns';import {ExternalLinkIcon,LoaderCircle,RefreshCwIcon,BookOpenIcon,ArrowLeft}from'lucide-react';import {useParams,useNavigate,Link}from'react-router-dom';import me from'swr';import Se from'swr/infinite';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var Ne=2e3;function be({actions:f,title:i}){return jsxs(Fragment,{children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4",children:[jsxs(b$3,{children:[jsx(c$3,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h1",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:i}),f]}),jsx(b$2,{asChild:true,className:"fk:w-fit fk:shrink-0",size:"sm",variant:"ghost",children:jsxs(Link,{relative:"path",to:"..",children:[jsx(ArrowLeft,{className:"fk:mr-2 fk:size-4"}),"All documents"]})})]})}function we(){return jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6",children:[jsx("span",{className:"fk:sr-only",children:"Loading document"}),jsx(t,{className:"fk:h-6 fk:w-64"}),jsx(t,{className:"fk:h-4 fk:w-96"}),jsx(t,{className:"fk:h-32 fk:w-full"})]})}function ce({children:f}){return jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:f})}function ye({projectId:f,source:i}){let h=i.currentVersion?.status==="published"?i.currentVersion:null,n=h?.passageCount??0,u=h?.id??null,N=o=>{if(!u||o*b$4>=n)return null;let l=o*b$4;return `${c$1(f).passages(i.id,{from:l,to:Math.min(l+b$4-1,n-1)})}&version=${encodeURIComponent(u)}`},{data:b,error:S,isLoading:x,setSize:p,size:r}=Se(N,b$1,{revalidateFirstPage:false}),d=b?.flatMap(o=>o.passages)??[],v=d.length;return useEffect(()=>{p(1);},[p,u]),n===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Passages appear here once the document is indexed."}):S?jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The passages could not be loaded."}):jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3",children:[d.map(o=>{let l$1=l(o.locator);return jsxs("article",{className:"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle",children:[jsxs("header",{className:"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground",children:[jsxs("span",{className:"fk:font-medium",children:["#",String(o.order+1)]}),l$1?jsx("span",{className:"fk:truncate",children:l$1}):null]}),jsx("p",{className:"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed",children:o.text})]},o.id)}),x?jsxs("div",{className:"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),"Loading passages\u2026"]}):null,v<n&&!x?jsxs(b$2,{className:"fk:w-fit",size:"sm",variant:"outline",onClick:()=>{p(r+1);},children:["Show more (",String(v)," of ",String(n),")"]}):null]})}function Te({api:f,onSaved:i,projectId:h$1,source:n$1}){let u=b(),[,N]=g(),{data:b$3}=me(c$1(h$1).spaces,b$1),S=N.user?.spaces??[],x=b$3?.spaces??[],p=x.filter(a=>S.includes(a.code)),r=n$1.spaces.filter(a=>!S.includes(a)),[d,v]=useState(n$1.title),[o,l]=useState(false),s$1=d.trim()!==n$1.title&&d.trim().length>0;useEffect(()=>{v(n$1.title);},[n$1.title]);async function m(a){if(u){l(true);try{let g=await f.updateSource(n$1.id,a);i(g.source),f$1();}catch(g){qa.error(h(g,"The document could not be updated."));}finally{l(false);}}}let k=!u||o||r.length>0,w="This project has no spaces yet, so every member can read it.";return x.length>0&&(w="You are not a member of any space in this project."),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-5",children:[r.length>0?jsx(Tc,{children:jsxs(Vc,{children:["This document is shared with spaces you are not a member of (",r.join(", "),"), so only an owner or a member of all of them can change it."]})}):null,jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1.5",children:[jsx(e$2,{htmlFor:"knowledge-title",children:"Title"}),jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(s,{className:"fk:max-w-md",disabled:k,id:"knowledge-title",maxLength:a,value:d,onChange:a=>v(a.target.value),onKeyDown:a=>{a.key==="Enter"&&s$1&&(a.preventDefault(),m({title:d.trim()}));}}),s$1?jsx(b$2,{disabled:k,size:"sm",variant:"outline",onClick:()=>{m({title:d.trim()});},children:"Save"}):null]}),jsx("p",{className:"fk:text-xs fk:text-muted-foreground",children:"The agent cites the document by this title."})]}),jsxs("label",{className:"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3",children:[jsx(_,{checked:n$1.agentVisible,disabled:k,onCheckedChange:a=>{m({agentVisible:a});}}),jsxs("span",{className:"fk:flex fk:flex-col",children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:"Visible to the agent"}),jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:"Off keeps the document in the list for people but out of the agent's searches."})]})]}),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:"Spaces"}),jsx("p",{className:"fk:text-xs fk:text-muted-foreground",children:n$1.spaces.length===0?"Every project member can read this document. Pick spaces to limit it to their members.":"Only members of the selected spaces (and the agent working for them) can read this document."}),p.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:w}):jsx("div",{className:"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2",children:p.map(a=>jsxs("label",{className:"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm",children:[jsx(o$1,{checked:n$1.spaces.includes(a.code),disabled:k,onCheckedChange:()=>{m({spaces:n(n$1.spaces,a.code)});}}),a.label]},a.id))})]})]})}function Xe(){let{api:f$1,projectId:i$1}=e(),{sourceId:h$1}=useParams(),n=useNavigate(),u=b(),N=c(),[b$3,S]=useState(false),[x,p]=useState(false),{data:r,error:d,isLoading:v$1,mutate:o$1}=me(i$1&&h$1?c$1(i$1).source(h$1):null,b$1,{refreshInterval:N&&b$3?Ne:0});if(useEffect(()=>{S(r?j(r.source,r.job):false);},[r]),!i$1||!f$1||!h$1)return jsx(j$1,{children:"Select a document."});if(d&&!r)return jsx(j$1,{children:"This document does not exist or is not shared with you."});if(v$1||!r)return jsx(we,{});let{job:l,source:s}=r,m$2=k(s,l),k$2=s.currentVersion,w=x;async function a(){p(true);try{let c=await f$1.reingestSource(s.id);qa.success("Re-indexing started."),await o$1({job:c.job,source:{...s,status:"processing"}},{revalidate:!0});}catch(c){qa.error(h(c,"The document could not be re-indexed."));}finally{p(false);}}let g=[{label:"Type",value:i(s)}];return s.originUrl&&g.push({label:"Address",value:jsxs("a",{className:"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2",href:s.originUrl,rel:"noreferrer",target:"_blank",children:[jsx("span",{className:"fk:truncate",children:s.originUrl}),jsx(ExternalLinkIcon,{className:"fk:size-3.5 fk:shrink-0"})]})}),s.size!==null&&g.push({label:"Size",value:f(s.size)}),g.push({label:"Added",value:formatDistance(new Date(s.createdAt),new Date,{addSuffix:true})}),k$2?.publishedAt&&g.push({label:"Indexed",value:formatDistance(new Date(k$2.publishedAt),new Date,{addSuffix:true})}),jsxs("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3",children:[jsx(be,{actions:jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(na,{disabled:!u,children:jsxs(b$2,{disabled:!u||w||m$2.tone==="busy",size:"sm",variant:"outline",onClick:()=>{a();},children:[x?jsx(LoaderCircle,{className:"fk:animate-spin"}):jsx(RefreshCwIcon,{}),"Re-index"]})}),jsx(o,{isBusy:w,source:s,trigger:"page",onRemoved:()=>n("..",{relative:"path"})})]}),title:s.title}),jsx("div",{className:"fk:min-h-0 fk:flex-1 fk:overflow-auto",children:jsxs("div",{className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6",children:[jsxs("section",{className:"fk:flex fk:items-start fk:gap-4",children:[jsx(m,{source:s}),jsxs("div",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2",children:[jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-2",children:[jsx(k$1,{label:m$2.label,tone:m$2.tone}),jsx("span",{className:"fk:text-sm fk:text-muted-foreground",children:m$2.detail})]}),l?.error?.hint&&(m$2.tone==="error"||l.state==="failed")?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:l.error.hint}):null,jsx("dl",{className:"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm",children:g.map(c=>jsxs("div",{className:"fk:contents",children:[jsx("dt",{className:"fk:text-muted-foreground",children:c.label}),jsx("dd",{className:"fk:min-w-0 fk:truncate",children:c.value})]},c.label))}),k$2&&k$2.warnings.length>0?jsx(Tc,{children:jsx(Vc,{children:jsx("ul",{className:"fk:list-disc fk:pl-4",children:k$2.warnings.map(c=>jsx("li",{children:m$1(c)},c))})})}):null]})]}),jsx(v,{}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-4",children:[jsx(ce,{children:"Settings"}),jsx(Te,{api:f$1,projectId:i$1,source:s,onSaved:c=>{o$1({job:l,source:c},{revalidate:false});}})]}),jsx(v,{}),jsx("section",{className:"fk:flex fk:flex-col fk:gap-4",children:jsx(c$2,{api:f$1,projectId:i$1,source:s})}),jsx(v,{}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-4",children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(BookOpenIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx(ce,{children:"Passages"})]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"The document is split into passages the agent searches and cites. Each one keeps its page, slide or section so a citation points back to the right place."}),jsx(ye,{projectId:i$1,source:s})]})]})})]})}export{Xe as Source};//# sourceMappingURL=source-PGSWL4DQ.js.map
2
+ //# sourceMappingURL=source-PGSWL4DQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/knowledge/source.tsx"],"names":["DETAIL_POLL_INTERVAL_MS","SourcePageHeader","actions","title","jsxs","Fragment","Tooltip","jsx","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","Button","Link","ArrowLeft","SourceDetailSkeleton","Skeleton","SectionTitle","children","PassageList","projectId","source","version","passageCount","versionId","getPassagesKey","pageIndex","KNOWLEDGE_PASSAGES_PAGE_SIZE","from","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","passages","page","loaded","useEffect","passage","where","formatKnowledgeLocator","LoaderCircle","SourceSettings","api","onSaved","canMutate","useCanMutate","auth","useAuth","spacesData","useSWR","userSpaceCodes","projectSpaces","selectableSpaces","space","foreignSpaces","code","setTitle","useState","isSaving","setIsSaving","titleChanged","save","patch","result","invalidateKnowledgeLists","toast","describeApiError","disabled","spacesEmptyMessage","Alert","AlertDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","event","Switch","checked","Checkbox","toggleSpaceCode","Source","useProjectKnowledge","sourceId","useParams","navigate","useNavigate","isViewing","useIsViewing","isBusy","setIsBusy","isReindexing","setIsReindexing","data","mutate","isKnowledgeSourceBusy","PageMessage","job","status","summarizeKnowledgeStatus","isWorking","reindex","reindexError","facts","getKnowledgeKindLabel","ExternalLinkIcon","formatFileSize","formatDistance","PermissionTooltip","RefreshCwIcon","SourceActionsMenu","SourceIcon","StatusBadge","fact","warning","formatKnowledgeWarning","saved","LinkedRecordsSection","BookOpenIcon"],"mappings":"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","file":"source-F6B2UBWX.js","sourcesContent":["import type { JSX } from 'react';\nimport { useEffect, useState } from 'react';\nimport { formatDistance } from 'date-fns';\nimport { ArrowLeft, BookOpenIcon, ExternalLinkIcon, LoaderCircle, RefreshCwIcon } from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAuth } from '../../auth/auth-context';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n Switch,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, knowledgePaths, type KnowledgeApi, type ProjectSpace } from './api';\nimport {\n formatFileSize,\n formatKnowledgeLocator,\n formatKnowledgeWarning,\n getKnowledgeKindLabel,\n isKnowledgeSourceBusy,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n KNOWLEDGE_PASSAGES_PAGE_SIZE,\n summarizeKnowledgeStatus,\n toggleSpaceCode,\n type KnowledgePassage,\n type KnowledgePassagesPage,\n type KnowledgeSource,\n type KnowledgeSourceDetail,\n} from './knowledge';\nimport { LinkedRecordsSection } from './record-links';\nimport {\n describeApiError,\n invalidateKnowledgeLists,\n PageMessage,\n SourceActionsMenu,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst DETAIL_POLL_INTERVAL_MS = 2_000;\n\nfunction SourcePageHeader({ actions, title }: { actions?: JSX.Element; title: string }): JSX.Element {\n return (\n <>\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {title}\n </h1>\n {actions}\n </div>\n <Button asChild className=\"fk:w-fit fk:shrink-0\" size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n All documents\n </Link>\n </Button>\n </>\n );\n}\n\nfunction SourceDetailSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6\">\n <span className=\"fk:sr-only\">Loading document</span>\n <Skeleton className=\"fk:h-6 fk:w-64\" />\n <Skeleton className=\"fk:h-4 fk:w-96\" />\n <Skeleton className=\"fk:h-32 fk:w-full\" />\n </div>\n );\n}\n\nfunction SectionTitle({ children }: { children: string }): JSX.Element {\n return <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">{children}</h3>;\n}\n\nfunction PassageList({ projectId, source }: { projectId: string; source: KnowledgeSource }): JSX.Element {\n const version = source.currentVersion?.status === 'published' ? source.currentVersion : null;\n const passageCount = version?.passageCount ?? 0;\n const versionId = version?.id ?? null;\n const getPassagesKey = (pageIndex: number): string | null => {\n if (!versionId || pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE >= passageCount) {\n return null;\n }\n\n const from = pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE;\n const path = knowledgePaths(projectId).passages(source.id, {\n from,\n to: Math.min(from + KNOWLEDGE_PASSAGES_PAGE_SIZE - 1, passageCount - 1),\n });\n\n // The version is part of the key, so a re-index swaps the pages instead\n // of serving the retired ones; the server ignores the extra parameter.\n return `${path}&version=${encodeURIComponent(versionId)}`;\n };\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgePassagesPage>(getPassagesKey, fetcher, {\n revalidateFirstPage: false,\n });\n const passages: KnowledgePassage[] = pages?.flatMap((page) => page.passages) ?? [];\n const loaded = passages.length;\n\n // A new version starts from its first page again.\n useEffect(() => {\n void setSize(1);\n }, [setSize, versionId]);\n\n if (passageCount === 0) {\n return <p className=\"fk:text-sm fk:text-muted-foreground\">Passages appear here once the document is indexed.</p>;\n }\n\n if (error) {\n return <p className=\"fk:text-sm fk:text-destructive\">The passages could not be loaded.</p>;\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\">\n {passages.map((passage) => {\n const where = formatKnowledgeLocator(passage.locator);\n\n return (\n <article\n className=\"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle\"\n key={passage.id}\n >\n <header className=\"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground\">\n <span className=\"fk:font-medium\">#{String(passage.order + 1)}</span>\n {where ? <span className=\"fk:truncate\">{where}</span> : null}\n </header>\n <p className=\"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed\">{passage.text}</p>\n </article>\n );\n })}\n {isLoading ? (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Loading passages…\n </div>\n ) : null}\n {loaded < passageCount && !isLoading ? (\n <Button className=\"fk:w-fit\" size=\"sm\" variant=\"outline\" onClick={() => void setSize(size + 1)}>\n Show more ({String(loaded)} of {String(passageCount)})\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction SourceSettings({\n api,\n onSaved,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n onSaved: (_source: KnowledgeSource) => void;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [, auth] = useAuth();\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(knowledgePaths(projectId).spaces, fetcher);\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only the caller's own spaces are offered: changing a source needs every\n // space it is shared with, and the server refuses codes the caller lacks.\n const projectSpaces = spacesData?.spaces ?? [];\n const selectableSpaces = projectSpaces.filter((space) => userSpaceCodes.includes(space.code));\n const foreignSpaces = source.spaces.filter((code) => !userSpaceCodes.includes(code));\n const [title, setTitle] = useState(source.title);\n const [isSaving, setIsSaving] = useState(false);\n const titleChanged = title.trim() !== source.title && title.trim().length > 0;\n\n useEffect(() => {\n setTitle(source.title);\n }, [source.title]);\n\n async function save(patch: { agentVisible?: boolean; spaces?: string[]; title?: string }): Promise<void> {\n if (!canMutate) {\n return;\n }\n\n setIsSaving(true);\n\n try {\n const result = await api.updateSource(source.id, patch);\n\n onSaved(result.source);\n void invalidateKnowledgeLists();\n } catch (error) {\n toast.error(describeApiError(error, 'The document could not be updated.'));\n } finally {\n setIsSaving(false);\n }\n }\n\n const disabled = !canMutate || isSaving || foreignSpaces.length > 0;\n let spacesEmptyMessage = 'This project has no spaces yet, so every member can read it.';\n\n if (projectSpaces.length > 0) {\n spacesEmptyMessage = 'You are not a member of any space in this project.';\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-5\">\n {foreignSpaces.length > 0 ? (\n <Alert>\n <AlertDescription>\n This document is shared with spaces you are not a member of ({foreignSpaces.join(', ')}), so only an owner\n or a member of all of them can change it.\n </AlertDescription>\n </Alert>\n ) : null}\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-title\">Title</Label>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Input\n className=\"fk:max-w-md\"\n disabled={disabled}\n id=\"knowledge-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && titleChanged) {\n event.preventDefault();\n void save({ title: title.trim() });\n }\n }}\n />\n {titleChanged ? (\n <Button disabled={disabled} size=\"sm\" variant=\"outline\" onClick={() => void save({ title: title.trim() })}>\n Save\n </Button>\n ) : null}\n </div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">The agent cites the document by this title.</p>\n </div>\n <label className=\"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3\">\n <Switch\n checked={source.agentVisible}\n disabled={disabled}\n onCheckedChange={(checked) => void save({ agentVisible: checked })}\n />\n <span className=\"fk:flex fk:flex-col\">\n <span className=\"fk:text-sm fk:font-medium\">Visible to the agent</span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n Off keeps the document in the list for people but out of the agent's searches.\n </span>\n </span>\n </label>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <span className=\"fk:text-sm fk:font-medium\">Spaces</span>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n {source.spaces.length === 0\n ? 'Every project member can read this document. Pick spaces to limit it to their members.'\n : 'Only members of the selected spaces (and the agent working for them) can read this document.'}\n </p>\n {selectableSpaces.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{spacesEmptyMessage}</p>\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2\">\n {selectableSpaces.map((space) => (\n <label className=\"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm\" key={space.id}>\n <Checkbox\n checked={source.spaces.includes(space.code)}\n disabled={disabled}\n onCheckedChange={() => void save({ spaces: toggleSpaceCode(source.spaces, space.code) })}\n />\n {space.label}\n </label>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function Source(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const { sourceId } = useParams<{ sourceId: string }>();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const [isBusy, setIsBusy] = useState(false);\n const [isReindexing, setIsReindexing] = useState(false);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeSourceDetail>(\n projectId && sourceId ? knowledgePaths(projectId).source(sourceId) : null,\n fetcher,\n { refreshInterval: isViewing && isBusy ? DETAIL_POLL_INTERVAL_MS : 0 }\n );\n\n useEffect(() => {\n setIsBusy(data ? isKnowledgeSourceBusy(data.source, data.job) : false);\n }, [data]);\n\n if (!projectId || !api || !sourceId) {\n return <PageMessage>Select a document.</PageMessage>;\n }\n\n // A failed background refresh keeps the last good data on screen; only a\n // document that never loaded is reported as missing.\n if (error && !data) {\n return <PageMessage>This document does not exist or is not shared with you.</PageMessage>;\n }\n\n if (isLoading || !data) {\n return <SourceDetailSkeleton />;\n }\n\n const { job, source } = data;\n const status = summarizeKnowledgeStatus(source, job);\n const version = source.currentVersion;\n const isWorking = isReindexing;\n\n async function reindex(): Promise<void> {\n setIsReindexing(true);\n\n try {\n const result = await api!.reingestSource(source.id);\n\n toast.success('Re-indexing started.');\n await mutate({ job: result.job, source: { ...source, status: 'processing' } }, { revalidate: true });\n } catch (reindexError) {\n toast.error(describeApiError(reindexError, 'The document could not be re-indexed.'));\n } finally {\n setIsReindexing(false);\n }\n }\n\n const facts: { label: string; value: JSX.Element | string }[] = [\n { label: 'Type', value: getKnowledgeKindLabel(source) },\n ];\n\n if (source.originUrl) {\n facts.push({\n label: 'Address',\n value: (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2\"\n href={source.originUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span className=\"fk:truncate\">{source.originUrl}</span>\n <ExternalLinkIcon className=\"fk:size-3.5 fk:shrink-0\" />\n </a>\n ),\n });\n }\n\n if (source.size !== null) {\n facts.push({ label: 'Size', value: formatFileSize(source.size) });\n }\n\n facts.push({ label: 'Added', value: formatDistance(new Date(source.createdAt), new Date(), { addSuffix: true }) });\n\n if (version?.publishedAt) {\n facts.push({\n label: 'Indexed',\n value: formatDistance(new Date(version.publishedAt), new Date(), { addSuffix: true }),\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SourcePageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <PermissionTooltip disabled={!canMutate}>\n <Button\n disabled={!canMutate || isWorking || status.tone === 'busy'}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void reindex()}\n >\n {isReindexing ? <LoaderCircle className=\"fk:animate-spin\" /> : <RefreshCwIcon />}\n Re-index\n </Button>\n </PermissionTooltip>\n <SourceActionsMenu\n isBusy={isWorking}\n source={source}\n trigger=\"page\"\n onRemoved={() => navigate('..', { relative: 'path' })}\n />\n </div>\n }\n title={source.title}\n />\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6\">\n <section className=\"fk:flex fk:items-start fk:gap-4\">\n <SourceIcon source={source} />\n <div className=\"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:text-sm fk:text-muted-foreground\">{status.detail}</span>\n </div>\n {job?.error?.hint && (status.tone === 'error' || job.state === 'failed') ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{job.error.hint}</p>\n ) : null}\n <dl className=\"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm\">\n {facts.map((fact) => (\n <div className=\"fk:contents\" key={fact.label}>\n <dt className=\"fk:text-muted-foreground\">{fact.label}</dt>\n <dd className=\"fk:min-w-0 fk:truncate\">{fact.value}</dd>\n </div>\n ))}\n </dl>\n {version && version.warnings.length > 0 ? (\n <Alert>\n <AlertDescription>\n <ul className=\"fk:list-disc fk:pl-4\">\n {version.warnings.map((warning) => (\n <li key={warning}>{formatKnowledgeWarning(warning)}</li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n ) : null}\n </div>\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <SectionTitle>Settings</SectionTitle>\n <SourceSettings\n api={api}\n projectId={projectId}\n source={source}\n onSaved={(saved) => void mutate({ job, source: saved }, { revalidate: false })}\n />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <LinkedRecordsSection api={api} projectId={projectId} source={source} />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <SectionTitle>Passages</SectionTitle>\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n The document is split into passages the agent searches and cites. Each one keeps its page, slide or\n section so a citation points back to the right place.\n </p>\n <PassageList projectId={projectId} source={source} />\n </section>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/knowledge/source.tsx"],"names":["DETAIL_POLL_INTERVAL_MS","SourcePageHeader","actions","title","jsxs","Fragment","Tooltip","jsx","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","Button","Link","ArrowLeft","SourceDetailSkeleton","Skeleton","SectionTitle","children","PassageList","projectId","source","version","passageCount","versionId","getPassagesKey","pageIndex","KNOWLEDGE_PASSAGES_PAGE_SIZE","from","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","passages","page","loaded","useEffect","passage","where","formatKnowledgeLocator","LoaderCircle","SourceSettings","api","onSaved","canMutate","useCanMutate","auth","useAuth","spacesData","useSWR","userSpaceCodes","projectSpaces","selectableSpaces","space","foreignSpaces","code","setTitle","useState","isSaving","setIsSaving","titleChanged","save","patch","result","invalidateKnowledgeLists","toast","describeApiError","disabled","spacesEmptyMessage","Alert","AlertDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","event","Switch","checked","Checkbox","toggleSpaceCode","Source","useProjectKnowledge","sourceId","useParams","navigate","useNavigate","isViewing","useIsViewing","isBusy","setIsBusy","isReindexing","setIsReindexing","data","mutate","isKnowledgeSourceBusy","PageMessage","job","status","summarizeKnowledgeStatus","isWorking","reindex","reindexError","facts","getKnowledgeKindLabel","ExternalLinkIcon","formatFileSize","formatDistance","PermissionTooltip","RefreshCwIcon","SourceActionsMenu","SourceIcon","StatusBadge","fact","warning","formatKnowledgeWarning","saved","LinkedRecordsSection","BookOpenIcon"],"mappings":"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","file":"source-PGSWL4DQ.js","sourcesContent":["import type { JSX } from 'react';\nimport { useEffect, useState } from 'react';\nimport { formatDistance } from 'date-fns';\nimport { ArrowLeft, BookOpenIcon, ExternalLinkIcon, LoaderCircle, RefreshCwIcon } from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAuth } from '../../auth/auth-context';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n Switch,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, knowledgePaths, type KnowledgeApi, type ProjectSpace } from './api';\nimport {\n formatFileSize,\n formatKnowledgeLocator,\n formatKnowledgeWarning,\n getKnowledgeKindLabel,\n isKnowledgeSourceBusy,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n KNOWLEDGE_PASSAGES_PAGE_SIZE,\n summarizeKnowledgeStatus,\n toggleSpaceCode,\n type KnowledgePassage,\n type KnowledgePassagesPage,\n type KnowledgeSource,\n type KnowledgeSourceDetail,\n} from './knowledge';\nimport { LinkedRecordsSection } from './record-links';\nimport {\n describeApiError,\n invalidateKnowledgeLists,\n PageMessage,\n SourceActionsMenu,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst DETAIL_POLL_INTERVAL_MS = 2_000;\n\nfunction SourcePageHeader({ actions, title }: { actions?: JSX.Element; title: string }): JSX.Element {\n return (\n <>\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {title}\n </h1>\n {actions}\n </div>\n <Button asChild className=\"fk:w-fit fk:shrink-0\" size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n All documents\n </Link>\n </Button>\n </>\n );\n}\n\nfunction SourceDetailSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6\">\n <span className=\"fk:sr-only\">Loading document</span>\n <Skeleton className=\"fk:h-6 fk:w-64\" />\n <Skeleton className=\"fk:h-4 fk:w-96\" />\n <Skeleton className=\"fk:h-32 fk:w-full\" />\n </div>\n );\n}\n\nfunction SectionTitle({ children }: { children: string }): JSX.Element {\n return <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">{children}</h3>;\n}\n\nfunction PassageList({ projectId, source }: { projectId: string; source: KnowledgeSource }): JSX.Element {\n const version = source.currentVersion?.status === 'published' ? source.currentVersion : null;\n const passageCount = version?.passageCount ?? 0;\n const versionId = version?.id ?? null;\n const getPassagesKey = (pageIndex: number): string | null => {\n if (!versionId || pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE >= passageCount) {\n return null;\n }\n\n const from = pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE;\n const path = knowledgePaths(projectId).passages(source.id, {\n from,\n to: Math.min(from + KNOWLEDGE_PASSAGES_PAGE_SIZE - 1, passageCount - 1),\n });\n\n // The version is part of the key, so a re-index swaps the pages instead\n // of serving the retired ones; the server ignores the extra parameter.\n return `${path}&version=${encodeURIComponent(versionId)}`;\n };\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgePassagesPage>(getPassagesKey, fetcher, {\n revalidateFirstPage: false,\n });\n const passages: KnowledgePassage[] = pages?.flatMap((page) => page.passages) ?? [];\n const loaded = passages.length;\n\n // A new version starts from its first page again.\n useEffect(() => {\n void setSize(1);\n }, [setSize, versionId]);\n\n if (passageCount === 0) {\n return <p className=\"fk:text-sm fk:text-muted-foreground\">Passages appear here once the document is indexed.</p>;\n }\n\n if (error) {\n return <p className=\"fk:text-sm fk:text-destructive\">The passages could not be loaded.</p>;\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\">\n {passages.map((passage) => {\n const where = formatKnowledgeLocator(passage.locator);\n\n return (\n <article\n className=\"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle\"\n key={passage.id}\n >\n <header className=\"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground\">\n <span className=\"fk:font-medium\">#{String(passage.order + 1)}</span>\n {where ? <span className=\"fk:truncate\">{where}</span> : null}\n </header>\n <p className=\"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed\">{passage.text}</p>\n </article>\n );\n })}\n {isLoading ? (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Loading passages…\n </div>\n ) : null}\n {loaded < passageCount && !isLoading ? (\n <Button className=\"fk:w-fit\" size=\"sm\" variant=\"outline\" onClick={() => void setSize(size + 1)}>\n Show more ({String(loaded)} of {String(passageCount)})\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction SourceSettings({\n api,\n onSaved,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n onSaved: (_source: KnowledgeSource) => void;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [, auth] = useAuth();\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(knowledgePaths(projectId).spaces, fetcher);\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only the caller's own spaces are offered: changing a source needs every\n // space it is shared with, and the server refuses codes the caller lacks.\n const projectSpaces = spacesData?.spaces ?? [];\n const selectableSpaces = projectSpaces.filter((space) => userSpaceCodes.includes(space.code));\n const foreignSpaces = source.spaces.filter((code) => !userSpaceCodes.includes(code));\n const [title, setTitle] = useState(source.title);\n const [isSaving, setIsSaving] = useState(false);\n const titleChanged = title.trim() !== source.title && title.trim().length > 0;\n\n useEffect(() => {\n setTitle(source.title);\n }, [source.title]);\n\n async function save(patch: { agentVisible?: boolean; spaces?: string[]; title?: string }): Promise<void> {\n if (!canMutate) {\n return;\n }\n\n setIsSaving(true);\n\n try {\n const result = await api.updateSource(source.id, patch);\n\n onSaved(result.source);\n void invalidateKnowledgeLists();\n } catch (error) {\n toast.error(describeApiError(error, 'The document could not be updated.'));\n } finally {\n setIsSaving(false);\n }\n }\n\n const disabled = !canMutate || isSaving || foreignSpaces.length > 0;\n let spacesEmptyMessage = 'This project has no spaces yet, so every member can read it.';\n\n if (projectSpaces.length > 0) {\n spacesEmptyMessage = 'You are not a member of any space in this project.';\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-5\">\n {foreignSpaces.length > 0 ? (\n <Alert>\n <AlertDescription>\n This document is shared with spaces you are not a member of ({foreignSpaces.join(', ')}), so only an owner\n or a member of all of them can change it.\n </AlertDescription>\n </Alert>\n ) : null}\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-title\">Title</Label>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Input\n className=\"fk:max-w-md\"\n disabled={disabled}\n id=\"knowledge-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && titleChanged) {\n event.preventDefault();\n void save({ title: title.trim() });\n }\n }}\n />\n {titleChanged ? (\n <Button disabled={disabled} size=\"sm\" variant=\"outline\" onClick={() => void save({ title: title.trim() })}>\n Save\n </Button>\n ) : null}\n </div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">The agent cites the document by this title.</p>\n </div>\n <label className=\"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3\">\n <Switch\n checked={source.agentVisible}\n disabled={disabled}\n onCheckedChange={(checked) => void save({ agentVisible: checked })}\n />\n <span className=\"fk:flex fk:flex-col\">\n <span className=\"fk:text-sm fk:font-medium\">Visible to the agent</span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n Off keeps the document in the list for people but out of the agent's searches.\n </span>\n </span>\n </label>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <span className=\"fk:text-sm fk:font-medium\">Spaces</span>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n {source.spaces.length === 0\n ? 'Every project member can read this document. Pick spaces to limit it to their members.'\n : 'Only members of the selected spaces (and the agent working for them) can read this document.'}\n </p>\n {selectableSpaces.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{spacesEmptyMessage}</p>\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2\">\n {selectableSpaces.map((space) => (\n <label className=\"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm\" key={space.id}>\n <Checkbox\n checked={source.spaces.includes(space.code)}\n disabled={disabled}\n onCheckedChange={() => void save({ spaces: toggleSpaceCode(source.spaces, space.code) })}\n />\n {space.label}\n </label>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function Source(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const { sourceId } = useParams<{ sourceId: string }>();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const [isBusy, setIsBusy] = useState(false);\n const [isReindexing, setIsReindexing] = useState(false);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeSourceDetail>(\n projectId && sourceId ? knowledgePaths(projectId).source(sourceId) : null,\n fetcher,\n { refreshInterval: isViewing && isBusy ? DETAIL_POLL_INTERVAL_MS : 0 }\n );\n\n useEffect(() => {\n setIsBusy(data ? isKnowledgeSourceBusy(data.source, data.job) : false);\n }, [data]);\n\n if (!projectId || !api || !sourceId) {\n return <PageMessage>Select a document.</PageMessage>;\n }\n\n // A failed background refresh keeps the last good data on screen; only a\n // document that never loaded is reported as missing.\n if (error && !data) {\n return <PageMessage>This document does not exist or is not shared with you.</PageMessage>;\n }\n\n if (isLoading || !data) {\n return <SourceDetailSkeleton />;\n }\n\n const { job, source } = data;\n const status = summarizeKnowledgeStatus(source, job);\n const version = source.currentVersion;\n const isWorking = isReindexing;\n\n async function reindex(): Promise<void> {\n setIsReindexing(true);\n\n try {\n const result = await api!.reingestSource(source.id);\n\n toast.success('Re-indexing started.');\n await mutate({ job: result.job, source: { ...source, status: 'processing' } }, { revalidate: true });\n } catch (reindexError) {\n toast.error(describeApiError(reindexError, 'The document could not be re-indexed.'));\n } finally {\n setIsReindexing(false);\n }\n }\n\n const facts: { label: string; value: JSX.Element | string }[] = [\n { label: 'Type', value: getKnowledgeKindLabel(source) },\n ];\n\n if (source.originUrl) {\n facts.push({\n label: 'Address',\n value: (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2\"\n href={source.originUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span className=\"fk:truncate\">{source.originUrl}</span>\n <ExternalLinkIcon className=\"fk:size-3.5 fk:shrink-0\" />\n </a>\n ),\n });\n }\n\n if (source.size !== null) {\n facts.push({ label: 'Size', value: formatFileSize(source.size) });\n }\n\n facts.push({ label: 'Added', value: formatDistance(new Date(source.createdAt), new Date(), { addSuffix: true }) });\n\n if (version?.publishedAt) {\n facts.push({\n label: 'Indexed',\n value: formatDistance(new Date(version.publishedAt), new Date(), { addSuffix: true }),\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SourcePageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <PermissionTooltip disabled={!canMutate}>\n <Button\n disabled={!canMutate || isWorking || status.tone === 'busy'}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void reindex()}\n >\n {isReindexing ? <LoaderCircle className=\"fk:animate-spin\" /> : <RefreshCwIcon />}\n Re-index\n </Button>\n </PermissionTooltip>\n <SourceActionsMenu\n isBusy={isWorking}\n source={source}\n trigger=\"page\"\n onRemoved={() => navigate('..', { relative: 'path' })}\n />\n </div>\n }\n title={source.title}\n />\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6\">\n <section className=\"fk:flex fk:items-start fk:gap-4\">\n <SourceIcon source={source} />\n <div className=\"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:text-sm fk:text-muted-foreground\">{status.detail}</span>\n </div>\n {job?.error?.hint && (status.tone === 'error' || job.state === 'failed') ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{job.error.hint}</p>\n ) : null}\n <dl className=\"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm\">\n {facts.map((fact) => (\n <div className=\"fk:contents\" key={fact.label}>\n <dt className=\"fk:text-muted-foreground\">{fact.label}</dt>\n <dd className=\"fk:min-w-0 fk:truncate\">{fact.value}</dd>\n </div>\n ))}\n </dl>\n {version && version.warnings.length > 0 ? (\n <Alert>\n <AlertDescription>\n <ul className=\"fk:list-disc fk:pl-4\">\n {version.warnings.map((warning) => (\n <li key={warning}>{formatKnowledgeWarning(warning)}</li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n ) : null}\n </div>\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <SectionTitle>Settings</SectionTitle>\n <SourceSettings\n api={api}\n projectId={projectId}\n source={source}\n onSaved={(saved) => void mutate({ job, source: saved }, { revalidate: false })}\n />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <LinkedRecordsSection api={api} projectId={projectId} source={source} />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <SectionTitle>Passages</SectionTitle>\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n The document is split into passages the agent searches and cites. Each one keeps its page, slide or\n section so a citation points back to the right place.\n </p>\n <PassageList projectId={projectId} source={source} />\n </section>\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  handleFlexkitRequest
3
- } from "./chunk-GFAOY74A.js";
3
+ } from "./chunk-GGC75EMC.js";
4
4
 
5
5
  // src/auth/tanstack-start-api.ts
6
6
  function getCookieValue(cookieHeader, name) {
@@ -1,2 +1,2 @@
1
- import'./index.css';import {g}from'./chunk-2HYQVMP3.js';import'./chunk-5CVDMZUI.js';import {t,e,g as g$1,a,b as b$2,c,h,n,o,k,j,p}from'./chunk-SZEGGBOC.js';import {b}from'./chunk-U45E5X3H.js';import {b as b$1}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import v from'boring-avatars';import {Monitor,Moon,Sun}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var A=["#06d9b6","#a4f479","#d4d323","#fb468f","#0ec4f1"];function F({projectId:D}){let{theme:r,setTheme:t$1}=b(),[C,n$1]=g();return C?jsx(t,{className:"fk:h-8 fk:w-8 fk:rounded-full"}):jsxs(e,{children:[jsx(g$1,{asChild:true,children:jsx(b$1,{className:"fk:relative fk:h-8 fk:w-8 fk:rounded-full",variant:"ghost",children:jsxs(a,{className:"fk:h-8 fk:w-8",children:[n$1.user?.avatar_url?jsx(b$2,{alt:n$1.user.display_name,src:n$1.user.avatar_url}):null,jsx(c,{className:"fk:bg-transparent",children:jsx(v,{className:"fk:size-8",colors:A,name:n$1.user?.id??"user",size:32,variant:"marble"})})]})})}),jsxs(h,{align:"end",className:"fk:w-56",forceMount:true,children:[jsx(n,{className:"font-normal",children:jsxs("div",{className:"fk:flex fk:flex-col fk:space-y-1",children:[jsx("p",{className:"fk:text-sm fk:font-medium fk:leading-none",children:n$1.user?.display_name}),jsx("p",{className:"fk:text-xs fk:leading-none fk:text-muted-foreground",children:n$1.user?.email})]})}),jsx(o,{}),jsx(n,{children:"Theme"}),jsxs(k,{checked:r==="system",onCheckedChange:()=>{t$1("system");},children:[jsx(Monitor,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"System"})]}),jsxs(k,{checked:r==="dark",onCheckedChange:()=>{t$1("dark");},children:[jsx(Moon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Dark"})]}),jsxs(k,{checked:r==="light",onCheckedChange:()=>{t$1("light");},children:[jsx(Sun,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Light"})]}),jsx(o,{}),jsxs(j,{onClick:()=>{n$1.logout(D).then(()=>{}).catch(()=>{});},children:["Log out",jsx(p,{children:"\u21E7\u2318Q"})]})]})]})}export{F as UserNav};//# sourceMappingURL=user-nav-36ACWXOW.js.map
2
- //# sourceMappingURL=user-nav-36ACWXOW.js.map
1
+ import'./index.css';import {g}from'./chunk-JIB4PRLH.js';import'./chunk-5CVDMZUI.js';import {t,e,g as g$1,a,b as b$2,c,h,n,o,k,j,p}from'./chunk-SZEGGBOC.js';import {b}from'./chunk-U45E5X3H.js';import {b as b$1}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import v from'boring-avatars';import {Monitor,Moon,Sun}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var A=["#06d9b6","#a4f479","#d4d323","#fb468f","#0ec4f1"];function F({projectId:D}){let{theme:r,setTheme:t$1}=b(),[C,n$1]=g();return C?jsx(t,{className:"fk:h-8 fk:w-8 fk:rounded-full"}):jsxs(e,{children:[jsx(g$1,{asChild:true,children:jsx(b$1,{className:"fk:relative fk:h-8 fk:w-8 fk:rounded-full",variant:"ghost",children:jsxs(a,{className:"fk:h-8 fk:w-8",children:[n$1.user?.avatar_url?jsx(b$2,{alt:n$1.user.display_name,src:n$1.user.avatar_url}):null,jsx(c,{className:"fk:bg-transparent",children:jsx(v,{className:"fk:size-8",colors:A,name:n$1.user?.id??"user",size:32,variant:"marble"})})]})})}),jsxs(h,{align:"end",className:"fk:w-56",forceMount:true,children:[jsx(n,{className:"font-normal",children:jsxs("div",{className:"fk:flex fk:flex-col fk:space-y-1",children:[jsx("p",{className:"fk:text-sm fk:font-medium fk:leading-none",children:n$1.user?.display_name}),jsx("p",{className:"fk:text-xs fk:leading-none fk:text-muted-foreground",children:n$1.user?.email})]})}),jsx(o,{}),jsx(n,{children:"Theme"}),jsxs(k,{checked:r==="system",onCheckedChange:()=>{t$1("system");},children:[jsx(Monitor,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"System"})]}),jsxs(k,{checked:r==="dark",onCheckedChange:()=>{t$1("dark");},children:[jsx(Moon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Dark"})]}),jsxs(k,{checked:r==="light",onCheckedChange:()=>{t$1("light");},children:[jsx(Sun,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Light"})]}),jsx(o,{}),jsxs(j,{onClick:()=>{n$1.logout(D).then(()=>{}).catch(()=>{});},children:["Log out",jsx(p,{children:"\u21E7\u2318Q"})]})]})]})}export{F as UserNav};//# sourceMappingURL=user-nav-B37OEVQN.js.map
2
+ //# sourceMappingURL=user-nav-B37OEVQN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/components/user-nav.tsx"],"names":["AVATAR_COLORS","UserNav","projectId","theme","setTheme","useTheme","isLoading","auth","useAuth","jsx","Skeleton","jsxs","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","BoringAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Monitor","Moon","Sun","DropdownMenuItem","DropdownMenuShortcut"],"mappings":"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","file":"user-nav-36ACWXOW.js","sourcesContent":["import type { JSX } from 'react';\nimport BoringAvatar from 'boring-avatars';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { useTheme } from '../theme-context';\nimport { Avatar, AvatarFallback, AvatarImage } from '../primitives/avatar';\nimport { Button } from '../primitives/button';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '../primitives/dropdown-menu';\nimport { useAuth } from '../../auth/auth-context';\n\nconst AVATAR_COLORS = ['#06d9b6', '#a4f479', '#d4d323', '#fb468f', '#0ec4f1'];\n\ntype Props = {\n projectId: string;\n};\n\nexport function UserNav({ projectId }: Props): JSX.Element {\n const { theme, setTheme } = useTheme();\n const [isLoading, auth] = useAuth();\n\n if (isLoading) {\n return <Skeleton className=\"fk:h-8 fk:w-8 fk:rounded-full\" />;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:relative fk:h-8 fk:w-8 fk:rounded-full\" variant=\"ghost\">\n <Avatar className=\"fk:h-8 fk:w-8\">\n {auth.user?.avatar_url ? <AvatarImage alt={auth.user.display_name} src={auth.user.avatar_url} /> : null}\n <AvatarFallback className=\"fk:bg-transparent\">\n <BoringAvatar\n className=\"fk:size-8\"\n colors={AVATAR_COLORS}\n name={auth.user?.id ?? 'user'}\n size={32}\n variant=\"marble\"\n />\n </AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-56\" forceMount>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"fk:flex fk:flex-col fk:space-y-1\">\n <p className=\"fk:text-sm fk:font-medium fk:leading-none\">{auth.user?.display_name}</p>\n <p className=\"fk:text-xs fk:leading-none fk:text-muted-foreground\">{auth.user?.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Theme</DropdownMenuLabel>\n <DropdownMenuCheckboxItem\n checked={theme === 'system'}\n onCheckedChange={() => {\n setTheme('system');\n }}\n >\n <Monitor className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>System</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'dark'}\n onCheckedChange={() => {\n setTheme('dark');\n }}\n >\n <Moon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Dark</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'light'}\n onCheckedChange={() => {\n setTheme('light');\n }}\n >\n <Sun className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Light</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n auth\n .logout(projectId)\n .then(() => {\n //\n })\n .catch(() => {\n //\n });\n }}\n >\n Log out\n <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/ui/components/user-nav.tsx"],"names":["AVATAR_COLORS","UserNav","projectId","theme","setTheme","useTheme","isLoading","auth","useAuth","jsx","Skeleton","jsxs","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","BoringAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Monitor","Moon","Sun","DropdownMenuItem","DropdownMenuShortcut"],"mappings":"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","file":"user-nav-B37OEVQN.js","sourcesContent":["import type { JSX } from 'react';\nimport BoringAvatar from 'boring-avatars';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { useTheme } from '../theme-context';\nimport { Avatar, AvatarFallback, AvatarImage } from '../primitives/avatar';\nimport { Button } from '../primitives/button';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '../primitives/dropdown-menu';\nimport { useAuth } from '../../auth/auth-context';\n\nconst AVATAR_COLORS = ['#06d9b6', '#a4f479', '#d4d323', '#fb468f', '#0ec4f1'];\n\ntype Props = {\n projectId: string;\n};\n\nexport function UserNav({ projectId }: Props): JSX.Element {\n const { theme, setTheme } = useTheme();\n const [isLoading, auth] = useAuth();\n\n if (isLoading) {\n return <Skeleton className=\"fk:h-8 fk:w-8 fk:rounded-full\" />;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:relative fk:h-8 fk:w-8 fk:rounded-full\" variant=\"ghost\">\n <Avatar className=\"fk:h-8 fk:w-8\">\n {auth.user?.avatar_url ? <AvatarImage alt={auth.user.display_name} src={auth.user.avatar_url} /> : null}\n <AvatarFallback className=\"fk:bg-transparent\">\n <BoringAvatar\n className=\"fk:size-8\"\n colors={AVATAR_COLORS}\n name={auth.user?.id ?? 'user'}\n size={32}\n variant=\"marble\"\n />\n </AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-56\" forceMount>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"fk:flex fk:flex-col fk:space-y-1\">\n <p className=\"fk:text-sm fk:font-medium fk:leading-none\">{auth.user?.display_name}</p>\n <p className=\"fk:text-xs fk:leading-none fk:text-muted-foreground\">{auth.user?.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Theme</DropdownMenuLabel>\n <DropdownMenuCheckboxItem\n checked={theme === 'system'}\n onCheckedChange={() => {\n setTheme('system');\n }}\n >\n <Monitor className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>System</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'dark'}\n onCheckedChange={() => {\n setTheme('dark');\n }}\n >\n <Moon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Dark</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'light'}\n onCheckedChange={() => {\n setTheme('light');\n }}\n >\n <Sun className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Light</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n auth\n .logout(projectId)\n .then(() => {\n //\n })\n .catch(() => {\n //\n });\n }}\n >\n Log out\n <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flexkit/studio",
3
- "version": "0.2.21",
3
+ "version": "0.2.22",
4
4
  "description": "Flexkit Studio - Build custom internal tools like PIMs, CRMs, and ERPs with a flexible React UI and a graph-backed API",
5
5
  "keywords": [
6
6
  "flexkit",
@@ -77,8 +77,8 @@
77
77
  "tsup": "8.5.1",
78
78
  "typescript": "^5.3.3",
79
79
  "eslint-config-custom": "0.0.0",
80
- "tailwind-config": "0.0.1",
81
- "tsconfig": "0.0.0"
80
+ "tsconfig": "0.0.0",
81
+ "tailwind-config": "0.0.1"
82
82
  },
83
83
  "dependencies": {
84
84
  "@ai-sdk/react": "3.0.118",
@@ -198,7 +198,7 @@
198
198
  "test:performance": "tsup --config tests/performance.config.ts && node --test build/tests/list-performance.test.js build/tests/editor-preview.test.js",
199
199
  "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
200
200
  "ui:add": "pnpm dlx shadcn@latest add",
201
- "test:core": "tsup --config tests/core.config.ts && node --test build/tests/json-schema-to-zod.test.js build/tests/icon-name.test.js build/tests/project-schemas.test.js build/tests/rating-preview.test.js build/tests/last-project.test.js build/tests/proxy-target.test.js build/tests/project-label.test.js build/tests/hosted-session.test.js build/tests/bff-session.test.js build/tests/project-schema-key.test.js build/tests/schema-deploy-watch.test.js build/tests/app-sessions.test.js build/tests/electron-api.test.js",
201
+ "test:core": "tsup --config tests/core.config.ts && node --test build/tests/json-schema-to-zod.test.js build/tests/icon-name.test.js build/tests/project-schemas.test.js build/tests/rating-preview.test.js build/tests/last-project.test.js build/tests/proxy-target.test.js build/tests/project-label.test.js build/tests/hosted-session.test.js build/tests/bff-session.test.js build/tests/project-schema-key.test.js build/tests/schema-deploy-watch.test.js build/tests/app-sessions.test.js build/tests/electron-api.test.js build/tests/error-reporter.test.js",
202
202
  "test:ai": "tsup --config tests/ai.config.ts && node --test build/tests/ai/*.test.js",
203
203
  "test:knowledge": "tsup --config tests/knowledge.config.ts && node --test build/tests/knowledge/*.test.js",
204
204
  "test:graph": "tsup --config tests/graph.config.ts && node --test build/tests/graph/*.test.js",
@@ -1,3 +0,0 @@
1
- import'./index.css';import {c}from'./chunk-5CVDMZUI.js';import {createContext,useContext}from'react';import P from'swr';import {useParams,useHref}from'react-router-dom';import {jsx}from'react/jsx-runtime';var p=c,l=`https://${p}`,n=t=>t?`https://${t}.api.${p}`:l,w=`${l}/images/`,i="-",h={authProviders:`/api/flexkit/${i}/auth/providers`,logout:`/api/flexkit/${i}/auth/logout`,me:`/api/flexkit/${i}/me`,notificationPreferences:`/api/flexkit/${i}/me/notification-preferences`,push:`/api/flexkit/${i}/me/push`,otpConfirm:`/api/flexkit/${i}/auth/otp/confirm`,otpSend:`/api/flexkit/${i}/auth/otp/send`};function a(t=""){return {assets:`/api/flexkit/${t}/assets`,authProviders:`/api/flexkit/${t}/auth/providers`,completion:`/api/flexkit/${t}/completion`,currentUser:`/api/flexkit/${t}/users/me`,loginOtpConfirm:`${n(t)}/auth/otp/confirm`,loginOtpSend:`${n(t)}/auth/otp/send`,logout:e=>{let o=new URLSearchParams({redirect:e});return `/api/flexkit/${t}/auth/logout?${o.toString()}`},schema:`/api/flexkit/${t}/schema`,search:`/api/flexkit/${t}/search`,sessionId:`${n(t)}/api/auth/login/session`}}async function m(t){try{await fetch(h.logout,{credentials:"same-origin",method:"POST"});}catch{}await fetch("/api/flexkit/logout",{credentials:"include",method:"GET"}),window.location.assign(t);}function u(t="projects"){let{projectId:e}=useParams(),o=useHref(`/${e??""}`),r=useHref("/"),{data:g,isLoading:x}=P(e?a(e).currentUser:null,S=>fetch(S,{mode:"cors",credentials:"include"}).then(s=>s.json()).then(s=>({...s,spaces:s.spaces??[]})));return [!!e&&x,{user:g,logout:async()=>{if(t==="hosted"){await m(r);return}await fetch(a(e??"").logout(o),{method:"POST",mode:"cors",credentials:"include"}),await fetch("/api/flexkit/logout",{method:"GET",credentials:"include"}),window.location.reload();}}]}var d=createContext([true,{user:null,logout:()=>Promise.resolve()}]);function B({children:t,mode:e="projects"}){let[o,r]=u(e);return jsx(d.Provider,{value:[o,r],children:t})}function J(){return useContext(d)}
2
- export{l as a,w as b,h as c,a as d,m as e,B as f,J as g};//# sourceMappingURL=chunk-2HYQVMP3.js.map
3
- //# sourceMappingURL=chunk-2HYQVMP3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/api-paths.ts","../src/auth/hosted-logout.ts","../src/auth/use-auth-service.ts","../src/auth/auth-context.tsx"],"names":["domain","flexkitDomain","baseApiUrl","baseProjectApiUrl","projectId","IMAGES_BASE_URL","USER_API_SEGMENT","userApiPaths","apiPaths","redirectPath","params","signOutHosted","rootHref","useAuthService","mode","useParams","projectHref","useHref","user","isLoadingUser","useSWR","url","res","data","AuthContext","createContext","AuthProvider","children","isLoading","auth","jsx","useAuth","useContext"],"mappings":"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","file":"chunk-2HYQVMP3.js","sourcesContent":["import { flexkitDomain } from './domains';\n\nconst domain = flexkitDomain;\nexport const baseApiUrl = `https://${domain}`;\nconst baseProjectApiUrl = (projectId?: string): string =>\n projectId ? `https://${projectId}.api.${domain}` : baseApiUrl;\n\ninterface ApiPaths {\n assets: string;\n authProviders: string;\n completion: string;\n currentUser: string;\n loginOtpConfirm: string;\n loginOtpSend: string;\n /** `redirectPath` is the absolute in-app path to return to after logout. */\n logout: (redirectPath: string) => string;\n /** Deployed project schema, scopes, spaces, title and menu groups. */\n schema: string;\n search: string;\n sessionId: string;\n}\n\nexport const IMAGES_BASE_URL = `${baseApiUrl}/images/`;\n\n/**\n * Reserved BFF segment for user-level (project-less) Flexkit API calls:\n * `/api/flexkit/-/me` is proxied to `https://<flexkitDomain>/api/me` with the\n * session as a bearer token. Project ids are ten characters, so `-` can never\n * collide with one.\n */\nexport const USER_API_SEGMENT = '-';\n\nexport const userApiPaths = {\n authProviders: `/api/flexkit/${USER_API_SEGMENT}/auth/providers`,\n logout: `/api/flexkit/${USER_API_SEGMENT}/auth/logout`,\n /** Signed-in user plus every project they can open. */\n me: `/api/flexkit/${USER_API_SEGMENT}/me`,\n /** The signed-in user's notification preferences (desktop kinds, approval email). */\n notificationPreferences: `/api/flexkit/${USER_API_SEGMENT}/me/notification-preferences`,\n /** Web Push: GET the VAPID public key, POST or DELETE this browser's subscription. */\n push: `/api/flexkit/${USER_API_SEGMENT}/me/push`,\n otpConfirm: `/api/flexkit/${USER_API_SEGMENT}/auth/otp/confirm`,\n otpSend: `/api/flexkit/${USER_API_SEGMENT}/auth/otp/send`,\n} as const;\n\nexport function apiPaths(projectId = ''): ApiPaths {\n return {\n assets: `/api/flexkit/${projectId}/assets`,\n authProviders: `/api/flexkit/${projectId}/auth/providers`,\n completion: `/api/flexkit/${projectId}/completion`,\n currentUser: `/api/flexkit/${projectId}/users/me`,\n loginOtpConfirm: `${baseProjectApiUrl(projectId)}/auth/otp/confirm`,\n loginOtpSend: `${baseProjectApiUrl(projectId)}/auth/otp/send`,\n logout: (redirectPath: string) => {\n const params = new URLSearchParams({ redirect: redirectPath });\n\n return `/api/flexkit/${projectId}/auth/logout?${params.toString()}`;\n },\n schema: `/api/flexkit/${projectId}/schema`,\n search: `/api/flexkit/${projectId}/search`,\n sessionId: `${baseProjectApiUrl(projectId)}/api/auth/login/session`,\n };\n}\n","import { userApiPaths } from '../core/api-paths';\n\n/** Hosted mode sign-out: end the Flexkit session, drop the first-party cookie, go back to the Studio root. */\nexport async function signOutHosted(rootHref: string): Promise<void> {\n try {\n await fetch(userApiPaths.logout, { credentials: 'same-origin', method: 'POST' });\n } catch {\n // The cookie is cleared below either way; the session expires server-side.\n }\n\n await fetch('/api/flexkit/logout', { credentials: 'include', method: 'GET' });\n window.location.assign(rootHref);\n}\n","'use client';\n\nimport useSWR from 'swr';\nimport { useHref, useParams } from 'react-router-dom';\nimport { apiPaths } from '../core/api-paths';\nimport type { StudioMode } from '../core/config/types';\nimport { signOutHosted } from './hosted-logout';\nimport type { AuthService, User } from './types';\n\nexport default function useAuthService(mode: StudioMode = 'projects'): AuthService {\n const { projectId } = useParams();\n // Absolute path of the current project under the router basename.\n const projectHref = useHref(`/${projectId ?? ''}`);\n const rootHref = useHref('/');\n // Role and spaces are per project, so there is nothing to ask until a project is open.\n const { data: user, isLoading: isLoadingUser } = useSWR(projectId ? apiPaths(projectId).currentUser : null, (url: string) =>\n fetch(url, { mode: 'cors', credentials: 'include' })\n .then((res) => res.json() as Promise<User>)\n .then((data) => ({ ...data, spaces: data.spaces ?? [] }))\n );\n const isLoading = Boolean(projectId) && isLoadingUser;\n\n return [\n isLoading,\n {\n user,\n logout: async () => {\n if (mode === 'hosted') {\n await signOutHosted(rootHref);\n\n return;\n }\n\n // wipe remote session\n await fetch(apiPaths(projectId ?? '').logout(projectHref), {\n method: 'POST',\n mode: 'cors',\n credentials: 'include',\n });\n\n // delete first-party auth cookie\n await fetch('/api/flexkit/logout', { method: 'GET', credentials: 'include' });\n\n window.location.reload();\n },\n },\n ];\n}\n","'use client';\n\nimport { createContext, JSX, useContext } from 'react';\nimport useAuthService from './use-auth-service';\nimport type { Auth, AuthService, User } from './types';\nimport type { StudioMode } from '../core/config/types';\n\nconst AuthContext = createContext([\n true,\n {\n user: null as User | null,\n logout: () => Promise.resolve(),\n } as Auth,\n]);\n\nexport function AuthProvider({\n children,\n mode = 'projects',\n}: {\n children: React.ReactNode;\n mode?: StudioMode;\n}): JSX.Element {\n const [isLoading, auth] = useAuthService(mode);\n\n return <AuthContext.Provider value={[isLoading, auth]}>{children}</AuthContext.Provider>;\n}\n\nexport function useAuth(): AuthService {\n return useContext(AuthContext) as AuthService;\n}\n"]}
@@ -1,2 +0,0 @@
1
- import'./index.css';export{a as EntityKnowledgeButton,c as LinkedRecordsSection,b as RecordKnowledgePanel}from'./chunk-BXUW6OXZ.js';import'./chunk-7KRDPQXX.js';import'./chunk-2NXQF2F7.js';import'./chunk-DZS344SD.js';import'./chunk-ZZRA4567.js';import'./chunk-T2DOW23R.js';import'./chunk-XMOSCJOI.js';import'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import'./chunk-PLZUH56T.js';import'./chunk-2HYQVMP3.js';import'./chunk-5CVDMZUI.js';import'./chunk-DGIY4SKN.js';import'./chunk-SZEGGBOC.js';import'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import'./chunk-USNXQOMJ.js';import'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';//# sourceMappingURL=record-links-BACU2DWS.js.map
2
- //# sourceMappingURL=record-links-BACU2DWS.js.map