@heycys/gallery 0.2.1 → 0.2.3

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 (169) hide show
  1. package/THIRD-PARTY-NOTICES.md +1 -1
  2. package/browser/editor/page/annotate/index.mjs +3 -2
  3. package/browser/editor/page/board/index.mjs +2 -1
  4. package/browser/editor/page/board/settings.mjs +2 -1
  5. package/browser/editor/page/core.mjs +3 -2
  6. package/browser/editor/page/custom-page.mjs +4 -3
  7. package/browser/editor/page/editor.mjs +13 -7
  8. package/browser/editor/page/emoji-picker/support.mjs +3 -2
  9. package/browser/editor/page/links/index.mjs +1 -12
  10. package/browser/editor/page/links/pages.mjs +3 -2
  11. package/browser/editor/page/outline/folds.mjs +3 -0
  12. package/browser/editor/page/post.mjs +2 -1
  13. package/browser/editor/page/present-links.mjs +4 -3
  14. package/browser/editor/page/present-shell.mjs +3 -58
  15. package/browser/editor/page/session.mjs +3 -37
  16. package/browser/editor/page/storage.mjs +5 -5
  17. package/browser/shared/component-catalog.mjs +2 -2
  18. package/browser/shared/drafts.mjs +26 -51
  19. package/browser/shared/emoji/icon-value.mjs +2 -1
  20. package/browser/shared/extension-manifest.mjs +90 -0
  21. package/browser/shared/extensions.mjs +26 -16
  22. package/browser/shared/http.mjs +1 -1
  23. package/browser/shared/i18n/en.mjs +46 -15
  24. package/browser/shared/media.mjs +2 -1
  25. package/browser/shared/outline.mjs +11 -51
  26. package/browser/shared/page-address.mjs +8 -15
  27. package/browser/shared/paths.mjs +2 -1
  28. package/browser/shared/preferences.mjs +3 -1
  29. package/browser/shared/preview-server.mjs +51 -63
  30. package/browser/shared/service-location.mjs +18 -0
  31. package/browser/shared/session.mjs +3 -6
  32. package/browser/shared/workspace-address.mjs +22 -0
  33. package/browser/shared/workspace-columns.mjs +1 -2
  34. package/browser/shared/workspace-registry.mjs +6 -40
  35. package/browser/shared/workspace.mjs +3 -6
  36. package/browser/shared/writing-preferences.mjs +6 -4
  37. package/dist/{chunk-5MEXZ2UF.mjs → chunk-225ALKYI.mjs} +1 -1
  38. package/dist/{chunk-7N2LPG33.mjs → chunk-2HS7ZBPU.mjs} +1 -1
  39. package/dist/chunk-3F57LEN5.mjs +2 -0
  40. package/dist/{chunk-MKTX5PGV.mjs → chunk-43B75J5T.mjs} +1 -1
  41. package/dist/{chunk-VKSRM7EY.mjs → chunk-4B2TB5K2.mjs} +1 -1
  42. package/dist/{chunk-LV24RY2E.mjs → chunk-4K5KC6V2.mjs} +1 -1
  43. package/dist/chunk-5GK7HS62.mjs +2 -0
  44. package/dist/chunk-6GV3CBB2.mjs +2 -0
  45. package/dist/{chunk-TOE6DPLH.mjs → chunk-6NLXUKAY.mjs} +1 -1
  46. package/dist/{chunk-ZCP7BTOZ.mjs → chunk-6QBHU4DF.mjs} +1 -1
  47. package/dist/{chunk-QXVNUASA.mjs → chunk-6QWQXHAV.mjs} +1 -1
  48. package/dist/chunk-6XD6U3QA.mjs +5 -0
  49. package/dist/{chunk-DKR7LFIY.mjs → chunk-6Y3HYOBM.mjs} +1 -1
  50. package/dist/{chunk-36FIRJIF.mjs → chunk-742D2WWJ.mjs} +2 -2
  51. package/dist/{chunk-7M7UPWU6.mjs → chunk-7EFHNQ5B.mjs} +1 -1
  52. package/dist/{chunk-2GKGEVMR.mjs → chunk-7UZUQQ7Q.mjs} +25 -24
  53. package/dist/{chunk-VPVOAJ7X.mjs → chunk-AGDILNWB.mjs} +1 -1
  54. package/dist/{chunk-5IIH335D.mjs → chunk-ALZ6ZENZ.mjs} +1 -1
  55. package/dist/{chunk-G4YP7GVC.mjs → chunk-BFJGHSQN.mjs} +1 -1
  56. package/dist/{chunk-AMDGVDNV.mjs → chunk-BQNTTFPL.mjs} +1 -1
  57. package/dist/chunk-BX5AKINW.mjs +15 -0
  58. package/dist/{chunk-PAFSFVYB.mjs → chunk-BYNPEUDS.mjs} +1 -1
  59. package/dist/{chunk-74RPP2M2.mjs → chunk-C564NU2H.mjs} +1 -1
  60. package/dist/{chunk-DH6GMDNN.mjs → chunk-CRDG6EF2.mjs} +1 -1
  61. package/dist/{chunk-7XDYK3UC.mjs → chunk-E7656LR7.mjs} +1 -1
  62. package/dist/{chunk-KFZBYDIS.mjs → chunk-ECZBLQKK.mjs} +1 -1
  63. package/dist/{chunk-ZEY2RLBT.mjs → chunk-ERLAIBOA.mjs} +2 -2
  64. package/dist/{chunk-YFJU3O7G.mjs → chunk-FJLM7YE7.mjs} +1 -1
  65. package/dist/{chunk-AFGUR7SY.mjs → chunk-FNCCVGKX.mjs} +1 -1
  66. package/dist/{chunk-VNUWREXU.mjs → chunk-FOJ3K5Z3.mjs} +1 -1
  67. package/dist/{chunk-WCWYNFDF.mjs → chunk-FQ72LZHB.mjs} +1 -1
  68. package/dist/chunk-G7N7YFVD.mjs +2 -0
  69. package/dist/chunk-GIRXJBGC.mjs +2 -0
  70. package/dist/{chunk-VA3KAQZD.mjs → chunk-GKOBB6DH.mjs} +1 -1
  71. package/dist/chunk-GMJD7ID3.mjs +2 -0
  72. package/dist/chunk-GQJMVSSN.mjs +2 -0
  73. package/dist/{chunk-QZ35UAB4.mjs → chunk-GRAXKKG4.mjs} +1 -1
  74. package/dist/{chunk-SAHS56QM.mjs → chunk-HX4DLE3J.mjs} +1 -1
  75. package/dist/{chunk-2RKIHJI2.mjs → chunk-HYMEEXKN.mjs} +1 -1
  76. package/dist/{chunk-QK3VISCA.mjs → chunk-IA4PSIMD.mjs} +1 -1
  77. package/dist/chunk-IS7N3N6Q.mjs +168 -0
  78. package/dist/{chunk-CZ5KJSGK.mjs → chunk-JJNHKGTD.mjs} +1 -1
  79. package/dist/chunk-JPG2LBQM.mjs +11 -0
  80. package/dist/chunk-JYK5WJPM.mjs +2 -0
  81. package/dist/{chunk-LE44MD3O.mjs → chunk-KLQP46Y3.mjs} +1 -1
  82. package/dist/chunk-L55NOXBE.mjs +4 -0
  83. package/dist/{chunk-FXQBADMN.mjs → chunk-LCB6MARS.mjs} +1 -1
  84. package/dist/{chunk-SOD23RGL.mjs → chunk-LJLVCU6W.mjs} +8 -8
  85. package/dist/{chunk-NAGMRVW4.mjs → chunk-LKX55H76.mjs} +1 -1
  86. package/dist/chunk-LMUZQK5O.mjs +2 -0
  87. package/dist/{chunk-CG3UHDKH.mjs → chunk-M4NRDYI5.mjs} +1 -1
  88. package/dist/{chunk-HM4E43VM.mjs → chunk-MAFIGVXY.mjs} +1 -1
  89. package/dist/chunk-NLDF35P5.mjs +2 -0
  90. package/dist/{chunk-3OFXMN6N.mjs → chunk-NMF3IPYA.mjs} +1 -1
  91. package/dist/chunk-ONKC4BCC.mjs +2 -0
  92. package/dist/{chunk-CPS4SRPF.mjs → chunk-OU6ZZVBX.mjs} +2 -2
  93. package/dist/{chunk-NWRZXELO.mjs → chunk-PAREWQGB.mjs} +1 -1
  94. package/dist/{chunk-BYSF5UMM.mjs → chunk-PKVK6WFC.mjs} +2 -2
  95. package/dist/{chunk-4AMTKWDO.mjs → chunk-PUOQ65NC.mjs} +1 -1
  96. package/dist/{chunk-L7W624FD.mjs → chunk-QJAVCTY7.mjs} +1 -1
  97. package/dist/{chunk-6MPKCH3P.mjs → chunk-QNECWMGR.mjs} +1 -1
  98. package/dist/{chunk-HBAUKKQH.mjs → chunk-QP7BOHE4.mjs} +1 -1
  99. package/dist/chunk-QVGOPHOF.mjs +2 -0
  100. package/dist/{chunk-NFABH3QW.mjs → chunk-RRKJMHNX.mjs} +2 -2
  101. package/dist/chunk-S3SX3COT.mjs +20 -0
  102. package/dist/chunk-SQ3FQCCN.mjs +8 -0
  103. package/dist/{chunk-ZO7SFB2E.mjs → chunk-SQ6Y2ZMA.mjs} +2 -2
  104. package/dist/{chunk-3A5I2GJK.mjs → chunk-T4Y2ZSVX.mjs} +1 -1
  105. package/dist/{chunk-VG5JEIUQ.mjs → chunk-TKWEX4FD.mjs} +2 -2
  106. package/dist/{chunk-CCSGFCLZ.mjs → chunk-U3SSPL4K.mjs} +1 -1
  107. package/dist/{chunk-DHB7UZ7F.mjs → chunk-U5XL7D6A.mjs} +1 -1
  108. package/dist/{chunk-JXLSHVJ2.mjs → chunk-UMHUSOPJ.mjs} +1 -1
  109. package/dist/chunk-UTF7GBQU.mjs +4 -0
  110. package/dist/chunk-UTMAY3WK.mjs +2 -0
  111. package/dist/{chunk-S2Y7VI4H.mjs → chunk-V4ZHRALW.mjs} +2 -2
  112. package/dist/{chunk-GWOYMENX.mjs → chunk-V6XZ4VIR.mjs} +1 -1
  113. package/dist/{chunk-WTEGUPFG.mjs → chunk-VRPVVMRB.mjs} +1 -1
  114. package/dist/{chunk-XKOHV4H6.mjs → chunk-W5NPH5UA.mjs} +1 -1
  115. package/dist/{chunk-VGTMLQWZ.mjs → chunk-WD4U6XXT.mjs} +1 -1
  116. package/dist/{chunk-4DNHHJSL.mjs → chunk-XBNFXWAW.mjs} +1 -1
  117. package/dist/chunk-XZV72SQ4.mjs +2 -0
  118. package/dist/{chunk-QJ3TFJLQ.mjs → chunk-Y34NR5JL.mjs} +1 -1
  119. package/dist/{chunk-YBB5LWZK.mjs → chunk-YFJB534W.mjs} +1 -1
  120. package/dist/{chunk-V5JRSGZF.mjs → chunk-YN37ZDLW.mjs} +1 -1
  121. package/dist/chunk-Z6OKLRHC.mjs +2 -0
  122. package/dist/chunk-ZLS2FRS6.mjs +3 -0
  123. package/dist/{chunk-JI6T3A4Y.mjs → chunk-ZMHUDYLV.mjs} +1 -1
  124. package/dist/{chunk-KH24LWAT.mjs → chunk-ZTHICSSF.mjs} +1 -1
  125. package/dist/cli.mjs +1 -1
  126. package/dist/server.mjs +1 -1
  127. package/dist/worker.mjs +1 -1
  128. package/kit/math.js +1 -1
  129. package/kit/runtime.js +13 -2
  130. package/kit/state.js +2 -0
  131. package/kit/ui.js +5 -1
  132. package/package.json +1 -1
  133. package/release.json +7 -7
  134. package/skill/SKILL.md +13 -13
  135. package/skill/references/building-blocks.md +1 -1
  136. package/skill/references/extensions.md +45 -9
  137. package/web/assets/index-D8P8uhDW.js +15 -0
  138. package/web/assets/{index-xP0uw3a0.css → index-FLb9jCfl.css} +1 -1
  139. package/web/index.html +2 -2
  140. package/dist/chunk-46ACXOU5.mjs +0 -2
  141. package/dist/chunk-5DPABPBI.mjs +0 -2
  142. package/dist/chunk-5L26JUYA.mjs +0 -2
  143. package/dist/chunk-AEMVZYZQ.mjs +0 -166
  144. package/dist/chunk-ASAXY2DJ.mjs +0 -2
  145. package/dist/chunk-DAMVDXR3.mjs +0 -2
  146. package/dist/chunk-DLFZJJEE.mjs +0 -2
  147. package/dist/chunk-EKNHM3P4.mjs +0 -2
  148. package/dist/chunk-FCK6NXON.mjs +0 -3
  149. package/dist/chunk-FX42XU6J.mjs +0 -2
  150. package/dist/chunk-HATA2W7X.mjs +0 -2
  151. package/dist/chunk-JJNRIFND.mjs +0 -8
  152. package/dist/chunk-JL6R4FG4.mjs +0 -4
  153. package/dist/chunk-KUILYI7H.mjs +0 -4
  154. package/dist/chunk-NIW7F7LU.mjs +0 -4
  155. package/dist/chunk-OU3S466R.mjs +0 -20
  156. package/dist/chunk-QCEATQC4.mjs +0 -2
  157. package/dist/chunk-TDWJKOLN.mjs +0 -2
  158. package/dist/chunk-UGO5N3EI.mjs +0 -15
  159. package/dist/chunk-XMKHCUI6.mjs +0 -15
  160. package/dist/chunk-XQRUG4G3.mjs +0 -2
  161. package/dist/chunk-YPPJVDQI.mjs +0 -2
  162. package/dist/chunk-ZANMKAWS.mjs +0 -2
  163. package/web/assets/index-BHC5ZOMh.js +0 -15
  164. /package/dist/{chunk-N3DSBH5S.mjs → chunk-A55HN5OK.mjs} +0 -0
  165. /package/dist/{chunk-KNZJT4ET.mjs → chunk-QAIHRH3I.mjs} +0 -0
  166. /package/dist/{chunk-ZW2A6GBW.mjs → chunk-QR6A54KJ.mjs} +0 -0
  167. /package/dist/{chunk-74UW7QSL.mjs → chunk-UH4SIXTR.mjs} +0 -0
  168. /package/dist/{chunk-EKGYYOSP.mjs → chunk-W7XHE4CT.mjs} +0 -0
  169. /package/dist/{chunk-5MMN3N5J.mjs → chunk-YEY3RSFQ.mjs} +0 -0
@@ -0,0 +1,20 @@
1
+ import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
2
+ import{a as De,b as Fe}from"./chunk-IA4PSIMD.mjs";import{b as Ie}from"./chunk-F4ZA6JRZ.mjs";import{a as be,b as Ne,c as ht,d as Te,e as Ee,f as Re}from"./chunk-6NLXUKAY.mjs";import{b as je,c as Me,e as Ae,g as Gt}from"./chunk-VRPVVMRB.mjs";import{a as he}from"./chunk-UMHUSOPJ.mjs";import{a as $e,d as xe,e as Se,f as ve,g as Oe}from"./chunk-W5NPH5UA.mjs";import{e as ye,f as ge,g as ke,h as Kt}from"./chunk-ECZBLQKK.mjs";import{a as J,m as we}from"./chunk-E7656LR7.mjs";import{g as me,u as pe}from"./chunk-TKWEX4FD.mjs";var Mn=3e4,An=12e4,Nn=1500,Je=1e4,Pe=p=>p.reduce((u,{key:d,tag:f})=>u.set(`${d}
3
+ ${f}`,(u.get(`${d}
4
+ ${f}`)??0)+1),new Map);function Le({now:p=Date.now,hold:u=Mn,limit:d=An,quiet:f=Nn}={}){let b=new Map,h=new Map,x=new Map,l=new Map,c=new Map;return{wrote(g,k){l.set(g,J(k))},judge(g,{source:k,mtime:R}){if(k===null)return b.delete(g),x.delete(g),{held:!1,signs:[],wait:0,own:!1};let N=J(k),S=c.get(g)?.hash===N?c.get(g).signs:null;S||(S=Ne(k),c.set(g,{hash:N,signs:S}));let Q=p(),L=(U,D=!1)=>(b.delete(g),h.set(g,Pe(S)),x.set(g,k),{held:!1,signs:[],wait:U,own:D});if(l.get(g)===N)return L(0,!0);let _=h.get(g)??new Map,z=Pe(S);if([...z].some(([U,D])=>D>(_.get(U)??0))){let U=Math.min(R,Q),D=b.get(g)??U;b.set(g,D);let V=Math.min(u-(Q-U),d-(Q-D));if(V>0)return{held:!0,signs:S.filter(({key:s,tag:w})=>z.get(`${s}
5
+ ${w}`)>(_.get(`${s}
6
+ ${w}`)??0)),wait:V,own:!1,taken:x.get(g)}}return L(Math.min(f,Math.max(0,f-(Q-R))))}}}import{documentKey as nr}from"../browser/shared/workspace-address.mjs";import{serviceLocation as rr}from"../browser/shared/service-location.mjs";import{createHmac as or,randomBytes as ee}from"node:crypto";import{existsSync as ar,mkdirSync as sr,readFileSync as ir,writeFileSync as cr}from"node:fs";import H from"node:fs/promises";import P from"node:path";import{FILE as fr}from"../browser/shared/annotations.mjs";import{escapeTyped as lr}from"../browser/shared/escape.mjs";import{writeAtomic as Jt}from"../browser/shared/files.mjs";import{sendJson as Y}from"../browser/shared/http.mjs";import{REQUEST_ID as Xt}from"../browser/shared/ids.mjs";import{UPLOAD_REQUEST_LIMIT as ur}from"../browser/shared/media.mjs";import{reportsDirectory as dr}from"../browser/shared/paths.mjs";import{sameDirectory as mr}from"../browser/shared/preview-server.mjs";import{slugPattern as rt}from"../browser/shared/reports.mjs";import{TODO_MOST as pr}from"../browser/shared/workspace-query.mjs";import{documentDirectory as wr,documentFiles as Nt,isDocumentSource as hr}from"../browser/shared/workspace.mjs";import Qt from"node:fs/promises";import _e from"node:path";import{checkAnnotations as Tn,cleanAnchor as En,cleanItem as Ue,FILE as Rn,itemsText as In,readItems as Dn,treeText as We}from"../browser/shared/annotations.mjs";import{writeAtomic as Fn}from"../browser/shared/files.mjs";import{slugPattern as Pn}from"../browser/shared/reports.mjs";import{documentDirectory as Be,documentFiles as Jn}from"../browser/shared/workspace.mjs";var Ln=600*1e3,_n=600*1e3;function Un(p){let{units:u,boxes:d}=ke(p),f=[...u].sort((l,c)=>l.elStart-c.elStart),b=new Map(f.map((l,c)=>[l.id,c])),h=new Map(f.map(l=>[l.id,We(l.node)])),x={h2:null,h3:null,h4:null};return f.map(l=>{let c=[];for(let N=l;N;N=N.parent===null?null:u[N.parent]){let S=d[N.box];if(S?.kind==="panel"&&S.key!==null){let L=u.find(_=>_.kind==="tab"&&_.parent===S.unit&&_.key===S.key);L&&c.unshift({tab:h.get(L.id)})}let Q=S?.unit===null||S?.unit===void 0?null:u[S.unit];if(Q?.tag==="details"&&S.kind==="details"){let L=Q.node.childNodes.find(_=>_.tagName==="summary");L&&c.push({details:We(L)})}}let g=c.find(N=>N.tab)?.tab,k=c.find(N=>N.details)?.details,R=[g,x.h2,x.h3,x.h4,k].filter(Boolean);return l.tag==="h2"?Object.assign(x,{h2:h.get(l.id),h3:null,h4:null}):l.tag==="h3"?Object.assign(x,{h3:h.get(l.id),h4:null}):l.tag==="h4"&&(x.h4=h.get(l.id)),{id:l.blockId,text:h.get(l.id),parent:l.parent===null?null:b.get(l.parent)??null,where:R,heading:/^h[2-4]$/.test(l.tag)}})}function Ye({reportsDirectory:p,read:u,write:d=Fn,dropped:f=()=>{},now:b=Date.now}){let h=new Map,x=new Map,l=new Map,c=(s,w)=>{let r=l.get(s);if(r?.text===w)return r.units;let a=Un(w);return l.set(s,{text:w,units:a}),a},g=s=>_e.join(Be(s,p),Rn),k=s=>typeof s=="string"&&Pn.test(s);async function R(s){let w=await Qt.readFile(g(s),"utf8").catch(()=>null);return{text:w,items:w===null?[]:Dn(w)}}async function N(s,w,r){let a=In(w);return a===r||(a===null?await Qt.rm(g(s),{force:!0}):await d(g(s),a)),S(a)}let S=s=>s===null?"":J(s),Q=s=>{let w=h.get(s)??new Map;for(let[r,a]of w)b()-a>Ln&&w.delete(r);return[...w.keys()]},L=(s,w)=>w.forEach(r=>h.get(s)?.delete(r)),_=s=>{let w=x.get(s)??x.set(s,new Map).get(s);for(let[r,a]of w)b()-a>_n&&w.delete(r);return w};async function z(s,{keep:w=null,items:r=null,before:a=void 0}={}){let O=r?{items:r,text:a}:await R(s),v=await u(s).catch(()=>null);if(!v)return{items:O.items,units:[],places:new Map,version:S(O.text),missing:!0};let I=c(s,v.text),T=_(s),$=Tn(O.items,I,{keep:new Set([...T.keys(),w])});for(let A of T.keys())$.waiting.has(A)||T.delete(A);if($.dropped.length>0){let A=h.get(s)??h.set(s,new Map).get(s);for(let tt of $.dropped)A.set(tt.id,b())}let M=$.changed||r?await N(s,$.items,O.text):S(O.text);return $.dropped.length>0&&f(s,$.dropped),{items:$.items,units:I,places:$.places,version:M,missing:!1}}let Z=(s,{items:w,version:r})=>({ok:!0,version:r,items:w,dropped:Q(s)});async function U(s){if(!k(s))return[400,{ok:!1,reason:"body"}];let w=await z(s);return w.missing?[404,{ok:!1,reason:"missing"}]:[200,Z(s,w)]}async function D(s){if(!k(s))return[400,{ok:!1,reason:"body"}];let w=await z(s);if(w.missing)return[404,{ok:!1,reason:"missing"}];let r=null,a=Jn(Be(s,p));try{r=JSON.parse(await Qt.readFile(a.json,"utf8"))}catch{}let O=await u(s).catch(()=>null),v=/<h1\b[^>]*>([\s\S]*?)<\/h1>/i.exec(O?.text??"")?.[1]?.replace(/<[^>]*>/g,"").trim(),I=typeof r?.title=="string"&&r.title.trim()?r.title.trim():v||s,T=w.units.some(M=>M.heading),$=w.items.map(M=>{let A=w.units[w.places.get(M.id)?.at],tt=A?.where?.length?A.where:A?.heading?[A.text]:[];return{where:tt,top:T&&tt.length===0,blocks:M.anchor.blocks.filter(ot=>w.units.some($t=>$t.id===ot)),whole:M.anchor.kind==="blocks",quote:M.anchor.quote,text:M.text}});return[200,{ok:!0,title:I,path:_e.resolve(a.html),items:$}]}async function V(s){let{slug:w}=s??{};if(!k(w))return[400,{ok:!1,reason:"body"}];if(!await u(w).catch(()=>null))return[404,{ok:!1,reason:"missing"}];let r=await R(w);if(s.anchors&&typeof s.anchors=="object"&&!Array.isArray(s.anchors)){let T=r.items.map(M=>{let A=Object.hasOwn(s.anchors,M.id)?En(s.anchors[M.id]):null;return A&&A.kind===M.anchor.kind?{...M,anchor:A}:M}),$=await N(w,T,r.text);return[200,Z(w,{items:T,version:$})]}let a=r.items,O=null,v=null;if(s.put!==void 0){let T=a.find(M=>M.id===s.put?.id),$=Ue({...s.put,created:T?.created??s.put?.created});if(!$)return[400,{ok:!1,reason:"item"}];a=T?a.map(M=>M.id===$.id?$:M):[...a,$],O=$.id,T||_(w).set($.id,b()),L(w,[$.id])}else if(typeof s.remove=="string")a=a.filter(T=>T.id!==s.remove);else if(s.clear===!0)v=a,a=[];else if(Array.isArray(s.restore)){let T=new Map(a.map(A=>[A.id,A])),$=s.restore.map(A=>Ue(A,A?.updated)).filter(A=>A&&!(T.get(A.id)?.updated>A.updated)),M=new Set($.map(A=>A.id));for(let A of M)T.has(A)||_(w).set(A,b());a=[...a.filter(A=>!M.has(A.id)),...$],L(w,[...M])}else return[400,{ok:!1,reason:"body"}];let I=await z(w,{keep:O,items:a,before:r.text});return[200,{...Z(w,I),...v?{removed:v}:{}}]}async function st(s){if(!k(s))return;let{text:w}=await R(s);w!==null&&await z(s)}return{list:U,copy:D,change:V,afterWrite:st}}import yt from"node:fs/promises";import gt from"node:path";import{writeAtomic as Ze}from"../browser/shared/files.mjs";import{slugPattern as Vt}from"../browser/shared/reports.mjs";var Pt=1,Mt={seen:"seen.html",base:"base.html",state:"state.json"},Wn=4,Bn=1800*1e3;function Ce({stateDirectory:p=null,shown:u,folderOf:d,isPage:f=()=>!1,log:b=null,now:h=Date.now,quiet:x=Bn}){let l=new Map,c=r=>gt.join(p,"changes",r),g=Promise.resolve(),k=r=>{let a=g.then(r);return g=a.catch(O=>b?.(`changes: ${O.message}`)),a};async function R(r){if(!p)return l.get(r)?.state??null;try{let a=JSON.parse(await yt.readFile(gt.join(c(r),Mt.state),"utf8"));return a?.v===Pt&&typeof a.seen=="string"?a:null}catch{return null}}async function N(r,a){return p?yt.readFile(gt.join(c(r),Mt[a]),"utf8").catch(()=>null):l.get(r)?.[a]??null}async function S(r,a,O={}){if(!p){let v=l.get(r)??{};l.set(r,{...v,...O,state:a});return}await yt.mkdir(c(r),{recursive:!0});for(let[v,I]of Object.entries(O))I===null?await yt.rm(gt.join(c(r),Mt[v]),{force:!0}):await Ze(gt.join(c(r),Mt[v]),I);await Ze(gt.join(c(r),Mt.state),`${JSON.stringify(a)}
7
+ `)}async function Q(r){l.delete(r),p&&await yt.rm(c(r),{recursive:!0,force:!0,maxRetries:3})}let L=async r=>Math.round((await yt.stat(d(r)).catch(()=>null))?.birthtimeMs??0),_=r=>r?.base?`${r.since}|${r.writes}`:null,z=r=>Number.isFinite(r?.draft)&&h()-r.draft<x?r.draft:null,Z=(r,a,O,v=z(r))=>[{v:Pt,born:r?.born??0,seen:a,...v===null?{}:{draft:v}},{seen:O,base:null}];async function U(r){let a=await R(r);if(!a)return null;let O=await L(r);return a.born&&O&&a.born!==O?(await Q(r),null):a}async function D(r,a){if(typeof a!="string"||!Vt.test(r)||f(r))return!1;let O=J(a),v=await U(r);if(!v)return await S(r,{v:Pt,born:await L(r),seen:O},{seen:a}),!1;if(v.seen===O)return!1;let I=await N(r,"seen"),T=new Date(h()).toISOString();if(I===null)return await S(r,...Z(v,O,a)),!1;let $=u(I),M=u(a);if(!v.base){if(!ht($,M))return await S(r,...Z(v,O,a)),!1;if(z(v)!==null||Te($))return await S(r,...Z(v,O,a,h())),!1;let{draft:ot,...$t}=v;return await S(r,{...$t,seen:O,base:J($),since:T,at:T,writes:1},{seen:a,base:$}),!0}let A=await N(r,"base");if(A===null||!ht(A,M))return await S(r,...Z(v,O,a)),!0;let tt=ht($,M)!==null;return await S(r,{...v,seen:O,...tt?{at:T,writes:v.writes+1}:{}},{seen:a}),tt}async function V(r,a,O,v){if(!Vt.test(r)||f(r))return!1;let I=await U(r),T=J(a);if(!I?.base)return await S(r,...Z(I??{born:await L(r)},T,a,v?null:z(I))),!1;let $=await N(r,"base");if($!==null&&O)try{$=O($)}catch(M){b?.(`changes: ${r}: the baseline did not take the edit (${M.message})`)}return $===null||!ht($,u(a))?(await S(r,...Z(I,T,a)),!0):(await S(r,{...I,seen:T,base:J($)},{seen:a,base:$}),!1)}async function st(r,a){if(!Vt.test(r)||f(r))return{ended:!1,moved:!1};let O=typeof a=="string"?await D(r,a):!1,v=await U(r);if(v?.draft===void 0)return{ended:!1,moved:O};let{draft:I,...T}=v;return await S(r,T),{ended:z(v)!==null,moved:O}}let s=new Map;async function w(r,a){await D(r,a);let O=u(a),v=J(O),I=await U(r);if(!I?.base)return{pending:!1,version:v};let T=`${r} ${I.base} ${v}`,$=s.get(T);if($===void 0){let M=await N(r,"base");for($=M===null?null:ht(M,O),s.set(T,$);s.size>Wn;)s.delete(s.keys().next().value)}return $?{pending:!0,version:v,stamp:_(I),since:I.since,writes:I.writes,...$}:{pending:!1,version:v}}return{look:(r,a)=>k(()=>D(r,a)),wrote:(r,a,O=null,{reader:v=!1}={})=>k(()=>V(r,a,O,v)),endDraft:(r,a=null)=>k(()=>st(r,a)),read:(r,a)=>k(()=>w(r,a)),stamp:r=>k(async()=>_(await U(r))),snapshot:r=>k(async()=>{let a=await U(r);return a?{state:a,seen:await N(r,"seen"),base:await N(r,"base")}:null}),clear:r=>k(async()=>{let a=await U(r);a?.base&&await S(r,{v:Pt,born:a.born,seen:a.seen},{base:null})}),restore:(r,a)=>k(async()=>{a?.state&&await S(r,a.state,{seen:a.seen,base:a.base})}),forget:r=>k(()=>Q(r)),idle:()=>k(async()=>{})}}import{randomBytes as Yn}from"node:crypto";import ct from"node:fs/promises";import kt from"node:path";import{FILE as Zn,readItems as Cn}from"../browser/shared/annotations.mjs";import{writeAtomic as Hn}from"../browser/shared/files.mjs";import{documentDirectory as zn}from"../browser/shared/workspace.mjs";var Kn=20,Ke=/^\d{8}T\d{6}Z-[a-f0-9]{8}\.json$/,He=80,Ge=({stateDirectory:p,slug:u})=>kt.join(p,"dropped-annotations",u),Qe=p=>({id:p.id,text:p.text,quote:p.anchor?.quote??"",kind:p.anchor?.kind??"text"});async function Ve({stateDirectory:p,reportsDirectory:u,slug:d,time:f,items:b}){let h=Ge({stateDirectory:p,reportsDirectory:u,slug:d});await ct.mkdir(h,{recursive:!0});let x=f.replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z");await Hn(kt.join(h,`${x}-${Yn(4).toString("hex")}.json`),JSON.stringify({time:f,items:b}));let l=(await ct.readdir(h)).filter(c=>Ke.test(c)).sort();await Promise.all(l.slice(0,Math.max(0,l.length-Kn)).map(c=>ct.rm(kt.join(h,c),{force:!0})))}async function no({stateDirectory:p,reportsDirectory:u,slug:d}){let f=Ge({stateDirectory:p,reportsDirectory:u,slug:d}),b=(await ct.readdir(f).catch(()=>[])).filter(l=>Ke.test(l)).sort();if(b.length===0)return[];let h=new Set(Cn(await ct.readFile(kt.join(zn(d,u),Zn),"utf8").catch(()=>"")).map(l=>l.id)),x=[];for(let l of b){let c=kt.join(f,l);try{let g=JSON.parse(await ct.readFile(c,"utf8")),k=Array.isArray(g?.items)?g.items.filter(R=>typeof R?.id=="string"&&!h.has(R.id)):[];typeof g?.time=="string"&&k.length&&x.push({time:g.time,items:k})}catch{}await ct.rm(c,{force:!0}).catch(()=>{})}return x}var Gn=(p,u=new Date)=>{let d=new Date(p),f=h=>String(h).padStart(2,"0"),b=`${f(d.getHours())}:${f(d.getMinutes())}`;return d.toDateString()===u.toDateString()?b:`${d.getFullYear()}-${f(d.getMonth()+1)}-${f(d.getDate())} ${b}`},ze=p=>{let u=String(p??"").replace(/\s+/g," ").trim();return JSON.stringify(u.length>He?`${u.slice(0,He-1)}\u2026`:u)};function qt(p,{time:u=null,items:d},{today:f=new Date}={}){let b=kt.resolve(p),h=`${d.length} \u6279\u6CE8 (annotation${d.length===1?"":"s"})`;return[`annotations ${b}: ${u?`at ${Gn(u,f)}, `:""}Gallery deleted ${h} whose words are gone from the document (rewritten or deleted):`,...d.map(({id:x,text:l,quote:c,kind:g})=>` ${x} ${ze(l)} on ${g==="blocks"?"the blocks ":""}${ze(c)}`)]}function ro(p,u,{today:d=new Date}={}){return u.length?[...u.flatMap(f=>qt(p,f,{today:d}))," they were the reader's: say in your hand-off which your edit carried out and which you left, and never write them back"]:[]}import{randomBytes as Qn}from"node:crypto";import bt from"node:fs/promises";import At from"node:path";import{writeAtomic as Vn}from"../browser/shared/files.mjs";var qn=20,qe=/^\d{8}T\d{6}Z-[a-f0-9]{8}\.json$/,Xe=({stateDirectory:p,slug:u})=>At.join(p,"rewrites",u);async function tn({stateDirectory:p,reportsDirectory:u,slug:d,time:f,changes:b}){let h=Xe({stateDirectory:p,reportsDirectory:u,slug:d});await bt.mkdir(h,{recursive:!0});let x=f.replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z");await Vn(At.join(h,`${x}-${Qn(4).toString("hex")}.json`),JSON.stringify({time:f,changes:b}));let l=(await bt.readdir(h)).filter(c=>qe.test(c)).sort();await Promise.all(l.slice(0,Math.max(0,l.length-qn)).map(c=>bt.rm(At.join(h,c),{force:!0})))}async function en({stateDirectory:p,reportsDirectory:u,slug:d}){let f=Xe({stateDirectory:p,reportsDirectory:u,slug:d}),b=(await bt.readdir(f).catch(()=>[])).filter(x=>qe.test(x)).sort(),h=[];for(let x of b){let l=At.join(f,x);try{let c=JSON.parse(await bt.readFile(l,"utf8"));typeof c?.time=="string"&&Array.isArray(c.changes)&&h.push(c)}catch{}await bt.rm(l,{force:!0}).catch(()=>{})}return h}var Xn=(p,u=new Date)=>{let d=new Date(p),f=h=>String(h).padStart(2,"0"),b=`${f(d.getHours())}:${f(d.getMinutes())}`;return d.toDateString()===u.toDateString()?b:`${d.getFullYear()}-${f(d.getMonth()+1)}-${f(d.getDate())} ${b}`};function fo(p,u,{today:d=new Date}={}){if(!u.length)return[];let f=At.resolve(p),b=[];for(let{time:h,changes:x}of u){let l=[];for(let{line:c,rule:g,key:k}of[...x].sort((R,N)=>R.line-N.line)){let R=`line ${c} ${g}${k?` ${k}`:""}`;l.includes(R)||l.push(R)}b.push(`preview ${f}: at ${Xn(h,d)}, when the reader edited the page, the preview wrote your natural HTML as the kit's markup: ${l.join(", ")}`),b.push(...x.filter(c=>c.note).map(({line:c,rule:g,note:k})=>` line ${c}, ${g}: ${k}`))}return b.push(" re-read the file before editing it (those lines are the file's as you had left it)"),b}import{todoRef as tr}from"../browser/shared/workspace-query.mjs";var er=(p,u)=>p.length===u.length&&p.every((d,f)=>d===u[f]);function nn(p,u,d,f){let b=Fe(u),h=De(d,{at:!0}),x=null,l=c=>(x??=ye(d).units).find(g=>g.elStart===c)??null;return f.map(c=>{let g=tr(c?.ref);if(!g||g.slug!==p||typeof c.done!="boolean")return{reason:"ref"};let k=g.block?h.find(N=>N.block===g.block)??null:null;if(k&&k.text!==g.text)return{reason:"changed"};if(!k){let N=h.filter(S=>S.text===g.text&&er(S.path,g.path));if(g.version===b)k=N.find(S=>S.nth===g.nth)??null;else{if(N.length>1)return{reason:"ambiguous"};k=N[0]??null}}if(!k)return{reason:"changed"};let R=l(k.at);return R?{unit:R,done:k.done,want:c.done}:{reason:"locked"}})}function rn(p,u){let d=new Map,f=u.map(c=>{if(!c.unit)return!1;let g=d.has(c.unit.id)?d.get(c.unit.id):c.done;return d.set(c.unit.id,c.want),g!==c.want}),b=new Map;for(let c of u)c.unit&&d.get(c.unit.id)!==c.done&&b.set(c.unit.id,c);if(b.size===0)return{commit:null,changed:f};let h=[],x=[],l=new Map;for(let[c,g]of b){let k=`todo${h.length}`,R=g.unit.blockId?{key:k,id:g.unit.blockId}:{key:k,open:c,hash:we(p,g.unit)};h.push({key:k,unit:R,attribute:"data-checked",value:d.get(c)?"":null}),x.push(R),l.set(c,k)}return{commit:{units:h,touch:x,keys:l},changed:f}}import{EMPTY_STYLE as yr,emptyWordsScript as gr,showEmpty as kr}from"../browser/editor/components/placeholder.mjs";import{TOKENS as br}from"../browser/editor/page/look.mjs";import{MARGIN_STYLE as $r,earlyMarginScript as xr}from"../browser/editor/page/margin.mjs";var te=/^[a-f0-9]{16}$/,ne=2*1024*1024,Sr=ur,on=50,an=/^\d{8}T\d{6}Z-[a-f0-9]{16}\.html$/,vr=30,sn=3,cn=200,ft="\u6587\u4EF6\u4E00\u518D\u88AB\u4FEE\u6539\uFF08\u4F8B\u5982 AI \u6B63\u5728\u5199\u5165\uFF09\uFF0C\u7A0D\u540E\u518D\u540C\u6B65",Or="\u8FD9\u6B21\u7684\u4FEE\u6539\u592A\u5927\uFF0C\u4E00\u6B21\u5B58\u4E0D\u4E0B",jr=250,lt=Symbol("again"),Mr="/__gallery/edit/src/editor/page/editor.mjs",Ar=p=>new Promise(u=>setTimeout(u,p));function Nr(p,u=ne){return new Promise((d,f)=>{let b=[],h=0;p.on("data",x=>{h+=x.length,h>u?b.length=0:b.push(x)}),p.on("end",()=>h>u?f(new Error("too-large")):d(Buffer.concat(b).toString("utf8"))),p.on("error",f)})}function Tr(p){if(!p)return ee(16).toString("hex");let u=P.join(p,"token");try{let f=ir(u,"utf8").trim();if(/^[a-f0-9]{32}$/.test(f))return f}catch{}let d=ee(16).toString("hex");try{sr(p,{recursive:!0,mode:448}),cr(u,d,{mode:384})}catch{}return d}function zo({base:p="",token:u=null,reportsDirectory:d=dr,stateDirectory:f=null,write:b=Jt,ids:h=!0,finish:x=R=>R,log:l=null,settling:c={},reviewing:g={},onChanges:k=()=>{}}={}){let R=u??Tr(rr().data),N=Le(c),S=c.wait??Je,Q=new Map,L=async(t,n,e,o="reader")=>{let i=await b(t,n,e);if(i!==!1&&hr(P.basename(t))){let y=P.basename(P.dirname(t));N.wrote(y,n),Q.set(y,{hash:J(n),by:o})}return i},_=t=>wr(t,d),z=t=>Nt(_(t)).html,Z=new Map,U=f&&P.join(f,"snapshots"),D=Promise.resolve(),V=Promise.resolve(),st=async(t,n,e,{by:o="time"}={})=>{let i=(await H.readdir(t)).filter(m=>n.test(m));if(i.length<=e)return;let y=o==="name"?i.sort():(await Promise.all(i.map(async m=>({name:m,time:(await H.stat(P.join(t,m))).mtimeMs})))).sort((m,j)=>m.time-j.time).map(({name:m})=>m);await Promise.all(y.slice(0,y.length-e).map(m=>H.rm(P.join(t,m),{force:!0})))},s=(t,n)=>{U&&(D=D.then(async()=>{let e=P.join(U,`${t}.html`),o=new Date;try{await H.utimes(e,o,o);return}catch{}await H.mkdir(U,{recursive:!0}),await Jt(e,n),await st(U,/^[a-f0-9]{16}\.html$/,on)}).catch(()=>{}))},w=(t,n)=>{f&&(D=D.then(async()=>{let e=P.join(f,"history",t),o=J(n);if(await H.mkdir(e,{recursive:!0}),(await H.readdir(e)).filter(m=>an.test(m)).sort().at(-1)?.endsWith(`-${o}.html`))return;let y=new Date().toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z");await Jt(P.join(e,`${y}-${o}.html`),n),await st(e,an,vr,{by:"name"})}).catch(()=>{}))},r=new Map,a=t=>f&&P.join(f,"receipts",t),O=(t,n,e,o)=>{for(r.set(`${t} ${n}`,{digest:e,answer:o});r.size>cn*4;)r.delete(r.keys().next().value);let i=a(t);i&&(D=D.then(async()=>{await H.mkdir(i,{recursive:!0}),await Jt(P.join(i,`${n}.json`),JSON.stringify({digest:e,answer:o})),await st(i,{test:y=>y.endsWith(".json")&&Xt.test(y.slice(0,-5))},cn)}).catch(()=>{}))},v=async(t,n)=>{let e=r.get(`${t} ${n}`);if(e)return e;let o=a(t);if(!o)return null;await D;try{let i=JSON.parse(await H.readFile(P.join(o,`${n}.json`),"utf8"));return typeof i?.digest=="string"&&i.answer?.ok?i:null}catch{return null}},I=new Map,T=(t,n)=>{let e=new Date().toISOString();if(!f)return void I.set(t,[...I.get(t)??[],{time:e,changes:n}].slice(-20));D=D.then(()=>tn({stateDirectory:f,reportsDirectory:d,slug:t,time:e,changes:n})).catch(()=>{})},$=async t=>{if(!f){let n=I.get(t)??[];return I.delete(t),n}return await D,en({stateDirectory:f,reportsDirectory:d,slug:t})},M=(t,n)=>{for(Z.delete(t),Z.set(t,n);Z.size>on;)Z.delete(Z.keys().next().value);s(t,n)},A=async t=>{if(Z.has(t))return Z.get(t);if(!U||!te.test(t))return null;await D;let n=await H.readFile(P.join(U,`${t}.html`),"utf8").catch(()=>null);return n===null||J(n)!==t?null:(M(t,n),n)},tt=new Map,ot=t=>{let n=tt.get(t);if(n)return n;let e=je(t,{finish:x});for(tt.set(t,e);tt.size>8;)tt.delete(tt.keys().next().value);return e},$t=P.join(P.resolve(d),".gallery","pages"),C=Ce({...g,stateDirectory:f,shown:t=>ot(t).text,folderOf:_,log:l,isPage:t=>P.resolve(_(t)).startsWith($t+P.sep)}),ut=(t,n)=>n.then(e=>{e&&k(t)},e=>l?.(`${t}: the Agent's changes not kept (${e.message})`));async function Lt(t,n=void 0){if(typeof t!="string"||!rt.test(t))return null;let e=z(t),o=n!==void 0?n:await H.readFile(e,"utf8").catch(()=>null);if(o===null)return null;let{text:i,changes:y}=ot(o);return{file:e,source:o,text:i,version:J(i),changes:y}}async function it(t){if(typeof t!="string"||!rt.test(t))return{source:null,held:!1,signs:[],wait:0,own:!1};let n=z(t),e=await H.readFile(n,"utf8").catch(()=>null),o=(await H.stat(n).catch(()=>null))?.mtimeMs??0;return{source:e,...N.judge(t,{source:e,mtime:o})}}async function xt(t,n=Date.now()+S){for(;;){let e=await it(t);if(!e.held||Date.now()>=n)return e;await Ar(Math.max(0,Math.min(jr,n-Date.now())))}}async function _t(t,{wait:n=S}={}){let e=await xt(t,Date.now()+n),o=await Lt(t,e.held&&e.taken!==void 0?e.taken:e.source);return o&&{...o,held:e.held===!0}}function fn(t,n,{editor:e=Mr,kitTags:o=()=>[]}={}){let{html:i,map:y}=be(n);M(y.version,n);let m=me(),j=pe(m).map(({assets:B,...X})=>({...X,kit:o(B)})),E=`<script type="application/json" id="doc-edit-map" data-doc-dev>${JSON.stringify({slug:t,token:R,...y,components:j,hidden:m.settings.hidden}).replace(/</g,"\\u003c")}</script>
8
+ <script data-doc-dev>document.currentScript.remove(); import(${JSON.stringify(e)});</script>`,W=`<style data-doc-dev>.doc-display { display: none; }</style>
9
+ <style data-doc-dev data-ge-palette>${br}</style>
10
+ <style data-doc-dev>${yr}</style>
11
+ <script data-doc-dev>${gr()}</script>
12
+ <script data-doc-dev>document.currentScript.remove(); document.documentElement.setAttribute("data-ge-order", "file");</script>
13
+ <style data-doc-dev data-ge-margin-style>${$r}</style>
14
+ <script data-doc-dev>document.currentScript.remove(); ${xr(nr(t,p),{notes:ar(P.join(_(t),fr))})}</script>`;return{html:kr(i),snippet:E,head:W}}let ln=t=>M(J(t),t);function re(t){if(t.method!=="POST")return[405,{ok:!1,reason:"method"}];let n=t.headers.host??"",e=t.socket.localPort;return n!==`127.0.0.1:${e}`&&n!==`localhost:${e}`?[403,{ok:!1,reason:"host"}]:t.headers.origin!==`http://${n}`?[403,{ok:!1,reason:"origin"}]:t.headers["x-gallery-token"]!==R?[403,{ok:!1,reason:"token"}]:null}async function dt(t,n=ne){let e=re(t);if(e)return{error:e};if(!/^application\/json\b/i.test(t.headers["content-type"]??""))return{error:[415,{ok:!1,reason:"type"}]};try{return{body:JSON.parse(await Nr(t,n))}}catch(o){return{error:o.message==="too-large"?[413,{ok:!1,reason:"body",message:Or}]:[400,{ok:!1,reason:"body"}]}}}async function Ut(t,n){let{slug:e,opening:o,known:i=null,texts:y=[],units:m=[],touch:j=[],pageIds:F=null,request:E=null,agent:W=!1}=t;if(typeof e!="string"||!rt.test(e)||![y,m,j].every(Array.isArray))return[400,{ok:!1,reason:"body"}];if(E!==null&&(typeof E!="string"||!Xt.test(E)))return[400,{ok:!1,reason:"body"}];let B=E===null?null:J(JSON.stringify([o??null,y,m,j])),X=await oe(t);if(X)return X;let K=nt=>(E!==null&&O(e,E,B,nt),[200,nt]),G=z(e),et=typeof o=="string"&&te.test(o)?await A(o):null,q=nt=>or("sha256",R).update(`${e}
15
+ ${nt}`).digest("hex").slice(0,32);for(let nt=1;;nt++){let{source:at,held:It}=await it(e);if(at===null)return[404,{ok:!1,reason:"missing"}];if(It)return Date.now()<n?lt:[409,{ok:!1,reason:"busy",message:ft}];ut(e,C.look(e,at));let{text:jt,changes:zt}=ot(at),ce=[],Dt=xe({current:jt,opening:et,texts:y,units:m,touch:j,ids:h?()=>{let Ft=typeof h=="function"?h():Kt();return ce.push(Ft),Ft}:!1,seal:q,pageIds:F}),{title:fe,icon:le,...ue}=Dt,wt=Dt.text===jt?jt:x(Dt.text);wt!==Dt.text&&(ue.version=J(wt));let de={...ue,foreign:typeof i=="string"&&J(jt)!==i};if(wt===jt)return K({ok:!0,...de,wrote:!1,notes:[]});if(w(e,at),!await L(G,wt,{expect:at},W===!0?"agent":"reader")){if(nt===sn)return[409,{ok:!1,reason:"busy",message:ft}];continue}w(e,wt),ut(e,C.wrote(e,wt,Ft=>{let jn=0;return Ee(Ft,{opening:et,texts:y,units:m,touch:j,pageIds:F,seal:q,ids:h?()=>ce[jn++]??(typeof h=="function"?h():Kt()):!1})},{reader:W!==!0})),zt.length&&(l&&l(Gt(G,zt).join(`
16
+ `)),T(e,zt));let On=[...fe?await Tt(P.dirname(G),fe):[],...le!==void 0?await Wt(P.dirname(G),le):[]];return K({ok:!0,...de,wrote:!0,notes:On})}}async function un(t,n){return typeof t!="string"||!rt.test(t)?[404,{ok:!1,reason:"missing",message:"\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"}]:!Array.isArray(n)||n.length===0||n.length>pr?[400,{ok:!1,reason:"body"}]:Bt({slug:t},async(e,o)=>{let{source:i,held:y}=await it(t);if(i===null)return[404,{ok:!1,reason:"missing",message:"\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"}];if(y)return Date.now()<o?lt:[409,{ok:!1,reason:"busy",message:ft}];let{text:m}=ot(i),j=nn(t,i,m,n),{commit:F,changed:E}=rn(m,j),W=j.map((q,nt)=>q.reason?{ok:!1,reason:q.reason}:{ok:!0,changed:E[nt],block:q.unit.blockId??null});if(!F)return[200,{ok:!0,results:W,wrote:!1}];let B=J(m);M(B,m);let X=await Ut({slug:t,opening:B,units:F.units,touch:F.touch},o);if(X===lt)return lt;let[K,G]=X;if(!G.ok)return[K,G];let et=new Map((G.units??[]).map(q=>[q.key,q]));return[200,{ok:!0,wrote:G.wrote===!0,results:W.map((q,nt)=>{if(!q.ok)return q;let at=F.keys.get(j[nt].unit.id);if(at===void 0)return q;let It=et.get(at);return It?.status!=="applied"?{ok:!1,reason:It?.reason==="ambiguous"?"ambiguous":"changed"}:{...q,block:G.ids?.[at]??q.block}})}]})}async function oe({slug:t,opening:n,texts:e=[],units:o=[],touch:i=[],request:y=null}){if(typeof t!="string"||!rt.test(t)||typeof y!="string"||!Xt.test(y)||![e,o,i].every(Array.isArray))return null;let m=await v(t,y);return m?m.digest===J(JSON.stringify([n??null,e,o,i]))?[200,{...m.answer,again:!0}]:[409,{ok:!1,reason:"request",message:"\u540C\u4E00\u6B21\u4FDD\u5B58\u7684\u5185\u5BB9\u4E0D\u4E00\u81F4"}]:null}async function dn(t,n){let{slug:e,opening:o,texts:i=[],units:y=[],instances:m=[],pageIds:j=null}=t;if(typeof e!="string"||!rt.test(e)||!Array.isArray(i)||!Array.isArray(y)||!Array.isArray(m))return[400,{ok:!1,reason:"body"}];let{source:F,held:E}=await it(e);if(E)return Date.now()<n?lt:[409,{ok:!1,reason:"busy",message:ft}];let W=await Lt(e,F);if(W===null)return[404,{ok:!1,reason:"missing"}];let{text:B,version:X}=W,K=typeof o=="string"&&te.test(o)?await A(o):null;return[200,{ok:!0,version:X,reverted:Oe({current:B,opening:K,texts:i,pageIds:j}),units:Se({current:B,units:y}),parts:ve({current:B,instances:m,pageIds:j})}]}let mn=600*1e3,St=new Map;async function ae(t,n){let e=_(t),o=null;try{o=JSON.parse(await H.readFile(Nt(e).json,"utf8"))}catch{}let{title:i,icon:y}=Ae(n,o);i&&typeof o?.title=="string"&&o.title!==i.to&&await Tt(e,{from:o.title,to:i.to,synced:!0}),y&&!y.missing&&await Wt(e,y.to)}async function pn(t,n){let{slug:e,action:o,stamp:i=null,undo:y=null}=t;if(typeof e!="string"||!rt.test(e)||!["accept","revert","undo"].includes(o))return[400,{ok:!1,reason:"body"}];let m=z(e),{source:j,held:F}=await it(e);if(j===null)return[404,{ok:!1,reason:"missing"}];if(F)return Date.now()<n?lt:[409,{ok:!1,reason:"busy",message:ft}];if(o==="undo"){for(let[G,et]of St)Date.now()-et.at>mn&&St.delete(G);let K=typeof y=="string"?St.get(y):null;return!K||K.slug!==e?[404,{ok:!1,reason:"gone",message:"\u64A4\u9500\u5DF2\u7ECF\u8FC7\u671F"}]:j!==K.after?[409,{ok:!1,reason:"moved-on",message:"\u64A4\u56DE\u4E4B\u540E\u6587\u6863\u53C8\u6539\u8FC7\u4E86\uFF0C\u6CA1\u6CD5\u64A4\u9500"}]:(w(e,j),await L(m,K.before,{expect:j})?(w(e,K.before),St.delete(y),await ae(e,K.before),await C.restore(e,K.saved),await C.wrote(e,K.before),k(e),[200,{ok:!0,version:J(ot(K.before).text)}]):[409,{ok:!1,reason:"busy",message:ft}])}await C.look(e,j);let E=await C.snapshot(e),W=E?.state?.base?`${E.state.since}|${E.state.writes}`:null;if(W===null)return[200,{ok:!0,none:!0}];if(W!==i)return[409,{ok:!1,reason:"changed",message:"Agent \u521A\u521A\u53C8\u6539\u4E86\u6587\u6863\uFF0C\u518D\u770B\u4E00\u773C"}];if(o==="accept")return await C.clear(e),k(e),[200,{ok:!0}];let B=E.base;if(w(e,j),!await L(m,B,{expect:j}))return[409,{ok:!1,reason:"busy",message:ft}];w(e,B),await ae(e,B);let X=ee(8).toString("hex");return St.set(X,{slug:e,before:j,after:B,saved:E,at:Date.now()}),await C.clear(e),await C.wrote(e,B),k(e),[200,{ok:!0,version:J(ot(B).text),undo:X}]}async function wn(t,n){let e=await dt(t);if(e.error)return Y(n,...e.error);let o=e.body??{};try{if(o.action!=="read")return Y(n,...await Bt(o,pn));if(typeof o.slug!="string"||!rt.test(o.slug))return Y(n,400,{ok:!1,reason:"body"});let i=await _t(o.slug,{wait:0});return i===null?Y(n,404,{ok:!1,reason:"missing"}):Y(n,200,{ok:!0,...await C.read(o.slug,i.source)})}catch(i){return Y(n,500,{ok:!1,reason:"write",message:i.message})}}async function Tt(t,{from:n,to:e,synced:o}){let i=["\u6807\u9898\u5DF2\u66F4\u65B0",...o?[]:["\u5355\u72EC\u6253\u5F00\u6216\u5BFC\u51FA\u65F6\u7684\u9875\u9762\u540D\u79F0\u539F\u672C\u5C31\u548C\u6807\u9898\u4E0D\u540C\uFF0C\u6CA1\u6709\u8DDF\u7740\u6539"]],y=Nt(t).json,m=await H.readFile(y,"utf8").catch(()=>""),j=null;try{j=JSON.parse(m)}catch{}if(j?.title!==n)return[...i,"\u641C\u7D22\u548C\u4FA7\u680F\u91CC\uFF08\u6CA1\u6253\u5F00\u8FD9\u4EFD\u6587\u6863\u65F6\uFF09\u7684\u6587\u6863\u540D\u539F\u672C\u5C31\u548C\u6807\u9898\u4E0D\u540C\uFF0C\u6CA1\u6709\u8DDF\u7740\u6539"];let F=new RegExp(`("title"\\s*:\\s*)${JSON.stringify(n).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}`),E=F.test(m)?m.replace(F,(W,B)=>B+JSON.stringify(e)):`${JSON.stringify({...j,title:e},null,2)}
17
+ `;try{await L(y,E)}catch(W){return l?.(`${P.basename(y)}'s title was not written (${W.code??W.message}): ${y}`),[...i,"\u641C\u7D22\u548C\u4FA7\u680F\u91CC\uFF08\u6CA1\u6253\u5F00\u8FD9\u4EFD\u6587\u6863\u65F6\uFF09\u7684\u6587\u6863\u540D\u6CA1\u80FD\u8DDF\u7740\u6539"]}return i}async function Wt(t,n){let e=Nt(t).json,o=null;try{o=JSON.parse(await H.readFile(e,"utf8"))}catch{}if(!o||typeof o!="object")return l?.(`${P.basename(e)} could not be read, so its icon was not written: ${e}`),["\u9875\u9762\u56FE\u6807\u5DF2\u66F4\u6362\uFF0C\u4F46\u641C\u7D22\u548C\u4FA7\u680F\u91CC\uFF08\u6CA1\u6253\u5F00\u8FD9\u4EFD\u6587\u6863\u65F6\uFF09\u7684\u56FE\u6807\u6CA1\u80FD\u8DDF\u7740\u6362"];if((o.icon??null)===n)return[];let{icon:i,...y}=o,m=n===null?y:{...y,icon:n};try{await L(e,`${JSON.stringify(m,null,2)}
18
+ `)}catch(j){return l?.(`${P.basename(e)}'s icon was not written (${j.code??j.message}): ${e}`),["\u9875\u9762\u56FE\u6807\u5DF2\u66F4\u6362\uFF0C\u4F46\u641C\u7D22\u548C\u4FA7\u680F\u91CC\uFF08\u6CA1\u6253\u5F00\u8FD9\u4EFD\u6587\u6863\u65F6\uFF09\u7684\u56FE\u6807\u6CA1\u80FD\u8DDF\u7740\u6362"]}return[]}async function hn(t,n){let e=typeof n=="string"?n.replace(/\s+/g," ").trim():"";if(!e)return{ok:!1,reason:"title",message:"\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A"};let o=z(t),i=await H.readFile(o,"utf8").catch(()=>null);if(i===null)return{ok:!1,reason:"missing"};ut(t,C.look(t,i));let y=he(i),m=ge(y).find(E=>E.kind==="title");if(!m)return{ok:!1,reason:"no-title",message:"\u8FD9\u4EFD\u6587\u6863\u6CA1\u6709\u6807\u9898"};let j=lr(e),F=$e({current:y,edits:[{id:m.id,parts:[{keep:!0,html:j}]}],ids:h});return F.ok?F.text!==i&&!await L(o,F.text,{expect:i})?{ok:!1,reason:"changed-again"}:(F.text!==i&&ut(t,C.wrote(t,F.text,E=>Re(E,j))),{ok:!0,title:e,notes:F.title?await Tt(P.dirname(o),F.title):[]}):{ok:!1,reason:"conflict"}}let vt=t=>(n,e)=>{let o=V.then(()=>t(n));return V=o.catch(()=>{}),o.then(([i,y])=>Y(e,i,y),i=>Y(e,500,{ok:!1,reason:"write",message:i.message}))},se=(t,{early:n=null}={})=>async(e,o)=>{let i=await dt(e);if(i.error)return Y(o,...i.error);let y=i.body??{};try{let m=n&&await n(y);return m?Y(o,...m):Y(o,...await Bt(y,t))}catch(m){return Y(o,500,{ok:!1,reason:"write",message:m.message})}};async function Bt(t,n){let e=Date.now()+S;for(;;){await xt(t.slug,e);let o=V.then(()=>n(t,e));V=o.catch(()=>{});let i=await o;if(i!==lt)return i}}async function Yt(t,{reader:n=!1}={}){if(typeof t!="string"||!rt.test(t))return{ok:!1,reason:"missing",message:"\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"};let e=_(t),{html:o,json:i}=Nt(e);for(let y=1;;y++){let{source:m,held:j}=n?await it(t):{source:await H.readFile(o,"utf8").catch(()=>null),held:!1};if(m===null)return{ok:!1,reason:"missing",message:"\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"};if(j)return{ok:!1,reason:"busy",message:"\u6587\u4EF6\u4E00\u518D\u88AB\u4FEE\u6539\uFF08\u4F8B\u5982 AI \u6B63\u5728\u5199\u5165\uFF09\uFF0C\u6CA1\u6709\u5199\u5165"};ut(t,C.look(t,m));let F=null;try{F=JSON.parse(await H.readFile(i,"utf8"))}catch{}let{text:E,changes:W,added:B,given:X,repeated:K,title:G,icon:et}=Me(m,{finish:x,next:typeof h=="function"?h:void 0,metadata:F});if(E!==m){if(w(t,m),!await L(o,E,{expect:m},n?"reader":"agent")){if(y===sn)return{ok:!1,reason:"busy",message:"\u6587\u4EF6\u4E00\u518D\u88AB\u4FEE\u6539\uFF08\u4F8B\u5982 AI \u6B63\u5728\u5199\u5165\uFF09\uFF0C\u6CA1\u6709\u5199\u5165"};continue}w(t,E),ut(t,C.wrote(t,E)),n&&W.length&&(l&&l(Gt(o,W).join(`
19
+ `)),T(t,W))}return G&&typeof F?.title=="string"&&F.title!==G.to&&await Tt(e,{from:F.title,to:G.to,synced:G.page}),et&&!et.missing&&await Wt(e,et.to),{ok:!0,changes:E===m?[]:W,added:E===m?0:B,given:E===m?[]:X,repeated:K,written:E!==m,title:G,icon:et}}}let yn=async(t,{reader:n=!1}={})=>{n&&await xt(t);let e=V.then(()=>Yt(t,{reader:n}));return V=e.catch(()=>{}),e};async function Zt(t){let n=await dt(t);if(n.error)return{refused:n.error};let{slug:e,workspace:o}=n.body??{};return typeof e!="string"||!rt.test(e)||typeof o!="string"?{refused:[400,{ok:!1,reason:"body"}]}:mr(o,d)?{slug:e}:{refused:[409,{ok:!1,reason:"elsewhere",message:"\u8FD9\u4E2A\u9884\u89C8\u670D\u52A1\u5668\u7BA1\u7684\u662F\u53E6\u4E00\u4E2A\u76EE\u5F55\u7684\u6587\u6863"}]}}async function gn(t,n){try{let e=V.then(async()=>{let{slug:y,refused:m}=await Zt(t);if(m)return{answer:m};let j=await Yt(y);return{slug:j.ok?y:null,answer:[j.ok?200:j.reason==="missing"?404:409,j]}});V=e.catch(()=>{});let{slug:o,answer:i}=await e;return o&&await Et(o),Y(n,...i)}catch(e){return Y(n,500,{ok:!1,reason:"write",message:e.message})}}async function kn(t){let{slug:n,refused:e}=await Zt(t);return e||(await Et(n),[200,{ok:!0}])}async function ie(t){let{source:n}=await xt(t),{ended:e,moved:o}=await C.endDraft(t,n);return o&&k(t),e}async function bn(t){let{slug:n,refused:e}=await Zt(t);return e||[200,{ok:!0,ended:await ie(n)}]}let mt=Ie({reportsDirectory:d}),Ot=Ye({reportsDirectory:d,read:t=>_t(t,{wait:0}),write:L,dropped:(t,n)=>{let e=n.map(Qe);l&&l(qt(P.join(_(t),"annotations.json"),{items:e}).join(`
20
+ `)),f&&(D=D.then(()=>Ve({stateDirectory:f,reportsDirectory:d,slug:t,time:new Date().toISOString(),items:e})).catch(()=>{}))}}),Ct=Promise.resolve(),Ht=t=>{let n=Ct.then(t);return Ct=n.catch(()=>{}),n},$n=t=>(n,e)=>Ht(()=>t(n)).then(([o,i])=>Y(e,o,i),o=>Y(e,500,{ok:!1,reason:"write",message:o.message})),xn=300,pt=new Map;async function Et(t){let n=pt.get(t);n&&(clearTimeout(n.timer),pt.delete(t));let e=Ht(()=>Ot.afterWrite(t));n&&e.then(n.resolve,n.reject),await e.catch(o=>l?.(`${t}: annotations not checked: ${o.message}`)),await D}let Sn=t=>{let n=t.headers.host??"",e=t.socket.localPort;return n!==`127.0.0.1:${e}`&&n!==`localhost:${e}`?[403,{ok:!1,reason:"host"}]:t.headers["x-gallery-token"]!==R?[403,{ok:!1,reason:"token"}]:null};async function vn(t){if(t.method==="GET"){let e=Sn(t);if(e)return e;let o=new URL(t.url??"/","http://localhost").searchParams;return o.get("as")==="copy"?Ot.copy(o.get("slug")):Ot.list(o.get("slug"))}let n=await dt(t);return n.error??Ot.change(n.body)}let Rt=(t,n=ne)=>async e=>{let o=await dt(e,n);return o.error??t(o.body)};return{token:R,preview:fn,opened:ln,check:dt,checkHeaders:re,upload:vt(Rt(mt.upload,Sr)),addEmoji:vt(Rt(mt.addEmoji)),unfurl:vt(Rt(mt.unfurl)),annotations:$n(vn),checkAnnotations(t){let n=pt.get(t);return n||(n={timer:0},n.done=new Promise((e,o)=>Object.assign(n,{resolve:e,reject:o})),pt.set(t,n)),clearTimeout(n.timer),n.timer=setTimeout(()=>{pt.delete(t),Ht(()=>Ot.afterWrite(t)).then(n.resolve,n.reject)},xn),n.done},frameable:vt(Rt(mt.frameable)),listEmojis:mt.listEmojis,readEmoji:mt.readEmoji,respond:vt,keepVersion:w,renameReport:hn,read:Lt,settled:it,writerOf:(t,n)=>typeof n=="string"&&Q.get(t)?.hash===J(n)?Q.get(t).by:null,whenTaken:xt,readTaken:_t,takeRewrites:$,handIn:yn,handInReport:Yt,handInRequest:gn,settleRequest:(t,n)=>kn(t).then(([e,o])=>Y(n,e,o),e=>Y(n,500,{ok:!1,reason:"write",message:e.message})),settleNotes:Et,roundRequest:(t,n)=>bn(t).then(([e,o])=>Y(n,e,o),e=>Y(n,500,{ok:!1,reason:"write",message:e.message})),beginRound:ie,commit:se(Ut,{early:oe}),handleCommit:Ut,setTodos:un,reverted:se(dn),changes:wn,noteTaken:(t,n)=>C.look(t,n),forgetChanges:t=>C.forget(t),drain:async()=>{await V,await Promise.all([...pt.keys()].map(Et)),await Ct,await C.idle(),await D},stored:async()=>{await C.idle(),await D}}}export{no as a,ro as b,en as c,fo as d,Mn as e,An as f,Nn as g,Tr as h,zo as i};
@@ -0,0 +1,8 @@
1
+ import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
2
+ import{spawn as J}from"node:child_process";import b from"node:fs";import m from"node:fs/promises";import Q from"node:os";import P from"node:path";import{escapeMarkup as X}from"../browser/shared/escape.mjs";import{spawn as C}from"node:child_process";import{existsSync as H,readFileSync as M}from"node:fs";import w from"node:path";var V=e=>!["","0",void 0].includes(e),z=(e,r)=>(r.PATH??"").split(w.delimiter).some(t=>t&&H(w.join(t,e))),U=()=>{try{return process.platform==="linux"&&/microsoft/i.test(M("/proc/version","utf8"))}catch{return!1}};function K(e,{platform:r=process.platform,env:t=process.env,wsl:o=U()}={}){let n=encodeURI(e);return V(t.GALLERY_NO_BROWSER)?{skip:"GALLERY_NO_BROWSER is set"}:r==="win32"?{command:w.join(t.SystemRoot||t.windir||"C:\\Windows","System32","rundll32.exe"),args:["url.dll,FileProtocolHandler",n]}:r==="darwin"?{command:"open",args:[n]}:o?{command:"cmd.exe",args:["/c","start",'""',n.replace(/[&^]/g,"^$&")]}:!t.DISPLAY&&!t.WAYLAND_DISPLAY?{skip:"no display here (neither DISPLAY nor WAYLAND_DISPLAY is set)"}:z("xdg-open",t)?{command:"xdg-open",args:[n]}:{skip:"xdg-open is not installed"}}var q="Opened it in the default browser (if that is not Chrome or Edge, open the address there to edit).",T=e=>e.opened?q:`Not opened in a browser: ${e.why}.`;async function I(e,r){let t=K(e,r);return t.skip?{opened:!1,why:t.skip}:new Promise(o=>{let n;try{n=C(t.command,t.args,{detached:!0,stdio:"ignore",windowsHide:!0})}catch(s){return o({opened:!1,why:`${w.basename(t.command)} did not start (${s.code??s.message})`})}n.once("error",s=>o({opened:!1,why:`${w.basename(t.command)} did not start (${s.code??s.message})`})),n.once("spawn",()=>{n.unref(),o({opened:!0})})})}import{packageRoot as Z,projectRoot as G,release as O,reportsDirectory as h}from"../browser/shared/paths.mjs";import{workspaceId as ee,registerQuietly as te}from"../browser/shared/workspace-registry.mjs";import{serviceLocation as re,workspaceBase as ne}from"../browser/shared/service-location.mjs";import{fullAddress as oe}from"../browser/shared/page-address.mjs";import{findPreviewServer as se,galleryVersion as F,portIsFree as ie,previewServerFor as ae,readAnnouncement as ce}from"../browser/shared/preview-server.mjs";import{documentLinks as le}from"../browser/shared/reports.mjs";import{defaultWorkspace as de,documentDirectory as pe,documentFiles as ue}from"../browser/shared/workspace.mjs";var $="\u4EA4\u7ED9\u7528\u6237\uFF08\u73B0\u5728\u5C31\u628A\u8FD9\u4E2A\u5730\u5740\u7ED9\u7528\u6237\uFF1B\u7528 Chrome \u6216 Edge \u6253\u5F00\uFF09\uFF1A",fe="Agent \u81EA\u7528\uFF08\u53EA\u6709\u6587\u6863\u9875\uFF0C\u4E0D\u4EA4\u7ED9\u7528\u6237\uFF09\uFF1A",me=e=>`send the user ${e} now, in a message of its own, before any other step; then `;function Xe(e,r){let t=e.at(-1)??"";return`Next: ${t.startsWith($)?me(t.slice($.length)):""}${r}`}async function Ze(e,r){let t=e.at(-1)??"";return t.startsWith($)?r.has("--no-browser")?"Not opened in a browser (--no-browser).":T(await I(t.slice($.length))):null}var D="GALLERY_NO_PREVIEW",he=e=>!["","0",void 0].includes(e),et=e=>e.has("--no-preview")||he(process.env[D]),we=4317,$e=20,ye=(e=process.env)=>{let r=Number(e.GALLERY_PORT);return Number.isInteger(r)&&r>0&&r<65536?r:we},ge=6e4,ve=5*1024*1024,xe=P.join(G,"node_modules","vite","bin","vite.js"),ke=P.join(Z,"dist","server.mjs"),Le=e=>new Promise(r=>setTimeout(r,e)),Se=de(),R=re(),f=R.serverLog,W=()=>ne(h),A=(e,r)=>`http://127.0.0.1:${e}${W()}/generated/${r}.html`,be=(e,r)=>`${A(e,r)}?agent`,Y=e=>`http://127.0.0.1:${e}/`,Ae=async(e,r)=>{let t=await le(h).then(n=>n.links,()=>null),o=oe(`http://127.0.0.1:${e}`,r,t);return W()?o.replace("/#",`/#~${ee(h)}/`):o};async function Pe({first:e=ye(),count:r=$e}={}){let t=Number((await m.readFile(R.lastPortFile,"utf8").catch(()=>"")).trim()),o=Array.from({length:Math.max(0,r)},(n,s)=>e+s);return Number.isInteger(t)&&t>0&&t<65536?[t,...o.filter(n=>n!==t)]:o}async function Re(){return await m.mkdir(P.dirname(f),{recursive:!0}),await m.stat(f).then(r=>r.size,()=>0)>ve&&await m.rename(f,`${f}.1`).catch(()=>{}),b.openSync(f,"a")}async function Ee(e,r){if(!O){let{writeSharedAssets:p}=await import("./chunk-CRDG6EF2.mjs");await p()}let t=await Re();b.writeSync(t,`
3
+ [${new Date().toISOString()}] ${r}: Gallery ${F} on 127.0.0.1:${e} for ${h}
4
+ `);let[o,n]=O?[[ke,"--port",String(e)],Q.homedir()]:[[xe,"--host","127.0.0.1","--port",String(e),"--strictPort"],G],s=J(process.execPath,o,{cwd:n,env:{...process.env,GALLERY_WORKSPACE:Se,GALLERY_SERVER_KIND:"cli"},detached:!0,stdio:["ignore",t,t],windowsHide:!0});return b.closeSync(t),s.unref(),s}async function Ne({slug:e=null,command:r=`gallery open${e?` ${e}`:""}`,ports:t=null,starting:o=ge,baseline:n=!1}={}){await te(h);let s=()=>!0;if(e){let a=ue(pe(e,h)),c=await m.readFile(a.html,"utf8").catch(()=>null);if(c===null)return{ok:!1,reason:"missing",message:`No document "${e}": ${a.html} does not exist (gallery new ${e} "<\u6807\u9898>" makes one; gallery list lists those there are).`};n&&await import("./chunk-225ALKYI.mjs").then(({previewBaseline:x})=>x(e,c));let i=await m.readFile(a.json,"utf8").then(JSON.parse).catch(()=>({})),v=[/<title>([^<]*)<\/title>/i.exec(c)?.[1]?.trim(),typeof i.title=="string"?i.title.trim():""].filter(Boolean);s=x=>v.length===0||v.some(_=>x.includes(_)||x.includes(X(_)))}let p=t??await Pe(),k=p.length?`${Math.min(...p)} to ${Math.max(...p)}`:"none",L=`gallery open${e?` ${e}`:""}`,E=async(a,c=[])=>{let i=await ae({ports:p.slice(a),start:v=>Ee(v,r)});return i.busy?.newer?{failed:{ok:!1,reason:"newer",message:`A newer Gallery (${i.busy.version}) serves this Gallery data directory (port ${i.busy.port}, pid ${i.busy.pid}) and gave no answer in 10s; this is Gallery ${F}. Update this one (npm i -g @heycys/gallery@latest), or run ${L} again in a while.`}}:i.busy?{failed:{ok:!1,reason:"busy",message:`The shared Gallery server (port ${i.busy.port}, pid ${i.busy.pid}) took the request and gave no answer in 10s: it is busy or stuck. Run ${L} again in a while, or stop that process first (gallery stop): a second server for this data directory is not started beside it.`}}:i.stuck?{failed:{ok:!1,reason:"stuck",message:`An older Gallery's server serves this Gallery data directory and did not stop: ${i.stuck.message}`}}:i.port===null?{failed:{ok:!1,reason:"ports",message:`No server for this data directory runs, and no port from ${k} is free to start one on: stop a server on one of them (or name another first port: GALLERY_PORT=<n>), then run ${L}.`}}:{...i,passed:[...c,...i.passed]}},u=await E(0);if(u.failed)return u.failed;let{port:l,started:d,passed:S,replaced:j}=u,y=u.running??null,N=Date.now()+o,g="",B=async()=>{if(e){let c=await fetch(`${A(l,e)}?present`,{signal:AbortSignal.timeout(5e3)}).catch(()=>null),i=c?.ok?await c.text():"";return g=c?i?`HTTP ${c.status} without the title`:`HTTP ${c.status}`:"no answer",!!(i&&s(i))}let a=await fetch(`http://127.0.0.1:${l}/__gallery/workspace/info`,{signal:AbortSignal.timeout(5e3)}).catch(()=>null);return g=a?`HTTP ${a.status}`:"no answer",!!a?.ok};for(;;await Le(300)){if(Date.now()>N)return{ok:!1,reason:"timeout",message:`${e?A(l,e):Y(l)} did not answer${e?" with the document's title":""} in ${o/1e3}s (${g})${d?`; the server's output is in ${f}`:""}.`};if(d){let a=await se({answering:!0});if(a&&a.pid!==d.pid){if(d.exitCode===null)try{process.kill(d.pid)}catch{}({port:l}=a),y={pid:a.pid,kind:(await ce())?.kind??"cli",version:null},d=null;continue}if(!a&&d.exitCode===null){g="the server started has not announced itself yet";continue}if(!a){if(!await ie(l)){if(u=await E(p.indexOf(l)+1,[...S,`${l} (taken by another program while the server started)`]),u.failed)return u.failed;({port:l,started:d,passed:S}=u),y=u.running??null,N=Date.now()+o;continue}let c=await m.readFile(f,"utf8").catch(()=>"");return{ok:!1,reason:"stopped",message:`The Gallery server on port ${l} stopped (exit ${d.exitCode}). Its last words (${f}):
5
+ ${c.split(`
6
+ `).slice(-15).join(`
7
+ `)}`}}}if(await B())break}return await m.writeFile(R.lastPortFile,`${l}
8
+ `).catch(()=>{}),{ok:!0,port:l,pid:d?.pid??y?.pid??null,kind:y?.kind??"cli",started:!!d,replaced:j??null,passed:S}}var _e=e=>e.length<2?e.join(""):`${e.slice(0,-1).join(", ")} and ${e.at(-1)}`;function Te({port:e,pid:r,kind:t,started:o,replaced:n,passed:s=[]}){let p=[`pid ${r}`,...t==="dev"?["npm run dev's"]:[],...o?[`started now${s.length?`, after passing over ${_e(s)}`:""}`]:[],...n?[`it replaced Gallery ${n.version??"an older version"}'s server, pid ${n.pid}`]:[]],k=o?`; its log: ${f}`:"";return`Gallery's shared server runs on port ${e} (${p.join(", ")}${k}). This command is done; the server runs on after it (nothing to wait for or keep running).`}async function Ie(e,r,t=null){return[Te(r),...e?[`${fe}${be(r.port,e)}`]:[],`${$}${e?await Ae(r.port,{slug:e,block:t}):Y(r.port)}`]}async function tt(e,{skipped:r,command:t,ports:o=null}){let n=`gallery open ${e} starts it and prints the address to give the user`;if(r)return[`Preview: not started (--no-preview or ${D}): ${n}.`];let s=await Ne({slug:e,command:t,ports:o});return s.ok?Ie(e,s):[`Preview: not started: ${s.message}`,`When that is fixed, ${n}.`]}export{$ as a,fe as b,Xe as c,Ze as d,et as e,be as f,Y as g,Pe as h,Ne as i,Te as j,Ie as k,tt as l};