@augmentd-labs/canvas-web 2.26.19 → 2.26.21

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 (155) hide show
  1. package/dist/assets/DocumentBodyEditor-CE2S2X6g.js +1 -0
  2. package/dist/assets/DocumentIcon-BS10SIP6.js +1 -0
  3. package/dist/assets/EditorOverlay-BUToR_av.js +1 -0
  4. package/dist/assets/FileForm-BxTixeDm.js +1 -0
  5. package/dist/assets/FiltersApplet-DNYAQP5F.js +1 -0
  6. package/dist/assets/HomeFab-CpTZdNyY.js +3 -0
  7. package/dist/assets/IdentityFields-C2MPM-Ab.js +1 -0
  8. package/dist/assets/LensApplet-CRa1j2WP.js +1 -0
  9. package/dist/assets/LinkToCard-BZwwE-Dv.js +1 -0
  10. package/dist/assets/LinkToSidePanel-eCy3nW4R.js +1 -0
  11. package/dist/assets/{LocationTab-BONJQfYM.js → LocationTab-DAtqAQ3l.js} +1 -1
  12. package/dist/assets/{MarkdownEditor-CkobBLtI.js → MarkdownEditor-7OqSDr7E.js} +1 -1
  13. package/dist/assets/MessageComposerDialog-DzLhkHyh.js +4 -0
  14. package/dist/assets/{NextShell-Byg6OtC2.js → NextShell-D9gvlKY2.js} +1 -1
  15. package/dist/assets/NotesApplet-CFK86JYj.js +1 -0
  16. package/dist/assets/ObjectPropertiesCard-C3jt40tM.css +1 -0
  17. package/dist/assets/ObjectPropertiesCard-DDcRLpsW.js +8 -0
  18. package/dist/assets/PathPickerField-cVs5sZuG.js +1 -0
  19. package/dist/assets/PickDocumentsCard-BlicxMqC.js +1 -0
  20. package/dist/assets/SketchApplet-D8mkYmK9.js +1 -0
  21. package/dist/assets/{SketchEditor-C9_lu3Ot.js → SketchEditor-zMrm1npg.js} +4 -4
  22. package/dist/assets/TerminalApplet-BO2HRp0z.js +20 -0
  23. package/dist/assets/TerminalApplet-BrP-ENHg.css +1 -0
  24. package/dist/assets/TextDocumentEditor-7V4aFL8i.js +1 -0
  25. package/dist/assets/TodosApplet-swdaBT-2.js +1 -0
  26. package/dist/assets/TodosWidget-BXF8fYer.js +1 -0
  27. package/dist/assets/UploadProgressList-B2xCVzFR.js +1 -0
  28. package/dist/assets/_agentId_-CHdTYJFu.js +0 -0
  29. package/dist/assets/_contextId_-m9zn5qav.js +1 -0
  30. package/dist/assets/_workspaceName_-D0z9E9Uy.js +1 -0
  31. package/dist/assets/about-pl0DXTEt.js +1 -0
  32. package/dist/assets/add-B30V-yHb.js +1 -0
  33. package/dist/assets/admin-Bhg9QBHL.js +5 -0
  34. package/dist/assets/agents-Bc7_wscP.js +1 -0
  35. package/dist/assets/agents-ClK3Y2x0.js +1 -0
  36. package/dist/assets/alert-dialog-DIA-tAP5.js +1 -0
  37. package/dist/assets/api-CA6WiiYM.js +1 -0
  38. package/dist/assets/api-tokens-O5iFESo0.js +1 -0
  39. package/dist/assets/appearance-DLo_2WH0.js +1 -0
  40. package/dist/assets/applet-target-DnTa2VAT.js +1 -0
  41. package/dist/assets/apps-DzFFo5D0.js +1 -0
  42. package/dist/assets/auth-Bx9fAZmz.js +1 -0
  43. package/dist/assets/auth-CUdpxbLV.js +1 -0
  44. package/dist/assets/backend-sync-progress-DU-e9TWi.css +1 -0
  45. package/dist/assets/backend-sync-progress-DWR42uQV.js +7 -0
  46. package/dist/assets/blobs-WiXP9QRi.js +1 -0
  47. package/dist/assets/button-Bv4zA1qr.js +1 -0
  48. package/dist/assets/chunk-62JRHF6Z-vspAGgtK.js +3 -0
  49. package/dist/assets/{chunk-K2UTITRG-zQFDOW3Q.js → chunk-K2UTITRG-BvHe9UPk.js} +3 -3
  50. package/dist/assets/code-editor-BOIngd5F.js +40 -0
  51. package/dist/assets/color-DFEH4BfK.js +1 -0
  52. package/dist/assets/content-app-view-BUi8HG1r.js +1 -0
  53. package/dist/assets/context-D_K4g9SQ.js +1 -0
  54. package/dist/assets/contexts-B6d6Axza.js +1 -0
  55. package/dist/assets/contexts-CgydYDn-2.js +1 -0
  56. package/dist/assets/date-time-picker-BZaA3M9_.js +1 -0
  57. package/dist/assets/desk-dI_FvLsK.js +1 -0
  58. package/dist/assets/devices-CAa1bRxk.js +1 -0
  59. package/dist/assets/devices-D3-_UWM0.js +1 -0
  60. package/dist/assets/document-BG_mODBn.js +1 -0
  61. package/dist/assets/document-list-BiogH4tf.js +2 -0
  62. package/dist/assets/document-list-DAYdk5vh.css +1 -0
  63. package/dist/assets/document-open-mode-DoImW-xs.js +1 -0
  64. package/dist/assets/embedding-Cjrxh6MN.js +1 -0
  65. package/dist/assets/embedding-m8SZH4oN.js +1 -0
  66. package/dist/assets/form-panel-Dz96K7Lv.js +1 -0
  67. package/dist/assets/geo-CZfs0E-x.js +1 -0
  68. package/dist/assets/home-C5IxNq_5.js +1 -0
  69. package/dist/assets/image-GAAHSSAO-CI-0hUck.js +1 -0
  70. package/dist/assets/index-D7EoeBID.css +2 -0
  71. package/dist/assets/index-DtZS4JJ4.js +16 -0
  72. package/dist/assets/inferd-config-editor-DagMmwW4.js +1 -0
  73. package/dist/assets/input-BOtCd4HP.js +1 -0
  74. package/dist/assets/key-bindings-DomR6ZNC.js +1 -0
  75. package/dist/assets/label-CNoJOoe0.js +1 -0
  76. package/dist/assets/last-path-BbXWC3b3.js +1 -0
  77. package/dist/assets/layer-style-Byl5LNFR.js +1 -0
  78. package/dist/assets/lazy-editor-Cbva8Pe2.js +2 -0
  79. package/dist/assets/logs-CdbfY8_H.js +1 -0
  80. package/dist/assets/{markdown-html-XoABNf32.js → markdown-html-CZMGihx6.js} +1 -1
  81. package/dist/assets/markdown-view-BBBZtNSR.js +2 -0
  82. package/dist/assets/note-save-status-DPz4VzL6.js +1 -0
  83. package/dist/assets/offline-BjMpUv3N.js +1 -0
  84. package/dist/assets/page-header-GtTr9Ff_.js +1 -0
  85. package/dist/assets/public-share-DT9Tgn_Y.js +1 -0
  86. package/dist/assets/query-debug-tVbB_8Z6.js +1 -0
  87. package/dist/assets/react-BHzhHVTZ.js +164 -0
  88. package/dist/assets/registry-BgnkvPjl.js +2 -0
  89. package/dist/assets/relation-events-CKio19hE.js +1 -0
  90. package/dist/assets/remotes-DR_iJClb.js +1 -0
  91. package/dist/assets/role-C5I0Plgn.js +1 -0
  92. package/dist/assets/roles-DERIgujv.js +2 -0
  93. package/dist/assets/roles-DswT1Lv0.js +2 -0
  94. package/dist/assets/settings-B4LC1yCH.js +1 -0
  95. package/dist/assets/settings-BXOyceZ3.js +1 -0
  96. package/dist/assets/settings-CUzf6xEQ.js +14 -0
  97. package/dist/assets/settings-DhoHM9AU.js +1 -0
  98. package/dist/assets/share-target-CpjVaYVl.js +1 -0
  99. package/dist/assets/shared-1dpCuibu.js +1 -0
  100. package/dist/assets/shared-B824Ibpc.js +1 -0
  101. package/dist/assets/sketch-lazy-Q58-vPF-.js +2 -0
  102. package/dist/assets/socket-CtH3EU9m.js +1 -0
  103. package/dist/assets/subtree-transfer-dialog-B7s4r78T.js +1 -0
  104. package/dist/assets/tags-YamdPoBK.js +1 -0
  105. package/dist/assets/text-documents-D_zDMyhB.js +2 -0
  106. package/dist/assets/{ui-BqHBdBU4.js → ui-BSqPn1LJ.js} +2 -2
  107. package/dist/assets/url-params-n7kU_WZ-.js +1 -0
  108. package/dist/assets/use-applet-docs-Cry2SFsG.js +1 -0
  109. package/dist/assets/use-applet-target-mkjQujx6.js +1 -0
  110. package/dist/assets/use-canvas-pins-C57Vbkrq.css +1 -0
  111. package/dist/assets/use-canvas-pins-CZBfEB5E.js +3 -0
  112. package/dist/assets/use-create-panel-DhSNIGtr.js +1 -0
  113. package/dist/assets/use-document-modal-PG8bQyIB.js +1 -0
  114. package/dist/assets/use-menu-BVkqNEIx.js +1 -0
  115. package/dist/assets/use-mobile-Db-vWu9Y.js +1 -0
  116. package/dist/assets/use-settings-back-Dk-DJEUO.js +1 -0
  117. package/dist/assets/use-sortable-data-DYIDDI8c.js +1 -0
  118. package/dist/assets/{use-theme-Bd8sb5Ox.js → use-theme-DaxpiICf.js} +1 -1
  119. package/dist/assets/use-toast-BlLDqSUO.js +1 -0
  120. package/dist/assets/use-toolbox-Ck_cLGgf.js +1 -0
  121. package/dist/assets/use-workspace-identity-BVpGHkZq.js +1 -0
  122. package/dist/assets/useAddTarget-CVRPElxz.js +1 -0
  123. package/dist/assets/useAgentModels-ndLotMWH.js +3 -0
  124. package/dist/assets/useDocumentThumbnail-C_rq2rXs.js +1 -0
  125. package/dist/assets/useEditNoteFields-Bigs9ZG8.js +1 -0
  126. package/dist/assets/useEscapeClose-DR_xKT_k.js +1 -0
  127. package/dist/assets/useSocketSubscription-ifW-vnlb.js +1 -0
  128. package/dist/assets/useToastHelpers-CRrpIIdY.js +1 -0
  129. package/dist/assets/users-C9N-O1QA.js +1 -0
  130. package/dist/assets/workspace-BydSRtST.js +1 -0
  131. package/dist/assets/workspace-CJ1PWQ29.js +1 -0
  132. package/dist/assets/workspace-access-C9nZlBBZ.js +1 -0
  133. package/dist/assets/workspace-area-menu-Ba_9bGKs.js +1 -0
  134. package/dist/assets/workspace-content-gate-D8bzGD9i.js +1 -0
  135. package/dist/assets/workspace-import-form-D5JA8gzx.js +1 -0
  136. package/dist/assets/workspaces-BBgdfAM_.js +1 -0
  137. package/dist/assets/workspaces-Dx5_N57M.js +1 -0
  138. package/dist/index.html +69 -14
  139. package/dist/sw.js +1 -1
  140. package/package.json +2 -2
  141. package/dist/assets/EditorOverlay-B384ALjA.js +0 -1
  142. package/dist/assets/TextDocumentEditor-DBVWuJaR.js +0 -1
  143. package/dist/assets/alert-dialog-BC58hyW-.js +0 -1
  144. package/dist/assets/blobs-CtDkR2hC.js +0 -1
  145. package/dist/assets/code-editor-BQnKd3jw.js +0 -40
  146. package/dist/assets/document-list-BmUv3zzK.js +0 -19
  147. package/dist/assets/document-list-r-TfV16D.css +0 -1
  148. package/dist/assets/image-GAAHSSAO-BoD-NvEF.js +0 -1
  149. package/dist/assets/index-BhcdilCi.css +0 -2
  150. package/dist/assets/index-DRji5GQn.js +0 -61
  151. package/dist/assets/react-BzqgEMSQ.js +0 -164
  152. package/dist/assets/subtree-transfer-dialog-DRz8kLqY.js +0 -1
  153. package/dist/assets/text-documents-BvR9-zf4.js +0 -3
  154. package/dist/assets/useAddTarget-CgZfKokT.js +0 -1
  155. package/dist/assets/workspace-BSXnX2Me.js +0 -1
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{I as r,J as i,Mt as a,Vr as o,X as s}from"./ui-BSqPn1LJ.js";import{t as c}from"./utils-2pl1SbIp.js";import{t as l}from"./button-Bv4zA1qr.js";import{t as u}from"./input-BOtCd4HP.js";import{c as d,t as f}from"./api-CA6WiiYM.js";import{n as p}from"./use-toast-BlLDqSUO.js";var m=e(n(),1),h=[`onnx`,`clip`,`blip`,`openai`],g=[`onnx`,`clip`,`blip`,`ollama`,`vllm`],_=[{id:`openai`,baseUrl:`https://api.openai.com/v1`,label:`OpenAI`},{id:`vllm`,baseUrl:`http://127.0.0.1:8000/v1`,label:`vLLM`},{id:`ollama`,baseUrl:`http://127.0.0.1:11434/v1`,label:`Ollama`}],v=e=>`${d.workspaces}/${encodeURIComponent(e)}/inferd`;function y(e,t){let n={};for(let[r,i]of Object.entries(e.providers||{})){let e={...i};delete e.apiKeySet,delete e.headerNames,t.has(r)&&i.apiKey?e.apiKey=i.apiKey:delete e.apiKey,n[r]=e}return{...e,providers:n}}async function b(e){return await f.get(`${v(e)}/status`)}async function x(e,t={}){let n={};return t.force!==void 0&&(n.force=t.force),await f.post(`${v(e)}/summarize/images`,n)}async function S(e){return await f.post(`${v(e)}/summarize/images/stop`,{})}async function C(e){return await f.get(`${v(e)}/config`)}async function w(e,t){return await f.put(`${v(e)}/config`,t)}async function T(e,t={}){let n={};return t.space&&(n.space=t.space),t.reindex!==void 0&&(n.reindex=t.reindex),t.scope&&(n.scope=t.scope),await f.post(`${v(e)}/reindex`,n)}async function E(e){return await f.get(`${v(e)}/vector-tables`)}async function D(e,t){return await f.delete(`${v(e)}/vector-tables/${encodeURIComponent(t)}`)}async function O(){return await f.get(`${d.inferd}/config`)}async function k(e){return await f.put(`${d.inferd}/config`,e)}async function A(){return await f.get(`${d.inferd}/defaults`)}async function ee(e){return await f.put(`${d.inferd}/defaults`,e)}async function te(e,t){let n={...e};return delete n.apiKeySet,delete n.headerNames,(await f.post(`${d.inferd}/test`,{provider:n,...t?{model:t}:{},probe:!0})).cached??null}async function ne(e,t,n=`text`){let r={...e};return delete r.apiKeySet,delete r.headerNames,await f.post(`${d.inferd}/test`,{provider:r,...t?{model:t}:{},modality:n})}var j=t(),M=`h-8 w-full rounded-md border bg-background px-2 text-sm outline-none focus:ring-2 focus:ring-ring`,N=`font-semibold uppercase tracking-[0.08em]`,P={openai:{url:{key:`baseUrl`,label:`Base URL`,placeholder:`http://gpu.local:8000/v1`,hint:`OpenAI-compatible embeddings endpoint — Ollama, vLLM, TEI, infinity, LM Studio and OpenAI itself all speak this. A trailing /v1 is optional; both http://host:8000 and http://host:8000/v1 work.`},apiKey:"Sent as `Authorization: Bearer …`. Leave empty for servers that do not check it.",imageInput:!0,timeoutMs:!0,headers:!0,where:e=>e.baseUrl||`no endpoint set`},ollama:{url:{key:`host`,label:`Host (legacy)`,placeholder:`http://127.0.0.1:11434`,hint:`Written by an older version. Switch the type to openai — the host becomes the base URL and the /v1 suffix is added for you.`},apiKey:"Sent as `Authorization: Bearer …`.",where:e=>e.host||`http://127.0.0.1:11434`},onnx:{cacheDir:`Where downloaded weights are cached on the server. Empty uses the server default.`,note:`Runs in-process on the server. No endpoint and no credentials.`,where:()=>`in-process`},clip:{cacheDir:`Where downloaded weights are cached on the server. Empty uses the server default.`,note:`Runs in-process on the server. No endpoint and no credentials.`,where:()=>`in-process`}},re=[`baseUrl`,`host`,`apiKey`,`cacheDir`,`imageInput`,`timeoutMs`],F=[{value:`data-uri`,label:`data-uri (default)`,hint:"Images ride in the ordinary `input` array as data URIs (infinity, TEI-style servers)."},{value:`messages`,label:`messages`,hint:`vLLM's multimodal shape: one request per image, wrapped in a chat message.`}],ie=12e4;function I(e){if(typeof e!=`string`||e.trim()===``)return null;let t;try{t=new URL(e.trim())}catch{return`Must be an absolute URL including the scheme, e.g. http://127.0.0.1:11434`}return t.protocol!==`http:`&&t.protocol!==`https:`?`Unsupported scheme '${t.protocol.replace(`:`,``)}'. Use http or https.`:null}function L({title:e,hint:t}){return(0,j.jsxs)(`div`,{className:`mb-2`,children:[(0,j.jsx)(`h3`,{className:c(`text-[11px] text-muted-foreground`,N),children:e}),(0,j.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:t})]})}function R({overridden:e,source:t}){return e?(0,j.jsx)(`span`,{className:`rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary`,title:`Set on this layer; it wins over anything inherited`,children:`overridden`}):(0,j.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground`,title:t?`Inherited: ${t}`:`Inherited from a lower config layer`,children:`inherited`})}function z({label:e,value:t,inheritedValue:n,onChange:r,type:i=`text`,placeholder:a,disabled:o,hint:s,error:l,mono:d}){let f=t!==void 0&&t!==``;return(0,j.jsxs)(`div`,{className:`space-y-1`,children:[(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsx)(`label`,{className:`text-xs font-medium`,children:e}),(0,j.jsx)(R,{overridden:f,source:n===void 0?void 0:String(n)}),f&&!o&&(0,j.jsx)(`button`,{type:`button`,onClick:()=>r(``),className:`text-[10px] text-muted-foreground underline hover:text-foreground`,title:`Clear the override and fall back to the inherited value`,children:`reset`})]}),(0,j.jsx)(u,{type:i,value:t??``,disabled:o,onChange:e=>r(e.target.value),placeholder:a??(n===void 0?`—`:String(n)),className:c(`h-8 text-sm`,d&&`font-mono`,l&&`border-destructive focus-visible:ring-destructive`)}),l&&(0,j.jsx)(`p`,{className:`text-[11px] font-medium text-destructive`,children:l}),s&&(0,j.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:s})]})}function B({label:e,checked:t,overridden:n,disabled:r,onChange:i}){return(0,j.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,j.jsx)(`input`,{type:`checkbox`,disabled:r,checked:t,onChange:e=>i(e.target.checked)}),e,(0,j.jsx)(R,{overridden:n})]})}function ae({storedNames:e,value:t,disabled:n,onChange:r}){let i=t!==void 0,[o,c]=(0,m.useState)([]),d=e=>{c(e),r(Object.fromEntries(e.filter(([e])=>e.trim()!==``)))};return(0,j.jsxs)(`div`,{className:`mt-3 space-y-2`,children:[(0,j.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,j.jsx)(`label`,{className:`text-xs font-medium`,children:`Custom headers`}),i?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:`rounded bg-warning-subtle px-1.5 py-0.5 text-[10px] font-medium text-warning`,children:`will replace stored`}),!n&&(0,j.jsx)(`button`,{type:`button`,onClick:()=>{c([]),r(void 0)},className:`text-[10px] text-muted-foreground underline hover:text-foreground`,children:`cancel`})]}):(0,j.jsx)(R,{overridden:!1,source:e?.join(`, `)})]}),!i&&(0,j.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,j.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:e?.length?(0,j.jsxs)(j.Fragment,{children:[`Stored: `,(0,j.jsx)(`span`,{className:`font-mono`,children:e.join(`, `)}),` (values are never sent back)`]}):`None set.`}),!n&&(0,j.jsx)(l,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>{c([[``,``]]),r({})},children:e?.length?`Replace headers`:`Add headers`})]}),i&&(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Saving replaces every stored header, so re-enter the ones you want to keep.`}),o.map(([e,t],r)=>(0,j.jsxs)(`div`,{className:`flex gap-2`,children:[(0,j.jsx)(u,{value:e,disabled:n,placeholder:`X-Tenant`,className:`h-8 font-mono text-sm`,onChange:e=>d(o.map((t,n)=>n===r?[e.target.value,t[1]]:t))}),(0,j.jsx)(u,{value:t,disabled:n,placeholder:`value`,className:`h-8 font-mono text-sm`,onChange:e=>d(o.map((t,n)=>n===r?[t[0],e.target.value]:t))}),(0,j.jsx)(l,{type:`button`,size:`sm`,variant:`ghost`,disabled:n,"aria-label":`Remove header ${e||r+1}`,onClick:()=>d(o.filter((e,t)=>t!==r)),children:(0,j.jsx)(s,{className:`h-3.5 w-3.5`})})]},r)),!n&&(0,j.jsxs)(l,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>d([...o,[``,``]]),children:[(0,j.jsx)(a,{className:`mr-1.5 h-3.5 w-3.5`}),`Add header`]})]})]})}function V({open:e,onClick:t,label:n}){return(0,j.jsx)(`button`,{type:`button`,onClick:t,"aria-expanded":e,title:n,"aria-label":n,className:`flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground`,children:(0,j.jsx)(o,{className:c(`h-4 w-4 transition-transform motion-reduce:transition-none`,e&&`rotate-180`)})})}var oe={configured:`bg-success`,"needs-fill":`bg-warning`,unresolved:`bg-destructive`,unset:`bg-muted-foreground/30`};function H({value:e,effective:t,inherited:n,resolvedSpaces:o,invalid:d,attention:f,onFill:v,saving:b=!1,disabled:x=!1,saveLabel:S=`Save`,onSave:C}){let{showToast:w}=p(),[T,E]=(0,m.useState)(()=>structuredClone(e)),[D,O]=(0,m.useState)(new Set),[k,A]=(0,m.useState)(null),[ee,H]=(0,m.useState)(!1),[U,W]=(0,m.useState)(``),[se,ce]=(0,m.useState)(``),[le,G]=(0,m.useState)(null),K=(0,m.useMemo)(()=>[...new Set([...Object.keys(t.spaces||{}),...Object.keys(T.spaces||{})])].sort(),[t.spaces,T.spaces]),q=(0,m.useMemo)(()=>[...new Set([...Object.keys(t.providers||{}),...Object.keys(T.providers||{})])].sort(),[t.providers,T.providers]),J=(e,t,n)=>{E(r=>{let i={...r.spaces||{}},a={...i[e]||{}};if(n===``)delete a[t];else if(t===`dim`||t===`maxLength`||t===`dimensions`){let e=Number(n);if(Number.isNaN(e))return r;a[t]=e}else a[t]=n;return Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,spaces:i}})},ue=(e,t,n)=>{E(r=>{let i={...r.spaces||{}},a={...i[e]||{}};return n===void 0?delete a[t]:a[t]=n,Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,spaces:i}})},Y=(e,t,n)=>{t===`apiKey`&&O(t=>{let r=new Set(t);return n===``?r.delete(e):r.add(e),r}),E(r=>{let i={...r.providers||{}},a={...i[e]||{}};if(n===``)delete a[t];else if(t===`timeoutMs`){let e=Number(n);if(Number.isNaN(e))return r;a[t]=e}else a[t]=n;return Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,providers:i}})},de=(e,t,n)=>{E(r=>{let i={...r.providers||{}},a={...i[e]||{}};return n===void 0?delete a[t]:a[t]=n,Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,providers:i}})},fe=e=>{E(t=>{let n={...t.providers||{}};return delete n[e],{...t,providers:n}}),O(t=>{let n=new Set(t);return n.delete(e),n})},pe=()=>{let e=se.trim();if(e){if(K.includes(e)){w({title:`Space exists`,description:`'${e}' already has a row below.`,variant:`destructive`});return}E(t=>({...t,spaces:{...t.spaces||{},[e]:{}}})),ce(``),G(`space:${e}`)}},X=(e,t)=>{if(e){if(q.includes(e)){w({title:`Backend exists`,description:`'${e}' is already declared. Open it below to edit.`,variant:`destructive`});return}E(n=>({...n,providers:{...n.providers||{},[e]:{type:`openai`,...t?{baseUrl:t}:{}}}})),W(``),G(`provider:${e}`)}},me=e=>({...t.providers?.[e]||{},...T.providers?.[e]||{}}),he=async e=>{let n=T.spaces?.[e]?.provider??t.spaces?.[e]?.provider,r=T.spaces?.[e]?.model??t.spaces?.[e]?.model;if(!n){w({title:`No backend`,description:`Space '${e}' has no backend to test.`,variant:`destructive`});return}let i=me(n),a=i.type?P[i.type]?.url?.key:void 0,o=a?I(i[a]):null;if(o){w({title:`Backend '${n}'`,description:o,variant:`destructive`});return}A(e);try{try{await te(i,r)===!1&&(H(!0),w({title:`Downloading model`,description:`'${r??`the configured model`}' is not in the server's cache yet; downloading now. A first test can take a few minutes; the model is then cached for good.`}))}catch{}let n=await ne(i,r,e),a=T.spaces?.[e]?.dim??t.spaces?.[e]?.dim,o=n.dim>0&&a!==void 0&&n.dim!==a;(o||n.dim>0&&a===void 0)&&J(e,`dim`,String(n.dim)),w({title:o?`Backend answered; dimensions corrected`:`Backend answered`,description:o?`Returned ${n.dim}-d but '${e}' was set to ${a}-d. Dimensions updated to ${n.dim}; save to apply. (${n.latencyMs} ms)`:`${n.dim}-d in ${n.latencyMs} ms`})}catch(e){w({title:`Test failed`,description:e instanceof Error?e.message:`Backend unreachable`,variant:`destructive`})}finally{A(null),H(!1)}},Z=(0,m.useMemo)(()=>{let e=[];for(let[n,r]of Object.entries(T.providers||{})){let i=r.type??t.providers?.[n]?.type,a=i?P[i]?.url?.key:void 0;if(!a)continue;let o=I(r[a]);o&&e.push(`${n}: ${o}`)}return e},[T.providers,t.providers]),Q=(0,m.useMemo)(()=>JSON.stringify(T)!==JSON.stringify(e)||D.size>0,[T,e,D]),ge=async()=>{if(Z.length>0){w({title:`Fix the endpoint first`,description:Z.join(` · `),variant:`destructive`});return}await C(y(T,D)),O(new Set)},$=e=>G(t=>t===e?null:e);return(0,j.jsxs)(`div`,{className:`space-y-6`,children:[d&&(0,j.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive-subtle p-3 text-xs`,children:[(0,j.jsx)(i,{className:`mt-0.5 h-4 w-4 shrink-0 text-destructive`}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`p`,{className:`font-medium text-destructive`,children:`Stored config does not resolve; defaults are standing in`}),(0,j.jsx)(`p`,{className:`mt-0.5 font-mono text-[11px] text-muted-foreground`,children:d})]})]}),(0,j.jsxs)(`section`,{children:[(0,j.jsx)(L,{title:`Search models`,hint:`Choose a provider and model for each kind of content. After switching models, fill the new index to make existing documents searchable. Previous model indexes are preserved.`}),K.length===0?(0,j.jsxs)(`div`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,j.jsx)(`p`,{className:`text-sm font-medium`,children:`No spaces on this layer`}),(0,j.jsx)(`p`,{className:`mx-auto mt-1 max-w-sm text-xs text-muted-foreground`,children:`A space needs a backend, a model and a dimension count. Add one below to start embedding.`})]}):(0,j.jsx)(`div`,{className:`divide-y overflow-hidden rounded-lg border`,children:K.map(e=>{let i=T.spaces?.[e]||{},a=t.spaces?.[e]||{},s=n.spaces?.[e]||{},u=o?.[e],p=`space:${e}`,m=le===p,h=i.model??a.model,g=i.provider??a.provider,_=i.dim??a.dim,y=i.chunk??a.chunk??!1,b=f?.includes(e)??!1;return(0,j.jsxs)(`div`,{className:`relative`,children:[(0,j.jsx)(`span`,{className:c(`absolute inset-y-0 left-0 w-[3px]`,oe[d?`unresolved`:b?`needs-fill`:h?`configured`:`unset`]),"aria-hidden":!0}),(0,j.jsxs)(`div`,{className:`flex flex-col gap-2 py-3 pl-4 pr-3 sm:flex-row sm:items-start sm:gap-3`,children:[(0,j.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,j.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1`,children:[(0,j.jsx)(`span`,{className:c(`text-[11px]`,N),children:e}),(0,j.jsx)(`span`,{className:`truncate font-mono text-sm`,children:h||`no model set`}),g&&(0,j.jsxs)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground`,children:[`via `,g]}),_!==void 0&&(0,j.jsxs)(`span`,{className:`text-xs tabular-nums text-muted-foreground`,children:[_,`-d`]}),y&&(0,j.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`chunked`})]}),o&&h&&(0,j.jsxs)(`p`,{className:`mt-1 truncate font-mono text-[11px] text-muted-foreground`,title:`Vector table backing this space`,children:[`└─ `,u?.table??(0,j.jsx)(`span`,{className:`not-italic`,children:`not created yet`})]}),b&&(0,j.jsx)(`p`,{className:`mt-1 text-[11px] text-warning`,children:`New table, nothing embedded in it yet; dense search stays thin for this space until it is filled. Reverting the model is still instant.`})]}),(0,j.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 max-sm:justify-end`,children:[b&&v&&(0,j.jsx)(l,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>v(e),children:`Fill`}),(0,j.jsxs)(l,{type:`button`,size:`sm`,variant:`ghost`,disabled:x||k!==null,onClick:()=>he(e),title:`Round-trip a real embedding call against this backend and report the dimensions it returns`,children:[(0,j.jsx)(r,{className:`mr-1.5 h-3.5 w-3.5`}),k===e?ee?`Downloading…`:`Testing…`:`Test`]}),(0,j.jsx)(V,{open:m,onClick:()=>$(p),label:`Edit ${e}`})]})]}),m&&(0,j.jsxs)(`div`,{className:`border-t bg-muted/40 py-4 pl-4 pr-3`,children:[(0,j.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,j.jsxs)(`div`,{className:`space-y-1`,children:[(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsx)(`label`,{className:`text-xs font-medium`,children:`Backend`}),(0,j.jsx)(R,{overridden:i.provider!==void 0,source:s.provider})]}),(0,j.jsxs)(`select`,{className:M,disabled:x,value:i.provider??``,onChange:t=>J(e,`provider`,t.target.value),children:[(0,j.jsx)(`option`,{value:``,children:a.provider?`inherited: ${a.provider}`:`inherited`}),q.map(e=>(0,j.jsx)(`option`,{value:e,children:e},e))]})]}),(0,j.jsx)(z,{label:`Model`,mono:!0,value:i.model,inheritedValue:a.model,onChange:t=>J(e,`model`,t),disabled:x}),(0,j.jsx)(z,{label:`Dimensions`,type:`number`,value:i.dim,inheritedValue:a.dim,onChange:t=>J(e,`dim`,t),disabled:x,hint:`Sizes the vector table. Test asks the backend and fills in what it really returns.`}),(0,j.jsx)(z,{label:`Max length`,type:`number`,value:i.maxLength,inheritedValue:a.maxLength,onChange:t=>J(e,`maxLength`,t),disabled:x})]}),(0,j.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-4`,children:[(0,j.jsx)(B,{label:`Chunk long inputs`,checked:y,overridden:i.chunk!==void 0,disabled:x,onChange:t=>ue(e,`chunk`,t)}),(0,j.jsx)(B,{label:`Build ANN index`,checked:i.annIndex??a.annIndex??!0,overridden:i.annIndex!==void 0,disabled:x,onChange:t=>ue(e,`annIndex`,t)})]})]})]},e)})}),!x&&(0,j.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2`,children:[(0,j.jsx)(u,{value:se,onChange:e=>ce(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),pe())},placeholder:`new space name (e.g. audio)`,className:`h-8 w-full max-w-xs text-sm sm:w-auto`}),(0,j.jsxs)(l,{type:`button`,size:`sm`,variant:`ghost`,onClick:pe,children:[(0,j.jsx)(a,{className:`mr-1.5 h-3.5 w-3.5`}),`Add space`]})]})]}),(0,j.jsxs)(`section`,{children:[(0,j.jsx)(L,{title:`Model providers`,hint:`Connect a service here, then select it under Search models above. Built-in providers work without an extra connection. Provider changes take effect when you save.`}),(0,j.jsx)(`div`,{className:`divide-y overflow-hidden rounded-lg border`,children:q.map(e=>{let n=T.providers?.[e]||{},r=t.providers?.[e]||{},i=g.includes(e),a=T.providers?.[e]!==void 0,o=`provider:${e}`,c=le===o,d=n.type??r.type,f=d?P[d]:void 0,p=f?.url?I(n[f.url.key]):null,m={...r,...n},_=re.filter(e=>!(n[e]===void 0||e===f?.url?.key||e===`apiKey`&&f?.apiKey||e===`cacheDir`&&f?.cacheDir)),v=K.filter(n=>(T.spaces?.[n]?.provider??t.spaces?.[n]?.provider)===e);return(0,j.jsxs)(`div`,{children:[(0,j.jsxs)(`div`,{className:`flex flex-col gap-2 px-4 py-3 sm:flex-row sm:items-start sm:gap-3`,children:[(0,j.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,j.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1`,children:[(0,j.jsx)(`span`,{className:`font-mono text-sm font-semibold`,children:e}),(0,j.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground`,children:d??`no type`}),i&&(0,j.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`built-in`}),m.apiKeySet&&!D.has(e)&&(0,j.jsx)(`span`,{className:`text-[10px] font-medium text-success`,children:`key set`}),p&&(0,j.jsx)(`span`,{className:`text-[10px] font-medium text-destructive`,children:`check endpoint`})]}),(0,j.jsx)(`p`,{className:`mt-1 truncate font-mono text-[11px] text-muted-foreground`,children:f?f.where(m):`—`}),v.length>0&&(0,j.jsxs)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:[`used by `,v.join(`, `)]})]}),(0,j.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 max-sm:justify-end`,children:[a&&!i&&!x&&(0,j.jsx)(l,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>fe(e),title:`Remove this override`,children:(0,j.jsx)(s,{className:`h-3.5 w-3.5`})}),(0,j.jsx)(V,{open:c,onClick:()=>$(o),label:`Edit ${e}`})]})]}),c&&(0,j.jsxs)(`div`,{className:`border-t bg-muted/40 px-4 py-4`,children:[(0,j.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,j.jsxs)(`div`,{className:`space-y-1`,children:[(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsx)(`label`,{className:`text-xs font-medium`,children:`Type`}),(0,j.jsx)(R,{overridden:n.type!==void 0,source:r.type})]}),(0,j.jsxs)(`select`,{className:M,disabled:x,value:n.type??``,onChange:t=>Y(e,`type`,t.target.value),children:[(0,j.jsx)(`option`,{value:``,children:r.type?`inherited: ${r.type}`:`inherited`}),h.map(e=>(0,j.jsx)(`option`,{value:e,children:e},e)),d&&!h.includes(d)&&(0,j.jsxs)(`option`,{value:d,children:[d,` (legacy)`]})]}),f?.note&&(0,j.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:f.note})]}),f?.url&&(0,j.jsx)(z,{label:f.url.label,mono:!0,value:n[f.url.key],inheritedValue:r[f.url.key],onChange:t=>Y(e,f.url.key,t),disabled:x,placeholder:r[f.url.key]??f.url.placeholder,hint:f.url.hint,error:p??void 0}),f?.cacheDir&&(0,j.jsx)(z,{label:`Cache directory`,mono:!0,value:n.cacheDir,inheritedValue:r.cacheDir,onChange:t=>Y(e,`cacheDir`,t),disabled:x,placeholder:r.cacheDir??`server default`,hint:f.cacheDir}),f?.imageInput&&(0,j.jsxs)(`div`,{className:`space-y-1`,children:[(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsx)(`label`,{className:`text-xs font-medium`,children:`Image input shape`}),(0,j.jsx)(R,{overridden:n.imageInput!==void 0,source:r.imageInput})]}),(0,j.jsxs)(`select`,{className:M,disabled:x,value:n.imageInput??``,onChange:t=>Y(e,`imageInput`,t.target.value),children:[(0,j.jsx)(`option`,{value:``,children:r.imageInput?`inherited: ${r.imageInput}`:`inherited: data-uri`}),F.map(e=>(0,j.jsx)(`option`,{value:e.value,children:e.label},e.value))]}),(0,j.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:F.find(e=>e.value===(n.imageInput??r.imageInput??`data-uri`))?.hint})]}),f?.timeoutMs&&(0,j.jsx)(z,{label:`Request timeout (ms)`,type:`number`,value:n.timeoutMs,inheritedValue:r.timeoutMs??ie,onChange:t=>Y(e,`timeoutMs`,t),disabled:x,hint:`How long to wait for a batch before giving up. Raise it for a slow or cold GPU host.`}),f?.apiKey&&(0,j.jsxs)(`div`,{className:`space-y-1`,children:[(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsx)(`label`,{className:`text-xs font-medium`,children:`API key`}),D.has(e)&&(0,j.jsx)(`span`,{className:`rounded bg-warning-subtle px-1.5 py-0.5 text-[10px] font-medium text-warning`,children:`will be written`})]}),(0,j.jsx)(u,{type:`password`,autoComplete:`new-password`,disabled:x,value:n.apiKey??``,onChange:t=>Y(e,`apiKey`,t.target.value),placeholder:r.apiKeySet?`•••••••• (stored; leave empty to keep)`:`unset`,className:`h-8 text-sm`}),(0,j.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[f.apiKey,` Write-only: the stored key is never sent back, and leaving this empty keeps whatever is stored.`]})]})]}),f?.headers&&(0,j.jsx)(ae,{disabled:x,storedNames:r.headerNames,value:n.headers,onChange:t=>de(e,`headers`,t)}),_.length>0&&!x&&(0,j.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2 rounded-md border border-dashed p-2 text-[11px] text-muted-foreground`,children:[(0,j.jsxs)(`span`,{children:[`Not used by type `,(0,j.jsx)(`span`,{className:`font-mono`,children:d}),`:`,` `,(0,j.jsx)(`span`,{className:`font-mono`,children:_.join(`, `)})]}),(0,j.jsx)(`button`,{type:`button`,className:`underline hover:text-foreground`,onClick:()=>_.forEach(t=>Y(e,t,``)),children:`clear`})]}),r.headerNames&&r.headerNames.length>0&&(0,j.jsxs)(`p`,{className:`mt-3 text-[11px] text-muted-foreground`,children:[`Stored custom headers: `,(0,j.jsx)(`span`,{className:`font-mono`,children:r.headerNames.join(`, `)}),` (values not shown)`]})]})]},e)})}),!x&&(0,j.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2`,children:[(0,j.jsx)(u,{value:U,onChange:e=>W(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),X(U.trim()))},placeholder:`new backend name (e.g. gpu)`,className:`h-8 w-full max-w-xs text-sm sm:w-auto`}),(0,j.jsxs)(l,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>X(U.trim()),children:[(0,j.jsx)(a,{className:`mr-1.5 h-3.5 w-3.5`}),`Add backend`]}),_.filter(e=>!q.includes(e.id)).map(e=>(0,j.jsx)(l,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>X(e.id,e.baseUrl),title:`Add an openai-type backend '${e.id}' pointed at ${e.baseUrl}`,children:e.label},e.id))]})]}),!x&&(0,j.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 border-t pt-4`,children:[(0,j.jsx)(l,{type:`button`,size:`sm`,variant:Q?`default`:`outline`,onClick:ge,disabled:b||!Q||Z.length>0,children:b?`Saving…`:S}),(0,j.jsx)(l,{type:`button`,size:`sm`,variant:`ghost`,disabled:b||!Q,onClick:()=>{E(structuredClone(e)),O(new Set)},children:`Discard changes`}),(0,j.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:Z.length>0?(0,j.jsxs)(`span`,{className:`font-medium text-destructive`,children:[Z.length,` endpoint `,Z.length===1?`needs`:`need`,` fixing`]}):Q?`Unsaved changes`:`Everything saved`})]})]})}export{C as a,T as c,w as d,x as f,O as i,ee as l,D as n,b as o,S as p,A as r,E as s,H as t,k as u};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{t as r}from"./utils-2pl1SbIp.js";var i=e(n(),1),a=t(),o=i.forwardRef(({className:e,type:t,...n},i)=>(0,a.jsx)(`input`,{type:t,className:r(`flex w-full bg-transparent px-3 py-1 text-base transition-colors md:text-sm`,`h-(--input-height) rounded-(--input-radius)`,`border-(length:--input-border-width) border-input shadow-elevation-1`,`file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground`,`placeholder:text-muted-foreground`,`focus-ring`,`disabled:cursor-not-allowed disabled:opacity-50`,e),ref:i,...n}));o.displayName=`Input`;export{o as t};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{ct as r,lt as i,ut as a}from"./index-DtZS4JJ4.js";import{n as o}from"./page-header-GtTr9Ff_.js";import{t as s}from"./use-settings-back-Dk-DJEUO.js";var c=e(n(),1),l=t();function u(){let[e,t]=(0,c.useState)(i),[n,u]=(0,c.useState)(``),d=e=>{if(e.previousTree&&e.previousTree===e.nextTree){u(`Choose a different shortcut: that combination is already assigned.`);return}try{a(e),t(e),u(`Saved on this device.`)}catch{u(`Could not save shortcuts in this browser.`)}};return(0,l.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,l.jsx)(o,{className:`mb-6`,title:`Key bindings`,onBack:s(),description:`Web UI shortcuts, saved on this device and available offline.`}),(0,l.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,l.jsx)(`h2`,{className:`font-medium`,children:`Tree navigation`}),(0,l.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Cycle the open workspace menu’s tabs in their displayed order, including Pins and Layers. Swipe left for next or right for previous over the tab bar. Shortcuts pause while typing or using a dialog.`}),[`previousTree`,`nextTree`].map(t=>(0,l.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,l.jsx)(`label`,{htmlFor:t,className:`min-w-32 text-sm`,children:t===`previousTree`?`Previous tree`:`Next tree`}),(0,l.jsxs)(`select`,{id:t,className:`rounded-md border bg-background p-2 text-sm`,value:e[t].split(`+`).slice(0,-1).join(`+`),onChange:n=>d({...e,[t]:n.target.value?`${n.target.value}+${e[t].slice(-1)||r[t].slice(-1)}`:``}),children:[(0,l.jsx)(`option`,{value:``,children:`Disabled`}),[`Alt`,`Alt+Shift`,`Ctrl+Shift`,`Meta+Shift`].map(e=>(0,l.jsx)(`option`,{value:e,children:e},e))]}),(0,l.jsx)(`select`,{"aria-label":`${t===`previousTree`?`Previous`:`Next`} tree key`,disabled:!e[t],className:`rounded-md border bg-background p-2 text-sm disabled:opacity-50`,value:e[t].slice(-1)||r[t].slice(-1),onChange:n=>d({...e,[t]:`${e[t].split(`+`).slice(0,-1).join(`+`)}+${n.target.value}`}),children:`ABCDEFGHIJKLMNOPQRSTUVWXYZ`.split(``).map(e=>(0,l.jsx)(`option`,{value:e,children:e},e))})]},t)),(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Browsers and operating systems may reserve combinations. Choose another if a shortcut does not reach Canvas. Letters refer to physical keyboard positions (Q/W on a US keyboard); Meta is Command on Mac.`}),(0,l.jsx)(`button`,{type:`button`,className:`rounded-md border px-3 py-2 text-sm hover:bg-accent`,onClick:()=>d({...r}),children:`Restore defaults`}),(0,l.jsx)(`p`,{role:`status`,className:`text-sm`,children:n})]})]})}export{u as default};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{vi as r}from"./ui-BSqPn1LJ.js";import{t as i}from"./utils-2pl1SbIp.js";var a=e(n(),1),o=t(),s=a.forwardRef(({className:e,...t},n)=>(0,o.jsx)(r,{ref:n,className:i(`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70`,e),...t}));s.displayName=r.displayName;export{s as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./url-params-n7kU_WZ-.js";var t=`canvas:lastPath`,n=200;function r(){try{let e=localStorage.getItem(t);if(!e)return{};let n=JSON.parse(e);return n&&typeof n==`object`?n:{}}catch{return{}}}function i(e){try{localStorage.setItem(t,JSON.stringify(e))}catch{}}function a(e,t,a){if(!e)return;let o=r(),s=o[e];if(s&&s.tree===t&&s.path===a)return;delete o[e],o[e]={tree:t,path:a};let c=Object.keys(o);if(c.length>n)for(let e of c.slice(0,c.length-n))delete o[e];i(o)}function o(e){let t=r()[e];return!t||typeof t.path!=`string`||typeof t.tree!=`string`?null:t}function s(t){let n=o(t);return n?e(t,n.path,n.tree):`/workspaces/${t}`}export{a as n,s as r,o as t};
@@ -0,0 +1 @@
1
+ var e=null;function t(){return e||=fetch(`https://api.iconify.design/collection?prefix=ph`).then(e=>e.json()).then(e=>[...e.uncategorized??[],...Object.values(e.categories??{}).flat()].filter(e=>e.endsWith(`-fill`)).map(e=>`ph:${e}`)).catch(()=>(e=null,[])),e}async function n(e,t=120){let n=e.trim();if(!n)return[];try{let e=await(await fetch(`https://api.iconify.design/search?query=${encodeURIComponent(n)}&limit=${t}`)).json();return Array.isArray(e.icons)?e.icons:[]}catch{return[]}}var r=`ph:folder-fill`,i=`ph:squares-four-fill`,a=`ph:stack-fill`,o=[`#ef4444`,`#f97316`,`#f59e0b`,`#eab308`,`#84cc16`,`#22c55e`,`#14b8a6`,`#06b6d4`,`#3b82f6`,`#6366f1`,`#8b5cf6`,`#a855f7`,`#ec4899`,`#f43f5e`,`#64748b`,`#78716c`],s={home:{icon:`ph:house-fill`,color:`#3b82f6`},travel:{icon:`ph:airplane-tilt-fill`,color:`#06b6d4`},work:{icon:`ph:briefcase-fill`,color:`#64748b`},books:{icon:`ph:books-fill`,color:`#a855f7`},workouts:{icon:`ph:barbell-fill`,color:`#22c55e`},sport:{icon:`ph:barbell-fill`,color:`#22c55e`},sports:{icon:`ph:barbell-fill`,color:`#22c55e`},fitness:{icon:`ph:barbell-fill`,color:`#22c55e`},beauty:{icon:`ph:flower-lotus-fill`,color:`#ec4899`},recipes:{icon:`ph:cooking-pot-fill`,color:`#f97316`},"to watch":{icon:`ph:monitor-play-fill`,color:`#f43f5e`},"to read":{icon:`ph:book-open-text-fill`,color:`#8b5cf6`},learning:{icon:`ph:graduation-cap-fill`,color:`#6366f1`},tech:{icon:`ph:cpu-fill`,color:`#14b8a6`},music:{icon:`ph:music-notes-fill`,color:`#eab308`},finance:{icon:`ph:piggy-bank-fill`,color:`#84cc16`},shopping:{icon:`ph:shopping-cart-fill`,color:`#f59e0b`},ideas:{icon:`ph:lightbulb-filament-fill`,color:`#facc15`},data:{icon:`ph:database-fill`,color:`#14b8a6`}},c={"workspace:home":{icon:`ph:house-fill`,color:`#3b82f6`},"workspace:data":{icon:`ph:database-fill`,color:`#14b8a6`}},l={file:{icon:`ph:folder-fill`,color:`#64748b`},cacache:{icon:`ph:database-fill`,color:`#14b8a6`},s3:{icon:`ph:cloud-fill`,color:`#0ea5e9`},gdrive:{icon:`mdi:google-drive`,color:`#fbbc04`},http:{icon:`ph:globe-fill`,color:`#0ea5e9`},imap:{icon:`ph:envelope-fill`,color:`#a855f7`}},u={icon:`ph:hard-drive-fill`,color:`#64748b`};function d(e){let t=e.config?.ui??{},n=e.address&&c[e.address]||e.driver&&l[e.driver]||u;return{icon:typeof t.icon==`string`?t.icon:n.icon??u.icon,color:typeof t.color==`string`?t.color:n.color??u.color}}function f(e){let t=e.metadata?.ui??{},n=s[String(e.label??e.name??``).trim().toLowerCase()];return{icon:typeof t.icon==`string`?t.icon:n?.icon,color:typeof t.color==`string`?t.color:e.color??n?.color}}function p(e){let t=s[(e.split(`/`).filter(Boolean).pop()??``).trim().toLowerCase()];return t?{metadata:m(void 0,t)}:null}function m(e,t){let n={...e??{}},r={...n.ui??{}};return`icon`in t&&(t.icon?r.icon=t.icon:delete r.icon),`color`in t&&(t.color?r.color=t.color:delete r.color),n.ui=r,n}export{o as a,t as c,n as d,s as i,m as l,r as n,d as o,a as r,f as s,i as t,p as u};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MarkdownEditor-7OqSDr7E.js","assets/rolldown-runtime-C0FnF6B9.js","assets/code-editor-BOIngd5F.js","assets/react-BHzhHVTZ.js","assets/ui-BSqPn1LJ.js","assets/utils-2pl1SbIp.js","assets/utils-BxVxyehK.js","assets/punycode.es6-ZbLrB_Dn.js","assets/use-theme-DaxpiICf.js","assets/MarkdownEditor-DWa37grk.css"])))=>i.map(i=>d[i]);
2
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{t as r}from"./preload-helper-Czpn1I53.js";var i=e(n(),1),a=t(),o=(0,i.lazy)(()=>r(()=>import(`./MarkdownEditor-7OqSDr7E.js`).then(e=>({default:e.MarkdownEditor})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))),s=(0,a.jsx)(`div`,{className:`rounded-md border border-input p-3 text-sm text-muted-foreground`,children:`Loading editor…`});function c(e){return(0,a.jsx)(i.Suspense,{fallback:s,children:(0,a.jsx)(o,{...e})})}export{c as t};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{Pt as r,Vt as i,X as a,_i as o,wt as s}from"./ui-BSqPn1LJ.js";import{t as c}from"./button-Bv4zA1qr.js";import{t as l}from"./input-BOtCd4HP.js";import{t as u}from"./label-CNoJOoe0.js";import{i as d}from"./auth-Bx9fAZmz.js";import{n as f}from"./use-toast-BlLDqSUO.js";import{n as p}from"./page-header-GtTr9Ff_.js";import{t as m}from"./use-settings-back-Dk-DJEUO.js";import{t as h}from"./admin-Bhg9QBHL.js";var g=e(n(),1),_=t(),v={tail:200,level:``,module:``};function y(e){return e.slice(-1e3)}function b(e){switch(e.levelLabel){case`fatal`:return`text-destructive`;case`error`:return`text-destructive`;case`warn`:return`text-warning`;case`info`:return`text-info`;case`debug`:return`text-muted-foreground`;case`trace`:return`text-muted-foreground`;default:return`text-success`}}function x(){let e=m(),t=d()?.userType===`admin`,{showToast:n}=f(),x=(0,g.useRef)(null),[S,C]=(0,g.useState)(v),[w,T]=(0,g.useState)(v),[E,D]=(0,g.useState)([]),[O,k]=(0,g.useState)(t),[A,j]=(0,g.useState)(!1),[M,N]=(0,g.useState)(!1),[P,F]=(0,g.useState)(t?null:`Access denied. Admin privileges required.`),I=(0,g.useCallback)(async e=>{try{k(!0);let t=await h.logs.getLogs(e);D(y(t)),F(null)}catch(e){let t=e instanceof Error?e.message:`Failed to load server logs`;F(t),n({title:`Error`,description:t,variant:`destructive`})}finally{k(!1)}},[n]);(0,g.useEffect)(()=>{t&&I(S)},[S,t,I]),(0,g.useEffect)(()=>{if(!t||M)return;let e=new AbortController;return j(!0),h.logs.streamLogs(S,{signal:e.signal,onEntry:e=>{D(t=>y([...t,e]))},onError:e=>{F(e.message)}}).catch(e=>{let t=e instanceof Error?e.message:`Log stream stopped`;F(t),n({title:`Stream error`,description:t,variant:`destructive`})}).finally(()=>{j(!1)}),()=>{e.abort()}},[S,t,M,n]),(0,g.useEffect)(()=>{!x.current||M||(x.current.scrollTop=x.current.scrollHeight)},[E,M]);let L=()=>{C({tail:Math.min(Math.max(Number(w.tail)||v.tail,1),500),level:w.level||``,module:w.module.trim()})},R=(0,g.useMemo)(()=>[{value:``,label:`All levels`},{value:`trace`,label:`Trace`},{value:`debug`,label:`Debug`},{value:`info`,label:`Info`},{value:`warn`,label:`Warn`},{value:`error`,label:`Error`},{value:`fatal`,label:`Fatal`}],[]);return t?(0,_.jsxs)(`div`,{className:`space-y-6`,children:[(0,_.jsx)(p,{onBack:e,title:`Server Logs`,description:`Live tail for the unified canvas-server logger`,actions:(0,_.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,_.jsx)(o,{className:`w-4 h-4 ${A?`text-success`:`text-muted-foreground`}`}),(0,_.jsx)(`span`,{className:`text-muted-foreground`,children:M?`Paused`:A?`Streaming`:`Disconnected`})]})}),(0,_.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-[140px_180px_1fr_auto]`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsx)(u,{htmlFor:`tail`,children:`Tail`}),(0,_.jsx)(l,{id:`tail`,type:`number`,min:1,max:500,value:w.tail,onChange:e=>T(t=>({...t,tail:Number(e.target.value)}))})]}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(u,{htmlFor:`level`,children:`Level`}),(0,_.jsx)(`select`,{id:`level`,className:`w-full px-3 py-2 border rounded-md bg-background`,value:w.level,onChange:e=>T(t=>({...t,level:e.target.value})),children:R.map(e=>(0,_.jsx)(`option`,{value:e.value,children:e.label},e.value||`all`))})]}),(0,_.jsxs)(`div`,{children:[(0,_.jsx)(u,{htmlFor:`module`,children:`Module filter`}),(0,_.jsx)(l,{id:`module`,placeholder:`auth, http, workspace...`,value:w.module,onChange:e=>T(t=>({...t,module:e.target.value}))})]}),(0,_.jsx)(`div`,{className:`flex items-end`,children:(0,_.jsx)(c,{onClick:L,className:`w-full`,children:`Apply`})})]}),(0,_.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,_.jsxs)(c,{variant:`outline`,onClick:()=>N(e=>!e),children:[M?(0,_.jsx)(r,{className:`w-4 h-4 mr-2`}):(0,_.jsx)(i,{className:`w-4 h-4 mr-2`}),M?`Resume`:`Pause`]}),(0,_.jsxs)(c,{variant:`outline`,onClick:()=>I(S),children:[(0,_.jsx)(s,{className:`w-4 h-4 mr-2`}),`Refresh`]}),(0,_.jsxs)(c,{variant:`outline`,onClick:()=>D([]),children:[(0,_.jsx)(a,{className:`w-4 h-4 mr-2`}),`Clear buffer`]}),(0,_.jsxs)(`span`,{className:`text-sm text-muted-foreground ml-auto`,children:[`Showing `,E.length,` lines`]})]}),P&&(0,_.jsx)(`div`,{className:`rounded-md border border-destructive/30 bg-destructive/5 px-4 py-3 text-sm text-destructive`,children:P}),(0,_.jsx)(`div`,{className:`border rounded-lg overflow-hidden`,children:(0,_.jsx)(`div`,{ref:x,"data-scheme":`dark`,className:`bg-background text-success font-mono text-xs h-viewport-pane overflow-auto p-4 rounded-md`,children:O?(0,_.jsx)(`div`,{className:`text-muted-foreground`,children:`Loading logs...`}):E.length===0?(0,_.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,_.jsx)(`div`,{className:`whitespace-pre-wrap break-words`,children:E.map((e,t)=>(0,_.jsx)(`div`,{className:b(e),children:e.line},`${e.time||`log`}-${t}`))})})})]}):(0,_.jsx)(`div`,{className:`text-center space-y-4`,children:(0,_.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}export{x as default};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BQnKd3jw.js";import{t as r}from"./sanitize-DrVcFY1Q.js";import{t as i}from"./markdown-it-DRESbtwK.js";var a=e(n(),1),o=new i({html:!1,linkify:!0,breaks:!1,typographer:!1});o.renderer.rules.link_open=(e,t,n,r,i)=>{let a=String(e[t].attrGet(`href`)??``);return/^[a-z][a-z0-9+.-]*:/i.test(a)&&!a.startsWith(`/`)&&(e[t].attrSet(`target`,`_blank`),e[t].attrSet(`rel`,`noopener noreferrer`)),i.renderToken(e,t,n)},o.core.ruler.after(`inline`,`task-lists`,e=>{let t=e.tokens;for(let n=0;n<t.length;n++){if(t[n].type!==`inline`)continue;let r=t[n-1],i=t[n-2];if(!r||r.type!==`paragraph_open`||!i||i.type!==`list_item_open`)continue;let a=/^\[([ xX])\]\s+/.exec(t[n].content);if(!a)continue;t[n].content=t[n].content.slice(a[0].length);let o=t[n].children;if(o&&o[0]?.type===`text`){o[0].content=o[0].content.replace(/^\[[ xX]\]\s+/,``);let t=new e.Token(`html_inline`,``,0);t.content=`<input type="checkbox" disabled${a[1]===` `?``:` checked`}> `,o.unshift(t)}i.attrJoin(`class`,`task-list-item`),r.hidden=!0;let s=t[n+1];s&&s.type===`paragraph_close`&&(s.hidden=!0)}return!0});function s(e,t=!1){let n=o.render(e??``);return r.sanitize(n,t?{FORBID_TAGS:[`img`,`picture`,`source`,`video`,`audio`,`iframe`,`a`,`input`],KEEP_CONTENT:!0}:{ADD_ATTR:[`target`]})}var c=t();function l({content:e,className:t=``,preview:n=!1}){let r=(0,a.useMemo)(()=>s(e||``,n),[e,n]);return(0,c.jsx)(`div`,{className:`markdown-body ${t}`,dangerouslySetInnerHTML:{__html:r}})}export{l as MarkdownHtml,l as default};
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{t as r}from"./sanitize-DrVcFY1Q.js";import{t as i}from"./markdown-it-DRESbtwK.js";var a=e(n(),1),o=new i({html:!1,linkify:!0,breaks:!1,typographer:!1});o.renderer.rules.link_open=(e,t,n,r,i)=>{let a=String(e[t].attrGet(`href`)??``);return/^[a-z][a-z0-9+.-]*:/i.test(a)&&!a.startsWith(`/`)&&(e[t].attrSet(`target`,`_blank`),e[t].attrSet(`rel`,`noopener noreferrer`)),i.renderToken(e,t,n)},o.core.ruler.after(`inline`,`task-lists`,e=>{let t=e.tokens;for(let n=0;n<t.length;n++){if(t[n].type!==`inline`)continue;let r=t[n-1],i=t[n-2];if(!r||r.type!==`paragraph_open`||!i||i.type!==`list_item_open`)continue;let a=/^\[([ xX])\]\s+/.exec(t[n].content);if(!a)continue;t[n].content=t[n].content.slice(a[0].length);let o=t[n].children;if(o&&o[0]?.type===`text`){o[0].content=o[0].content.replace(/^\[[ xX]\]\s+/,``);let t=new e.Token(`html_inline`,``,0);t.content=`<input type="checkbox" disabled${a[1]===` `?``:` checked`}> `,o.unshift(t)}i.attrJoin(`class`,`task-list-item`),r.hidden=!0;let s=t[n+1];s&&s.type===`paragraph_close`&&(s.hidden=!0)}return!0});function s(e,t=!1){let n=o.render(e??``);return r.sanitize(n,t?{FORBID_TAGS:[`img`,`picture`,`source`,`video`,`audio`,`iframe`,`a`,`input`],KEEP_CONTENT:!0}:{ADD_ATTR:[`target`]})}var c=t();function l({content:e,className:t=``,preview:n=!1}){let r=(0,a.useMemo)(()=>s(e||``,n),[e,n]);return(0,c.jsx)(`div`,{className:`markdown-body ${t}`,dangerouslySetInnerHTML:{__html:r}})}export{l as MarkdownHtml,l as default};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/markdown-html-CZMGihx6.js","assets/rolldown-runtime-C0FnF6B9.js","assets/code-editor-BOIngd5F.js","assets/sanitize-DrVcFY1Q.js","assets/markdown-it-DRESbtwK.js","assets/punycode.es6-ZbLrB_Dn.js","assets/markdown-html-DtQ7-esK.css"])))=>i.map(i=>d[i]);
2
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{t as r}from"./preload-helper-Czpn1I53.js";var i=e(n(),1),a=t(),o=(0,i.lazy)(()=>r(()=>import(`./markdown-html-CZMGihx6.js`),__vite__mapDeps([0,1,2,3,4,5,6])));function s({content:e,className:t=``,preview:n=!1}){return(0,a.jsx)(i.Suspense,{fallback:(0,a.jsx)(`div`,{className:`whitespace-pre-wrap break-words ${t}`,children:e}),children:(0,a.jsx)(o,{content:e,className:t,preview:n})})}export{s as t};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";var r=e(n(),1),i=class{snapshot;listeners=new Set;timer;running;forcedSave;options;key;constructor(e,t,n={}){this.key=e,this.options=n;let r={value:t,saved:JSON.stringify(t),meta:{}};try{let t=JSON.parse(n.storage?.getItem(e)||`null`);t?.version===1&&t.value&&typeof t.saved==`string`&&(r=t)}catch{}this.snapshot={...r,status:JSON.stringify(r.value)===r.saved?`idle`:`draft`,error:``,storageError:!1}}configure=e=>{this.options={...e,storage:this.options.storage}};getSnapshot=()=>this.snapshot;subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)});emit(e){this.snapshot={...this.snapshot,...e},this.listeners.forEach(e=>e())}persist(){try{if(!this.options.storage)throw Error(`Storage unavailable`);this.options.storage.setItem(this.key,JSON.stringify({version:1,value:this.snapshot.value,saved:this.snapshot.saved,meta:this.snapshot.meta})),this.snapshot.storageError&&this.emit({storageError:!1})}catch{this.snapshot.storageError||this.emit({storageError:!0})}}update=e=>{let t={...this.snapshot.value,...e};JSON.stringify(t)!==JSON.stringify(this.snapshot.value)&&(this.emit({value:t,status:`draft`,error:``}),this.persist(),this.schedule())};schedule=()=>{this.cancelTimer(),this.options.save&&(this.timer=setTimeout(()=>{this.flush().catch(()=>{})},this.options.delay??650))};cancelTimer=()=>{clearTimeout(this.timer),this.timer=void 0};flush=()=>(this.cancelTimer(),this.running||=this.drain().finally(()=>{this.running=void 0,this.forcedSave=void 0}),this.running);async drain(){for(;JSON.stringify(this.snapshot.value)!==this.snapshot.saved;){let e=this.snapshot.value,t=this.forcedSave??this.options.save;if(!t||this.options.valid&&!this.options.valid(e))return;this.emit({status:`saving`,error:``});try{await t(e,this.snapshot.meta,e=>{this.emit({meta:e}),this.persist()}),this.emit({saved:JSON.stringify(e)}),this.persist()}catch(e){throw this.emit({status:`error`,error:e instanceof Error?e.message:`Save failed`}),this.persist(),e}}if(this.snapshot.status!==`idle`&&this.emit({status:`saved`}),!this.options.retainAfterSave)try{this.options.storage?.removeItem(this.key)}catch{}}saveWith=e=>(this.forcedSave=e,this.flush());clear=()=>{this.cancelTimer();try{this.options.storage?.removeItem(this.key)}catch{}}};function a(e){let t=`local`;try{let e=localStorage.getItem(`authToken`)||``,n=JSON.parse(atob(e.split(`.`)[1].replace(/-/g,`+`).replace(/_/g,`/`)));t=String(n.sub||n.userId||n.id||n.email||e)}catch{}let n=2166136261;for(let e of t)n=Math.imul(n^e.charCodeAt(0),16777619);return`canvas:note-draft:${n>>>0}:${e}`}var o=class{users=0;draft;constructor(e){this.draft=e}attach(){this.users++}release(){this.users--}},s=new Map;function c(e,t,n={}){let a=(0,r.useMemo)(()=>{let r=s.get(e);if(r)return r;let a;try{a=localStorage}catch{}let c=new o(new i(e,t,{...n,storage:a}));return s.set(e,c),c},[e]),{draft:c}=a;return(0,r.useEffect)(()=>{c.configure(n)}),(0,r.useEffect)(()=>{a.attach();let t=()=>{c.flush().catch(()=>{})},n=()=>{document.visibilityState===`hidden`&&t()};return c.schedule(),window.addEventListener(`online`,t),window.addEventListener(`pagehide`,t),document.addEventListener(`visibilitychange`,n),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`pagehide`,t),document.removeEventListener(`visibilitychange`,n),a.release(),c.flush().catch(()=>{}).finally(()=>{a.users===0&&s.get(e)===a&&s.delete(e)})}},[c,a,e]),{...(0,r.useSyncExternalStore)(c.subscribe,c.getSnapshot),update:c.update,flush:c.flush,clear:c.clear,saveWith:c.saveWith,getSnapshot:c.getSnapshot}}var l=t();function u({status:e,storageError:t,error:n,onRetry:r}){return(0,l.jsx)(`p`,{role:`status`,className:`text-xs text-muted-foreground`,children:e===`error`?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(`span`,{title:n,children:[`Couldn’t sync. `,t?`Keep this editor open.`:`Draft saved on this device.`]}),` `,(0,l.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>void r().catch(()=>{}),children:`Retry`})]}):e===`saving`?`Saving…`:e===`saved`?`Saved`:e===`draft`?t?`Draft recovery unavailable. Keep this editor open until saved.`:`Draft saved on this device`:`Changes save automatically`})}export{c as n,a as r,u as t};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{Ft as r,Hr as i,L as a,Ot as o,X as s,dn as c,ri as l,zn as u}from"./ui-BSqPn1LJ.js";import{t as d}from"./utils-2pl1SbIp.js";import{t as f}from"./button-Bv4zA1qr.js";import{c as p}from"./api-CA6WiiYM.js";import{t as m}from"./LinkToCard-BZwwE-Dv.js";import{B as h,Pt as g,it as _,z as v}from"./workspace-CJ1PWQ29.js";import{t as y}from"./useToastHelpers-CRrpIIdY.js";import{n as b}from"./LinkToSidePanel-eCy3nW4R.js";import{n as x}from"./page-header-GtTr9Ff_.js";import{t as S}from"./use-settings-back-Dk-DJEUO.js";var C=e(n(),1),w=`offline-content-v1`,T=`offline-api-v1`,E=1073741824,D={enabled:!1,budgetBytes:4*E,excludedWorkspaces:[]},O=1e3;function k(e){return(e.startsWith(`/`)?e:`/${e}`).replace(/\/+$/,``)||`/`}function A(e,t,n){return`${e}:${t}:${k(n)}`}var j=`canvas-offline`,M=2,N=null;function P(){return N||(N=new Promise((e,t)=>{let n=indexedDB.open(j,M);n.onupgradeneeded=e=>{let t=n.result;if(t.objectStoreNames.contains(`config`)||t.createObjectStore(`config`),t.objectStoreNames.contains(`entries`)||t.createObjectStore(`entries`,{keyPath:`url`}),e.oldVersion>=1&&t.objectStoreNames.contains(`pins`)){t.deleteObjectStore(`pins`);let e=n.transaction.objectStore(`entries`).openCursor();e.onsuccess=()=>{let t=e.result;if(!t)return;let n=t.value;n.pinned&&t.update({...n,pinned:!1}),t.continue()}}t.objectStoreNames.contains(`scopes`)||t.createObjectStore(`scopes`,{keyPath:`id`})},n.onsuccess=()=>{n.result.onversionchange=()=>{n.result.close(),N=null},e(n.result)},n.onerror=()=>{N=null,t(n.error)}}),N)}function F(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error)})}function I(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}async function L(e,t){return I((await P()).transaction(e).objectStore(e).get(t))}async function R(e){return I((await P()).transaction(e).objectStore(e).getAll())}async function z(e,t,n){let r=(await P()).transaction(e,`readwrite`);return r.objectStore(e).put(t,n),F(r)}async function B(e,t){let n=(await P()).transaction(e,`readwrite`);return n.objectStore(e).delete(t),F(n)}async function V(e){let t=(await P()).transaction(e,`readwrite`);return t.objectStore(e).clear(),F(t)}async function H(){try{let e=await L(`config`,`settings`);return e?{...D,...e}:D}catch{return D}}async function U(e){await z(`config`,e,`settings`)}async function W(e,t){let n=(await P()).transaction(`entries`,`readwrite`),r=n.objectStore(`entries`);for(let n of e){let e=r.get(n);e.onsuccess=()=>{let i=e.result;i?r.put({...i,pinned:t}):t&&r.put({url:n,kind:`content`,size:0,lastAccess:Date.now(),pinned:t})}}return F(n)}async function ee(e){let t=await R(`entries`),n=t.filter(e=>e.kind===`api`).sort((e,t)=>e.lastAccess-t.lastAccess),r=n.slice(0,Math.max(0,n.length-O)),i=t.filter(e=>e.kind===`content`),a=i.reduce((e,t)=>e+t.size,0),o=i.filter(e=>!e.pinned).sort((e,t)=>e.lastAccess-t.lastAccess),s=[];for(let t of o){if(a<=e)break;s.push(t),a-=t.size}if(!r.length&&!s.length)return;let[c,l]=await Promise.all([caches.open(T),caches.open(w)]);await Promise.all([...r.map(async e=>{await c.delete(e.url),await B(`entries`,e.url)}),...s.map(async e=>{await l.delete(e.url),await B(`entries`,e.url)})])}async function te(){let e=await R(`entries`),t=e.filter(e=>e.kind===`content`);return{contentBytes:t.reduce((e,t)=>e+t.size,0),contentCount:t.length,pinnedBytes:t.filter(e=>e.pinned).reduce((e,t)=>e+t.size,0),apiCount:e.length-t.length}}async function ne(){await Promise.all([caches.delete(w),caches.delete(T)]),await V(`entries`),await V(`scopes`)}async function re(){return R(`scopes`)}async function ie(e){return L(`scopes`,e)}async function G(e){await z(`scopes`,e)}async function K(e){let t=await L(`scopes`,e);await B(`scopes`,e),t?.urls.length&&await q(t.urls)}async function q(e){let t=await R(`scopes`),n=new Set(t.flatMap(e=>e.urls)),r=e.filter(e=>!n.has(e));r.length&&await W(r,!1)}var J=3,ae=`data/schema/file`,Y=128;async function oe({workspaceRef:e,path:t,treeName:n,treeType:r},i){let a=await H();if(!a.enabled)throw Error(`Enable the offline cache first`);if(a.excludedWorkspaces.includes(e))throw Error(`Workspace "${e}" is excluded from offline caching`);let o=A(e,n,t),s=k(t),c=await ie(o),l=((await _(e,s,[],{limit:1e4,treeName:n,treeType:r})).payload??[]).filter(e=>e.schema===ae),u=[],d=0,f=0,m=!1,g=l.length;i?.({done:f,total:g,bytes:d});let y=0;await Promise.all(Array.from({length:Math.min(J,l.length)},async()=>{for(;y<l.length;){let t=l[y++];if(d>=a.budgetBytes*.9){m=!0;return}try{let{blob:n}=await v(e,t.id);d+=n.size,u.push(`${p.workspaces}/${e}/documents/${t.id}/content`);try{await h(e,t.id,Y),u.push(`${p.workspaces}/${e}/documents/${t.id}/thumbnail?size=${Y}`)}catch{}}catch{}f+=1,i?.({done:f,total:g,bytes:d})}})),await W(u,!0);let b={id:o,workspaceRef:e,treeName:n,treeType:r,path:s,urls:u,bytes:d,warmedAt:Date.now(),...m?{truncated:!0}:{}};if(await G(b),c){let e=new Set(u),t=c.urls.filter(t=>!e.has(t));t.length&&await q(t)}return b}var X=t(),Z=[{label:`1 GB`,bytes:1*E},{label:`2 GB`,bytes:2*E},{label:`4 GB`,bytes:4*E},{label:`8 GB`,bytes:8*E}];function Q(e){return e<1048576?`${(e/1024).toFixed(0)} KB`:e<1073741824?`${(e/1048576).toFixed(1)} MB`:`${(e/E).toFixed(2)} GB`}function se(){navigator.serviceWorker?.controller?.postMessage({type:`OFFLINE_SETTINGS_CHANGED`})}function ce(){let{showSuccessToast:e,showErrorToast:t}=y(),[n,p]=(0,C.useState)(null),[h,_]=(0,C.useState)(null),[v,x]=(0,C.useState)(null),[S,w]=(0,C.useState)([]),[T,E]=(0,C.useState)([]),[D,O]=(0,C.useState)({}),[k,j]=(0,C.useState)(!1),[M,N]=(0,C.useState)(!1),P=(0,C.useCallback)(()=>{H().then(p).catch(()=>{}),te().then(_).catch(()=>{}),re().then(e=>E(e.sort((e,t)=>e.id.localeCompare(t.id)))).catch(()=>{}),navigator.storage?.persisted?.().then(x).catch(()=>{})},[]);(0,C.useEffect)(()=>{P(),g().then(e=>w(e.map(e=>e.name).filter(Boolean).sort())).catch(()=>{})},[P]);let F=async e=>{p(e),await U(e),se(),e.enabled&&navigator.storage?.persist?.().then(x).catch(()=>{}),ee(e.budgetBytes).then(P).catch(()=>{})},I=e=>{if(!n)return;let t=n.excludedWorkspaces.includes(e)?n.excludedWorkspaces.filter(t=>t!==e):[...n.excludedWorkspaces,e];F({...n,excludedWorkspaces:t})},L=async()=>{j(!0);try{await ne(),e(`Offline cache cleared`),P()}catch(e){t(e instanceof Error?e.message:`Failed to clear cache`)}finally{j(!1)}},R=async n=>{let r=A(n.workspaceRef,n.treeName,n.path);O(e=>({...e,[r]:{done:0,total:0,bytes:0}}));try{let t=await oe(n,e=>O(t=>({...t,[r]:e})));e(t.truncated?`Pinned ${Q(t.bytes)} — stopped at the size budget`:`Pinned ${t.workspaceRef}:/${t.path} (${Q(t.bytes)})`)}catch(e){t(e instanceof Error?e.message:`Failed to pin`)}finally{O(e=>{let{[r]:t,...n}=e;return n}),P()}},z=(e,t)=>{N(!1);for(let n of e)R({workspaceRef:t.workspaceName,path:n,treeName:t.treeName,treeType:t.treeType})},B=e=>({workspaceRef:e.workspaceRef,path:e.path,treeName:e.treeName||`context`,treeType:e.treeType||`context`}),V=async e=>{await K(e),P()};return n?(0,X.jsxs)(`div`,{className:`space-y-8`,children:[(0,X.jsxs)(`section`,{children:[(0,X.jsx)($,{title:`Offline cache`,description:`Keep documents you open (and scopes you pin) readable without a connection. Cached on this device only; least-recently-used files are evicted when the size budget fills. Video streaming is not cached.`}),(0,X.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,X.jsxs)(`button`,{type:`button`,onClick:()=>F({...n,enabled:!n.enabled}),"aria-pressed":n.enabled,className:d(`focus-ring flex items-center gap-3 rounded-lg border p-4 text-left transition-colors`,n.enabled?`border-primary bg-accent`:`border-input hover:bg-muted/40`),children:[(0,X.jsx)(u,{className:`h-5 w-5 shrink-0 text-muted-foreground`}),(0,X.jsxs)(`span`,{className:`flex-1`,children:[(0,X.jsx)(`span`,{className:`block text-sm font-medium`,children:n.enabled?`Enabled`:`Disabled`}),(0,X.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:n.enabled?v===!1?`Storage is not persistent — the browser may still evict the cache under disk pressure`:`Documents are cached as you browse`:`Nothing is cached for offline use`})]}),n.enabled&&(0,X.jsx)(i,{className:`h-4 w-4 shrink-0 text-primary`})]}),n.enabled&&(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`p`,{className:`mb-2 text-sm font-medium`,children:`Size budget`}),(0,X.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:Z.map(e=>(0,X.jsx)(f,{variant:n.budgetBytes===e.bytes?`default`:`outline`,size:`sm`,onClick:()=>F({...n,budgetBytes:e.bytes}),children:e.label},e.bytes))})]}),h&&(0,X.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,X.jsxs)(`div`,{className:`flex items-baseline justify-between text-sm`,children:[(0,X.jsxs)(`span`,{children:[Q(h.contentBytes),` of `,Q(n.budgetBytes),` used`]}),(0,X.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[h.contentCount,` file(s)`,h.pinnedBytes>0?`, ${Q(h.pinnedBytes)} pinned`:``]})]}),(0,X.jsx)(`div`,{className:`h-2 w-full overflow-hidden rounded-full bg-muted`,children:(0,X.jsx)(`div`,{className:`h-full rounded-full bg-primary`,style:{width:`${Math.min(100,h.contentBytes/n.budgetBytes*100)}%`}})})]}),(0,X.jsx)(`div`,{children:(0,X.jsxs)(f,{variant:`outline`,size:`sm`,onClick:L,disabled:k,children:[k?(0,X.jsx)(c,{className:`mr-1.5 h-3.5 w-3.5 animate-spin`}):(0,X.jsx)(s,{className:`mr-1.5 h-3.5 w-3.5`}),`Clear offline cache`]})})]})]})]}),n.enabled&&(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`section`,{children:[(0,X.jsx)($,{title:`Pinned scopes`,description:`A pinned scope — a workspace, or one of its tree paths — is downloaded up front and never evicted. Scopes resolve fresh on every re-warm, so moved contexts and reorganized trees are picked up; documents that left a scope return to normal eviction.`}),(0,X.jsx)(`div`,{className:`mb-3`,children:(0,X.jsxs)(f,{size:`sm`,onClick:()=>N(!0),disabled:!!Object.keys(D).length,children:[(0,X.jsx)(r,{className:`mr-1.5 h-3.5 w-3.5`}),`Pin a path…`]})}),(0,X.jsxs)(`ul`,{className:`space-y-1`,children:[T.map(e=>{let t=D[e.id];return(0,X.jsxs)(`li`,{className:`flex items-center gap-3 rounded-md border border-input px-3 py-2 text-sm`,children:[(0,X.jsxs)(`span`,{className:`flex-1 truncate font-mono text-xs sm:text-sm`,children:[e.workspaceRef,`://`,e.path.replace(/^\//,``),e.treeName&&e.treeName!==`context`&&(0,X.jsx)(`span`,{className:`ml-1.5 rounded bg-muted px-1 py-0.5 font-sans text-[10px] text-muted-foreground`,children:e.treeName})]}),t?(0,X.jsxs)(`span`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,X.jsx)(c,{className:`h-3.5 w-3.5 animate-spin`}),t.total>0?`${t.done}/${t.total} · ${Q(t.bytes)}`:`listing…`]}):(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[Q(e.bytes),e.truncated?` (partial)`:``]}),(0,X.jsx)(f,{variant:`ghost`,size:`sm`,onClick:()=>R(B(e)),"aria-label":`Re-warm ${e.id}`,title:`Re-warm: re-resolve the scope and download anything new`,children:(0,X.jsx)(o,{className:`h-3.5 w-3.5`})}),(0,X.jsx)(f,{variant:`ghost`,size:`sm`,onClick:()=>V(e.id),"aria-label":`Unpin ${e.id}`,children:(0,X.jsx)(a,{className:`h-3.5 w-3.5`})})]})]},e.id)}),T.length===0&&(0,X.jsx)(`li`,{className:`rounded-md border border-dashed border-input px-3 py-4 text-center text-sm text-muted-foreground`,children:`Nothing pinned — everything relies on browse-caching and LRU`})]})]}),(0,X.jsxs)(`section`,{children:[(0,X.jsx)($,{title:`Workspace caching`,description:`Excluded workspaces are never cached — not even as you browse — and are not served from cache.`}),(0,X.jsx)(`ul`,{className:`space-y-1`,children:S.map(e=>{let t=n.excludedWorkspaces.includes(e);return(0,X.jsxs)(`li`,{className:`flex items-center gap-3 rounded-md border border-input px-3 py-2 text-sm`,children:[(0,X.jsx)(`span`,{className:d(`flex-1 truncate`,t&&`text-muted-foreground line-through`),children:e}),t&&(0,X.jsx)(l,{className:`h-3.5 w-3.5 text-muted-foreground`}),(0,X.jsx)(f,{variant:t?`outline`:`ghost`,size:`sm`,onClick:()=>I(e),children:t?`Include`:`Exclude`})]},e)})})]})]}),M&&(0,X.jsx)(b,{onClose:()=>N(!1),children:(0,X.jsx)(m,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,multiple:!1,tabs:[`context`,`directory`],title:`Pin for offline…`,confirmLabel:`Pin path`,onConfirm:z,onClose:()=>N(!1)})})]}):null}function $({title:e,description:t}){return(0,X.jsxs)(`div`,{className:`mb-4`,children:[(0,X.jsx)(`h2`,{className:`text-base font-semibold`,children:e}),(0,X.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t})]})}function le(){return(0,X.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,X.jsx)(x,{className:`mb-6`,title:`Offline`,onBack:S(),description:`Per-device offline cache: browse notes, files, photos and saved websites without a connection.`}),(0,X.jsx)(ce,{})]})}export{le as default};
@@ -0,0 +1 @@
1
+ import{l as e}from"./code-editor-BOIngd5F.js";import{g as t}from"./chunk-62JRHF6Z-vspAGgtK.js";import{L as n,ui as r}from"./ui-BSqPn1LJ.js";import{t as i}from"./utils-2pl1SbIp.js";var a=e();function o({title:e,description:o,actions:s,backTo:c,onBack:l,className:u,compact:d}){let f=t();return(0,a.jsxs)(`div`,{className:i(`flex flex-wrap items-start gap-x-3 gap-y-2`,!d&&`border-b pb-4`,u),children:[(0,a.jsxs)(`div`,{className:`flex min-w-[14rem] flex-1 items-start gap-3`,children:[(l||c)&&(0,a.jsx)(`button`,{type:`button`,onClick:()=>l?l():f(c),"aria-label":`Back`,title:`Back`,className:`mt-1 shrink-0 text-muted-foreground transition-colors hover:text-foreground touch-target`,children:(0,a.jsx)(r,{className:`h-5 w-5`})}),(0,a.jsxs)(`div`,{className:`min-w-0`,children:[(0,a.jsx)(`h1`,{className:i(`truncate font-bold tracking-tight`,d?`text-xl`:`text-3xl`),children:e}),o&&(0,a.jsx)(`p`,{className:i(`break-words text-muted-foreground`,d?`mt-1 text-xs`:`mt-2`),children:o})]})]}),(0,a.jsx)(`button`,{type:`button`,onClick:()=>f(`/`),"aria-label":`Close`,title:`Close`,className:`order-2 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border text-muted-foreground transition-colors hover:bg-muted hover:text-foreground touch-target`,children:(0,a.jsx)(n,{className:`h-4 w-4`})}),s&&(0,a.jsx)(`div`,{className:`order-3 flex w-full items-center gap-2 max-sm:flex-wrap sm:order-1 sm:w-auto`,children:s})]})}function s({className:e}){let r=t();return(0,a.jsx)(`button`,{type:`button`,onClick:()=>r(`/`),"aria-label":`Close`,title:`Close`,className:i(`flex h-7 w-7 shrink-0 items-center justify-center rounded-md border text-muted-foreground transition-colors hover:bg-accent hover:text-foreground touch-target`,e),children:(0,a.jsx)(n,{className:`h-3.5 w-3.5`})})}function c({onBack:e,title:t=`Back`,className:n}){return(0,a.jsx)(`button`,{type:`button`,onClick:e,"aria-label":t,title:t,className:i(`flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground touch-target`,n),children:(0,a.jsx)(r,{className:`h-4 w-4`})})}export{o as n,c as r,s as t};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{u as t}from"./code-editor-BOIngd5F.js";import{l as n}from"./api-CA6WiiYM.js";import{B as r,M as i,N as a,rn as o,z as s}from"./workspace-CJ1PWQ29.js";var c=e(t(),1),l=(0,c.createContext)(null);function u(){return(0,c.useContext)(l)}function d(e,t,r={}){let i=new URLSearchParams;r.download&&i.set(`download`,`1`),r.url&&i.set(`url`,r.url),r.format&&i.set(`format`,r.format),r.version&&i.set(`v`,r.version);let a=i.toString();return`${n}/pub/c/${encodeURIComponent(e)}/documents/${t}/content${a?`?${a}`:``}`}async function f(e,t,r=256){let i=await fetch(`${n}/pub/c/${encodeURIComponent(e)}/documents/${t}/thumbnail?size=${r}`);if(!i.ok)throw Error(`HTTP ${i.status}`);let a=i.headers.get(`content-type`)||`image/webp`;return{blob:await i.blob(),mime:a}}async function p(e,t,n={}){let r=await fetch(d(e,t,n),{signal:n.signal});if(!r.ok)throw Error(`HTTP ${r.status}`);let i=r.headers.get(`content-type`)||`application/octet-stream`;return{blob:await r.blob(),mime:i}}async function m(e,t,n,r={}){let{blob:i}=await p(e,t,{...r}),a=URL.createObjectURL(i),o=document.createElement(`a`);o.href=a,o.download=n,document.body.appendChild(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(a),3e4)}function h(e){let t=u();return(0,c.useMemo)(()=>({isPublic:t!=null,fetchBlob:(n,r={})=>t?p(t,n,r):s(e,n,r),fetchThumbnail:(n,i=256,a)=>t?f(t,n,i):r(e,n,i,a),download:(n,r,i={})=>t?m(t,n,r,i):a(e,n,r,i),streamUrl:(n,r={})=>t?d(t,n,r):i(e,n,r),mintTicket:n=>t?Promise.resolve(!0):o(e,n)}),[e,t])}export{u as i,d as n,h as r,l as t};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{l as t,u as n}from"./code-editor-BOIngd5F.js";import{Ot as r,Tt as i,Wn as a,X as o,mr as s,rr as c}from"./ui-BSqPn1LJ.js";import{t as l}from"./button-Bv4zA1qr.js";import{t as u}from"./input-BOtCd4HP.js";import{t as d}from"./api-CA6WiiYM.js";import{n as f}from"./use-toast-BlLDqSUO.js";import{h as p,o as m,s as h}from"./LinkToCard-BZwwE-Dv.js";import{$ as g,I as _,Pn as v,Sn as y,St as b,bt as x,gt as S,in as C}from"./workspace-CJ1PWQ29.js";import{a as w,c as T,l as E,n as D,o as O,r as k,u as A}from"./backend-sync-progress-DWR42uQV.js";import{t as j}from"./workspace-access-C9nZlBBZ.js";var M=e(n(),1),N={membership:`keep`,propagation:`never`,targets:[],acceptPropagatedDeletions:!1},P=e=>`/workspaces/${encodeURIComponent(e)}/trash/operations`,F=(e,t)=>d.get(`${P(e)}?${new URLSearchParams(Object.entries(t).map(([e,t])=>[e,String(t)]))}`),I=(e,t,n,r={})=>d.post(`${P(e)}/${n}`,{ids:t,...r}),L=(e,t,n,r)=>d.patch(`/workspaces/${encodeURIComponent(e)}/backends/imap/${encodeURIComponent(t)}/containers/${encodeURIComponent(n)}`,{removalPolicy:r}),R=t();function z(e){let t=T(`backends`,e.path)?.backend;return(0,R.jsx)(B,{...e},JSON.stringify([e.workspace,t]))}function B({workspace:e,path:t,onNavigate:n}){let l=T(`backends`,t),u=l.backend,d=l.prefix,[f,g]=(0,M.useState)(null),[_,v]=(0,M.useState)(null),y=(0,M.useRef)(!1),[b,S]=(0,M.useState)(null),[C,j]=(0,M.useState)(null),[N,P]=(0,M.useState)(0),[F,I]=(0,M.useState)(new Set),[L,z]=(0,M.useState)(null),B=(0,M.useCallback)(()=>P(e=>e+1),[]),[V,H]=(0,M.useState)(t);V!==t&&(H(t),I(new Set),z(null),j(null),S(null));let U=f?.revision!==N,W=U?[]:f.items,G=U?[]:f.backends,K=f?.days;(0,M.useEffect)(()=>{let t=!1;return(u?w(e,u).then(e=>({...e,backends:[]})):x(e).then(e=>({items:[],days:null,backends:e.filter(e=>e.driver===`file`&&e.enabled!==!1)}))).then(e=>{t||g({...e,revision:N,error:null})}).catch(e=>{t||g({revision:N,items:[],backends:[],days:null,error:e instanceof Error?e.message:String(e)})}),()=>{t=!0}},[e,u,N]),(0,M.useEffect)(()=>{let t=null,n=n=>{let r=n.detail;r?.workspaceName&&r.workspaceName!==e||r?.treeName&&r.treeName!==`backends`||(t||=setTimeout(()=>{t=null,B()},500))};return window.addEventListener(`workspace:trash:refresh`,n),window.addEventListener(`workspace:tree:refresh`,n),()=>{window.removeEventListener(`workspace:trash:refresh`,n),window.removeEventListener(`workspace:tree:refresh`,n),t&&clearTimeout(t)}},[e,B]);let q=A(W,d),J=async(t,n)=>{if(!(!u||y.current||U||!n.length)&&!(t===`discard`&&!D(u,n))){y.current=!0,v(t),S(null),j(null),z(null);try{let r=await(t===`restore`?O:k)(e,u,[...n].sort((e,t)=>t.deletedAt-e.deletedAt).map(e=>e.id)),i=r.filter(e=>!e.ok);j(`${r.length-i.length} item(s) ${t===`restore`?`restored to their original paths`:`permanently deleted`}.`),i.length&&S(`${i.length} item(s) remain in Trash. ${i.slice(0,3).map(e=>`${e.key||`Item`}: ${e.reason===`precondition-failed`||e.reason===`target-exists`?`original path is occupied`:e.message||e.reason}`).join(`; `)}`),I(new Set)}catch(e){S(e instanceof Error?e.message:String(e))}finally{y.current=!1,v(null),B()}}},Y=(e,t,n)=>z({x:e,y:t,row:n});return(0,R.jsxs)(`section`,{className:`flex h-full min-h-0 flex-col bg-background`,"aria-label":`Backend Trash`,children:[(0,R.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2 border-b px-4 py-3`,children:[(0,R.jsx)(o,{className:`h-4 w-4 shrink-0 text-muted-foreground`}),(0,R.jsx)(h,{items:m(t,e).map((e,t)=>t===2&&u?{...e,label:u}:e),onNavigate:n,className:`basis-48`}),(0,R.jsxs)(`div`,{className:`ml-auto flex max-w-full flex-wrap items-center gap-2`,children:[F.size>0&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`button`,{className:`flex items-center gap-1 rounded border px-2 py-1 text-sm disabled:opacity-50`,disabled:!!_||U,onClick:()=>void J(`restore`,q.filter(e=>F.has(e.id)).flatMap(e=>e.items)),children:[(0,R.jsx)(i,{className:`h-3.5 w-3.5`}),`Restore selected`]}),(0,R.jsxs)(`button`,{className:`flex items-center gap-1 rounded border px-2 py-1 text-sm text-destructive disabled:opacity-50`,disabled:!!_||U,onClick:()=>void J(`discard`,q.filter(e=>F.has(e.id)).flatMap(e=>e.items)),children:[(0,R.jsx)(o,{className:`h-3.5 w-3.5`}),`Delete selected`]})]}),u&&q.length>0&&(0,R.jsxs)(`button`,{className:`flex items-center gap-1 rounded border px-2 py-1 text-sm text-destructive disabled:opacity-50`,disabled:!!_||U,onClick:()=>void J(`discard`,q.flatMap(e=>e.items)),children:[(0,R.jsx)(o,{className:`h-3.5 w-3.5`}),d?`Empty this folder`:`Empty Trash`]}),(0,R.jsx)(`button`,{title:`Refresh Trash`,"aria-label":`Refresh Trash`,className:`rounded p-2 hover:bg-accent`,disabled:!!_||U,onClick:B,children:(0,R.jsx)(r,{className:`h-4 w-4 ${U?`animate-spin`:``}`})})]})]}),(0,R.jsxs)(`div`,{className:`border-b px-4 py-2 text-xs text-muted-foreground`,children:[`Restore files and folders to their original paths. Existing files are kept.`,K?` Deleted items are kept for ${K} days.`:``]}),C&&(0,R.jsx)(`p`,{role:`status`,className:`px-4 py-2 text-sm`,children:C}),(b||f?.error)&&(0,R.jsx)(`p`,{role:`alert`,className:`px-4 py-2 text-sm text-destructive`,children:b||f?.error}),_&&(0,R.jsx)(`p`,{role:`status`,className:`px-4 py-2 text-sm`,children:_===`restore`?`Restoring…`:`Deleting permanently…`}),(0,R.jsx)(`div`,{className:`min-h-0 flex-1 overflow-auto p-3`,children:U?(0,R.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:`Loading Trash…`}):u?q.length===0?(0,R.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:`This Trash folder is empty.`}):(0,R.jsxs)(`table`,{className:`w-full text-left text-sm`,children:[(0,R.jsx)(`thead`,{className:`border-b text-xs text-muted-foreground`,children:(0,R.jsxs)(`tr`,{children:[(0,R.jsx)(`th`,{className:`w-8 p-2`,children:(0,R.jsx)(`input`,{type:`checkbox`,"aria-label":`Select all visible items`,checked:q.length>0&&q.every(e=>F.has(e.id)),onChange:e=>I(e.target.checked?new Set(q.map(e=>e.id)):new Set)})}),(0,R.jsx)(`th`,{className:`p-2`,children:`Name`}),(0,R.jsx)(`th`,{className:`p-2 max-sm:hidden`,children:`Original path`}),(0,R.jsx)(`th`,{className:`p-2 max-md:hidden`,children:`Deleted`}),(0,R.jsx)(`th`,{className:`p-2`,children:(0,R.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,R.jsx)(`tbody`,{children:q.map(e=>(0,R.jsxs)(`tr`,{className:`border-b border-border/50 hover:bg-accent/50`,onContextMenu:t=>{t.preventDefault(),Y(t.clientX,t.clientY,e)},onDoubleClick:()=>e.navigable&&n(E(u,e.key)),children:[(0,R.jsx)(`td`,{className:`p-2`,children:(0,R.jsx)(`input`,{type:`checkbox`,"aria-label":`Select ${e.name}`,checked:F.has(e.id),disabled:!!_,onChange:t=>I(n=>{let r=new Set(n);return t.target.checked?r.add(e.id):r.delete(e.id),r})})}),(0,R.jsx)(`td`,{className:`p-2`,children:(0,R.jsxs)(`button`,{className:`flex items-center gap-2 text-left`,onClick:()=>e.navigable&&n(E(u,e.key)),children:[e.directory?(0,R.jsx)(a,{className:`h-4 w-4 shrink-0`}):(0,R.jsx)(c,{className:`h-4 w-4 shrink-0`}),(0,R.jsxs)(`span`,{children:[e.name,e.navigable&&(0,R.jsxs)(`span`,{className:`ml-2 text-xs text-muted-foreground`,children:[e.items.length,` items`]})]})]})}),(0,R.jsx)(`td`,{className:`p-2 text-xs text-muted-foreground max-sm:hidden`,children:e.key}),(0,R.jsx)(`td`,{className:`p-2 text-xs text-muted-foreground max-md:hidden`,children:new Date(e.items.reduce((e,t)=>Math.max(e,t.deletedAt),0)).toLocaleString()}),(0,R.jsx)(`td`,{className:`p-2 text-right`,children:(0,R.jsx)(`button`,{title:`Actions for ${e.name}`,"aria-label":`Actions for ${e.name}`,disabled:!!_,className:`rounded p-2 hover:bg-accent`,onClick:t=>Y(t.clientX,t.clientY,e),children:(0,R.jsx)(s,{className:`h-4 w-4`})})})]},e.id))})]}):(0,R.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2 lg:grid-cols-3`,children:[G.map(e=>(0,R.jsxs)(`button`,{onClick:()=>n(E(e.address)),className:`flex items-center gap-3 rounded-lg border p-4 text-left hover:bg-accent`,children:[(0,R.jsx)(o,{className:`h-6 w-6 text-muted-foreground`}),(0,R.jsxs)(`span`,{children:[(0,R.jsx)(`span`,{className:`block text-sm font-medium`,children:e.label||e.address}),(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.address})]})]},e.address)),!G.length&&(0,R.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:`No file backends are available.`})]})}),L&&(0,R.jsxs)(p,{x:L.x,y:L.y,onClose:()=>z(null),className:`min-w-44 rounded-md border bg-popover p-1 shadow-elevation-3`,children:[L.row.navigable&&(0,R.jsxs)(`button`,{className:`flex w-full items-center gap-2 rounded px-3 py-2 text-sm hover:bg-accent`,onClick:()=>{n(E(u,L.row.key)),z(null)},children:[(0,R.jsx)(a,{className:`h-4 w-4`}),`Open folder`]}),(0,R.jsxs)(`button`,{disabled:!!_,className:`flex w-full items-center gap-2 rounded px-3 py-2 text-sm hover:bg-accent disabled:opacity-50`,onClick:()=>void J(`restore`,L.row.items),children:[(0,R.jsx)(i,{className:`h-4 w-4`}),`Restore `,L.row.directory?`folder`:`file`]}),(0,R.jsxs)(`button`,{disabled:!!_||U,className:`flex w-full items-center gap-2 rounded px-3 py-2 text-sm text-destructive hover:bg-destructive/10 disabled:opacity-50`,onClick:()=>void J(`discard`,L.row.items),children:[(0,R.jsx)(o,{className:`h-4 w-4`}),`Delete permanently`]})]})]})}function V({value:e,backends:t,source:n,onSave:r,destination:i=!0}){let[a,o]=(0,M.useState)({...N,...e}),[s,c]=(0,M.useState)(!1),[u,d]=(0,M.useState)(``),f=`rounded border bg-background px-2 py-1.5 text-xs w-full`,p=async()=>{c(!0),d(``);try{await r(a),d(`Removal policy saved.`)}catch(e){d(e instanceof Error?e.message:`Could not save policy`)}finally{c(!1)}};return(0,R.jsxs)(`details`,{className:`border-t pt-3 text-xs`,children:[(0,R.jsx)(`summary`,{className:`cursor-pointer font-medium`,children:`Source removals and Trash`}),(0,R.jsxs)(`div`,{className:`mt-3 space-y-3`,children:[(0,R.jsx)(`p`,{className:`text-muted-foreground`,children:`A completed scan removes missing locations from the backend tree. Items with no remaining locations go to Trash until you purge them.`}),(0,R.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,R.jsxs)(`label`,{className:`space-y-1 block`,children:[`When an item disappears from this source`,(0,R.jsxs)(`select`,{className:f,value:a.membership,disabled:s,onChange:e=>o({...a,membership:e.target.value}),children:[(0,R.jsx)(`option`,{value:`keep`,children:`Keep in managed trees`}),(0,R.jsx)(`option`,{value:`review`,children:`Review removal in Trash`}),(0,R.jsx)(`option`,{value:`trash`,children:`Move to Trash automatically`})]})]}),(0,R.jsxs)(`label`,{className:`space-y-1 block`,children:[`Remove tracked copies from other backends`,(0,R.jsxs)(`select`,{className:f,value:a.propagation,disabled:s,onChange:e=>o({...a,propagation:e.target.value}),children:[(0,R.jsx)(`option`,{value:`never`,children:`Never`}),(0,R.jsx)(`option`,{value:`review`,children:`Review in Trash`}),(0,R.jsx)(`option`,{value:`automatic`,children:`Automatically, retaining recovery copies`})]})]})]}),a.propagation!==`never`&&(0,R.jsxs)(`fieldset`,{className:`space-y-2`,children:[(0,R.jsx)(`legend`,{className:`mb-1 font-medium`,children:`Destinations`}),(0,R.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(`input`,{type:`checkbox`,checked:a.targets===`all`,disabled:s,onChange:e=>o({...a,targets:e.target.checked?`all`:[]})}),`All eligible backends`]}),a.targets!==`all`&&t.filter(e=>e.address!==n&&e.kind===`storage`).map(e=>(0,R.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(`input`,{type:`checkbox`,disabled:s||e.config?.propagatedRemovalSupported!==!0,checked:a.targets.includes(e.address),onChange:t=>o({...a,targets:t.target.checked?[...a.targets,e.address]:a.targets.filter(t=>t!==e.address)})}),String(e.config?.label||e.address),e.config?.propagatedRemovalSupported===!0?!e.config?.removalPolicy?.acceptPropagatedDeletions&&` · protected`:` · recovery removal unavailable`]},e.address)),(0,R.jsx)(`p`,{className:`text-muted-foreground`,children:`Only tracked, Canvas-owned copies are eligible. Protected destinations refuse propagated deletion. Recovery removal currently supports filesystem and workspace blob storage; remote destinations remain protected.`})]}),i&&(0,R.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(`input`,{type:`checkbox`,disabled:s,checked:a.acceptPropagatedDeletions,onChange:e=>o({...a,acceptPropagatedDeletions:e.target.checked})}),`Accept propagated deletions on this backend`]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,R.jsx)(l,{size:`sm`,variant:`outline`,disabled:s,onClick:()=>void p(),children:s?`Saving…`:`Save removal policy`}),(0,R.jsx)(`span`,{role:`status`,children:u})]})]})]})}function H({workspaceName:e,canWrite:t}){let{showToast:n}=f(),[a,s]=(0,M.useState)([]),[c,u]=(0,M.useState)(!1),[d,p]=(0,M.useState)([]),[m,h]=(0,M.useState)(!1),g=(0,M.useCallback)(async()=>{u(!0);try{s(await b(e))}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to load the trash`,variant:`destructive`})}finally{u(!1)}},[e]);(0,M.useEffect)(()=>{g()},[g]);let y=(0,M.useCallback)(e=>d.includes(e),[d]),x=async(e,t)=>{p(t=>[...t,...e]);try{await t()}finally{p(t=>t.filter(t=>!e.includes(t)))}},S=t=>x([t.id],async()=>{try{let r=await C(e,[t.id]);r.failed?.length?n({title:`Not restored`,description:r.failed[0]?.error||`No restore target recorded`,variant:`destructive`}):(n({title:`Restored`,description:`Document put back where it was.`}),s(e=>e.filter(e=>e.id!==t.id)))}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to restore`,variant:`destructive`})}}),w=t=>x([t.id],async()=>{try{let r=await _(e,[t.id]);if(r.failed?.length)throw Error(`The item could not be purged. Refresh and retry.`);n({title:`Cleared from Trash`,description:r.preserved?.length?`Existing backend copies remain indexed.`:`Document permanently deleted.`}),s(e=>e.filter(e=>e.id!==t.id))}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to delete`,variant:`destructive`})}}),T=async()=>{if(!m){h(!0);return}h(!1);try{let t=await _(e);n({title:`Trash emptied`,description:`${t.destroyed?.length??0} document(s) purged. ${t.preserved?.length??0} item(s) cleared with backend copies preserved.`}),await g()}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to empty the trash`,variant:`destructive`})}},E=(0,M.useMemo)(()=>a.map(e=>{let t=v(e),n=(e.trashed?.placements??[]).flatMap(e=>e.paths.map(t=>`${e.tree}:${t}`));return{document:e,title:t.title,origin:n,trashedAt:e.trashed?.trashedAt||null}}),[a]);return(0,R.jsxs)(`div`,{className:`space-y-4`,children:[(0,R.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-sm font-medium`,children:`Managed-tree items`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1 max-w-2xl`,children:`Restore managed-tree placements or permanently purge these items. Pending removals require separate approval. Backend copies are managed below.`})]}),(0,R.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 max-sm:flex-wrap`,children:[(0,R.jsxs)(l,{variant:`outline`,size:`sm`,onClick:()=>g(),disabled:c,children:[(0,R.jsx)(r,{className:`mr-2 h-3.5 w-3.5 ${c?`animate-spin`:``}`}),`Refresh`]}),(0,R.jsxs)(l,{variant:m?`destructive`:`outline`,size:`sm`,onClick:T,onBlur:()=>h(!1),disabled:!t||a.length===0,children:[(0,R.jsx)(o,{className:`mr-2 h-3.5 w-3.5`}),m?`Click again to delete everything`:`Empty trash`]})]})]}),c&&a.length===0&&(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading…`}),!c&&a.length===0&&(0,R.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`The trash is empty.`}),E.length>0&&(0,R.jsx)(`div`,{className:`border rounded-md divide-y`,children:E.map(({document:e,title:n,origin:r,trashedAt:a})=>(0,R.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-2`,children:[(0,R.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,R.jsx)(`div`,{className:`truncate text-sm`,children:n}),(0,R.jsxs)(`div`,{className:`truncate text-xs text-muted-foreground`,children:[r.length>0?`from ${r.join(`, `)}`:`no recorded origin`,a?` · ${new Date(a).toLocaleString()}`:``]})]}),(0,R.jsxs)(l,{variant:`outline`,size:`sm`,onClick:()=>S(e),disabled:!t||y(e.id)||r.length===0,title:r.length===0?`Nothing recorded to restore to`:`Put it back where it was`,children:[(0,R.jsx)(i,{className:`mr-2 h-3.5 w-3.5`}),`Restore placements`]}),(0,R.jsx)(l,{variant:`ghost`,size:`sm`,onClick:()=>w(e),disabled:!t||y(e.id),title:`Delete permanently`,children:(0,R.jsx)(o,{className:`h-3.5 w-3.5`})})]},e.id))})]})}function U({workspaceName:e}){return(0,R.jsx)(W,{workspaceName:e},e)}function W({workspaceName:e}){let[t,n]=(0,M.useState)(`pending`),[i,a]=(0,M.useState)(``),[o,s]=(0,M.useState)(``),[c,d]=(0,M.useState)(0),[f,p]=(0,M.useState)(0),[m,h]=(0,M.useState)(null),[_,v]=(0,M.useState)(``),[b,C]=(0,M.useState)(!1),[w,T]=(0,M.useState)(new Set),[E,D]=(0,M.useState)({}),[O,k]=(0,M.useState)(`/Trash`),[A,P]=(0,M.useState)([]),[B,U]=(0,M.useState)({write:!1,admin:!1});(0,M.useEffect)(()=>{let t=!0;return g(e).then(e=>{let n=e.remote?.permissions||e.access?.permissions||(typeof e.sharedVia==`object`?e.sharedVia?.permissions:[])||[],r=j(e);t&&U({admin:r,write:r||n.includes(`write`)})}).catch(()=>{}),()=>{t=!1}},[e]);let[W,G]=(0,M.useState)(null);(0,M.useEffect)(()=>{let t=!0;return x(e).then(e=>{t&&P(e)}).catch(()=>{}),()=>{t=!1}},[e]),(0,M.useEffect)(()=>{let n=!1,r=()=>F(e,{view:t,search:i,...o?{backend:o}:{},offset:c}).then(e=>{n||(h(e),v(``))}).catch(e=>{n||v(e instanceof Error?e.message:`Could not load Trash`)});r();let a=setInterval(()=>{b||r()},5e3);return()=>{n=!0,clearInterval(a)}},[e,t,i,o,c,f,b]);let K=m?.operations||[],q=()=>{T(new Set),p(e=>e+1)},J=()=>{S(e),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e}})),window.dispatchEvent(new CustomEvent(`workspace:trash:refresh`,{detail:{workspaceName:e}}))},Y=async(t,n=[...w])=>{if(!(!n.length||b)&&!(t===`purge`&&!window.confirm(`Permanently delete retained recovery copies for ${n.length} operation(s)?`))){C(!0),v(``);try{let r=(t===`approve`?(await Promise.all(n.map(n=>I(e,[n],t,E[n])))).flatMap(e=>e.results):(await I(e,n,t)).results).filter(e=>!e.ok||e.operation?.state===`failed`);r.length&&v(r.map(e=>e.error||e.operation?.error||`A destination could not be changed. Expand the item for details.`).join(` `)),J(),q()}catch(e){v(e instanceof Error?e.message:`Trash action failed`)}finally{C(!1)}}},X=e=>{n(e),d(0),h(null),T(new Set),D({})};return(0,R.jsxs)(`div`,{className:`space-y-4`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`h2`,{className:`text-base font-semibold`,children:`Workspace Trash`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`Review source removals, recover items, and see what automatic policies changed.`})]}),(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,role:`tablist`,"aria-label":`Trash views`,children:[[[`pending`,`Pending removal`],[`trashed`,`In Trash`],[`activity`,`Activity`]].map(([e,n])=>(0,R.jsx)(l,{role:`tab`,"aria-selected":t===e,size:`sm`,variant:t===e?`default`:`outline`,onClick:()=>X(e),children:n},e)),(0,R.jsxs)(l,{size:`sm`,variant:`ghost`,className:`ml-auto`,onClick:q,disabled:b,children:[(0,R.jsx)(r,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),t===`trashed`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(H,{workspaceName:e,canWrite:B.write},f),(0,R.jsxs)(`details`,{className:`rounded border p-3`,children:[(0,R.jsx)(`summary`,{className:`cursor-pointer text-sm font-medium`,children:`Browse backend recovery copies`}),(0,R.jsx)(`div`,{className:`mt-3 min-h-48`,children:(0,R.jsx)(z,{workspace:e,path:O,onNavigate:k})})]})]}),(0,R.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,R.jsx)(u,{"aria-label":`Filter Trash items`,placeholder:`Filter by item or path…`,className:`max-w-xs`,value:i,onChange:e=>{a(e.target.value),h(null),d(0),T(new Set)}}),(0,R.jsx)(u,{"aria-label":`Filter by backend`,placeholder:`Backend name…`,className:`max-w-56`,value:o,onChange:e=>{s(e.target.value),h(null),d(0),T(new Set)}}),w.size>0&&(0,R.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,R.jsxs)(`span`,{children:[w.size,` selected`]}),t===`pending`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(l,{size:`sm`,disabled:b,onClick:()=>void Y(`approve`),children:`Approve selected`}),(0,R.jsx)(l,{size:`sm`,variant:`outline`,disabled:b,onClick:()=>void Y(`keep`),children:`Keep selected`}),(0,R.jsx)(l,{size:`sm`,variant:`outline`,disabled:b,onClick:()=>void Y(`retry`),children:`Retry`})]}),t===`trashed`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(l,{size:`sm`,variant:`outline`,disabled:b,onClick:()=>void Y(`restore`),children:`Restore copies`}),(0,R.jsx)(l,{size:`sm`,variant:`destructive`,disabled:b,onClick:()=>void Y(`purge`),children:`Purge copies`})]})]})]}),W&&(0,R.jsxs)(`div`,{className:`rounded border p-3 space-y-2`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,R.jsxs)(`p`,{className:`text-sm font-medium`,children:[`Removal policy · `,W.source.account||W.source.backend,W.source.folder?` / ${W.source.folder}`:``]}),(0,R.jsx)(l,{size:`sm`,variant:`ghost`,onClick:()=>G(null),children:`Close`})]}),(0,R.jsx)(V,{source:W.source.backend,backends:A,destination:!1,value:{...N,...A.find(e=>e.address===W.source.backend)?.config?.removalPolicy,membership:E[W.id]?.membership??W.membership!==`keep`?`review`:`keep`,propagation:W.targets.length?`review`:`never`,targets:[...new Set(W.targets.filter(e=>!E[W.id]||E[W.id].targets.includes(JSON.stringify([e.backend,e.key]))).map(e=>e.backend))]},onSave:async t=>{W.source.driver===`imap`?await L(e,W.source.account,W.source.folder,t):await y(e,W.source.driver,W.source.backend,{removalPolicy:t}),P(await x(e))}},W.id)]}),_&&(0,R.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:_}),(0,R.jsxs)(`div`,{className:`overflow-x-auto rounded border`,children:[(0,R.jsxs)(`table`,{className:`w-full text-left text-xs`,children:[(0,R.jsx)(`thead`,{className:`bg-muted`,children:(0,R.jsxs)(`tr`,{children:[(0,R.jsx)(`th`,{className:`p-3 w-8`,children:(0,R.jsx)(`input`,{type:`checkbox`,"aria-label":`Select visible operations`,disabled:!B.write||b||!K.length||t===`activity`,checked:K.length>0&&K.every(e=>w.has(e.id)),onChange:e=>T(e.target.checked?new Set(K.map(e=>e.id)):new Set)})}),(0,R.jsx)(`th`,{className:`p-3`,children:`Item and affected copies`}),(0,R.jsx)(`th`,{className:`p-3`,children:`Source`}),(0,R.jsx)(`th`,{className:`p-3`,children:`Status`}),(0,R.jsx)(`th`,{className:`p-3`,children:`Detected`})]})}),(0,R.jsx)(`tbody`,{children:K.map(e=>{let n=E[e.id]||{targets:e.targets.filter(e=>e.state!==`kept`).map(e=>JSON.stringify([e.backend,e.key])),membership:e.membership!==`keep`};return(0,R.jsxs)(`tr`,{className:`border-t align-top`,children:[(0,R.jsx)(`td`,{className:`p-3`,children:(0,R.jsx)(`input`,{type:`checkbox`,"aria-label":`Select ${e.title}`,disabled:!B.write||b||t===`activity`,checked:w.has(e.id),onChange:t=>T(n=>{let r=new Set(n);return t.target.checked?r.add(e.id):r.delete(e.id),r})})}),(0,R.jsx)(`td`,{className:`p-3 min-w-64`,children:(0,R.jsxs)(`details`,{children:[(0,R.jsx)(`summary`,{className:`cursor-pointer font-medium`,children:e.title}),(0,R.jsxs)(`div`,{className:`mt-2 space-y-2 text-muted-foreground`,children:[(0,R.jsx)(`p`,{children:e.orphan?`No remaining byte locations. Restore placements only unless recovery bytes are available.`:`${e.remainingLocations.length} remaining location(s) when detected.`}),e.placements.map(e=>(0,R.jsxs)(`p`,{children:[e.tree,`: `,e.paths.join(`, `)]},e.tree)),e.membership!==`keep`&&(0,R.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(`input`,{type:`checkbox`,checked:n.membership,disabled:b||t!==`pending`||e.membershipApplied,onChange:t=>D({...E,[e.id]:{...n,membership:t.target.checked}})}),e.membershipApplied?`Managed placements moved to Trash`:`Move managed placements to Trash`]}),e.targets.map(r=>{let i=JSON.stringify([r.backend,r.key]);return(0,R.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,R.jsx)(`input`,{type:`checkbox`,disabled:b||t!==`pending`||!!r.trashId,checked:n.targets.includes(i),onChange:t=>D({...E,[e.id]:{...n,targets:t.target.checked?[...n.targets,i]:n.targets.filter(e=>e!==i)}})}),(0,R.jsxs)(`span`,{className:`break-all`,children:[r.backend,`:`,r.key,` · `,r.state,r.error&&(0,R.jsx)(`span`,{className:`block text-destructive`,children:r.error})]})]},i)}),(0,R.jsx)(l,{size:`sm`,variant:`outline`,disabled:!B.admin,onClick:()=>G(e),children:`Use these choices as a source policy`}),e.remainingLocations.map(e=>(0,R.jsx)(`p`,{className:`break-all`,children:e.url},e.url))]})]})}),(0,R.jsxs)(`td`,{className:`p-3 break-all`,children:[e.source.account||e.source.backend,e.source.folder&&(0,R.jsx)(`span`,{className:`block text-muted-foreground`,children:e.source.folder})]}),(0,R.jsxs)(`td`,{className:`p-3`,children:[e.state,e.error&&(0,R.jsx)(`p`,{className:`mt-1 max-w-xs text-destructive`,children:e.error})]}),(0,R.jsx)(`td`,{className:`p-3 whitespace-nowrap text-muted-foreground`,children:new Date(e.createdAt).toLocaleString()})]},e.id)})})]}),!K.length&&(0,R.jsx)(`p`,{className:`p-5 text-center text-sm text-muted-foreground`,children:m?`No matching operations.`:`Loading…`})]}),(0,R.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-muted-foreground`,children:[(0,R.jsxs)(`span`,{children:[m?.total??0,` operation(s)`]}),(0,R.jsxs)(`div`,{className:`flex gap-2`,children:[(0,R.jsx)(l,{size:`sm`,variant:`outline`,disabled:!c||b,onClick:()=>{d(Math.max(0,c-200)),T(new Set)},children:`Previous`}),(0,R.jsx)(l,{size:`sm`,variant:`outline`,disabled:c+K.length>=(m?.total??0)||b,onClick:()=>{d(c+200),T(new Set)},children:`Next`})]})]})]})}var G=`canvas:query-debug`,K=`canvas:query-debug-changed`;function q(){try{return localStorage.getItem(G)===`1`}catch{return!1}}function J(e){try{e?localStorage.setItem(G,`1`):localStorage.removeItem(G)}catch{}window.dispatchEvent(new CustomEvent(K,{detail:e}))}function Y(){let[e,t]=(0,M.useState)(q);return(0,M.useEffect)(()=>{let e=()=>t(q());return window.addEventListener(K,e),window.addEventListener(`storage`,e),()=>{window.removeEventListener(K,e),window.removeEventListener(`storage`,e)}},[]),e}export{V as a,U as i,J as n,z as o,Y as r,L as s,q as t};