alchemylab 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,74 +1,26 @@
1
1
  (()=>{"use strict"
2
- function e(t){var r=o[t]
2
+ function e(t){var r=s[t]
3
3
  if(void 0!==r)return r.exports
4
- var module=o[t]={id:t,loaded:!1,exports:{}}
5
- return n[t].call(module.exports,module,module.exports,e),module.loaded=!0,module.exports}var t,r,n={4703:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.LIVE_FRAME_PATH=void 0,exports.readOomKills=async function(e){const t=await(0,r.docker)(["exec",e,"cat","/sys/fs/cgroup/memory.events"],n)
6
- if(0===t.exit){const e=/^oom_kill (\d+)/m.exec(t.stdout)
7
- if(e)return Number(e[1])}const o=await(0,r.docker)(["exec",e,"cat","/sys/fs/cgroup/memory/memory.oom_control"],n)
8
- if(0===o.exit){const e=/^oom_kill (\d+)/m.exec(o.stdout)
9
- if(e)return Number(e[1])}return null},exports.probeBox=async function(e){const t=`cat /sys/fs/cgroup/memory.events 2>/dev/null || cat /sys/fs/cgroup/memory/memory.oom_control 2>/dev/null; if [ -s ${exports.LIVE_FRAME_PATH} ]; then echo __ALCHEMY_LIVE_FRAME__; fi`,o=await(0,r.docker)(["exec",e,"/bin/sh","-c",t],n),s=/^oom_kill (\d+)/m.exec(o.stdout)
10
- return{oomKills:s?Number(s[1]):null,liveFrame:o.stdout.includes("__ALCHEMY_LIVE_FRAME__")}},exports.oomNote=function(e,t){return`[AlchemyLab] Out of memory: the kernel killed ${1===e?"a process":`${e} processes`} in this box during this command (the box's memory cap is ${t}). Exit code 137 means killed. Make the case smaller, or raise the environment's memory (resources.memory).`}
11
- const r=t(6175),n=5e3
12
- exports.LIVE_FRAME_PATH="/tmp/.alchemy_live.png"},6175:(e,exports,t)=>{function r(){return{...c?{"alchemy.project":c}:{},...l.getStore()??{}}}function n(e){if("create"!==e[0]&&"run"!==e[0])return e
13
- const t=new Set
14
- e.forEach(((r,n)=>{"--label"===e[n-1]&&t.add(r.split("=")[0])}))
15
- const n=Object.entries(r()).filter((([e])=>!t.has(e))).flatMap((([e,t])=>["--label",`${e}=${t.replace(/[\r\n]/g," ").slice(0,200)}`]))
16
- return n.length?[e[0],...n,...e.slice(1)]:e}function o(e,t){return new Promise((r=>{(0,s.execFile)("docker",n(e),{timeout:t,killSignal:"SIGKILL",maxBuffer:33554432,windowsHide:!0},((e,t,n)=>{if(!e)return void r({exit:0,stdout:t,stderr:n,timedOut:!1})
17
- const o=e
18
- if("ENOENT"===o.code)return void r({exit:-1,stdout:t??"",stderr:n??"",timedOut:!1,spawnError:"docker CLI not found on PATH"})
19
- const s=!0===o.killed||"SIGKILL"===o.signal,a="number"==typeof o.code?o.code:-1
20
- r({exit:a,stdout:t??"",stderr:n??"",timedOut:s})}))}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.PULL_TIMEOUT_MS=exports.DOCKER_OP_TIMEOUT_MS=void 0,exports.setContainerProject=function(e){c=e||void 0},exports.withContainerLabels=function(e,t){const r=Object.fromEntries(Object.entries(e).filter((([,e])=>"string"==typeof e&&e.length>0)))
21
- return l.run({...l.getStore()??{},...r},t)},exports.containerLabels=r,exports.withScopeLabels=n,exports.docker=o,exports.volumeExists=async function(e){return 0===(await o(["volume","inspect",e],exports.DOCKER_OP_TIMEOUT_MS)).exit},exports.ensureImage=async function(e){const t=(0,i.localRecipeFor)(e)
22
- if(t)return(0,i.ensureLocalImage)(t)
23
- const r=await o(["image","inspect",e],exports.DOCKER_OP_TIMEOUT_MS)
24
- if(r.spawnError)return r.spawnError
25
- if(0===r.exit)return
26
- const n=await o(["pull",e],exports.PULL_TIMEOUT_MS)
27
- return 0!==n.exit?`docker pull ${e} failed: ${(n.stderr||String(n.exit)).trim()}`:void 0}
28
- const s=t(31421),a=t(16698),i=t(69968)
29
- let c
30
- const l=new a.AsyncLocalStorage
31
- exports.DOCKER_OP_TIMEOUT_MS=6e4,exports.PULL_TIMEOUT_MS=3e5},7740:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.ENVIRONMENT_PRESETS=exports.OFFICE_BOX_PRESET=exports.OFFICE_BOX_RECIPE_HASH=exports.OFFICE_BOX_DOCKERFILE=exports.OFFICE_RENDER_DIR=exports.OFFICE_BOX_IMAGE=exports.OFFICE_BOX_VERSION=void 0,exports.expandEnvironmentPreset=function(e,t){const r=t??{}
32
- if(!e)return r
33
- const n=exports.ENVIRONMENT_PRESETS[e].config
34
- return{...n,...r,resources:{...n.resources??{},...r.resources??{}}}},exports.presetsLine=function(e){if(!e.includes(exports.OFFICE_BOX_IMAGE))return'Presets: `office` (python-docx, openpyxl, python-pptx, pandoc, LibreOffice; `render-pdf FILE` turns Word, Excel, PowerPoint, Markdown or HTML into PDF). Set it up with environment_verify({ preset: "office" }) then environment_create({ name: "Office", preset: "office" }), or ask environment_setup for the office preset. Needs Docker; the image is built locally on first use (a few minutes, about 900 MB). To only look at an office file, view_asset renders it without a box.'}
35
- const r=t(76982)
36
- exports.OFFICE_BOX_VERSION=1,exports.OFFICE_BOX_IMAGE=`alchemylab-local/office-box:v${exports.OFFICE_BOX_VERSION}`,exports.OFFICE_RENDER_DIR="/scratch/render"
37
- const n=`#!/bin/sh\n# render-pdf FILE... : convert Word, Excel, PowerPoint, OpenDocument, Markdown or HTML to PDF.\n# Writes each PDF under \${RENDER_OUT:-${exports.OFFICE_RENDER_DIR}} and prints its path, one per line.\nset -e\nout="\${RENDER_OUT:-${exports.OFFICE_RENDER_DIR}}"\nmkdir -p "$out" /scratch/.render-work\nexport HOME="\${HOME:-/scratch}"\nif [ "$1" = "--self-test" ]; then\n cd /scratch/.render-work\n python3 -c "import docx; d = docx.Document(); d.add_heading('render-pdf self-test', 1); d.add_paragraph('ok'); d.save('self-test.docx')"\n set -- /scratch/.render-work/self-test.docx\nfi\n[ "$#" -gt 0 ] || { echo "usage: render-pdf FILE..." >&2; exit 2; }\nfor f in "$@"; do\n [ -f "$f" ] || { echo "render-pdf: no such file: $f" >&2; exit 1; }\n name=$(basename "$f"); stem="\${name%.*}"\n case "$name" in\n *.md|*.markdown) pandoc "$f" -o "/scratch/.render-work/$stem.docx"; src="/scratch/.render-work/$stem.docx" ;;\n *) src="$f" ;;\n esac\n soffice --headless --norestore -env:UserInstallation=file:///scratch/.render-profile --convert-to pdf --outdir "$out" "$src" >/scratch/.render-work/soffice.log 2>&1 \\\n || { echo "render-pdf: LibreOffice could not convert $f" >&2; tail -5 /scratch/.render-work/soffice.log >&2; exit 1; }\n [ -f "$out/$stem.pdf" ] || { echo "render-pdf: no PDF produced for $f" >&2; exit 1; }\n echo "$out/$stem.pdf"\ndone\n`
38
- exports.OFFICE_BOX_DOCKERFILE=["FROM python:3.12-slim","ENV DEBIAN_FRONTEND=noninteractive PIP_NO_CACHE_DIR=1 PYTHONDONTWRITEBYTECODE=1","RUN apt-get update \\"," && apt-get install -y --no-install-recommends \\"," libreoffice-writer-nogui libreoffice-calc-nogui libreoffice-impress-nogui \\"," pandoc fonts-liberation fonts-dejavu-core fonts-crosextra-carlito fonts-crosextra-caladea \\"," && rm -rf /var/lib/apt/lists/*","RUN pip install python-docx openpyxl python-pptx pypdf",`RUN echo ${Buffer.from(n).toString("base64")} | base64 -d > /usr/local/bin/render-pdf && chmod 755 /usr/local/bin/render-pdf`,""].join("\n"),exports.OFFICE_BOX_RECIPE_HASH=(0,r.createHash)("sha256").update(exports.OFFICE_BOX_DOCKERFILE).digest("hex").slice(0,16),exports.OFFICE_BOX_PRESET={name:"Office",description:"Make and render office files: python-docx, openpyxl, python-pptx, pandoc and LibreOffice in a sealed box. `render-pdf FILE` writes a PDF under /scratch/render. The worktree is read-only here: make files under /scratch, record them (results record, box), then view_asset({ result }) to look at a PDF and write_file({ path, fromResult }) to put a file in the repository.",smoke:"render-pdf --self-test",config:{image:exports.OFFICE_BOX_IMAGE,shellInit:"export HOME=/scratch",resources:{memory:"3g",scratchMb:1024,shmMb:256}}},exports.ENVIRONMENT_PRESETS={office:exports.OFFICE_BOX_PRESET}},15845:function(module,exports,e){async function t(e,t,r){const n=await(0,d.renderDocument)({bytes:Buffer.from(e),filename:`version.${t}`,to:r},{cacheDir:l.join(c.tmpdir(),"alchemylab-render-cache"),image:"present-only"})
39
- if(!n.ok)throw new Error(n.error)
40
- return n.bytes}async function r(e){const r=(0,u.documentKindFor)(e)
41
- if(!r)return`(AlchemyLab: no text form for ${e.split(".").pop()} files)\n`
42
- try{const n=await(0,u.extractDocumentText)(new Uint8Array(await(0,i.readFile)(e)),r,{convert:t})
43
- return n.text.endsWith("\n")?n.text:`${n.text}\n`}catch(e){return`(AlchemyLab: could not read this ${r.toUpperCase()} version: ${e instanceof Error?e.message:String(e)})\n`}}module=e.nmd(module)
44
- var n,o=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r)
45
- var o=Object.getOwnPropertyDescriptor(t,r)
46
- o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||(n=function(e){return n=Object.getOwnPropertyNames||function(e){var t=[]
47
- for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r)
48
- return t},n(e)},function(e){if(e&&e.__esModule)return e
49
- var t={}
50
- if(null!=e)for(var r=n(e),a=0;a<r.length;a++)"default"!==r[a]&&o(t,e,r[a])
51
- return s(t,e),t})
52
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.textconv=r
53
- const i=e(91943),c=a(e(70857)),l=a(e(16928)),u=e(98335),d=e(24716)
54
- if(e.c[e.s]===module){const e=process.argv[2]
55
- e||(process.stderr.write("usage: textconv <file>\n"),process.exit(2)),r(e).then((e=>process.stdout.write(e)),(()=>process.stdout.write("(AlchemyLab: text conversion failed)\n")))}},16603:(e,exports)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.withShellInit=function(e,t){const r=(e??"").trim()
56
- return r?`${r} && ${t}`:t},exports.carriesOwnShellInit=function(e){return/(^|[;&|]\s*|\s-lc\s*['"]?\s*)(\.|source)\s+\S+\s*(&&|;)/.test(e)}},16698:module=>{module.exports=require("node:async_hooks")},16928:module=>{module.exports=require("path")},24716:function(e,exports,t){function r(e,t){const r=d.extname(e).slice(1).toLowerCase()
4
+ var module=s[t]={id:t,loaded:!1,exports:{}}
5
+ return o[t].call(module.exports,module,module.exports,e),module.loaded=!0,module.exports}var t,r,n,o={2203:module=>{module.exports=require("stream")},2566:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.RUN_ENV_VAR=exports.RUN_FROM_ENV=void 0,exports.withShellInit=function(e,t){const r=(e??"").trim()
6
+ return r?`${r} && ${t}`:t},exports.carriesOwnShellInit=function(e){return/(^|[;&|]\s*|\s-lc\s*['"]?\s*)(\.|source)\s+\S+\s*(&&|;)/.test(e)}
7
+ var r=t(44600)
8
+ Object.defineProperty(exports,"RUN_FROM_ENV",{enumerable:!0,get:function(){return r.RUN_FROM_ENV}}),Object.defineProperty(exports,"RUN_ENV_VAR",{enumerable:!0,get:function(){return r.RUN_ENV_VAR}})},3517:function(e,exports,t){function r(e,t){const r=d.extname(e).slice(1).toLowerCase()
57
9
  return b[t].includes(r)}function n(e,t){const r=e=>`'${e.replace(/'/g,"'\\''")}'`,n=`/work/in/${e}`,o=e.replace(/\.[^.]+$/,"")
58
10
  return"pdf"===t?`RENDER_OUT=/work/out render-pdf ${r(n)}`:"docx"===t&&/\.(md|markdown|html?)$/i.test(e)?`pandoc ${r(n)} -o ${r(`/work/out/${o}.docx`)}`:`soffice --headless --norestore -env:UserInstallation=file:///scratch/.render-profile --convert-to ${t} --outdir /work/out ${r(n)} >/dev/null`}var o,s=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r)
59
11
  var o=Object.getOwnPropertyDescriptor(t,r)
60
- o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||(o=function(e){return o=Object.getOwnPropertyNames||function(e){var t=[]
12
+ o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||(o=function(e){return o=Object.getOwnPropertyNames||function(e){var t=[]
61
13
  for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r)
62
14
  return t},o(e)},function(e){if(e&&e.__esModule)return e
63
15
  var t={}
64
16
  if(null!=e)for(var r=o(e),n=0;n<r.length;n++)"default"!==r[n]&&s(t,e,r[n])
65
- return a(t,e),t})
17
+ return i(t,e),t})
66
18
  Object.defineProperty(exports,"__esModule",{value:!0}),exports.RENDER_MIME=exports.MAX_RENDER_INPUT_BYTES=void 0,exports.canRender=r,exports.renderDocument=async function(e,t){const o=(s=e.filename,d.basename(s).replace(/[^A-Za-z0-9._-]+/g,"_").replace(/^\.+/,"")||"document")
67
19
  var s
68
20
  if(!r(o,e.to))return{ok:!1,error:`${d.extname(o)||"this file"} cannot be turned into ${e.to.toUpperCase()}`}
69
21
  if(e.bytes.length>exports.MAX_RENDER_INPUT_BYTES)return{ok:!1,error:`file is over ${exports.MAX_RENDER_INPUT_BYTES/1048576} MB`}
70
- const a=(0,c.createHash)("sha256").update(m.OFFICE_BOX_RECIPE_HASH).update("\0").update(e.to).update("\0").update(d.extname(o).toLowerCase()).update("\0").update(e.bytes).digest("hex"),i=d.join(t.cacheDir,`${a}.${e.to}`)
71
- try{return{ok:!0,bytes:await l.promises.readFile(i),cached:!0}}catch{}const b=t.image??"wait"
22
+ const i=(0,c.createHash)("sha256").update(m.OFFICE_BOX_RECIPE_HASH).update("\0").update(e.to).update("\0").update(d.extname(o).toLowerCase()).update("\0").update(e.bytes).digest("hex"),a=d.join(t.cacheDir,`${i}.${e.to}`)
23
+ try{return{ok:!0,bytes:await l.promises.readFile(a),cached:!0}}catch{}const b=t.image??"wait"
72
24
  if("wait"!==b){const e=(0,f.localRecipeFor)(m.OFFICE_BOX_IMAGE),t=await(0,f.localImageState)(e)
73
25
  if("no-docker"===t.state)return{ok:!1,error:t.error,unavailable:!0}
74
26
  if("building"===t.state)return{ok:!1,error:g,preparing:!0,since:t.since}
@@ -79,97 +31,90 @@ return{ok:!1,error:g,preparing:!0,since:t}}}const x=await l.promises.mkdtemp(d.j
79
31
  try{await l.promises.mkdir(d.join(x,"in")),await l.promises.mkdir(d.join(x,"out")),await l.promises.chmod(x,493),await l.promises.chmod(d.join(x,"in"),493),await l.promises.chmod(d.join(x,"out"),511),await l.promises.writeFile(d.join(x,"in",o),e.bytes,{mode:420})
80
32
  const r=new p.ContainerRunner({image:m.OFFICE_BOX_IMAGE,stepTimeoutMs:h,resources:{memory:"3g",shmSizeMb:256}}),s=await r.run({worktreePath:x,image:m.OFFICE_BOX_IMAGE,env:{HOME:"/scratch"},steps:[{run:n(o,e.to)}]})
81
33
  if(!s.ok){const e=s.steps[0]
82
- return{ok:!1,error:(s.error??`${(e?.stderr||e?.stdout||"").trim().split("\n").slice(-4).join(" ")}`)||"rendering failed",unavailable:!!s.error&&/docker|daemon|not found on PATH|Cannot connect/i.test(s.error)}}const a=(await l.promises.readdir(d.join(x,"out"))).find((t=>t.toLowerCase().endsWith(`.${e.to}`)))
83
- if(!a)return{ok:!1,error:`no ${e.to.toUpperCase()} was produced`}
84
- const c=await l.promises.readFile(d.join(x,"out",a))
85
- return await l.promises.mkdir(t.cacheDir,{recursive:!0}),await l.promises.writeFile(i,c),{ok:!0,bytes:c,cached:!1}}finally{await l.promises.rm(x,{recursive:!0,force:!0})}}
86
- const c=t(76982),l=t(79896),u=i(t(70857)),d=i(t(16928)),p=t(64936),f=t(69968),m=t(7740)
34
+ return{ok:!1,error:(s.error??`${(e?.stderr||e?.stdout||"").trim().split("\n").slice(-4).join(" ")}`)||"rendering failed",unavailable:!!s.error&&/docker|daemon|not found on PATH|Cannot connect/i.test(s.error)}}const i=(await l.promises.readdir(d.join(x,"out"))).find((t=>t.toLowerCase().endsWith(`.${e.to}`)))
35
+ if(!i)return{ok:!1,error:`no ${e.to.toUpperCase()} was produced`}
36
+ const c=await l.promises.readFile(d.join(x,"out",i))
37
+ return await l.promises.mkdir(t.cacheDir,{recursive:!0}),await l.promises.writeFile(a,c),{ok:!0,bytes:c,cached:!1}}finally{await l.promises.rm(x,{recursive:!0,force:!0})}}
38
+ const c=t(76982),l=t(79896),u=a(t(70857)),d=a(t(16928)),p=t(52429),f=t(83129),m=t(44853)
87
39
  exports.MAX_RENDER_INPUT_BYTES=52428800
88
40
  const h=18e4,b={pdf:["docx","doc","odt","rtf","xlsx","xlsm","xls","ods","csv","pptx","ppt","odp","md","markdown","html","htm"],docx:["md","markdown","html","htm","odt","rtf","doc"],xlsx:["xls","ods"],pptx:["ppt","odp"]}
89
41
  exports.RENDER_MIME={pdf:"application/pdf",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation"}
90
- const w=12e4,g="the office renderer is being built on this machine (first use only, usually a few minutes)"},31421:module=>{module.exports=require("node:child_process")},48161:module=>{module.exports=require("node:os")},50478:(e,exports)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.rtfToText=function(e){const o="string"==typeof e?e:Buffer.from(e).toString("latin1")
91
- if(!/^\s*\{\s*\\rtf/i.test(o))throw new Error("not an RTF file (it does not start with {\\rtf)")
92
- const s=[],a=[{skip:!1,skipChars:0}],i=()=>a[a.length-1],c=e=>{i().skip||s.push(e)}
93
- for(let e=0;e<o.length;e++){const s=o[e]
94
- if("{"===s){a.push({...i()})
95
- continue}if("}"===s){a.length>1&&a.pop()
96
- continue}if("\r"===s||"\n"===s)continue
97
- if("\\"!==s){if(i().skipChars>0){i().skipChars--
98
- continue}c(s)
99
- continue}const u=/^\\([a-zA-Z]+)(-?\d+)? ?/.exec(o.slice(e))
100
- if(!u){const s=o[e+1]
101
- if("*"===s){const r=/^\\\*\\([a-zA-Z]+)/.exec(o.slice(e))
102
- r&&!t.has(r[1])||(i().skip=!0),e+=1
103
- continue}if("'"===s){const t=o.slice(e+2,e+4)
104
- if(e+=3,i().skipChars>0){i().skipChars--
105
- continue}c((l=parseInt(t,16)||0)<128?String.fromCharCode(l):n[l-128]??"")
106
- continue}if(void 0!==s&&void 0!==r[s]){c(r[s]),e+=1
107
- continue}e+=1
108
- continue}const[d,p,f]=u
109
- e+=d.length-1
110
- const m=void 0===f?void 0:Number(f)
111
- if(t.has(p))i().skip=!0
112
- else if("u"!==p)"uc"!==p?"cell"!==p&&"nestcell"!==p?"row"!==p&&"nestrow"!==p?void 0===r[p]||c(r[p]):c("\n"):c(" | "):i().ucSkip=m??1
113
- else{const e=i().skipChars>0
114
- i().skipChars=Math.max(0,a[a.length-1].ucSkip??1),e||void 0===m||c(String.fromCodePoint(m<0?m+65536:m))}}var l
115
- return s.join("").replace(/[ \t]+\n/g,"\n").replace(/\n{3,}/g,"\n\n").split("\n").map((e=>{const t=e.replace(/\s+$/,"").replace(/^\s*\|\s*/,"").replace(/\s*\|\s*$/,"")
116
- return e.includes(" | ")?`| ${t} |`:t})).join("\n").trim()}
117
- const t=new Set(["fonttbl","colortbl","stylesheet","listtable","listoverridetable","revtbl","rsidtbl","generator","info","pict","object","themedata","colorschememapping","latentstyles","datastore","xmlnstbl","filetbl","upr","fldinst","nonshppict","shppict","panose"]),r={par:"\n",line:"\n",tab:"\t",sect:"\n\n",page:"\n\n",lquote:"\u2018",rquote:"\u2019",ldblquote:"\u201c",rdblquote:"\u201d",emdash:"\u2014",endash:"\u2013",bullet:"\u2022",emspace:" ",enspace:" ",qmspace:" ","~":"\xa0","-":"",_:"-","{":"{","}":"}","\\":"\\"},n="\u20ac\x81\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\x8d\u017d\x8f\x90\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\x9d\u017e\u0178\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"},53157:(e,exports)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.hardenedCreateArgs=function(e){return["--network",e.network,"--user",e.user,"--cap-drop","ALL",...(e.capAdds??[]).flatMap((e=>["--cap-add",e])),...Object.entries(e.sysctls??{}).flatMap((([e,t])=>["--sysctl",`${e}=${t}`])),"--security-opt","no-new-privileges","--read-only","--tmpfs","/tmp:rw,nosuid,nodev,exec,size=256m",...(e.extraTmpfs??[]).flatMap((e=>["--tmpfs",e])),"--ipc","none","--tmpfs",`/dev/shm:rw,nosuid,nodev,size=${e.shmSizeMb??64}m`,"--memory",e.memory,"--memory-swap",e.memory,"--cpus",String(e.cpus),"--pids-limit",String(e.pidsLimit),"-e","HOME=/tmp"]}},64264:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.SCRATCH_VOLUME_ARGS=void 0,exports.scratchTmpfsArg=function(e){return`/scratch:rw,nosuid,nodev,exec,size=${e}m`},exports.claimScratch=async function(e,t,n){const o=await(0,r.docker)(["run","--rm","--network","none","--user","0:0","--volumes-from",e,"--entrypoint","chown",t,n,"/scratch"],r.DOCKER_OP_TIMEOUT_MS)
118
- return 0===o.exit?null:o.spawnError??((o.stderr||"").trim()||`chown exited ${o.exit}`)}
119
- const r=t(6175)
120
- exports.SCRATCH_VOLUME_ARGS=["--mount","type=volume,dst=/scratch"]},64936:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.ContainerRunner=void 0
121
- const r=t(6175),n=t(53157),o=t(16603),s=t(64264),a=t(4703)
122
- exports.ContainerRunner=class{constructor(e={}){this.image=e.image??"node:20-alpine",this.stepTimeoutMs=e.stepTimeoutMs??12e4,this.network=e.network??"none",this.resources=e.resources??{}}async run(e){if(!e.worktreePath)return{steps:[],ok:!1,error:"worktreePath is required"}
123
- const t=e.image??this.image,n={}
124
- let i=Date.now()
125
- const c=e=>{const t=Date.now()
126
- n[e]=(n[e]??0)+(t-i),i=t},l=await(0,r.ensureImage)(t)
127
- if(c("image"),l)return{steps:[],ok:!1,error:l}
128
- let u=await(0,r.docker)(this.createArgs(e,t,!0),r.DOCKER_OP_TIMEOUT_MS)
129
- if(0!==u.exit)return{steps:[],ok:!1,error:u.spawnError??`docker create failed: ${(u.stderr||String(u.exit)).trim()}`}
130
- let d=u.stdout.trim()
131
- if(c("create"),await(0,s.claimScratch)(d,t,"1000:1000")){if(await(0,r.docker)(["rm","-f","-v",d],r.DOCKER_OP_TIMEOUT_MS),u=await(0,r.docker)(this.createArgs(e,t,!1),r.DOCKER_OP_TIMEOUT_MS),0!==u.exit)return{steps:[],ok:!1,error:u.spawnError??`docker create failed: ${(u.stderr||String(u.exit)).trim()}`}
132
- d=u.stdout.trim()}c("scratch")
133
- try{const t=await(0,r.docker)(["start",d],r.DOCKER_OP_TIMEOUT_MS)
134
- if(c("start"),0!==t.exit)return{steps:[],ok:!1,error:`docker start failed: ${(t.stderr||String(t.exit)).trim()}`}
135
- const s=[]
136
- let i=await(0,a.readOomKills)(d)??0
137
- for(const t of e.steps){const n=Date.now(),c=await(0,r.docker)(["exec",d,"/bin/sh","-c",(0,o.withShellInit)(e.shellInit,t.run)],t.timeoutMs??this.stepTimeoutMs),l=Date.now()-n,u=await(0,a.readOomKills)(d),p=null!=u?Math.max(0,u-i):0
138
- null!=u&&(i=u)
139
- const f=p>0?`${c.stderr}${c.stderr&&!c.stderr.endsWith("\n")?"\n":""}${(0,a.oomNote)(p,this.resources.memory??"1g")}\n`:c.stderr
140
- s.push({run:t.run,exit:c.exit,stdout:c.stdout,stderr:f,ms:l,timedOut:c.timedOut})}return c("commands"),{steps:s,ok:s.every((e=>0===e.exit)),phaseMs:n}}finally{const e=Date.now()
141
- await(0,r.docker)(["rm","-f","-v",d],r.DOCKER_OP_TIMEOUT_MS),n.remove=Date.now()-e}}createArgs(e,t,r){const o=Object.entries(e.env??{}).flatMap((([e,t])=>["-e",`${e}=${t}`])),a=e.depsVolume?["-v",`${e.depsVolume}:/work/node_modules`]:[],i=(e.mounts??[]).flatMap((e=>["-v",`${e.volume}:${e.target}`])),c=(e.readOnlyBinds??[]).flatMap((e=>["-v",`${e.host}:${e.target}:ro`]))
142
- return["create","--label","alchemy.sandbox=rung1",...(0,n.hardenedCreateArgs)({network:this.network,user:"1000:1000",...r?{}:{extraTmpfs:[(0,s.scratchTmpfsArg)(512)]},shmSizeMb:this.resources.shmSizeMb,memory:this.resources.memory??"1g",cpus:this.resources.cpus??2,pidsLimit:this.resources.pidsLimit??512}),...r?s.SCRATCH_VOLUME_ARGS:[],...o,"-v",`${e.worktreePath}:/work:rw`,...a,...i,...c,"-w","/work",t,"tail","-f","/dev/null"]}}},69968:function(e,exports,t){function r(e){const t=m.get(e.image)
143
- if(t)return t.work
144
- const r=(async()=>{const t=await(0,u.docker)(["image","inspect","--format",`{{ index .Config.Labels "${p}" }}`,e.image],u.DOCKER_OP_TIMEOUT_MS)
145
- if(t.spawnError)return t.spawnError
146
- if(0===t.exit&&t.stdout.trim()===e.recipeHash)return
147
- const r=i.mkdtempSync(l.join(c.tmpdir(),"alchemylab-image-"))
148
- try{i.writeFileSync(l.join(r,"Dockerfile"),e.dockerfile)
149
- const t=await(0,u.docker)(["build","--label",`${p}=${e.recipeHash}`,"-t",e.image,r],exports.BUILD_TIMEOUT_MS)
150
- if(0!==t.exit){const r=(t.stderr||t.stdout||"").trim().split("\n").slice(-12).join("\n")
151
- return`building ${e.image} failed${t.timedOut?" (timed out)":""}: ${r}`}return}finally{i.rmSync(r,{recursive:!0,force:!0})}})()
152
- return m.set(e.image,{work:r,since:Date.now()}),r.then((t=>{t?h.set(e.image,{error:t,at:Date.now()}):h.delete(e.image)}),(t=>{h.set(e.image,{error:t instanceof Error?t.message:String(t),at:Date.now()})})).finally((()=>m.delete(e.image))),r}var n,o=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r)
153
- var o=Object.getOwnPropertyDescriptor(t,r)
154
- o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||(n=function(e){return n=Object.getOwnPropertyNames||function(e){var t=[]
155
- for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r)
156
- return t},n(e)},function(e){if(e&&e.__esModule)return e
157
- var t={}
158
- if(null!=e)for(var r=n(e),a=0;a<r.length;a++)"default"!==r[a]&&o(t,e,r[a])
159
- return s(t,e),t})
160
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.BUILD_TIMEOUT_MS=void 0,exports.localRecipeFor=function(e){return f.find((t=>t.image===e))},exports.ensureLocalImage=r,exports.localImageState=async function(e){const t=m.get(e.image)
161
- if(t)return{state:"building",since:t.since}
162
- const r=await(0,u.docker)(["image","inspect","--format",`{{ index .Config.Labels "${p}" }}`,e.image],u.DOCKER_OP_TIMEOUT_MS)
163
- if(r.spawnError)return{state:"no-docker",error:"Docker is not installed on this machine (no docker command)"}
164
- if(0===r.exit&&r.stdout.trim()===e.recipeHash)return{state:"ready"}
165
- if(/cannot connect to the docker daemon|is the docker daemon running|error during connect/i.test(r.stderr))return{state:"no-docker",error:"Docker is not running on this machine"}
166
- const n=h.get(e.image)
167
- return n?{state:"failed",...n}:{state:"missing"}},exports.startLocalImageBuild=function(e){return h.delete(e.image),r(e).catch((()=>{})),{since:m.get(e.image)?.since??Date.now()}}
168
- const i=a(t(73024)),c=a(t(48161)),l=a(t(76760)),u=t(6175),d=t(7740),p="dev.alchemylab.recipe"
169
- exports.BUILD_TIMEOUT_MS=15e5
170
- const f=[{image:d.OFFICE_BOX_IMAGE,dockerfile:d.OFFICE_BOX_DOCKERFILE,recipeHash:d.OFFICE_BOX_RECIPE_HASH}],m=new Map,h=new Map},70610:(e,exports)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.DOCUMENT_FORMATS=void 0,exports.formatOfKind=function(e){return exports.DOCUMENT_FORMATS.find((t=>t.kind===e))},exports.formatFor=function(e){const r=/\.([a-z0-9]+)$/i.exec(e)
42
+ const w=12e4,g="the office renderer is being built on this machine (first use only, usually a few minutes)"},9956:module=>{module.exports=require("undici")},11895:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.SandboxSession=exports.DEFAULT_CPUS=void 0
43
+ const r=t(81618),n=t(22604),o=t(26166),s=t(2566),i=t(90695),a=t(61260)
44
+ exports.DEFAULT_CPUS=4,exports.SandboxSession=class{constructor(e,t={}){this.spec=e,this.oomKillsSeen=0,this.network=t.network??"none",this.execTimeoutMs=t.execTimeoutMs??12e4,this.scratchMb=t.scratchSizeMb??512,this.memory=t.memory??"2g",this.cpus=t.cpus??exports.DEFAULT_CPUS,this.cpusRequested=t.cpus,this.size=t.size??"standard",this.pidsLimit=t.pidsLimit??512,this.shmSizeMb=t.shmSizeMb,this.addCaps=t.addCaps??[],this.sysctls=t.sysctls??{},this.runAsRoot=t.runAsRoot??!1,this.dockerSocket=t.dockerSocket??!1}get containerId(){return this.id}get running(){return void 0!==this.id}async start(){if(this.id)return{ok:!0}
45
+ if(!this.spec.worktreePath)return{ok:!1,error:"worktreePath is required"}
46
+ const e=this.spec.image??"node:20-alpine",t=await(0,r.ensureImage)(e)
47
+ if(t)return{ok:!1,error:t}
48
+ const o=await(0,n.withAdmission)(this.memory,"box",(()=>this.createAndStart(e)))
49
+ return"refused"in o?{ok:!1,error:o.refused}:o.value}async createAndStart(e){const t=await(0,n.pickCores)(this.cpusRequested,exports.DEFAULT_CPUS,this.size)
50
+ this.cpus=t.cpus,this.cpuset=t.cpuset
51
+ let o=await(0,r.docker)(this.createArgs(e,!0),r.DOCKER_OP_TIMEOUT_MS)
52
+ if(0!==o.exit)return{ok:!1,error:o.spawnError??`docker create failed: ${(o.stderr||String(o.exit)).trim()}`}
53
+ let s=o.stdout.trim()
54
+ if(await(0,i.claimScratch)(s,e,this.runAsRoot?"0:0":"1000:1000")){if(await(0,r.docker)(["rm","-f","-v",s],r.DOCKER_OP_TIMEOUT_MS),o=await(0,r.docker)(this.createArgs(e,!1),r.DOCKER_OP_TIMEOUT_MS),0!==o.exit)return{ok:!1,error:o.spawnError??`docker create failed: ${(o.stderr||String(o.exit)).trim()}`}
55
+ s=o.stdout.trim()}const c=await(0,r.docker)(["start",s],r.DOCKER_OP_TIMEOUT_MS)
56
+ return 0!==c.exit?(await(0,r.docker)(["rm","-f","-v",s],r.DOCKER_OP_TIMEOUT_MS),{ok:!1,error:`docker start failed: ${(c.stderr||String(c.exit)).trim()}`}):(this.id=s,this.oomKillsSeen=await(0,a.readOomKills)(s)??0,{ok:!0})}async exec(e,t={}){if(!this.id)return{exit:-1,stdout:"",stderr:"session not started",ms:0,timedOut:!1}
57
+ const n=Date.now(),o=t.execId??`lim-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,i=t.timeoutMs??this.execTimeoutMs,c=await(0,r.dockerKeepingEnds)(["exec","-e",`ALCHEMY_EXEC_ID=${o}`,"-e",`${s.RUN_ENV_VAR}=${(0,s.withShellInit)(this.spec.shellInit,e)}`,this.id,"/bin/sh","-c",s.RUN_FROM_ENV],i),l=Date.now()-n,u=[]
58
+ let d=c.exit
59
+ c.timedOut&&(await this.killExec(o),d=124,u.push(`[AlchemyLab] Time limit reached after ${Math.round(i/1e3)}s: the command was stopped and its processes in the box were ended. Anything it wrote is still in the box.`))
60
+ const p=this.id?await(0,a.probeBox)(this.id):{oomKills:null,liveFrame:!1},f=p.oomKills,m=null!=f?Math.max(0,f-this.oomKillsSeen):0
61
+ null!=f&&(this.oomKillsSeen=f),m>0&&u.push((0,a.oomNote)(m,this.memory))
62
+ const h=u.length?`${c.stderr}${c.stderr&&!c.stderr.endsWith("\n")?"\n":""}${u.join("\n")}\n`:c.stderr
63
+ return{exit:d,stdout:c.stdout,stderr:h,ms:l,timedOut:c.timedOut,...m>0?{oomKills:m}:{},...p.liveFrame?{liveFrame:!0}:{}}}async killExec(e){if(!this.id)return
64
+ const t=`for d in /proc/[0-9]*; do if grep -qa "ALCHEMY_EXEC_ID=${e.replace(/[^a-zA-Z0-9_-]/g,"")}" "$d/environ" 2>/dev/null; then kill -9 "\${d##*/}" 2>/dev/null || true; fi; done`
65
+ await(0,r.docker)(["exec",this.id,"/bin/sh","-c",t],r.DOCKER_OP_TIMEOUT_MS)}async readFile(e){if(!this.id)return null
66
+ const t=await(0,r.docker)(["exec",this.id,"base64",e],r.DOCKER_OP_TIMEOUT_MS)
67
+ if(0!==t.exit)return null
68
+ try{const e=Buffer.from(t.stdout.replace(/\s/g,""),"base64")
69
+ return e.length>0?e:null}catch{return null}}async insertFrom(e,n){if(!this.id)return{ok:!1,bytes:0,error:"session not started"}
70
+ if(!n.startsWith("/"))return{ok:!1,bytes:0,error:"boxPath must be absolute"}
71
+ const{spawn:o}=await Promise.resolve().then(t.t.bind(t,35317,23)),{Transform:s}=await Promise.resolve().then(t.t.bind(t,2203,23)),i=n.replace(/\/+$/,"").replace(/\/[^/]+$/,"")||"/",a=await(0,r.docker)(["exec",this.id,"mkdir","-p",i],r.DOCKER_OP_TIMEOUT_MS)
72
+ return 0!==a.exit?{ok:!1,bytes:0,error:`could not create ${i}: ${(a.stderr||"").trim()}`}:await new Promise((t=>{let r=0,i="",a=!1
73
+ const c=e=>{a||(a=!0,t(e))},l=o("docker",["exec","-i",this.id,"sh","-c",`cat > '${n.replace(/'/g,"'\\''")}'`],{stdio:["pipe","ignore","pipe"]}),u=new s({transform(e,t,n){r+=e.length,n(null,e)}})
74
+ e.on("error",(e=>c({ok:!1,bytes:r,error:e.message}))),l.stderr.on("data",(e=>{i+=e.toString().slice(0,500)})),l.on("error",(e=>c({ok:!1,bytes:r,error:e.message}))),l.on("close",(e=>{c(0===e?{ok:!0,bytes:r}:{ok:!1,bytes:r,error:i.trim()||`docker exec exited ${e}`})})),e.pipe(u).pipe(l.stdin)}))}async extractInto(e,r){if(!this.id)return{ok:!1,bytes:0,error:"session not started"}
75
+ const{spawn:n}=await Promise.resolve().then(t.t.bind(t,35317,23)),{Transform:o}=await Promise.resolve().then(t.t.bind(t,2203,23)),{mkdir:s}=await Promise.resolve().then(t.t.bind(t,91943,23))
76
+ await s(r,{recursive:!0})
77
+ const i=e.replace(/\/+$/,"").replace(/\/[^/]+$/,"")||"/",a=e.replace(/\/+$/,"").split("/").pop()||"."
78
+ return await new Promise((e=>{let t=0,s=""
79
+ const c=n("docker",["exec",this.id,"tar","-cf","-","-C",i,a],{stdio:["ignore","pipe","pipe"]}),l=n("tar",["-xf","-","-C",r],{stdio:["pipe","ignore","pipe"]}),u=new o({transform(e,r,n){t+=e.length,n(null,e)}})
80
+ c.stdout.pipe(u).pipe(l.stdin),c.stderr.on("data",(e=>{s+=e.toString().slice(0,500)})),l.stderr.on("data",(e=>{s+=e.toString().slice(0,500)})),c.on("error",(r=>e({ok:!1,bytes:t,error:r.message}))),l.on("error",(r=>e({ok:!1,bytes:t,error:r.message}))),l.on("close",(r=>{e(0===r?{ok:!0,bytes:t}:{ok:!1,bytes:t,error:s.trim()||`tar exited ${r}`})}))}))}async stop(){if(!this.id)return
81
+ const e=this.id
82
+ this.id=void 0,await(0,r.docker)(["rm","-f","-v",e],r.DOCKER_OP_TIMEOUT_MS)}createArgs(e,t){const r=Object.entries(this.spec.env??{}).flatMap((([e,t])=>["-e",`${e}=${t}`])),n=this.spec.depsVolume?["-v",`${this.spec.depsVolume}:/work/node_modules`]:[]
83
+ return["create","--label","alchemy.sandbox=experiment",...this.spec.projectId?["--label",`alchemy.experiment.project=${this.spec.projectId}`]:[],"--init",...(0,o.hardenedCreateArgs)({network:this.network,user:this.runAsRoot?"0:0":"1000:1000",capAdds:this.addCaps,sysctls:this.sysctls,...t?{}:{extraTmpfs:[(0,i.scratchTmpfsArg)(this.scratchMb)]},shmSizeMb:this.shmSizeMb,memory:this.memory,cpus:this.cpus,cpuset:this.cpuset,pidsLimit:this.pidsLimit}),...t?i.SCRATCH_VOLUME_ARGS:[],...r,"-v",`${this.spec.worktreePath}:/work:${this.spec.writableSource?"rw":"ro"}`,...n,...(this.spec.mounts??[]).flatMap((e=>["-v",`${e.volume}:${e.target}`])),...(this.spec.readOnlyBinds??[]).flatMap((e=>["-v",`${e.host}:${e.target}:ro`])),...this.dockerSocket?["-v","/var/run/docker.sock:/var/run/docker.sock"]:[],"-w","/work",e,"tail","-f","/dev/null"]}}},12661:(e,exports)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.DOCUMENT_FORMATS=void 0,exports.formatOfKind=function(e){return exports.DOCUMENT_FORMATS.find((t=>t.kind===e))},exports.formatFor=function(e){const r=/\.([a-z0-9]+)$/i.exec(e)
171
84
  return r?t.get(r[1].toLowerCase()):void 0},exports.DOCUMENT_FORMATS=[{kind:"pdf",extensions:["pdf"],mime:"application/pdf",modelInput:"pdf",text:!0},{kind:"docx",extensions:["docx"],mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",text:!0,render:"office"},{kind:"xlsx",extensions:["xlsx","xlsm"],mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",text:!0,render:"office"},{kind:"pptx",extensions:["pptx"],mime:"application/vnd.openxmlformats-officedocument.presentationml.presentation",text:!0,render:"office"},{kind:"odt",extensions:["odt"],mime:"application/vnd.oasis.opendocument.text",text:!0,render:"office"},{kind:"ods",extensions:["ods"],mime:"application/vnd.oasis.opendocument.spreadsheet",text:!0,render:"office"},{kind:"odp",extensions:["odp"],mime:"application/vnd.oasis.opendocument.presentation",text:!0,render:"office"},{kind:"doc",extensions:["doc"],mime:"application/msword",text:!0,textVia:"docx",render:"office"},{kind:"rtf",extensions:["rtf"],mime:"application/rtf",text:!0,render:"office"},{kind:"xls",extensions:["xls"],mime:"application/vnd.ms-excel",text:!0,textVia:"xlsx",render:"office"},{kind:"ppt",extensions:["ppt"],mime:"application/vnd.ms-powerpoint",text:!0,textVia:"pptx",render:"office"}]
172
- const t=new Map(exports.DOCUMENT_FORMATS.flatMap((e=>e.extensions.map((t=>[t,e])))))},70857:module=>{module.exports=require("os")},73024:module=>{module.exports=require("node:fs")},76760:module=>{module.exports=require("node:path")},76982:module=>{module.exports=require("crypto")},79896:module=>{module.exports=require("fs")},88194:module=>{module.exports=require("jszip")},88891:module=>{module.exports=require("unpdf")},91943:module=>{module.exports=require("fs/promises")},98335:(e,exports,t)=>{async function r(e){return(await Promise.resolve().then(t.t.bind(t,88194,23))).default.loadAsync(e)}async function n(e,t){const r=e.file(t)
85
+ const t=new Map(exports.DOCUMENT_FORMATS.flatMap((e=>e.extensions.map((t=>[t,e])))))},16698:module=>{module.exports=require("node:async_hooks")},16928:module=>{module.exports=require("path")},22604:(e,exports,t)=>{function r(e){if("number"==typeof e)return e
86
+ const t=String(e??"").trim().toLowerCase().match(/^(\d+(?:\.\d+)?)\s*([bkmg]?)b?$/)
87
+ if(!t)return NaN
88
+ const r={"":1,b:1,k:1024,m:1048576,g:1024**3}[t[2]]
89
+ return Math.round(parseFloat(t[1])*r)}function n(e,t,r,n){return e>0&&r>0?t+r<=e?null:`Not started: this ${n} needs ${f(r)} of memory, and the boxes already running on this machine have ${f(t)} of the ${f(e)} Docker can give. Stop a box you no longer need (experiment_list shows yours) or try again when one ends.`:null}function o(e){if(!Number.isInteger(e)||e<=0)return!0
90
+ try{return process.kill(e,0),!0}catch(e){return"EPERM"===e?.code}}function s(e,t,r=o){return!(!e||!m.has(t)||r(Number(e)))}async function i(){const e=await(0,p.docker)(["ps","-a","--filter","label=alchemy.project","--filter","status=running","--filter","status=created","--format",'{{.ID}}\t{{.Label "alchemy.owner"}}\t{{.Label "alchemy.sandbox"}}'],p.DOCKER_OP_TIMEOUT_MS)
91
+ if(0!==e.exit)return 0
92
+ const t=[]
93
+ for(const r of e.stdout.split("\n").map((e=>e.trim())).filter(Boolean)){const[e,n="",o=""]=r.split("\t")
94
+ s(n,o)?await(0,p.docker)(["rm","-f","-v",e],p.DOCKER_OP_TIMEOUT_MS):t.push(e)}if(!t.length)return 0
95
+ const r=await(0,p.docker)(["inspect","--format","{{.HostConfig.Memory}}",...t],p.DOCKER_OP_TIMEOUT_MS)
96
+ return 0!==r.exit?0:r.stdout.split("\n").map((e=>Number(e.trim())||0)).reduce(((e,t)=>e+t),0)}async function a(e,t,o=12e4,s=5e3){try{const a=r(e),c=await async function(){const e=r(process.env.ALCHEMY_BOX_MEMORY_BUDGET)
97
+ if(e>0)return e
98
+ const t=await(0,p.docker)(["info","--format","{{.MemTotal}}"],p.DOCKER_OP_TIMEOUT_MS)
99
+ return 0===t.exit?Number(t.stdout.trim()):NaN}(),l=Date.now()+o
100
+ for(;;){const e=n(c,await i(),a,t)
101
+ if(!e||Date.now()>=l)return e
102
+ await new Promise((e=>setTimeout(e,s)))}}catch{return null}}function c(e){const t=[]
103
+ for(const r of String(e||"").split(",").map((e=>e.trim())).filter(Boolean)){const e=r.match(/^(\d+)(?:-(\d+))?$/)
104
+ if(!e)continue
105
+ const n=Number(e[1]),o=void 0!==e[2]?Number(e[2]):n
106
+ for(let e=n;e<=o&&e-n<1024;e++)t.push(e)}return t}function l(e,t,r){const n=new Array(e).fill(0)
107
+ for(const t of r)for(const r of c(t))r<e&&n[r]++
108
+ return[...n.keys()].sort(((e,t)=>n[e]-n[t]||e-t)).slice(0,t).sort(((e,t)=>e-t))}function u(e,t){const r=Math.max(2,Math.floor(e/2))
109
+ return Math.min(r,Math.max(2,Math.ceil(t/2)))}function d(e,t,r){return"light"===e?2:"heavy"===e?Math.max(2,Math.min(t-2,r-2)):u(t,r)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.BOX_SIZES=void 0,exports.memoryBytes=r,exports.admissionRefusal=n,exports.processAlive=o,exports.isOrphan=s,exports.waitForRoom=a,exports.withAdmission=function(e,t,r){const n=h.then((async()=>{const n=await a(e,t)
110
+ return n?{refused:n}:{value:await r()}}))
111
+ return h=n.catch((()=>{})),n},exports.cpusetCores=c,exports.leastUsedCores=l,exports.flexibleCores=u,exports.boxSize=function(e){return"string"==typeof e&&exports.BOX_SIZES.includes(e)?e:void 0},exports.coresForSize=d,exports.pickCores=async function(e,t,r="standard"){try{const n=await(0,p.docker)(["info","--format","{{.NCPU}}"],p.DOCKER_OP_TIMEOUT_MS),o=Number(n.stdout.trim())
112
+ if(!(o>0))return{cpus:e??t}
113
+ const s=await(0,p.docker)(["ps","-a","-q","--filter","label=alchemy.project","--filter","status=running","--filter","status=created"],p.DOCKER_OP_TIMEOUT_MS),i=0===s.exit?s.stdout.split("\n").map((e=>e.trim())).filter(Boolean):[],a=i.length?(await(0,p.docker)(["inspect","--format","{{.HostConfig.CpusetCpus}}",...i],p.DOCKER_OP_TIMEOUT_MS)).stdout.split("\n").map((e=>e.trim())).filter(Boolean):[],u=new Set(a.flatMap(c).filter((e=>e<o))),f=e??d(r,o,o-u.size),m=Math.max(1,Math.ceil(f))
114
+ return m>=o?{cpus:f}:{cpus:f,cpuset:l(o,m,a).join(",")}}catch{return{cpus:e??t}}}
115
+ const p=t(81618),f=e=>`${(e/1024**3).toFixed(1)} GB`,m=new Set(["experiment","rung1","deps","egress-proxy","service"])
116
+ let h=Promise.resolve()
117
+ exports.BOX_SIZES=["light","standard","heavy"]},26166:(e,exports)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.hardenedCreateArgs=function(e){return["--network",e.network,"--user",e.user,"--cap-drop","ALL",...(e.capAdds??[]).flatMap((e=>["--cap-add",e])),...Object.entries(e.sysctls??{}).flatMap((([e,t])=>["--sysctl",`${e}=${t}`])),"--security-opt","no-new-privileges","--read-only","--tmpfs","/tmp:rw,nosuid,nodev,exec,size=256m",...(e.extraTmpfs??[]).flatMap((e=>["--tmpfs",e])),"--ipc","none","--tmpfs",`/dev/shm:rw,nosuid,nodev,size=${e.shmSizeMb??64}m`,"--memory",e.memory,"--memory-swap",e.memory,"--cpus",String(e.cpus),...e.cpuset?["--cpuset-cpus",e.cpuset]:[],"--pids-limit",String(e.pidsLimit),"-e","HOME=/tmp","-e","XDG_CACHE_HOME=/tmp/.cache","-e","MYPY_CACHE_DIR=/tmp/.mypy_cache","-e","RUFF_CACHE_DIR=/tmp/.ruff_cache","-e","PYTHONPYCACHEPREFIX=/tmp/.pycache","-e","npm_config_cache=/tmp/.npm",..."none"===e.network?["-e","UV_OFFLINE=1","-e","PIP_NO_INDEX=1","-e","npm_config_offline=true"]:[]]}},31421:module=>{module.exports=require("node:child_process")},35317:module=>{module.exports=require("child_process")},36018:(e,exports,t)=>{async function r(e){return(await Promise.resolve().then(t.t.bind(t,88194,23))).default.loadAsync(e)}async function n(e,t){const r=e.file(t)
173
118
  return r?r.async("string"):void 0}function o(e){return e.replace(/&(#x[0-9a-f]+|#\d+|amp|lt|gt|quot|apos);/gi,((e,t)=>{const r=t.toLowerCase()
174
119
  if("amp"===r)return"&"
175
120
  if("lt"===r)return"<"
@@ -178,39 +123,39 @@ if("quot"===r)return'"'
178
123
  if("apos"===r)return"'"
179
124
  const n=r.startsWith("#x")?parseInt(r.slice(2),16):parseInt(r.slice(1),10)
180
125
  return Number.isFinite(n)?String.fromCodePoint(n):e}))}function s(e,t){const r=new RegExp(`(?:^|\\s)${t.replace(":","\\:")}="([^"]*)"`).exec(e)
181
- return r?o(r[1]):void 0}function a(e,t){const r=new Map
126
+ return r?o(r[1]):void 0}function i(e,t){const r=new Map
182
127
  if(!e)return r
183
128
  for(const n of e.matchAll(/<Relationship\b([^>]*)\/?>/g)){const e=s(n[1],"Id"),o=s(n[1],"Target")
184
- e&&o&&r.set(e,o.startsWith("/")?o.slice(1):i(`${t}/${o}`))}return r}function i(e){const t=[]
129
+ e&&o&&r.set(e,o.startsWith("/")?o.slice(1):a(`${t}/${o}`))}return r}function a(e){const t=[]
185
130
  for(const r of e.split("/"))r&&"."!==r&&(".."===r?t.pop():t.push(r))
186
131
  return t.join("/")}function c(e){const t=e.slice(0,e.lastIndexOf("/"))
187
132
  return{path:`${t}/_rels/${e.slice(e.lastIndexOf("/")+1)}.rels`,dir:t}}function l(e,t){const r=(e||t||"").replace(/\s+/g," ").trim().slice(0,200)
188
133
  return r?`[image: ${r}]`:"[image]"}async function u(e,t){const r=new Map
189
134
  for(const[o,s]of t){if(!/charts\/chart[^/]*\.xml$/.test(s))continue
190
135
  const t=await n(e,s)
191
- t&&r.set(o,d(t))}return r}function d(e){const t=p(e),r=[...new Set([...t.matchAll(/<(\w+Chart)\b/g)].map((e=>P[e[1]])).filter(Boolean))]
136
+ t&&r.set(o,d(t))}return r}function d(e){const t=p(e),r=[...new Set([...t.matchAll(/<(\w+Chart)\b/g)].map((e=>A[e[1]])).filter(Boolean))]
192
137
  "bar"===r[0]&&/<barDir val="col"/.test(t)&&(r[0]="column")
193
- const n=t.split("<plotArea")[0],s=/<title>([\s\S]*?)<\/title>/.exec(n)?.[1],a=s?[...s.matchAll(/<t>([\s\S]*?)<\/t>/g)].map((e=>o(e[1]))).join("").trim():"",i=[...t.matchAll(/<ser>([\s\S]*?)<\/ser>/g)].map((e=>{const t=e[1],r=/<tx>([\s\S]*?)<\/tx>/.exec(t)?.[1]??"",n=o(/<v>([\s\S]*?)<\/v>/.exec(r)?.[1]??/<f>([\s\S]*?)<\/f>/.exec(r)?.[1]??"").trim(),s=e=>{if(!e)return""
138
+ const n=t.split("<plotArea")[0],s=/<title>([\s\S]*?)<\/title>/.exec(n)?.[1],i=s?[...s.matchAll(/<t>([\s\S]*?)<\/t>/g)].map((e=>o(e[1]))).join("").trim():"",a=[...t.matchAll(/<ser>([\s\S]*?)<\/ser>/g)].map((e=>{const t=e[1],r=/<tx>([\s\S]*?)<\/tx>/.exec(t)?.[1]??"",n=o(/<v>([\s\S]*?)<\/v>/.exec(r)?.[1]??/<f>([\s\S]*?)<\/f>/.exec(r)?.[1]??"").trim(),s=e=>{if(!e)return""
194
139
  const t=/<f>([\s\S]*?)<\/f>/.exec(e)?.[1],r=[...e.matchAll(/<v>([\s\S]*?)<\/v>/g)].map((e=>o(e[1])))
195
- return t&&/!/.test(t)?o(t):r.length?`${r.slice(0,8).join(", ")}${r.length>8?`, ... (${r.length})`:""}`:""},a=s(/<(?:val|yVal)>([\s\S]*?)<\/(?:val|yVal)>/.exec(t)?.[1]),i=s(/<(?:cat|xVal)>([\s\S]*?)<\/(?:cat|xVal)>/.exec(t)?.[1])
196
- return`${n||"series"}${a?`: ${a}`:""}${i?` by ${i}`:""}`}))
197
- return`[chart: ${r.join("/")||"chart"}${a?` "${a}"`:""}${i.length?`; ${i.join("; ")}`:""}]`}function p(e){return e.replace(/<(\/?)[A-Za-z][\w.-]*:/g,"<$1")}function f(e,t=new Map){const r=[],n=[]
198
- let a=null,i="",c=!1,u=!1,d=null,p=0
140
+ return t&&/!/.test(t)?o(t):r.length?`${r.slice(0,8).join(", ")}${r.length>8?`, ... (${r.length})`:""}`:""},i=s(/<(?:val|yVal)>([\s\S]*?)<\/(?:val|yVal)>/.exec(t)?.[1]),a=s(/<(?:cat|xVal)>([\s\S]*?)<\/(?:cat|xVal)>/.exec(t)?.[1])
141
+ return`${n||"series"}${i?`: ${i}`:""}${a?` by ${a}`:""}`}))
142
+ return`[chart: ${r.join("/")||"chart"}${i?` "${i}"`:""}${a.length?`; ${a.join("; ")}`:""}]`}function p(e){return e.replace(/<(\/?)[A-Za-z][\w.-]*:/g,"<$1")}function f(e,t=new Map){const r=[],n=[]
143
+ let i=null,a="",c=!1,u=!1,d=null,p=0
199
144
  const f=/<(\/?)(w:p|w:tbl|w:tr|w:tc|w:t|w:tab|w:br|w:cr|w:pStyle|w:numPr|w:drawing|wp:docPr|c:chart|v:imagedata|mc:Fallback)\b([^>]*?)(\/?)>|([^<]+)/g
200
145
  for(const m of e.matchAll(f)){const[,e,f,h,b,w]=m
201
146
  if("mc:Fallback"===f){b||(p+=e?-1:1)
202
147
  continue}if(p>0)continue
203
- if(void 0!==w){u&&a&&a.push(o(w))
148
+ if(void 0!==w){u&&i&&i.push(o(w))
204
149
  continue}const g=n[n.length-1]
205
150
  if(e)switch(f){case"w:drawing":{if(!d)break
206
151
  const e=d.chart??l(d.descr,d.name)
207
- d=null,a?a.push(` ${e} `):r.push(e)
152
+ d=null,i?i.push(` ${e} `):r.push(e)
208
153
  break}case"w:t":u=!1
209
154
  break
210
- case"w:p":{const e=(a??[]).join("").trim()
211
- if(a=null,g?.cell){e&&g.cell.push(e)
155
+ case"w:p":{const e=(i??[]).join("").trim()
156
+ if(i=null,g?.cell){e&&g.cell.push(e)
212
157
  break}if(!e){r.length&&""!==r[r.length-1]&&r.push("")
213
- break}const t=/^(?:heading|kop|\xfcberschrift|titre)\s*(\d)/i.exec(i)||(/^title$/i.test(i)?["","1"]:null)
158
+ break}const t=/^(?:heading|kop|\xfcberschrift|titre)\s*(\d)/i.exec(a)||(/^title$/i.test(a)?["","1"]:null)
214
159
  r.push(t?`${"#".repeat(Math.min(6,Number(t[1])))} ${e}`:c?`- ${e}`:e)
215
160
  break}case"w:tc":g?.cell&&g.row&&(g.row.push(g.cell.join(" ")),g.cell=null)
216
161
  break
@@ -227,32 +172,32 @@ break
227
172
  case"c:chart":d&&(d.chart=t.get(s(h,"r:id")??"")??"[chart]")
228
173
  break
229
174
  case"v:imagedata":{const e=l(s(h,"o:title"),void 0)
230
- a?a.push(e):r.push(e)
231
- break}case"w:p":a=[],i="",c=!1
175
+ i?i.push(e):r.push(e)
176
+ break}case"w:p":i=[],a="",c=!1
232
177
  break
233
- case"w:pStyle":i=s(h,"w:val")??""
178
+ case"w:pStyle":a=s(h,"w:val")??""
234
179
  break
235
180
  case"w:numPr":c=!0
236
181
  break
237
182
  case"w:t":b||(u=!0)
238
183
  break
239
- case"w:tab":a?.push("\t")
184
+ case"w:tab":i?.push("\t")
240
185
  break
241
- case"w:br":case"w:cr":a?.push("\n")
186
+ case"w:br":case"w:cr":i?.push("\n")
242
187
  break
243
188
  case"w:tbl":n.push({rows:[],row:null,cell:null})
244
189
  break
245
190
  case"w:tr":g&&(g.row=[])
246
191
  break
247
192
  case"w:tc":g&&(g.cell=[])}}return r.join("\n").replace(/\n{3,}/g,"\n\n").trim()}async function m(e,t){const r=[],o=c(t)
248
- for(const t of a(await n(e,o.path),o.dir).values()){if(!/drawings\/drawing[^/]*\.xml$/.test(t))continue
193
+ for(const t of i(await n(e,o.path),o.dir).values()){if(!/drawings\/drawing[^/]*\.xml$/.test(t))continue
249
194
  const o=await n(e,t)
250
195
  if(!o)continue
251
- const i=p(o),d=c(t),f=await u(e,a(await n(e,d.path),d.dir))
252
- for(const e of i.matchAll(/<(?:twoCellAnchor|oneCellAnchor|absoluteAnchor)\b[\s\S]*?<\/(?:twoCellAnchor|oneCellAnchor|absoluteAnchor)>/g)){const t=e[0],n=/<chart\b[^>]*r:id="([^"]+)"/.exec(t)?.[1],o=/<from>[\s\S]*?<col>(\d+)<\/col>[\s\S]*?<row>(\d+)<\/row>/.exec(t),a=o?` at ${w(Number(o[1]))}${Number(o[2])+1}`:""
253
- if(n){r.push(`${(f.get(n)??"[chart]").replace(/\]$/,`${a}]`)}`)
254
- continue}const i=/<pic>[\s\S]*?<cNvPr\b([^>]*)\/?>/.exec(t)
255
- i&&r.push(l(s(i[1],"descr"),s(i[1],"name")).replace(/\]$/,`${a}]`))}}return r}function h(e){if(!e)return[]
196
+ const a=p(o),d=c(t),f=await u(e,i(await n(e,d.path),d.dir))
197
+ for(const e of a.matchAll(/<(?:twoCellAnchor|oneCellAnchor|absoluteAnchor)\b[\s\S]*?<\/(?:twoCellAnchor|oneCellAnchor|absoluteAnchor)>/g)){const t=e[0],n=/<chart\b[^>]*r:id="([^"]+)"/.exec(t)?.[1],o=/<from>[\s\S]*?<col>(\d+)<\/col>[\s\S]*?<row>(\d+)<\/row>/.exec(t),i=o?` at ${w(Number(o[1]))}${Number(o[2])+1}`:""
198
+ if(n){r.push(`${(f.get(n)??"[chart]").replace(/\]$/,`${i}]`)}`)
199
+ continue}const a=/<pic>[\s\S]*?<cNvPr\b([^>]*)\/?>/.exec(t)
200
+ a&&r.push(l(s(a[1],"descr"),s(a[1],"name")).replace(/\]$/,`${i}]`))}}return r}function h(e){if(!e)return[]
256
201
  const t=[]
257
202
  for(const r of e.matchAll(/<si\b[^>]*>([\s\S]*?)<\/si>/g)){const e=[]
258
203
  for(const t of r[1].matchAll(/<t\b[^>]*>([\s\S]*?)<\/t>/g))e.push(o(t[1]))
@@ -262,17 +207,17 @@ for(const e of t)r=26*r+(e.charCodeAt(0)-64)
262
207
  return r-1}function w(e){let t=""
263
208
  for(let r=e+1;r>0;r=Math.floor((r-1)/26))t=String.fromCharCode(65+(r-1)%26)+t
264
209
  return t}function g(e,t){const r=[]
265
- let n=0,a=!1
266
- for(const i of e.matchAll(/<row\b([^>]*?)(?:\/>|>([\s\S]*?)<\/row>)/g)){if(r.length>=C){a=!0
267
- break}const e=i[2]??"",c=[]
210
+ let n=0,i=!1
211
+ for(const a of e.matchAll(/<row\b([^>]*?)(?:\/>|>([\s\S]*?)<\/row>)/g)){if(r.length>=R){i=!0
212
+ break}const e=a[2]??"",c=[]
268
213
  let l=0
269
214
  for(const r of e.matchAll(/<c\b([^>]*?)(?:\/>|>([\s\S]*?)<\/c>)/g)){const e=s(r[1],"r"),n=e?b(e):l
270
215
  l=n+1
271
- const a=s(r[1],"t"),i=r[2]??"",u=/<f\b[^>]*>([\s\S]*?)<\/f>/.exec(i)?.[1]
216
+ const i=s(r[1],"t"),a=r[2]??"",u=/<f\b[^>]*>([\s\S]*?)<\/f>/.exec(a)?.[1]
272
217
  let d=""
273
- if("inlineStr"===a)d=[...i.matchAll(/<t\b[^>]*>([\s\S]*?)<\/t>/g)].map((e=>o(e[1]))).join("")
274
- else{const e=/<v\b[^>]*>([\s\S]*?)<\/v>/.exec(i)?.[1]
275
- void 0!==e&&(d="s"===a?t[Number(e)]??"":"b"===a?"1"===e?"TRUE":"FALSE":o(e))}u&&(d=`${d}${""===d?"":" "}(=${o(u)})`),""!==d&&(c[n]=d.replace(/[\t\r\n]+/g," "))}c.length&&(n=Math.max(n,c.length),r.push({n:Number(s(i[1],"r"))||r.length+1,cells:c}))}return{text:x(r,n),truncated:a}}function x(e,t){return e.length?[["row",...Array.from({length:t},((e,t)=>w(t)))].join("\t"),...e.map((e=>[String(e.n),...Array.from({length:t},((t,r)=>e.cells[r]??""))].join("\t").replace(/\t+$/,"")))].join("\n"):""}function _(e,t){const r=[],n=p(e)
218
+ if("inlineStr"===i)d=[...a.matchAll(/<t\b[^>]*>([\s\S]*?)<\/t>/g)].map((e=>o(e[1]))).join("")
219
+ else{const e=/<v\b[^>]*>([\s\S]*?)<\/v>/.exec(a)?.[1]
220
+ void 0!==e&&(d="s"===i?t[Number(e)]??"":"b"===i?"1"===e?"TRUE":"FALSE":o(e))}u&&(d=`${d}${""===d?"":" "}(=${o(u)})`),""!==d&&(c[n]=d.replace(/[\t\r\n]+/g," "))}c.length&&(n=Math.max(n,c.length),r.push({n:Number(s(a[1],"r"))||r.length+1,cells:c}))}return{text:x(r,n),truncated:i}}function x(e,t){return e.length?[["row",...Array.from({length:t},((e,t)=>w(t)))].join("\t"),...e.map((e=>[String(e.n),...Array.from({length:t},((t,r)=>e.cells[r]??""))].join("\t").replace(/\t+$/,"")))].join("\n"):""}function _(e,t){const r=[],n=p(e)
276
221
  for(const e of n.matchAll(/<pic\b[^>]*>[\s\S]*?<\/pic>|<graphicFrame\b[^>]*>[\s\S]*?<\/graphicFrame>/g)){const n=e[0]
277
222
  if(/^<pic\b/.test(n)){const e=/<cNvPr\b([^>]*)\/?>/.exec(n)?.[1]??""
278
223
  r.push(l(s(e,"descr"),s(e,"name")))
@@ -281,48 +226,48 @@ o&&r.push(t.get(o)??"[chart]")}return r}function k(e){const t=[]
281
226
  for(const r of e.matchAll(/<a:p\b[^>]*>([\s\S]*?)<\/a:p>/g)){const e=[]
282
227
  for(const t of r[1].matchAll(/<a:t\b[^>]*>([\s\S]*?)<\/a:t>|<a:br\b[^>]*\/>/g))e.push(void 0!==t[1]?o(t[1]):"\n")
283
228
  const n=e.join("").trim()
284
- n&&t.push(n)}return t}async function v(e,t,o){const s=await r(e),a=(await n(s,"mimetype"))?.trim(),i=await n(s,"content.xml")
285
- if(!i||a&&a!==t)throw new Error(`not an OpenDocument ${o} (${i?`its mimetype is ${a}`:"content.xml is missing"})`)
229
+ n&&t.push(n)}return t}async function E(e,t,o){const s=await r(e),i=(await n(s,"mimetype"))?.trim(),a=await n(s,"content.xml")
230
+ if(!a||i&&i!==t)throw new Error(`not an OpenDocument ${o} (${a?`its mimetype is ${i}`:"content.xml is missing"})`)
286
231
  const c=new Map
287
232
  for(const e of Object.keys(s.files)){const t=/^(.+)\/content\.xml$/.exec(e)?.[1]
288
233
  if(!t)continue
289
234
  const r=await n(s,e)
290
- r&&/<chart:chart\b/.test(r)&&c.set(t,E(r))}return{xml:i.split(/<office:body\b/)[1]??i,objects:c}}function O(e,t){return e.object?t.get((e.href??"").replace(/^\.\//,""))??`[embedded object: ${(e.desc||e.title||e.name||"unnamed").trim()}]`:e.image?l(e.desc||e.title,e.name):null}function E(e){const t=/chart:class="chart:(\w+)"/.exec(e)?.[1]??"chart",r=[...(/<chart:title\b[^>]*>([\s\S]*?)<\/chart:title>/.exec(e)?.[1]??"").matchAll(/<text:p\b[^>]*>([\s\S]*?)<\/text:p>/g)].map((e=>o(e[1].replace(/<[^>]+>/g,"")))).join(" ").trim(),n=[],a=/<table:table\b[^>]*table:name="local-table"[^>]*>([\s\S]*?)<\/table:table>/.exec(e)?.[1]
291
- if(a)for(const e of a.matchAll(/<table:table-row\b[^>]*>([\s\S]*?)<\/table:table-row>/g)){const t=[]
292
- for(const r of e[1].matchAll(/<table:(?:table-cell|covered-table-cell)\b([^>]*?)(?:\/>|>([\s\S]*?)<\/table:(?:table-cell|covered-table-cell)>)/g)){const e=o([...(r[2]??"").matchAll(/<text:p\b[^>]*>([\s\S]*?)<\/text:p>/g)].map((e=>e[1].replace(/<[^>]+>/g,""))).join(" ")).trim()||s(r[1],"office:value")||"",n=Math.min(Math.max(1,Number(s(r[1],"table:number-columns-repeated")??1)||1),R)
293
- for(let r=0;r<n;r++)t.push(e)}n.push(t)}const i=e=>{const t=/^\$?([A-Z]+)\$?(\d+)$/.exec(e)
235
+ r&&/<chart:chart\b/.test(r)&&c.set(t,y(r))}return{xml:a.split(/<office:body\b/)[1]??a,objects:c}}function O(e,t){return e.object?t.get((e.href??"").replace(/^\.\//,""))??`[embedded object: ${(e.desc||e.title||e.name||"unnamed").trim()}]`:e.image?l(e.desc||e.title,e.name):null}function y(e){const t=/chart:class="chart:(\w+)"/.exec(e)?.[1]??"chart",r=[...(/<chart:title\b[^>]*>([\s\S]*?)<\/chart:title>/.exec(e)?.[1]??"").matchAll(/<text:p\b[^>]*>([\s\S]*?)<\/text:p>/g)].map((e=>o(e[1].replace(/<[^>]+>/g,"")))).join(" ").trim(),n=[],i=/<table:table\b[^>]*table:name="local-table"[^>]*>([\s\S]*?)<\/table:table>/.exec(e)?.[1]
236
+ if(i)for(const e of i.matchAll(/<table:table-row\b[^>]*>([\s\S]*?)<\/table:table-row>/g)){const t=[]
237
+ for(const r of e[1].matchAll(/<table:(?:table-cell|covered-table-cell)\b([^>]*?)(?:\/>|>([\s\S]*?)<\/table:(?:table-cell|covered-table-cell)>)/g)){const e=o([...(r[2]??"").matchAll(/<text:p\b[^>]*>([\s\S]*?)<\/text:p>/g)].map((e=>e[1].replace(/<[^>]+>/g,""))).join(" ")).trim()||s(r[1],"office:value")||"",n=Math.min(Math.max(1,Number(s(r[1],"table:number-columns-repeated")??1)||1),D)
238
+ for(let r=0;r<n;r++)t.push(e)}n.push(t)}const a=e=>{const t=/^\$?([A-Z]+)\$?(\d+)$/.exec(e)
294
239
  return t?{col:b(t[1]),row:Number(t[2])-1}:null},c=e=>{if(!e)return""
295
240
  const t=e.split(":").map((e=>({table:e.slice(0,e.lastIndexOf(".")).replace(/^'(.*)'$/,"$1"),ref:e.slice(e.lastIndexOf(".")+1)})))
296
- if("local-table"===t[0].table||""===t[0].table&&n.length){const e=i(t[0].ref),r=i(t[t.length-1].ref)??e
241
+ if("local-table"===t[0].table||""===t[0].table&&n.length){const e=a(t[0].ref),r=a(t[t.length-1].ref)??e
297
242
  if(!e||!r)return""
298
243
  const o=[]
299
244
  for(let t=e.row;t<=r.row;t++)for(let s=e.col;s<=r.col;s++)o.push(n[t]?.[s]??"")
300
245
  return`${o.slice(0,8).join(", ")}${o.length>8?`, ... (${o.length})`:""}`}const r=t.map((e=>e.ref.replace(/\$/g,"")))
301
246
  return`${t[0].table?`${t[0].table}!`:""}${2===r.length&&r[0]===r[1]?r[0]:r.join(":")}`},l=c(/<chart:categories\b[^>]*table:cell-range-address="([^"]+)"/.exec(e)?.[1]),u=[...e.matchAll(/<chart:series\b([^>]*)>/g)].map((e=>{const t=c(s(e[1],"chart:values-cell-range-address"))
302
247
  return`${c(s(e[1],"chart:label-cell-address"))||"series"}${t?`: ${t}`:""}${l?` by ${l}`:""}`}))
303
- return`[chart: ${N[t]??t}${r?` "${r}"`:""}${u.length?`; ${u.join("; ")}`:""}]`}function $(e){return e.replace(/^[a-z]+:/i,"").replace(/^=/,"").replace(/\[([^\]]*)\]/g,((e,t)=>t.split(":").map((e=>{const t=e.lastIndexOf("."),r=e.slice(0,t).replace(/^\$/,"").replace(/^'(.*)'$/,"$1"),n=e.slice(t+1).replace(/\$/g,"")
304
- return r?`${r}!${n}`:n})).join(":")))}function y(e,t,r){switch(e){case"text:tab":return r.push("\t"),!0
248
+ return`[chart: ${F[t]??t}${r?` "${r}"`:""}${u.length?`; ${u.join("; ")}`:""}]`}function v(e){return e.replace(/^[a-z]+:/i,"").replace(/^=/,"").replace(/\[([^\]]*)\]/g,((e,t)=>t.split(":").map((e=>{const t=e.lastIndexOf("."),r=e.slice(0,t).replace(/^\$/,"").replace(/^'(.*)'$/,"$1"),n=e.slice(t+1).replace(/\$/g,"")
249
+ return r?`${r}!${n}`:n})).join(":")))}function $(e,t,r){switch(e){case"text:tab":return r.push("\t"),!0
305
250
  case"text:line-break":return r.push("\n"),!0
306
251
  case"text:s":return r.push(" ".repeat(Math.min(100,Number(s(t,"text:c")??1)||1))),!0
307
- default:return!1}}function M(e,t=new Map){const r=[],n=[],a=new L
308
- let i=0,c=0,l=null,u=null
309
- for(const d of e.matchAll(A)){const[,e,p,f,m,h]=d
252
+ default:return!1}}function M(e,t=new Map){const r=[],n=[],i=new U
253
+ let a=0,c=0,l=null,u=null
254
+ for(const d of e.matchAll(P)){const[,e,p,f,m,h]=d
310
255
  if(void 0!==h){if(c)continue
311
- u&&l?l[u]=(l[u]??"")+o(h):a.push(o(h))
312
- continue}if(F.has(p)){m||(c+=e?-1:1)
256
+ u&&l?l[u]=(l[u]??"")+o(h):i.push(o(h))
257
+ continue}if(N.has(p)){m||(c+=e?-1:1)
313
258
  continue}if(c)continue
314
259
  const b=n[n.length-1]
315
260
  if(e)switch(p){case"svg:title":case"svg:desc":u=null
316
261
  break
317
262
  case"draw:frame":{const e=l?O(l,t):null
318
263
  if(l=null,!e)break
319
- a.current?a.pushSpaced(e):b?.cell?b.cell.push(e):r.push(e)
320
- break}case"text:p":case"text:h":{const e=a.close()
264
+ i.current?i.pushSpaced(e):b?.cell?b.cell.push(e):r.push(e)
265
+ break}case"text:p":case"text:h":{const e=i.close()
321
266
  if(!e)break
322
267
  if(b?.cell){e.plain&&b.cell.push(e.plain)
323
268
  break}if(!e.line){r.length&&""!==r[r.length-1]&&r.push("")
324
269
  break}r.push(e.line)
325
- break}case"text:list-item":i=Math.max(0,i-1)
270
+ break}case"text:list-item":a=Math.max(0,a-1)
326
271
  break
327
272
  case"table:table-cell":case"table:covered-table-cell":b?.cell&&b.row&&(b.row.push(b.cell.join(" ")),b.cell=null)
328
273
  break
@@ -332,10 +277,10 @@ case"table:table":{const e=n.pop()
332
277
  if(!e)break
333
278
  const t=e.rows.map((e=>`| ${e.map((e=>e.replace(/\|/g,"\\|"))).join(" | ")} |`)),o=n[n.length-1]
334
279
  o?.cell?o.cell.push(t.join(" ")):r.push(...t,"")
335
- break}}else{if(y(p,f,a))continue
336
- switch(p){case"text:p":case"text:h":m?!b?.cell&&r.length&&""!==r[r.length-1]&&r.push(""):a.open("text:h"===p?Number(s(f,"text:outline-level")??1)||1:0,i>0)
280
+ break}}else{if($(p,f,i))continue
281
+ switch(p){case"text:p":case"text:h":m?!b?.cell&&r.length&&""!==r[r.length-1]&&r.push(""):i.open("text:h"===p?Number(s(f,"text:outline-level")??1)||1:0,a>0)
337
282
  break
338
- case"text:list-item":m||i++
283
+ case"text:list-item":m||a++
339
284
  break
340
285
  case"table:table":m||n.push({rows:[],row:null,cell:null})
341
286
  break
@@ -350,34 +295,34 @@ break
350
295
  case"draw:object":case"draw:object-ole":l&&(l.object=!0,l.href=s(f,"xlink:href"))
351
296
  break
352
297
  case"svg:title":case"svg:desc":!m&&l&&(u="svg:title"===p?"title":"desc")}}}return r.join("\n").replace(/\n{3,}/g,"\n\n").trim()}function S(e,t=new Map){const r=[]
353
- let n=!1,a=null,i=null,c=null,l=null,u=null,d=0,p=!1
354
- for(const f of e.matchAll(A)){const[,e,m,h,b,w]=f
298
+ let n=!1,i=null,a=null,c=null,l=null,u=null,d=0,p=!1
299
+ for(const f of e.matchAll(P)){const[,e,m,h,b,w]=f
355
300
  if(void 0!==w){if(d)continue
356
301
  u&&l?l[u]=(l[u]??"")+o(w):c&&p&&c.parts.push(o(w))
357
- continue}if(F.has(m)){b||(d+=e?-1:1)
302
+ continue}if(N.has(m)){b||(d+=e?-1:1)
358
303
  continue}if(d)continue
359
- const g=()=>{if(!c||!i)return
304
+ const g=()=>{if(!c||!a)return
360
305
  let e=c.parts.join("").trim()||c.value||""
361
- if(c.formula&&(e=`${e}${e?" ":""}(=${$(c.formula)})`),e)for(let t=0;t<Math.min(c.repeat,R);t++)i.cells[i.col+t]=e.replace(/[\t\r\n]+/g," ")
362
- i.col+=c.repeat,c=null}
306
+ if(c.formula&&(e=`${e}${e?" ":""}(=${v(c.formula)})`),e)for(let t=0;t<Math.min(c.repeat,D);t++)a.cells[a.col+t]=e.replace(/[\t\r\n]+/g," ")
307
+ a.col+=c.repeat,c=null}
363
308
  if(e)switch(m){case"svg:title":case"svg:desc":u=null
364
309
  break
365
310
  case"draw:frame":{const e=l?O(l,t):null
366
- l=null,e&&a&&a.figures.push(e)
311
+ l=null,e&&i&&i.figures.push(e)
367
312
  break}case"text:p":p=!1
368
313
  break
369
314
  case"table:table-cell":case"table:covered-table-cell":g()
370
315
  break
371
- case"table:table-row":if(!i||!a)break
372
- if(i.cells.some((e=>void 0!==e))){for(let e=0;e<Math.min(i.repeat,D);e++){if(a.rows.length>=C){n=!0
373
- break}a.rows.push({n:a.rowIndex+e+1,cells:i.cells})}a.width=Math.max(a.width,i.cells.length)}a.rowIndex+=i.repeat,i=null
316
+ case"table:table-row":if(!a||!i)break
317
+ if(a.cells.some((e=>void 0!==e))){for(let e=0;e<Math.min(a.repeat,j);e++){if(i.rows.length>=R){n=!0
318
+ break}i.rows.push({n:i.rowIndex+e+1,cells:a.cells})}i.width=Math.max(i.width,a.cells.length)}i.rowIndex+=a.repeat,a=null
374
319
  break
375
- case"table:table":if(!a)break
376
- r.push({name:a.name,text:x(a.rows,a.width),figures:a.figures}),a=null}else switch(m){case"table:table":b||(a={name:s(h,"table:name")??`Sheet ${r.length+1}`,rows:[],width:0,figures:[],rowIndex:0})
320
+ case"table:table":if(!i)break
321
+ r.push({name:i.name,text:x(i.rows,i.width),figures:i.figures}),i=null}else switch(m){case"table:table":b||(i={name:s(h,"table:name")??`Sheet ${r.length+1}`,rows:[],width:0,figures:[],rowIndex:0})
377
322
  break
378
323
  case"table:table-row":{const e=Math.max(1,Number(s(h,"table:number-rows-repeated")??1)||1)
379
- b?a&&(a.rowIndex+=e):i={cells:[],col:0,repeat:e}
380
- break}case"table:table-cell":case"table:covered-table-cell":if(!i)break
324
+ b?i&&(i.rowIndex+=e):a={cells:[],col:0,repeat:e}
325
+ break}case"table:table-cell":case"table:covered-table-cell":if(!a)break
381
326
  c={parts:[],repeat:Math.max(1,Number(s(h,"table:number-columns-repeated")??1)||1),value:s(h,"office:value")??s(h,"office:date-value")??s(h,"office:time-value")??s(h,"office:boolean-value")??s(h,"office:string-value"),formula:s(h,"table:formula")},b&&g()
382
327
  break
383
328
  case"text:p":c&&!b&&(c.parts.length&&c.parts.push(" "),p=!0)
@@ -390,95 +335,253 @@ case"draw:image":l&&(l.image=!0)
390
335
  break
391
336
  case"draw:object":case"draw:object-ole":l&&(l.object=!0,l.href=s(h,"xlink:href"))
392
337
  break
393
- case"svg:title":case"svg:desc":!b&&l&&(u="svg:title"===m?"title":"desc")}}return{sheets:r,truncated:n}}function T(e,t=new Map){const r=[]
338
+ case"svg:title":case"svg:desc":!b&&l&&(u="svg:title"===m?"title":"desc")}}return{sheets:r,truncated:n}}function C(e,t=new Map){const r=[]
394
339
  let n=null
395
- const a=new L
396
- let i=0,c=0,l=null,u=null
397
- for(const d of e.matchAll(A)){const[,e,p,f,m,h]=d
398
- if(void 0===h){if(F.has(p))m||(c+=e?-1:1)
340
+ const i=new U
341
+ let a=0,c=0,l=null,u=null
342
+ for(const d of e.matchAll(P)){const[,e,p,f,m,h]=d
343
+ if(void 0===h){if(N.has(p))m||(c+=e?-1:1)
399
344
  else if(!c)if(e)switch(p){case"svg:title":case"svg:desc":u=null
400
345
  break
401
- case"text:p":case"text:h":{const e=a.close()
402
- !e?.plain||!n||i&&/^<number>$/.test(e.plain)||(i?n.notes:n.lines).push(e.plain)
346
+ case"text:p":case"text:h":{const e=i.close()
347
+ !e?.plain||!n||a&&/^<number>$/.test(e.plain)||(a?n.notes:n.lines).push(e.plain)
403
348
  break}case"draw:frame":{const e=l?O(l,t):null
404
349
  l=null,e&&n&&n.lines.push(e)
405
- break}case"presentation:notes":i=Math.max(0,i-1)
350
+ break}case"presentation:notes":a=Math.max(0,a-1)
406
351
  break
407
352
  case"draw:page":{if(!n)break
408
353
  let e=`## Slide ${r.length+1}\n${n.lines.join("\n")||"(no text)"}`
409
354
  n.notes.length&&(e+=`\n\nNotes:\n${n.notes.join("\n")}`),r.push(e),n=null
410
- break}}else{if(y(p,f,a))continue
355
+ break}}else{if($(p,f,i))continue
411
356
  switch(p){case"draw:page":m||(n={lines:[],notes:[]})
412
357
  break
413
- case"presentation:notes":m||i++
358
+ case"presentation:notes":m||a++
414
359
  break
415
- case"text:p":case"text:h":m||a.open(0,!1)
360
+ case"text:p":case"text:h":m||i.open(0,!1)
416
361
  break
417
- case"draw:frame":m||i||(l={name:s(f,"draw:name")})
362
+ case"draw:frame":m||a||(l={name:s(f,"draw:name")})
418
363
  break
419
364
  case"draw:image":l&&(l.image=!0)
420
365
  break
421
366
  case"draw:object":case"draw:object-ole":l&&(l.object=!0,l.href=s(f,"xlink:href"))
422
367
  break
423
368
  case"svg:title":case"svg:desc":!m&&l&&(u="svg:title"===p?"title":"desc")}}}else{if(c)continue
424
- u&&l?l[u]=(l[u]??"")+o(h):a.push(o(h))}}return r}Object.defineProperty(exports,"__esModule",{value:!0}),exports.MAX_DOCUMENT_BYTES=void 0,exports.documentKindFor=function(e){const t=(0,I.formatFor)(e)
425
- return t?.text?t.kind:void 0},exports.extractDocumentText=async function e(o,i,c={}){if(o.byteLength>exports.MAX_DOCUMENT_BYTES)throw new Error(`file is ${(o.byteLength/1048576).toFixed(1)} MB; text extraction stops at ${exports.MAX_DOCUMENT_BYTES/1048576} MB`)
426
- const l=(0,I.formatOfKind)(i).textVia
427
- if(l){if(!c.convert)throw new Error(`.${i} files are read by converting them in the office box, which is not reachable from here`)
428
- const t=await e(await c.convert(o,i,l),l)
429
- return{...t,kind:i,note:`Converted from .${i} to .${l} in the office box first. ${t.note??""}`.trim()}}switch(i){case"pdf":return async function(e){const r=await Promise.resolve().then(t.t.bind(t,88891,23)),{getDocumentProxy:n,extractText:o}=r?.default??r,s=await n(new Uint8Array(e),{isEvalSupported:!1})
430
- try{const{totalPages:e,text:t}=await o(s,{mergePages:!1}),r=Array.isArray(t)?t:[t],n=r.map(((t,r)=>`--- page ${r+1} of ${e} ---\n${String(t).trim()}`)).join("\n\n"),a=r.every((e=>!String(e).trim()))
431
- return{kind:"pdf",text:n,units:e,note:a?"No text layer (probably a scan). Use view_asset with this path to look at the pages.":"Text only. For tables, figures or layout, use view_asset with this path and the page numbers."}}finally{await(s.loadingTask?.destroy?.().catch?.((()=>{})))}}(o)
369
+ u&&l?l[u]=(l[u]??"")+o(h):i.push(o(h))}}return r}Object.defineProperty(exports,"__esModule",{value:!0}),exports.MAX_DOCUMENT_BYTES=void 0,exports.documentKindFor=function(e){const t=(0,T.formatFor)(e)
370
+ return t?.text?t.kind:void 0},exports.extractDocumentText=async function e(o,a,c={}){if(o.byteLength>exports.MAX_DOCUMENT_BYTES)throw new Error(`file is ${(o.byteLength/1048576).toFixed(1)} MB; text extraction stops at ${exports.MAX_DOCUMENT_BYTES/1048576} MB`)
371
+ const l=(0,T.formatOfKind)(a).textVia
372
+ if(l){if(!c.convert)throw new Error(`.${a} files are read by converting them in the office box, which is not reachable from here`)
373
+ const t=await e(await c.convert(o,a,l),l)
374
+ return{...t,kind:a,note:`Converted from .${a} to .${l} in the office box first. ${t.note??""}`.trim()}}switch(a){case"pdf":return async function(e){const r=await Promise.resolve().then(t.t.bind(t,88891,23)),{getDocumentProxy:n,extractText:o}=r?.default??r,s=await n(new Uint8Array(e),{isEvalSupported:!1})
375
+ try{const{totalPages:e,text:t}=await o(s,{mergePages:!1}),r=Array.isArray(t)?t:[t],n=r.map(((t,r)=>`--- page ${r+1} of ${e} ---\n${String(t).trim()}`)).join("\n\n"),i=r.every((e=>!String(e).trim()))
376
+ return{kind:"pdf",text:n,units:e,note:i?"No text layer (probably a scan). Use view_asset with this path to look at the pages.":"Text only. For tables, figures or layout, use view_asset with this path and the page numbers."}}finally{await(s.loadingTask?.destroy?.().catch?.((()=>{})))}}(o)
432
377
  case"docx":return async function(e){const t=await r(e),o=await n(t,"word/document.xml")
433
378
  if(!o)throw new Error("not a Word document (word/document.xml is missing)")
434
- return{kind:"docx",text:f(o,await u(t,a(await n(t,"word/_rels/document.xml.rels"),"word"))),note:"Text, headings, lists and tables; pictures show as [image: alt text] and charts as a one-line summary; formatting is dropped. To see the pages, view_asset this path."}}(o)
379
+ return{kind:"docx",text:f(o,await u(t,i(await n(t,"word/_rels/document.xml.rels"),"word"))),note:"Text, headings, lists and tables; pictures show as [image: alt text] and charts as a one-line summary; formatting is dropped. To see the pages, view_asset this path."}}(o)
435
380
  case"xlsx":return async function(e){const t=await r(e),o=await n(t,"xl/workbook.xml")
436
381
  if(!o)throw new Error("not an Excel workbook (xl/workbook.xml is missing)")
437
- const i=a(await n(t,"xl/_rels/workbook.xml.rels"),"xl"),c=h(await n(t,"xl/sharedStrings.xml")),l=[]
382
+ const a=i(await n(t,"xl/_rels/workbook.xml.rels"),"xl"),c=h(await n(t,"xl/sharedStrings.xml")),l=[]
438
383
  let u=!1,d=0
439
- for(const e of o.matchAll(/<sheet\b([^>]*)\/?>/g)){const r=s(e[1],"name")??`Sheet ${d+1}`,o=s(e[1],"r:id"),a=o?i.get(o):void 0,p=a?await n(t,a):void 0
384
+ for(const e of o.matchAll(/<sheet\b([^>]*)\/?>/g)){const r=s(e[1],"name")??`Sheet ${d+1}`,o=s(e[1],"r:id"),i=o?a.get(o):void 0,p=i?await n(t,i):void 0
440
385
  if(d++,!p){l.push(`## Sheet: ${r}\n(empty)`)
441
386
  continue}const{text:f,truncated:h}=g(p,c)
442
387
  u=u||h
443
- const b=await m(t,a)
444
- l.push(`## Sheet: ${r}\n${f||"(empty)"}${b.length?`\n\n${b.join("\n")}`:""}`)}return{kind:"xlsx",text:l.join("\n\n"),units:d,note:"Cell values as tab-separated rows (column letters in the header); a formula shows as its last computed value followed by (=formula). Charts and pictures are listed under their sheet. Dates show as numbers."+(u?` Sheets over ${C} rows are cut off.`:"")}}(o)
388
+ const b=await m(t,i)
389
+ l.push(`## Sheet: ${r}\n${f||"(empty)"}${b.length?`\n\n${b.join("\n")}`:""}`)}return{kind:"xlsx",text:l.join("\n\n"),units:d,note:"Cell values as tab-separated rows (column letters in the header); a formula shows as its last computed value followed by (=formula). Charts and pictures are listed under their sheet. Dates show as numbers."+(u?` Sheets over ${R} rows are cut off.`:"")}}(o)
445
390
  case"pptx":return async function(e){const t=await r(e),o=await n(t,"ppt/presentation.xml")
446
391
  if(!o)throw new Error("not a PowerPoint deck (ppt/presentation.xml is missing)")
447
- const i=a(await n(t,"ppt/_rels/presentation.xml.rels"),"ppt")
392
+ const a=i(await n(t,"ppt/_rels/presentation.xml.rels"),"ppt")
448
393
  let c=[...o.matchAll(/<p:sldId\b([^>]*)\/?>/g)].map((e=>{const t=s(e[1],"r:id")
449
- return t?i.get(t):void 0})).filter((e=>!!e))
394
+ return t?a.get(t):void 0})).filter((e=>!!e))
450
395
  c.length||(c=Object.keys(t.files).filter((e=>/^ppt\/slides\/slide\d+\.xml$/.test(e))).sort(((e,t)=>Number(/(\d+)\.xml$/.exec(e)[1])-Number(/(\d+)\.xml$/.exec(t)[1]))))
451
396
  const l=[]
452
- for(let e=0;e<c.length;e++){const r=c[e],o=await n(t,r),s=o?k(o):[],i=r.slice(0,r.lastIndexOf("/")),d=r.slice(r.lastIndexOf("/")+1),p=a(await n(t,`${i}/_rels/${d}.rels`),i)
397
+ for(let e=0;e<c.length;e++){const r=c[e],o=await n(t,r),s=o?k(o):[],a=r.slice(0,r.lastIndexOf("/")),d=r.slice(r.lastIndexOf("/")+1),p=i(await n(t,`${a}/_rels/${d}.rels`),a)
453
398
  o&&s.push(..._(o,await u(t,p)))
454
399
  const f=[...p.values()].find((e=>/notesSlide\d*\.xml$/.test(e))),m=f?await n(t,f):void 0,h=m?k(m).filter((e=>!/^(\d+|<number>)$/.test(e))):[]
455
400
  let b=`## Slide ${e+1}\n${s.join("\n")||"(no text)"}`
456
401
  h.length&&(b+=`\n\nNotes:\n${h.join("\n")}`),l.push(b)}return{kind:"pptx",text:l.join("\n\n"),units:c.length,note:"Slide text and speaker notes; pictures show as [image: alt text] and charts as a one-line summary; layout is dropped. To see a slide, view_asset this path."}}(o)
457
- case"odt":return async function(e){const{xml:t,objects:r}=await v(e,"application/vnd.oasis.opendocument.text","text document")
402
+ case"odt":return async function(e){const{xml:t,objects:r}=await E(e,"application/vnd.oasis.opendocument.text","text document")
458
403
  return{kind:"odt",text:M(t,r),note:"Text, headings, lists and tables; pictures show as [image: alt text] and charts as a one-line summary; notes, comments and formatting are dropped. To see the pages, view_asset this path."}}(o)
459
- case"ods":return async function(e){const{xml:t,objects:r}=await v(e,"application/vnd.oasis.opendocument.spreadsheet","spreadsheet"),{sheets:n,truncated:o}=S(t,r)
460
- return{kind:"ods",text:n.map((e=>`## Sheet: ${e.name}\n${e.text||"(empty)"}${e.figures.length?`\n\n${e.figures.join("\n")}`:""}`)).join("\n\n"),units:n.length,note:"Cell values as tab-separated rows (column letters in the header); a formula shows as its value followed by (=formula). Charts and pictures are listed under their sheet."+(o?` Sheets over ${C} rows are cut off.`:"")}}(o)
461
- case"odp":return async function(e){const{xml:t,objects:r}=await v(e,"application/vnd.oasis.opendocument.presentation","presentation"),n=T(t,r)
404
+ case"ods":return async function(e){const{xml:t,objects:r}=await E(e,"application/vnd.oasis.opendocument.spreadsheet","spreadsheet"),{sheets:n,truncated:o}=S(t,r)
405
+ return{kind:"ods",text:n.map((e=>`## Sheet: ${e.name}\n${e.text||"(empty)"}${e.figures.length?`\n\n${e.figures.join("\n")}`:""}`)).join("\n\n"),units:n.length,note:"Cell values as tab-separated rows (column letters in the header); a formula shows as its value followed by (=formula). Charts and pictures are listed under their sheet."+(o?` Sheets over ${R} rows are cut off.`:"")}}(o)
406
+ case"odp":return async function(e){const{xml:t,objects:r}=await E(e,"application/vnd.oasis.opendocument.presentation","presentation"),n=C(t,r)
462
407
  return{kind:"odp",text:n.join("\n\n"),units:n.length,note:"Slide text and speaker notes; pictures show as [image: alt text] and charts as a one-line summary; layout is dropped. To see a slide, view_asset this path."}}(o)
463
- case"rtf":return{kind:"rtf",text:(0,j.rtfToText)(o),note:"Text, paragraphs and table rows; styling, pictures and layout are dropped. To see the pages, view_asset this path."}
464
- default:throw new Error(`no text form for .${i}`)}},exports.decodeXml=o,exports.figureMarker=l,exports.chartXmlSummary=d,exports.stripElementPrefixes=p,exports.docxXmlToText=f,exports.parseSharedStrings=h,exports.sheetXmlToText=g,exports.slideFigures=_,exports.drawingMlParagraphs=k,exports.odfChartSummary=E,exports.odfFormula=$,exports.odtXmlToText=M,exports.odsXmlToText=S,exports.odpXmlToText=T
465
- const I=t(70610),j=t(50478)
408
+ case"rtf":return{kind:"rtf",text:(0,I.rtfToText)(o),note:"Text, paragraphs and table rows; styling, pictures and layout are dropped. To see the pages, view_asset this path."}
409
+ default:throw new Error(`no text form for .${a}`)}},exports.decodeXml=o,exports.figureMarker=l,exports.chartXmlSummary=d,exports.stripElementPrefixes=p,exports.docxXmlToText=f,exports.parseSharedStrings=h,exports.sheetXmlToText=g,exports.slideFigures=_,exports.drawingMlParagraphs=k,exports.odfChartSummary=y,exports.odfFormula=v,exports.odtXmlToText=M,exports.odsXmlToText=S,exports.odpXmlToText=C
410
+ const T=t(12661),I=t(43701)
466
411
  exports.MAX_DOCUMENT_BYTES=52428800
467
- const C=5e3,P={barChart:"bar",bar3DChart:"bar",lineChart:"line",line3DChart:"line",pieChart:"pie",pie3DChart:"pie",ofPieChart:"pie",doughnutChart:"doughnut",areaChart:"area",area3DChart:"area",scatterChart:"scatter",radarChart:"radar",bubbleChart:"bubble",stockChart:"stock",surfaceChart:"surface",surface3DChart:"surface"},A=/<(\/?)([A-Za-z][\w.-]*:[\w.-]+)\b([^>]*?)(\/?)>|([^<]+)/g,F=new Set(["text:note","office:annotation","text:tracked-changes","office:forms","text:sequence-decls"]),R=256,D=50,N={circle:"pie",ring:"doughnut"}
468
- class L{constructor(){this.stack=[]}open(e,t){this.stack.push({parts:[],heading:e,listed:t})}get current(){return this.stack[this.stack.length-1]}push(e){this.current?.parts.push(e)}pushSpaced(e){const t=this.current?.parts
412
+ const R=5e3,A={barChart:"bar",bar3DChart:"bar",lineChart:"line",line3DChart:"line",pieChart:"pie",pie3DChart:"pie",ofPieChart:"pie",doughnutChart:"doughnut",areaChart:"area",area3DChart:"area",scatterChart:"scatter",radarChart:"radar",bubbleChart:"bubble",stockChart:"stock",surfaceChart:"surface",surface3DChart:"surface"},P=/<(\/?)([A-Za-z][\w.-]*:[\w.-]+)\b([^>]*?)(\/?)>|([^<]+)/g,N=new Set(["text:note","office:annotation","text:tracked-changes","office:forms","text:sequence-decls"]),D=256,j=50,F={circle:"pie",ring:"doughnut"}
413
+ class U{constructor(){this.stack=[]}open(e,t){this.stack.push({parts:[],heading:e,listed:t})}get current(){return this.stack[this.stack.length-1]}push(e){this.current?.parts.push(e)}pushSpaced(e){const t=this.current?.parts
469
414
  if(!t)return
470
415
  const r=t[t.length-1]??""
471
416
  t.push(`${!r||/\s$/.test(r)?"":" "}${e} `)}close(){const e=this.stack.pop()
472
417
  if(!e)return null
473
418
  const t=e.parts.join("").replace(/[ \t]+\n/g,"\n").trim()
474
- return this.current?(t&&this.pushSpaced(t),null):{plain:t,line:t?e.heading?`${"#".repeat(Math.min(6,e.heading))} ${t}`:e.listed?`- ${t}`:t:""}}}}},o={}
475
- e.c=o,r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,e.t=function(n,o){if(1&o&&(n=this(n)),8&o)return n
419
+ return this.current?(t&&this.pushSpaced(t),null):{plain:t,line:t?e.heading?`${"#".repeat(Math.min(6,e.heading))} ${t}`:e.listed?`- ${t}`:t:""}}}},43701:(e,exports)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.rtfToText=function(e){const o="string"==typeof e?e:Buffer.from(e).toString("latin1")
420
+ if(!/^\s*\{\s*\\rtf/i.test(o))throw new Error("not an RTF file (it does not start with {\\rtf)")
421
+ const s=[],i=[{skip:!1,skipChars:0}],a=()=>i[i.length-1],c=e=>{a().skip||s.push(e)}
422
+ for(let e=0;e<o.length;e++){const s=o[e]
423
+ if("{"===s){i.push({...a()})
424
+ continue}if("}"===s){i.length>1&&i.pop()
425
+ continue}if("\r"===s||"\n"===s)continue
426
+ if("\\"!==s){if(a().skipChars>0){a().skipChars--
427
+ continue}c(s)
428
+ continue}const u=/^\\([a-zA-Z]+)(-?\d+)? ?/.exec(o.slice(e))
429
+ if(!u){const s=o[e+1]
430
+ if("*"===s){const r=/^\\\*\\([a-zA-Z]+)/.exec(o.slice(e))
431
+ r&&!t.has(r[1])||(a().skip=!0),e+=1
432
+ continue}if("'"===s){const t=o.slice(e+2,e+4)
433
+ if(e+=3,a().skipChars>0){a().skipChars--
434
+ continue}c((l=parseInt(t,16)||0)<128?String.fromCharCode(l):n[l-128]??"")
435
+ continue}if(void 0!==s&&void 0!==r[s]){c(r[s]),e+=1
436
+ continue}e+=1
437
+ continue}const[d,p,f]=u
438
+ e+=d.length-1
439
+ const m=void 0===f?void 0:Number(f)
440
+ if(t.has(p))a().skip=!0
441
+ else if("u"!==p)"uc"!==p?"cell"!==p&&"nestcell"!==p?"row"!==p&&"nestrow"!==p?void 0===r[p]||c(r[p]):c("\n"):c(" | "):a().ucSkip=m??1
442
+ else{const e=a().skipChars>0
443
+ a().skipChars=Math.max(0,i[i.length-1].ucSkip??1),e||void 0===m||c(String.fromCodePoint(m<0?m+65536:m))}}var l
444
+ return s.join("").replace(/[ \t]+\n/g,"\n").replace(/\n{3,}/g,"\n\n").split("\n").map((e=>{const t=e.replace(/\s+$/,"").replace(/^\s*\|\s*/,"").replace(/\s*\|\s*$/,"")
445
+ return e.includes(" | ")?`| ${t} |`:t})).join("\n").trim()}
446
+ const t=new Set(["fonttbl","colortbl","stylesheet","listtable","listoverridetable","revtbl","rsidtbl","generator","info","pict","object","themedata","colorschememapping","latentstyles","datastore","xmlnstbl","filetbl","upr","fldinst","nonshppict","shppict","panose"]),r={par:"\n",line:"\n",tab:"\t",sect:"\n\n",page:"\n\n",lquote:"\u2018",rquote:"\u2019",ldblquote:"\u201c",rdblquote:"\u201d",emdash:"\u2014",endash:"\u2013",bullet:"\u2022",emspace:" ",enspace:" ",qmspace:" ","~":"\xa0","-":"",_:"-","{":"{","}":"}","\\":"\\"},n="\u20ac\x81\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\x8d\u017d\x8f\x90\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\x9d\u017e\u0178\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"},44600:(e,exports,t)=>{async function r(e,r={}){const{spawn:n}=await Promise.resolve().then(t.t.bind(t,35317,23))
447
+ return new Promise((t=>{const o="win32"===process.platform,s=o?n(e,{cwd:r.cwd??process.cwd(),env:r.env,shell:"cmd.exe",stdio:["pipe","pipe","pipe"],detached:!1}):n("/bin/sh",["-c",exports.RUN_FROM_ENV],{cwd:r.cwd??process.cwd(),env:{...r.env??process.env,[exports.RUN_ENV_VAR]:e},stdio:["pipe","pipe","pipe"],detached:!0}),i=[],a=[]
448
+ let c=!1,l=!1
449
+ const u=e=>{if(s.pid)try{o?s.kill(e):process.kill(-s.pid,e)}catch{}}
450
+ let d,p
451
+ r.onKillReady?.(((e="SIGTERM")=>{u(e),"SIGKILL"!==e&&setTimeout((()=>{l||u("SIGKILL")}),2e3)})),r.timeoutMs&&r.timeoutMs>0&&(p=setTimeout((()=>{c=!0,u("SIGTERM"),d=setTimeout((()=>{l||u("SIGKILL")}),2e3)}),r.timeoutMs)),s.stdout?.on("data",(e=>{i.push(e),r.onChunk?.("stdout",e)})),s.stderr?.on("data",(e=>{a.push(e),r.onChunk?.("stderr",e)}))
452
+ const f=e=>{l||(l=!0,p&&clearTimeout(p),d&&clearTimeout(d),t({stdout:Buffer.concat(i).toString("utf-8"),stderr:Buffer.concat(a).toString("utf-8"),exitCode:e,timedOut:c}))}
453
+ s.on("close",(e=>f(e??(c?124:1)))),s.on("error",(()=>f(1)))}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.RUN_ENV_VAR=exports.RUN_FROM_ENV=exports.RUN_PARSE_FAILED_EXIT=void 0,exports.exitMeansCouldNotRun=function(e){return e===exports.RUN_PARSE_FAILED_EXIT||127===e},exports.execAsync=async function(e,t={}){return new Promise(((r,o)=>{const[s,...i]=e.split(" "),a=(0,n.spawn)(s,i,{cwd:t.cwd||process.cwd(),stdio:["pipe","pipe","pipe"]})
454
+ let c="",l=""
455
+ a.stdout?.on("data",(e=>{c+=e.toString()})),a.stderr?.on("data",(e=>{l+=e.toString()})),a.on("close",(e=>{r({stdout:c,stderr:l,exitCode:e||0})})),a.on("error",(t=>{o(new Error(`Command failed: ${e}\nError: ${t.message}`))})),t.timeout&&setTimeout((()=>{a.kill(),o(new Error(`Command timed out: ${e}`))}),t.timeout)}))},exports.runShellCommand=r,exports.runTrackedShellCommand=async function(e,n,o){const{getActionServerBaseUrl:s}=await t.e(414).then(t.bind(t,79414)),i=s(),a=(new Date).toISOString(),c=n.cwd??process.cwd()
456
+ let l
457
+ fetch(`${i}/api/commands/start`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:o.id,name:o.name,command:e,cwd:c,sessionId:o.sessionId,startedAt:a,logPath:o.logPath,timeoutMs:n.timeoutMs}),signal:AbortSignal.timeout(2e3)}).catch((()=>{}))
458
+ try{l=await r(e,n)}catch(e){throw fetch(`${i}/api/commands/end`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:o.id,exitCode:1,timedOut:!1,finishedAt:(new Date).toISOString()}),signal:AbortSignal.timeout(2e3)}).catch((()=>{})),e}return fetch(`${i}/api/commands/end`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:o.id,exitCode:l.exitCode,timedOut:l.timedOut,finishedAt:(new Date).toISOString()}),signal:AbortSignal.timeout(2e3)}).catch((()=>{})),l}
459
+ const n=t(35317)
460
+ exports.RUN_PARSE_FAILED_EXIT=125,exports.RUN_FROM_ENV=["c=$ALCHEMY_RUN_CMD; unset ALCHEMY_RUN_CMD",`if (set -o pipefail) 2>/dev/null; then set -o pipefail; sh -n -c "$c" || exit ${exports.RUN_PARSE_FAILED_EXIT}; eval "$c"`,`elif command -v bash >/dev/null 2>&1; then ALCHEMY_RUN_CMD=$c; export ALCHEMY_RUN_CMD; exec bash -o pipefail -c 'c=$ALCHEMY_RUN_CMD; unset ALCHEMY_RUN_CMD; bash -n -c "$c" || exit ${exports.RUN_PARSE_FAILED_EXIT}; eval "$c"'`,`else sh -n -c "$c" || exit ${exports.RUN_PARSE_FAILED_EXIT}; eval "$c"; fi`].join("\n"),exports.RUN_ENV_VAR="ALCHEMY_RUN_CMD"},44853:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.ENVIRONMENT_PRESETS=exports.OFFICE_BOX_PRESET=exports.OFFICE_BOX_RECIPE_HASH=exports.OFFICE_BOX_DOCKERFILE=exports.NOBREAK_DIGIT_HYPHEN_LUA=exports.OFFICE_RENDER_DIR=exports.OFFICE_BOX_IMAGE=exports.OFFICE_BOX_VERSION=void 0,exports.expandEnvironmentPreset=function(e,t){const r=t??{}
461
+ if(!e)return r
462
+ const n=exports.ENVIRONMENT_PRESETS[e].config
463
+ return{...n,...r,resources:{...n.resources??{},...r.resources??{}}}},exports.presetsLine=function(e){if(!e.includes(exports.OFFICE_BOX_IMAGE))return'Presets: `office` (python-docx, openpyxl, python-pptx, pandoc, LibreOffice, segno and zbarimg for QR codes; `render-pdf FILE` turns Word, Excel, PowerPoint, Markdown or HTML into PDF). Set it up with environment_verify({ preset: "office" }) then environment_create({ name: "Office", preset: "office" }), or ask environment_setup for the office preset. Needs Docker; the image is built locally on first use (a few minutes, about 900 MB). To only look at an office file, view_asset renders it without a box.'}
464
+ const r=t(76982)
465
+ exports.OFFICE_BOX_VERSION=1,exports.OFFICE_BOX_IMAGE=`alchemylab-local/office-box:v${exports.OFFICE_BOX_VERSION}`,exports.OFFICE_RENDER_DIR="/scratch/render",exports.NOBREAK_DIGIT_HYPHEN_LUA="local NBH = utf8.char(0x2011)\nfunction Str(el)\n local t = el.text\n for _ = 1, 2 do t = t:gsub('(%d)%-(%d)', '%1' .. NBH .. '%2') end\n if t ~= el.text then el.text = t end\n return el\nend\n"
466
+ const n="/usr/local/share/render-pdf/nobreak.lua",o=`#!/bin/sh\n# render-pdf FILE... : convert Word, Excel, PowerPoint, OpenDocument, Markdown or HTML to PDF.\n# Writes each PDF under \${RENDER_OUT:-${exports.OFFICE_RENDER_DIR}} and prints its path, one per line.\nset -e\nout="\${RENDER_OUT:-${exports.OFFICE_RENDER_DIR}}"\nmkdir -p "$out" /scratch/.render-work\nexport HOME="\${HOME:-/scratch}"\nif [ "$1" = "--self-test" ]; then\n cd /scratch/.render-work\n python3 -c "import docx; d = docx.Document(); d.add_heading('render-pdf self-test', 1); d.add_paragraph('ok'); d.save('self-test.docx')"\n set -- /scratch/.render-work/self-test.docx\nfi\n[ "$#" -gt 0 ] || { echo "usage: render-pdf FILE..." >&2; exit 2; }\nfor f in "$@"; do\n [ -f "$f" ] || { echo "render-pdf: no such file: $f" >&2; exit 1; }\n name=$(basename "$f"); stem="\${name%.*}"\n case "$name" in\n *.md|*.markdown) pandoc --lua-filter ${n} "$f" -o "/scratch/.render-work/$stem.docx"; src="/scratch/.render-work/$stem.docx" ;;\n *) src="$f" ;;\n esac\n soffice --headless --norestore -env:UserInstallation=file:///scratch/.render-profile --convert-to pdf --outdir "$out" "$src" >/scratch/.render-work/soffice.log 2>&1 \\\n || { echo "render-pdf: LibreOffice could not convert $f" >&2; tail -5 /scratch/.render-work/soffice.log >&2; exit 1; }\n [ -f "$out/$stem.pdf" ] || { echo "render-pdf: no PDF produced for $f" >&2; exit 1; }\n echo "$out/$stem.pdf"\ndone\n`
467
+ exports.OFFICE_BOX_DOCKERFILE=function(){const e=Buffer.from(o).toString("base64"),t=Buffer.from(exports.NOBREAK_DIGIT_HYPHEN_LUA).toString("base64")
468
+ return["FROM python:3.12-slim","ENV DEBIAN_FRONTEND=noninteractive PIP_NO_CACHE_DIR=1 PYTHONDONTWRITEBYTECODE=1","RUN apt-get update \\"," && apt-get install -y --no-install-recommends \\"," libreoffice-writer-nogui libreoffice-calc-nogui libreoffice-impress-nogui \\"," pandoc fonts-liberation fonts-dejavu-core fonts-crosextra-carlito fonts-crosextra-caladea \\"," zbar-tools poppler-utils \\"," && rm -rf /var/lib/apt/lists/*","RUN pip install python-docx openpyxl python-pptx pypdf segno",`RUN echo ${e} | base64 -d > /usr/local/bin/render-pdf && chmod 755 /usr/local/bin/render-pdf`,`RUN mkdir -p ${n.replace(/\/[^/]+$/,"")} && echo ${t} | base64 -d > ${n}`,""].join("\n")}(),exports.OFFICE_BOX_RECIPE_HASH=(0,r.createHash)("sha256").update(exports.OFFICE_BOX_DOCKERFILE).digest("hex").slice(0,16),exports.OFFICE_BOX_PRESET={name:"Office",description:'Make and render office files: python-docx, openpyxl, python-pptx, pandoc and LibreOffice in a sealed box. `render-pdf FILE` writes a PDF under /scratch/render. QR codes: `segno "URL" -o qr.png --scale 10`, read back with `zbarimg`; `pdftoppm -png` turns PDF pages into images. Word styling from Markdown: `pandoc --reference-doc`. The worktree is read-only here: make files under /scratch, record them (results record, box), then view_asset({ result }) to look at a PDF and write_file({ path, fromResult }) to put a file in the repository. Scripts you write to make a file stay in /scratch: the repository gets the finished files, and a note in the source saying how it was rendered.',smoke:"render-pdf --self-test",config:{image:exports.OFFICE_BOX_IMAGE,shellInit:"export HOME=/scratch",resources:{memory:"3g",scratchMb:1024,shmMb:256}}},exports.ENVIRONMENT_PRESETS={office:exports.OFFICE_BOX_PRESET}},48161:module=>{module.exports=require("node:os")},52429:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.ContainerRunner=void 0
469
+ const r=t(81618),n=t(22604),o=t(11895),s=t(26166),i=t(2566),a=t(90695),c=t(61260)
470
+ exports.ContainerRunner=class{constructor(e={}){this.image=e.image??"node:20-alpine",this.stepTimeoutMs=e.stepTimeoutMs??12e4,this.network=e.network??"none",this.resources=e.resources??{}}async run(e){if(!e.worktreePath)return{steps:[],ok:!1,error:"worktreePath is required"}
471
+ const t=e.image??this.image,s={}
472
+ let l=Date.now()
473
+ const u=e=>{const t=Date.now()
474
+ s[e]=(s[e]??0)+(t-l),l=t},d=await(0,r.ensureImage)(t)
475
+ if(u("image"),d)return{steps:[],ok:!1,error:d}
476
+ const p=await(0,n.withAdmission)(this.resources.memory??"1g","check",(async()=>{const{cpus:s,cpuset:i}=await(0,n.pickCores)(this.resources.cpus,o.DEFAULT_CPUS,this.resources.size)
477
+ let c=await(0,r.docker)(this.createArgs(e,t,!0,i,s),r.DOCKER_OP_TIMEOUT_MS)
478
+ if(0!==c.exit)return{error:c.spawnError??`docker create failed: ${(c.stderr||String(c.exit)).trim()}`}
479
+ let l=c.stdout.trim()
480
+ if(u("create"),await(0,a.claimScratch)(l,t,"1000:1000")){if(await(0,r.docker)(["rm","-f","-v",l],r.DOCKER_OP_TIMEOUT_MS),c=await(0,r.docker)(this.createArgs(e,t,!1,i,s),r.DOCKER_OP_TIMEOUT_MS),0!==c.exit)return{error:c.spawnError??`docker create failed: ${(c.stderr||String(c.exit)).trim()}`}
481
+ l=c.stdout.trim()}return u("scratch"),{id:l}}))
482
+ if("refused"in p)return{steps:[],ok:!1,error:p.refused}
483
+ if("error"in p.value)return{steps:[],ok:!1,error:p.value.error}
484
+ const f=p.value.id
485
+ try{const t=await(0,r.docker)(["start",f],r.DOCKER_OP_TIMEOUT_MS)
486
+ if(u("start"),0!==t.exit)return{steps:[],ok:!1,error:`docker start failed: ${(t.stderr||String(t.exit)).trim()}`}
487
+ const n=[]
488
+ let o=await(0,c.readOomKills)(f)??0
489
+ for(const t of e.steps){const s=Date.now(),a=await(0,r.dockerKeepingEnds)(["exec","-e",`${i.RUN_ENV_VAR}=${(0,i.withShellInit)(e.shellInit,t.run)}`,f,"/bin/sh","-c",i.RUN_FROM_ENV],t.timeoutMs??this.stepTimeoutMs),l=Date.now()-s,u=await(0,c.readOomKills)(f),d=null!=u?Math.max(0,u-o):0
490
+ null!=u&&(o=u)
491
+ const p=d>0?`${a.stderr}${a.stderr&&!a.stderr.endsWith("\n")?"\n":""}${(0,c.oomNote)(d,this.resources.memory??"1g")}\n`:a.stderr
492
+ n.push({run:t.run,exit:a.exit,stdout:a.stdout,stderr:p,ms:l,timedOut:a.timedOut})}return u("commands"),{steps:n,ok:n.every((e=>0===e.exit)),phaseMs:s}}finally{const e=Date.now()
493
+ await(0,r.docker)(["rm","-f","-v",f],r.DOCKER_OP_TIMEOUT_MS),s.remove=Date.now()-e}}createArgs(e,t,r,n,i){const c=Object.entries(e.env??{}).flatMap((([e,t])=>["-e",`${e}=${t}`])),l=e.depsVolume?["-v",`${e.depsVolume}:/work/node_modules`]:[],u=(e.mounts??[]).flatMap((e=>["-v",`${e.volume}:${e.target}`])),d=(e.readOnlyBinds??[]).flatMap((e=>["-v",`${e.host}:${e.target}:ro`]))
494
+ return["create","--label","alchemy.sandbox=rung1",...(0,s.hardenedCreateArgs)({network:this.network,user:"1000:1000",...r?{}:{extraTmpfs:[(0,a.scratchTmpfsArg)(512)]},shmSizeMb:this.resources.shmSizeMb,memory:this.resources.memory??"1g",cpus:i??this.resources.cpus??o.DEFAULT_CPUS,cpuset:n,pidsLimit:this.resources.pidsLimit??512}),...r?a.SCRATCH_VOLUME_ARGS:[],...c,"-v",`${e.worktreePath}:/work:rw`,...l,...u,...d,"-w","/work",t,"tail","-f","/dev/null"]}}},61260:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.LIVE_FRAME_PATH=void 0,exports.readOomKills=async function(e){const t=await(0,r.docker)(["exec",e,"cat","/sys/fs/cgroup/memory.events"],n)
495
+ if(0===t.exit){const e=/^oom_kill (\d+)/m.exec(t.stdout)
496
+ if(e)return Number(e[1])}const o=await(0,r.docker)(["exec",e,"cat","/sys/fs/cgroup/memory/memory.oom_control"],n)
497
+ if(0===o.exit){const e=/^oom_kill (\d+)/m.exec(o.stdout)
498
+ if(e)return Number(e[1])}return null},exports.probeBox=async function(e){const t=`cat /sys/fs/cgroup/memory.events 2>/dev/null || cat /sys/fs/cgroup/memory/memory.oom_control 2>/dev/null; if [ -s ${exports.LIVE_FRAME_PATH} ]; then echo __ALCHEMY_LIVE_FRAME__; fi`,o=await(0,r.docker)(["exec",e,"/bin/sh","-c",t],n),s=/^oom_kill (\d+)/m.exec(o.stdout)
499
+ return{oomKills:s?Number(s[1]):null,liveFrame:o.stdout.includes("__ALCHEMY_LIVE_FRAME__")}},exports.oomNote=function(e,t){return`[AlchemyLab] Out of memory: the kernel killed ${1===e?"a process":`${e} processes`} in this box during this command (the box's memory cap is ${t}). Exit code 137 means killed. Make the case smaller, or raise the environment's memory (resources.memory).`}
500
+ const r=t(81618),n=5e3
501
+ exports.LIVE_FRAME_PATH="/tmp/.alchemy_live.png"},70857:module=>{module.exports=require("os")},73024:module=>{module.exports=require("node:fs")},76760:module=>{module.exports=require("node:path")},76982:module=>{module.exports=require("crypto")},79896:module=>{module.exports=require("fs")},81618:(e,exports,t)=>{function r(){return{...l?{"alchemy.project":l}:{},"alchemy.owner":String(process.pid),...u.getStore()??{}}}function n(e){if("create"!==e[0]&&"run"!==e[0])return e
502
+ const t=new Set
503
+ e.forEach(((r,n)=>{"--label"===e[n-1]&&t.add(r.split("=")[0])}))
504
+ const n=Object.entries(r()).filter((([e])=>!t.has(e))).flatMap((([e,t])=>["--label",`${e}=${t.replace(/[\r\n]/g," ").slice(0,200)}`]))
505
+ return n.length?[e[0],...n,...e.slice(1)]:e}function o(e,t){return new Promise((r=>{(0,s.execFile)("docker",n(e),{timeout:t,killSignal:"SIGKILL",maxBuffer:33554432,windowsHide:!0},((e,t,n)=>{if(!e)return void r({exit:0,stdout:t,stderr:n,timedOut:!1})
506
+ const o=e
507
+ if("ENOENT"===o.code)return void r({exit:-1,stdout:t??"",stderr:n??"",timedOut:!1,spawnError:"docker CLI not found on PATH"})
508
+ const s=!0===o.killed||"SIGKILL"===o.signal,i="number"==typeof o.code?o.code:-1
509
+ r({exit:i,stdout:t??"",stderr:n??"",timedOut:s})}))}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.PULL_TIMEOUT_MS=exports.DOCKER_OP_TIMEOUT_MS=void 0,exports.setContainerProject=function(e){l=e||void 0},exports.withContainerLabels=function(e,t){const r=Object.fromEntries(Object.entries(e).filter((([,e])=>"string"==typeof e&&e.length>0)))
510
+ return u.run({...u.getStore()??{},...r},t)},exports.containerLabels=r,exports.withScopeLabels=n,exports.dockerKeepingEnds=function(e,t,r=524288){return new Promise((o=>{const i=new c.EndsKeeper(r),a=new c.EndsKeeper(r)
511
+ let l=!1,u=!1
512
+ const d=(0,s.spawn)("docker",n(e),{windowsHide:!0}),p=setTimeout((()=>{l=!0,d.kill("SIGKILL")}),t)
513
+ d.stdout.setEncoding("utf8").on("data",(e=>i.push(e))),d.stderr.setEncoding("utf8").on("data",(e=>a.push(e)))
514
+ const f=e=>{u||(u=!0,clearTimeout(p),o(e))}
515
+ d.on("error",(e=>f({exit:-1,stdout:i.text(),stderr:a.text(),timedOut:!1,..."ENOENT"===e.code?{spawnError:"docker CLI not found on PATH"}:{spawnError:e.message}}))),d.on("close",(e=>f({exit:l?-1:e??-1,stdout:i.text(),stderr:a.text(),timedOut:l})))}))},exports.docker=o,exports.volumeExists=async function(e){return 0===(await o(["volume","inspect",e],exports.DOCKER_OP_TIMEOUT_MS)).exit},exports.ensureImage=async function(e){const t=(0,a.localRecipeFor)(e)
516
+ if(t)return(0,a.ensureLocalImage)(t)
517
+ const r=await o(["image","inspect",e],exports.DOCKER_OP_TIMEOUT_MS)
518
+ if(r.spawnError)return r.spawnError
519
+ if(0===r.exit)return
520
+ const n=await o(["pull",e],exports.PULL_TIMEOUT_MS)
521
+ return 0!==n.exit?`docker pull ${e} failed: ${(n.stderr||String(n.exit)).trim()}`:void 0}
522
+ const s=t(31421),i=t(16698),a=t(83129),c=t(88196)
523
+ let l
524
+ const u=new i.AsyncLocalStorage
525
+ exports.DOCKER_OP_TIMEOUT_MS=6e4,exports.PULL_TIMEOUT_MS=3e5},83129:function(e,exports,t){function r(e){const t=m.get(e.image)
526
+ if(t)return t.work
527
+ const r=(async()=>{const t=await(0,u.docker)(["image","inspect","--format",`{{ index .Config.Labels "${p}" }}`,e.image],u.DOCKER_OP_TIMEOUT_MS)
528
+ if(t.spawnError)return t.spawnError
529
+ if(0===t.exit&&t.stdout.trim()===e.recipeHash)return
530
+ const r=a.mkdtempSync(l.join(c.tmpdir(),"alchemylab-image-"))
531
+ try{a.writeFileSync(l.join(r,"Dockerfile"),e.dockerfile)
532
+ const t=await(0,u.docker)(["build","--label",`${p}=${e.recipeHash}`,"-t",e.image,r],exports.BUILD_TIMEOUT_MS)
533
+ if(0!==t.exit){const r=(t.stderr||t.stdout||"").trim().split("\n").slice(-12).join("\n")
534
+ return`building ${e.image} failed${t.timedOut?" (timed out)":""}: ${r}`}return}finally{a.rmSync(r,{recursive:!0,force:!0})}})()
535
+ return m.set(e.image,{work:r,since:Date.now()}),r.then((t=>{t?h.set(e.image,{error:t,at:Date.now()}):h.delete(e.image)}),(t=>{h.set(e.image,{error:t instanceof Error?t.message:String(t),at:Date.now()})})).finally((()=>m.delete(e.image))),r}var n,o=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r)
536
+ var o=Object.getOwnPropertyDescriptor(t,r)
537
+ o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||(n=function(e){return n=Object.getOwnPropertyNames||function(e){var t=[]
538
+ for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r)
539
+ return t},n(e)},function(e){if(e&&e.__esModule)return e
540
+ var t={}
541
+ if(null!=e)for(var r=n(e),i=0;i<r.length;i++)"default"!==r[i]&&o(t,e,r[i])
542
+ return s(t,e),t})
543
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.BUILD_TIMEOUT_MS=void 0,exports.localRecipeFor=function(e){return f.find((t=>t.image===e))},exports.ensureLocalImage=r,exports.localImageState=async function(e){const t=m.get(e.image)
544
+ if(t)return{state:"building",since:t.since}
545
+ const r=await(0,u.docker)(["image","inspect","--format",`{{ index .Config.Labels "${p}" }}`,e.image],u.DOCKER_OP_TIMEOUT_MS)
546
+ if(r.spawnError)return{state:"no-docker",error:"Docker is not installed on this machine (no docker command)"}
547
+ if(0===r.exit&&r.stdout.trim()===e.recipeHash)return{state:"ready"}
548
+ if(/cannot connect to the docker daemon|is the docker daemon running|error during connect/i.test(r.stderr))return{state:"no-docker",error:"Docker is not running on this machine"}
549
+ const n=h.get(e.image)
550
+ return n?{state:"failed",...n}:{state:"missing"}},exports.startLocalImageBuild=function(e){return h.delete(e.image),r(e).catch((()=>{})),{since:m.get(e.image)?.since??Date.now()}}
551
+ const a=i(t(73024)),c=i(t(48161)),l=i(t(76760)),u=t(81618),d=t(44853),p="dev.alchemylab.recipe"
552
+ exports.BUILD_TIMEOUT_MS=15e5
553
+ const f=[{image:d.OFFICE_BOX_IMAGE,dockerfile:d.OFFICE_BOX_DOCKERFILE,recipeHash:d.OFFICE_BOX_RECIPE_HASH}],m=new Map,h=new Map},88194:module=>{module.exports=require("jszip")},88196:(e,exports)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.EndsKeeper=void 0,exports.keepEnds=function(e,t,r){return e.length<=t+r?e:`${e.slice(0,t)}\n[AlchemyLab] ${e.length-t-r} characters cut here; the start and the end are kept.\n${e.slice(-r)}`},exports.EndsKeeper=class{constructor(e){this.half=e,this.head="",this.tail="",this.cut=0}push(e){if(this.head.length<this.half){const t=this.half-this.head.length
554
+ if(this.head+=e.slice(0,t),!(e=e.slice(t)))return}this.tail+=e,this.tail.length>this.half&&(this.cut+=this.tail.length-this.half,this.tail=this.tail.slice(-this.half))}text(){return this.cut>0?`${this.head}\n[AlchemyLab] ${this.cut} characters of output cut here; the start and the end are kept.\n${this.tail}`:this.head+this.tail}}},88891:module=>{module.exports=require("unpdf")},90695:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.SCRATCH_VOLUME_ARGS=void 0,exports.scratchTmpfsArg=function(e){return`/scratch:rw,nosuid,nodev,exec,size=${e}m`},exports.claimScratch=async function(e,t,n){const o=await(0,r.docker)(["run","--rm","--network","none","--user","0:0","--volumes-from",e,"--entrypoint","chown",t,n,"/scratch"],r.DOCKER_OP_TIMEOUT_MS)
555
+ return 0===o.exit?null:o.spawnError??((o.stderr||"").trim()||`chown exited ${o.exit}`)}
556
+ const r=t(81618)
557
+ exports.SCRATCH_VOLUME_ARGS=["--mount","type=volume,dst=/scratch"]},91943:module=>{module.exports=require("fs/promises")},95900:function(module,exports,e){async function t(e,t,r){const n=await(0,d.renderDocument)({bytes:Buffer.from(e),filename:`version.${t}`,to:r},{cacheDir:l.join(c.tmpdir(),"alchemylab-render-cache"),image:"present-only"})
558
+ if(!n.ok)throw new Error(n.error)
559
+ return n.bytes}async function r(e){const r=(0,u.documentKindFor)(e)
560
+ if(!r)return`(AlchemyLab: no text form for ${e.split(".").pop()} files)\n`
561
+ try{const n=await(0,u.extractDocumentText)(new Uint8Array(await(0,a.readFile)(e)),r,{convert:t})
562
+ return n.text.endsWith("\n")?n.text:`${n.text}\n`}catch(e){return`(AlchemyLab: could not read this ${r.toUpperCase()} version: ${e instanceof Error?e.message:String(e)})\n`}}module=e.nmd(module)
563
+ var n,o=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r)
564
+ var o=Object.getOwnPropertyDescriptor(t,r)
565
+ o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||(n=function(e){return n=Object.getOwnPropertyNames||function(e){var t=[]
566
+ for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r)
567
+ return t},n(e)},function(e){if(e&&e.__esModule)return e
568
+ var t={}
569
+ if(null!=e)for(var r=n(e),i=0;i<r.length;i++)"default"!==r[i]&&o(t,e,r[i])
570
+ return s(t,e),t})
571
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.textconv=r
572
+ const a=e(91943),c=i(e(70857)),l=i(e(16928)),u=e(36018),d=e(3517)
573
+ if(e.c[e.s]===module){const e=process.argv[2]
574
+ e||(process.stderr.write("usage: textconv <file>\n"),process.exit(2)),r(e).then((e=>process.stdout.write(e)),(()=>process.stdout.write("(AlchemyLab: text conversion failed)\n")))}}},s={}
575
+ e.m=o,e.c=s,r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,e.t=function(n,o){if(1&o&&(n=this(n)),8&o)return n
476
576
  if("object"==typeof n&&n){if(4&o&&n.__esModule)return n
477
577
  if(16&o&&"function"==typeof n.then)return n}var s=Object.create(null)
478
578
  e.r(s)
479
- var a={}
579
+ var i={}
480
580
  t=t||[null,r({}),r([]),r(r)]
481
- for(var i=2&o&&n;"object"==typeof i&&!~t.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach((e=>a[e]=()=>n[e]))
482
- return a.default=()=>n,e.d(s,a),s},e.d=(exports,t)=>{for(var r in t)e.o(t,r)&&!e.o(exports,r)&&Object.defineProperty(exports,r,{enumerable:!0,get:t[r]})},e.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e.r=exports=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports,"__esModule",{value:!0})},e.nmd=module=>(module.paths=[],module.children||(module.children=[]),module)
483
- var s=e(e.s=15845)
484
- module.exports=s})()
581
+ for(var a=2&o&&n;"object"==typeof a&&!~t.indexOf(a);a=r(a))Object.getOwnPropertyNames(a).forEach((e=>i[e]=()=>n[e]))
582
+ return i.default=()=>n,e.d(s,i),s},e.d=(exports,t)=>{for(var r in t)e.o(t,r)&&!e.o(exports,r)&&Object.defineProperty(exports,r,{enumerable:!0,get:t[r]})},e.f={},e.e=t=>Promise.all(Object.keys(e.f).reduce(((r,n)=>(e.f[n](t,r),r)),[])),e.u=e=>e+".js",e.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e.r=exports=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports,"__esModule",{value:!0})},e.nmd=module=>(module.paths=[],module.children||(module.children=[]),module),n={830:1},e.f.require=t=>{n[t]||(t=>{var r=t.modules,o=t.ids,s=t.runtime
583
+ for(var i in r)e.o(r,i)&&(e.m[i]=r[i])
584
+ s&&s(e)
585
+ for(var a=0;a<o.length;a++)n[o[a]]=1})(require("./"+e.u(t)))}
586
+ var i=e(e.s=95900)
587
+ module.exports=i})()