alchemylab 2.0.2 → 2.1.1

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,48 +1,97 @@
1
1
  (()=>{"use strict"
2
- function e(t){var r=s[t]
3
- if(void 0!==r)return r.exports
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={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
2
+ function e(n){const o=r[n]
3
+ if(void 0!==o)return o.exports
4
+ const module=r[n]={id:n,loaded:!1,exports:{}}
5
+ return t[n].call(module.exports,module,module.exports,e),module.loaded=!0,module.exports}var t={22604(e,exports,t){function r(e){if("number"==typeof e)return e
6
+ const t=String(e??"").trim().toLowerCase().match(/^(\d+(?:\.\d+)?)\s*([bkmg]?)b?$/)
7
+ if(!t)return NaN
8
+ const r={"":1,b:1,k:1024,m:1048576,g:1024**3}[t[2]]
9
+ 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 ${u(r)} of memory, and the boxes already running on this machine have ${u(t)} of the ${u(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
10
+ try{return process.kill(e,0),!0}catch(e){return"EPERM"===e?.code}}function s(e,t,r=o){return!(!e||!d.has(t)||r(Number(e)))}async function a(){const e=await(0,l.docker)(["ps","-a","--filter","label=alchemy.project","--filter","status=running","--filter","status=created","--format",'{{.ID}}\t{{.Label "alchemy.owner"}}\t{{.Label "alchemy.sandbox"}}'],l.DOCKER_OP_TIMEOUT_MS)
11
+ if(0!==e.exit)return 0
12
+ const t=[]
13
+ for(const r of e.stdout.split("\n").map(e=>e.trim()).filter(Boolean)){const[e,n="",o=""]=r.split("\t")
14
+ s(n,o)?await(0,l.docker)(["rm","-f","-v",e],l.DOCKER_OP_TIMEOUT_MS):t.push(e)}if(!t.length)return 0
15
+ const r=await(0,l.docker)(["inspect","--format","{{.HostConfig.Memory}}",...t],l.DOCKER_OP_TIMEOUT_MS)
16
+ return 0!==r.exit?0:r.stdout.split("\n").map(e=>Number(e.trim())||0).reduce((e,t)=>e+t,0)}function i(e){const t=[]
17
+ for(const r of String(e||"").split(",").map(e=>e.trim()).filter(Boolean)){const e=r.match(/^(\d+)(?:-(\d+))?$/)
18
+ if(!e)continue
19
+ const n=Number(e[1]),o=void 0!==e[2]?Number(e[2]):n
20
+ for(let e=n;e<=o&&e-n<1024;e++)t.push(e)}return t}function c(e,t,r){const n=new Array(e).fill(0)
21
+ for(const t of r)for(const r of i(t))r<e&&n[r]++
22
+ return[...n.keys()].sort((e,t)=>n[e]-n[t]||e-t).slice(0,t).sort((e,t)=>e-t)}exports.TS=void 0,exports.withAdmission=function(e,t,o){const s=p.then(async()=>{const s=await async function(e,t,o=12e4,s=5e3){try{const i=r(e),c=await async function(){const e=r(process.env.ALCHEMY_BOX_MEMORY_BUDGET)
23
+ if(e>0)return e
24
+ const t=await(0,l.docker)(["info","--format","{{.MemTotal}}"],l.DOCKER_OP_TIMEOUT_MS)
25
+ return 0===t.exit?Number(t.stdout.trim()):NaN}(),u=Date.now()+o
26
+ for(;;){const e=n(c,await a(),i,t)
27
+ if(!e||Date.now()>=u)return e
28
+ await new Promise(e=>setTimeout(e,s))}}catch{return null}}(e,t)
29
+ return s?{refused:s}:{value:await o()}})
30
+ return p=s.catch(()=>{}),s},exports.pickCores=async function(e,t,r="standard"){try{const n=await(0,l.docker)(["info","--format","{{.NCPU}}"],l.DOCKER_OP_TIMEOUT_MS),o=Number(n.stdout.trim())
31
+ if(!(o>0))return{cpus:e??t}
32
+ const s=await(0,l.docker)(["ps","-a","-q","--filter","label=alchemy.project","--filter","status=running","--filter","status=created"],l.DOCKER_OP_TIMEOUT_MS),a=0===s.exit?s.stdout.split("\n").map(e=>e.trim()).filter(Boolean):[],u=a.length?(await(0,l.docker)(["inspect","--format","{{.HostConfig.CpusetCpus}}",...a],l.DOCKER_OP_TIMEOUT_MS)).stdout.split("\n").map(e=>e.trim()).filter(Boolean):[],d=new Set(u.flatMap(i).filter(e=>e<o)),p=e??function(e,t,r){return"light"===e?2:"heavy"===e?Math.max(2,Math.min(t-2,r-2)):function(e,t){const r=Math.max(2,Math.floor(e/2))
33
+ return Math.min(r,Math.max(2,Math.ceil(t/2)))}(t,r)}(r,o,o-d.size),f=Math.max(1,Math.ceil(p))
34
+ return f>=o?{cpus:p}:{cpus:p,cpuset:c(o,f,u).join(",")}}catch{return{cpus:e??t}}}
35
+ const l=t(81618),u=e=>`${(e/1024**3).toFixed(1)} GB`,d=new Set(["experiment","rung1","deps","egress-proxy","service"])
36
+ let p=Promise.resolve()
37
+ exports.TS=["light","standard","heavy"]},52429(e,exports,t){exports.ContainerRunner=void 0
38
+ const r=t(81618),n=t(22604),o=t(11895),s=t(26166),a=t(2566),i=t(90695),c=t(61260)
39
+ 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"}
40
+ const t=e.image??this.image,s={}
41
+ let l=Date.now()
42
+ const u=e=>{const t=Date.now()
43
+ s[e]=(s[e]??0)+(t-l),l=t},d=await(0,r.ensureImage)(t)
44
+ if(u("image"),d)return{steps:[],ok:!1,error:d}
45
+ const p=await(0,n.withAdmission)(this.resources.memory??"1g","check",async()=>{const{cpus:s,cpuset:a}=await(0,n.pickCores)(this.resources.cpus,o.DEFAULT_CPUS,this.resources.size)
46
+ let c=await(0,r.docker)(this.createArgs(e,t,!0,a,s),r.DOCKER_OP_TIMEOUT_MS)
47
+ if(0!==c.exit)return{error:c.spawnError??`docker create failed: ${(c.stderr||String(c.exit)).trim()}`}
48
+ let l=c.stdout.trim()
49
+ if(u("create"),await(0,i.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,a,s),r.DOCKER_OP_TIMEOUT_MS),0!==c.exit)return{error:c.spawnError??`docker create failed: ${(c.stderr||String(c.exit)).trim()}`}
50
+ l=c.stdout.trim()}return u("scratch"),{id:l}})
51
+ if("refused"in p)return{steps:[],ok:!1,error:p.refused}
52
+ if("error"in p.value)return{steps:[],ok:!1,error:p.value.error}
53
+ const f=p.value.id
54
+ try{const t=await(0,r.docker)(["start",f],r.DOCKER_OP_TIMEOUT_MS)
55
+ if(u("start"),0!==t.exit)return{steps:[],ok:!1,error:`docker start failed: ${(t.stderr||String(t.exit)).trim()}`}
56
+ const n=[]
57
+ let o=await(0,c.readOomKills)(f)??0
58
+ for(const t of e.steps){const s=Date.now(),i=await(0,r.dockerKeepingEnds)(["exec","-e",`${a.RUN_ENV_VAR}=${(0,a.withShellInit)(e.shellInit,t.run)}`,f,"/bin/sh","-c",a.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
59
+ null!=u&&(o=u)
60
+ const p=d>0?`${i.stderr}${i.stderr&&!i.stderr.endsWith("\n")?"\n":""}${(0,c.oomNote)(d,this.resources.memory??"1g")}\n`:i.stderr
61
+ n.push({run:t.run,exit:i.exit,stdout:i.stdout,stderr:p,ms:l,timedOut:i.timedOut})}return u("commands"),{steps:n,ok:n.every(e=>0===e.exit),phaseMs:s}}finally{const e=Date.now()
62
+ await(0,r.docker)(["rm","-f","-v",f],r.DOCKER_OP_TIMEOUT_MS),s.remove=Date.now()-e}}createArgs(e,t,r,n,a){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`])
63
+ return["create","--label","alchemy.sandbox=rung1",...(0,s.hardenedCreateArgs)({network:this.network,user:"1000:1000",...r?{}:{extraTmpfs:[(0,i.scratchTmpfsArg)(512)]},shmSizeMb:this.resources.shmSizeMb,memory:this.resources.memory??"1g",cpus:a??this.resources.cpus??o.DEFAULT_CPUS,cpuset:n,pidsLimit:this.resources.pidsLimit??512}),...r?i.SCRATCH_VOLUME_ARGS:[],...c,"-v",`${e.worktreePath}:/work:rw`,...l,...u,...d,"-w","/work",t,"tail","-f","/dev/null"]}}},81618(e,exports,t){function r(e){if("create"!==e[0]&&"run"!==e[0])return e
13
64
  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})
65
+ e.forEach((r,n)=>{"--label"===e[n-1]&&t.add(r.split("=")[0])})
66
+ const r=Object.entries({"alchemy.owner":String(process.pid),...c.getStore()??{}}).filter(([e])=>!t.has(e)).flatMap(([e,t])=>["--label",`${e}=${t.replace(/[\r\n]/g," ").slice(0,200)}`])
67
+ return r.length?[e[0],...r,...e.slice(1)]:e}function n(e,t){return new Promise(n=>{(0,o.execFile)("docker",r(e),{timeout:t,killSignal:"SIGKILL",maxBuffer:33554432,windowsHide:!0},(e,t,r)=>{if(!e)return void n({exit:0,stdout:t,stderr:r,timedOut:!1})
17
68
  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"})
69
+ if("ENOENT"===o.code)return void n({exit:-1,stdout:t??"",stderr:r??"",timedOut:!1,spawnError:"docker CLI not found on PATH"})
19
70
  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)
71
+ n({exit:a,stdout:t??"",stderr:r??"",timedOut:s})})})}exports.P=exports.DOCKER_OP_TIMEOUT_MS=void 0,exports.dockerKeepingEnds=function(e,t,n=524288){return new Promise(s=>{const a=new i.EndsKeeper(n),c=new i.EndsKeeper(n)
72
+ let l=!1,u=!1
73
+ const d=(0,o.spawn)("docker",r(e),{windowsHide:!0}),p=setTimeout(()=>{l=!0,d.kill("SIGKILL")},t)
74
+ d.stdout.setEncoding("utf8").on("data",e=>a.push(e)),d.stderr.setEncoding("utf8").on("data",e=>c.push(e))
75
+ const f=e=>{u||(u=!0,clearTimeout(p),s(e))}
76
+ d.on("error",e=>f({exit:-1,stdout:a.text(),stderr:c.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:a.text(),stderr:c.text(),timedOut:l}))})},exports.docker=n,exports.ensureImage=async function(e){const t=(0,a.localRecipeFor)(e)
77
+ if(t)return(0,a.ensureLocalImage)(t)
78
+ const r=await n(["image","inspect",e],exports.DOCKER_OP_TIMEOUT_MS)
24
79
  if(r.spawnError)return r.spawnError
25
80
  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.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??{}
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, 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.'}
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",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"
37
- 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`
38
- exports.OFFICE_BOX_DOCKERFILE=function(){const e=Buffer.from(o).toString("base64"),t=Buffer.from(exports.NOBREAK_DIGIT_HYPHEN_LUA).toString("base64")
39
- 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}},9956:module=>{module.exports=require("undici")},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"})
40
- if(!n.ok)throw new Error(n.error)
41
- return n.bytes}async function r(e){const r=(0,u.documentKindFor)(e)
42
- if(!r)return`(AlchemyLab: no text form for ${e.split(".").pop()} files)\n`
43
- try{const n=await(0,u.extractDocumentText)(new Uint8Array(await(0,i.readFile)(e)),r,{convert:t})
44
- 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)
45
- var n,o=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r)
81
+ const o=await n(["pull",e],exports.P)
82
+ return 0!==o.exit?`docker pull ${e} failed: ${(o.stderr||String(o.exit)).trim()}`:void 0}
83
+ const o=t(31421),s=t(16698),a=t(83129),i=t(88196),c=new s.AsyncLocalStorage
84
+ exports.DOCKER_OP_TIMEOUT_MS=6e4,exports.P=3e5},26166(e,exports){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"]:[]]}},83129(e,exports,t){function r(e){const t=m.get(e.image)
85
+ if(t)return t.work
86
+ const r=(async()=>{const t=await(0,u.docker)(["image","inspect","--format",`{{ index .Config.Labels "${p}" }}`,e.image],u.DOCKER_OP_TIMEOUT_MS)
87
+ if(t.spawnError)return t.spawnError
88
+ if(0===t.exit&&t.stdout.trim()===e.recipeHash)return
89
+ const r=i.mkdtempSync(l.join(c.tmpdir(),"alchemylab-image-"))
90
+ try{i.writeFileSync(l.join(r,"Dockerfile"),e.dockerfile)
91
+ const t=await(0,u.docker)(["build","--label",`${p}=${e.recipeHash}`,"-t",e.image,r],exports.BUILD_TIMEOUT_MS)
92
+ if(0!==t.exit){const r=(t.stderr||t.stdout||"").trim().split("\n").slice(-12).join("\n")
93
+ return`building ${e.image} failed${t.timedOut?" (timed out)":""}: ${r}`}return}finally{i.rmSync(r,{recursive:!0,force:!0})}})()
94
+ 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)
46
95
  var o=Object.getOwnPropertyDescriptor(t,r)
47
96
  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=[]
48
97
  for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r)
@@ -50,14 +99,38 @@ return t},n(e)},function(e){if(e&&e.__esModule)return e
50
99
  var t={}
51
100
  if(null!=e)for(var r=n(e),a=0;a<r.length;a++)"default"!==r[a]&&o(t,e,r[a])
52
101
  return s(t,e),t})
53
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.textconv=r
54
- const i=e(91943),c=a(e(70857)),l=a(e(16928)),u=e(98335),d=e(24716)
55
- if(e.c[e.s]===module){const e=process.argv[2]
56
- 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,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()
57
- return r?`${r} && ${t}`:t},exports.carriesOwnShellInit=function(e){return/(^|[;&|]\s*|\s-lc\s*['"]?\s*)(\.|source)\s+\S+\s*(&&|;)/.test(e)}
58
- var r=t(52039)
59
- 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}})},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()
60
- return b[t].includes(r)}function n(e,t){const r=e=>`'${e.replace(/'/g,"'\\''")}'`,n=`/work/in/${e}`,o=e.replace(/\.[^.]+$/,"")
102
+ 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)
103
+ if(t)return{state:"building",since:t.since}
104
+ const r=await(0,u.docker)(["image","inspect","--format",`{{ index .Config.Labels "${p}" }}`,e.image],u.DOCKER_OP_TIMEOUT_MS)
105
+ if(r.spawnError)return{state:"no-docker",error:"Docker is not installed on this machine (no docker command)"}
106
+ if(0===r.exit&&r.stdout.trim()===e.recipeHash)return{state:"ready"}
107
+ 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"}
108
+ const n=h.get(e.image)
109
+ 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()}}
110
+ const i=a(t(73024)),c=a(t(48161)),l=a(t(76760)),u=t(81618),d=t(44853),p="dev.alchemylab.recipe"
111
+ exports.BUILD_TIMEOUT_MS=15e5
112
+ const f=[{image:d.OFFICE_BOX_IMAGE,dockerfile:d.OFFICE_BOX_DOCKERFILE,recipeHash:d.OFFICE_BOX_RECIPE_HASH}],m=new Map,h=new Map},61260(e,exports,t){exports.H=void 0,exports.readOomKills=async function(e){const t=await(0,r.docker)(["exec",e,"cat","/sys/fs/cgroup/memory.events"],n)
113
+ if(0===t.exit){const e=/^oom_kill (\d+)/m.exec(t.stdout)
114
+ if(e)return Number(e[1])}const o=await(0,r.docker)(["exec",e,"cat","/sys/fs/cgroup/memory/memory.oom_control"],n)
115
+ if(0===o.exit){const e=/^oom_kill (\d+)/m.exec(o.stdout)
116
+ 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.H} ]; 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)
117
+ 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).`}
118
+ const r=t(81618),n=5e3
119
+ exports.H="/tmp/.alchemy_live.png"},11895(e,exports,t){exports.DEFAULT_CPUS=void 0,t(81618),t(22604),t(26166),t(2566),t(90695),t(61260),exports.DEFAULT_CPUS=4},90695(e,exports,t){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)
120
+ return 0===o.exit?null:o.spawnError??((o.stderr||"").trim()||`chown exited ${o.exit}`)}
121
+ const r=t(81618)
122
+ exports.SCRATCH_VOLUME_ARGS=["--mount","type=volume,dst=/scratch"]},2566(e,exports,t){exports.RUN_ENV_VAR=exports.RUN_FROM_ENV=void 0,exports.withShellInit=function(e,t){const r=(e??"").trim()
123
+ return r?`${r} && ${t}`:t}
124
+ var r=t(44600)
125
+ 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}})},12661(e,exports){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)
126
+ 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"}]
127
+ const t=new Map(exports.DOCUMENT_FORMATS.flatMap(e=>e.extensions.map(t=>[t,e])))},44853(e,exports,t){exports.ENVIRONMENT_PRESETS=exports.VP=exports.OFFICE_BOX_RECIPE_HASH=exports.OFFICE_BOX_DOCKERFILE=exports.dw=exports.OT=exports.OFFICE_BOX_IMAGE=exports.m4=void 0
128
+ const r=t(76982)
129
+ exports.m4=1,exports.OFFICE_BOX_IMAGE=`alchemylab-local/office-box:v${exports.m4}`,exports.OT="/scratch/render",exports.dw="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"
130
+ 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.OT}} and prints its path, one per line.\nset -e\nout="\${RENDER_OUT:-${exports.OT}}"\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`
131
+ exports.OFFICE_BOX_DOCKERFILE=function(){const e=Buffer.from(o).toString("base64"),t=Buffer.from(exports.dw).toString("base64")
132
+ 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.VP={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.VP}},3517(e,exports,t){function r(e,t){const r=d.extname(e).slice(1).toLowerCase()
133
+ return h[t].includes(r)}function n(e,t){const r=e=>`'${e.replace(/'/g,"'\\''")}'`,n=`/work/in/${e}`,o=e.replace(/\.[^.]+$/,"")
61
134
  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)
62
135
  var o=Object.getOwnPropertyDescriptor(t,r)
63
136
  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=[]
@@ -71,26 +144,26 @@ var s
71
144
  if(!r(o,e.to))return{ok:!1,error:`${d.extname(o)||"this file"} cannot be turned into ${e.to.toUpperCase()}`}
72
145
  if(e.bytes.length>exports.MAX_RENDER_INPUT_BYTES)return{ok:!1,error:`file is over ${exports.MAX_RENDER_INPUT_BYTES/1048576} MB`}
73
146
  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}`)
74
- try{return{ok:!0,bytes:await l.promises.readFile(i),cached:!0}}catch{}const b=t.image??"wait"
75
- if("wait"!==b){const e=(0,f.localRecipeFor)(m.OFFICE_BOX_IMAGE),t=await(0,f.localImageState)(e)
147
+ try{return{ok:!0,bytes:await l.promises.readFile(i),cached:!0}}catch{}const h=t.image??"wait"
148
+ if("wait"!==h){const e=(0,f.localRecipeFor)(m.OFFICE_BOX_IMAGE),t=await(0,f.localImageState)(e)
76
149
  if("no-docker"===t.state)return{ok:!1,error:t.error,unavailable:!0}
77
- if("building"===t.state)return{ok:!1,error:g,preparing:!0,since:t.since}
78
- if("failed"===t.state&&Date.now()-t.at<w)return{ok:!1,error:`building the office renderer failed: ${t.error.split("\n").slice(-3).join(" ")}`}
79
- if("ready"!==t.state){if("present-only"===b)return{ok:!1,error:"the office renderer is not built on this machine yet",unavailable:!0}
150
+ if("building"===t.state)return{ok:!1,error:w,preparing:!0,since:t.since}
151
+ if("failed"===t.state&&Date.now()-t.at<12e4)return{ok:!1,error:`building the office renderer failed: ${t.error.split("\n").slice(-3).join(" ")}`}
152
+ if("ready"!==t.state){if("present-only"===h)return{ok:!1,error:"the office renderer is not built on this machine yet",unavailable:!0}
80
153
  const{since:t}=(0,f.startLocalImageBuild)(e)
81
- return{ok:!1,error:g,preparing:!0,since:t}}}const x=await l.promises.mkdtemp(d.join(u.tmpdir(),"alchemylab-render-"))
82
- 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})
83
- 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)}]})
154
+ return{ok:!1,error:w,preparing:!0,since:t}}}const b=await l.promises.mkdtemp(d.join(u.tmpdir(),"alchemylab-render-"))
155
+ try{await l.promises.mkdir(d.join(b,"in")),await l.promises.mkdir(d.join(b,"out")),await l.promises.chmod(b,493),await l.promises.chmod(d.join(b,"in"),493),await l.promises.chmod(d.join(b,"out"),511),await l.promises.writeFile(d.join(b,"in",o),e.bytes,{mode:420})
156
+ const r=new p.ContainerRunner({image:m.OFFICE_BOX_IMAGE,stepTimeoutMs:18e4,resources:{memory:"3g",shmSizeMb:256}}),s=await r.run({worktreePath:b,image:m.OFFICE_BOX_IMAGE,env:{HOME:"/scratch"},steps:[{run:n(o,e.to)}]})
84
157
  if(!s.ok){const e=s.steps[0]
85
- 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}`)))
158
+ 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(b,"out"))).find(t=>t.toLowerCase().endsWith(`.${e.to}`))
86
159
  if(!a)return{ok:!1,error:`no ${e.to.toUpperCase()} was produced`}
87
- const c=await l.promises.readFile(d.join(x,"out",a))
88
- 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})}}
89
- const c=t(76982),l=t(79896),u=i(t(70857)),d=i(t(16928)),p=t(64936),f=t(69968),m=t(7740)
160
+ const c=await l.promises.readFile(d.join(b,"out",a))
161
+ 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(b,{recursive:!0,force:!0})}}
162
+ const c=t(76982),l=t(79896),u=i(t(70857)),d=i(t(16928)),p=t(52429),f=t(83129),m=t(44853)
90
163
  exports.MAX_RENDER_INPUT_BYTES=52428800
91
- 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"]}
164
+ const h={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"]}
92
165
  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"}
93
- 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")},35317:module=>{module.exports=require("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")
166
+ const w="the office renderer is being built on this machine (first use only, usually a few minutes)"},43701(e,exports){function t(e){return e<128?String.fromCharCode(e):"\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"[e-128]??""}exports.rtfToText=function(e){const o="string"==typeof e?e:Buffer.from(e).toString("latin1")
94
167
  if(!/^\s*\{\s*\\rtf/i.test(o))throw new Error("not an RTF file (it does not start with {\\rtf)")
95
168
  const s=[],a=[{skip:!1,skipChars:0}],i=()=>a[a.length-1],c=e=>{i().skip||s.push(e)}
96
169
  for(let e=0;e<o.length;e++){const s=o[e]
@@ -99,102 +172,32 @@ continue}if("}"===s){a.length>1&&a.pop()
99
172
  continue}if("\r"===s||"\n"===s)continue
100
173
  if("\\"!==s){if(i().skipChars>0){i().skipChars--
101
174
  continue}c(s)
102
- continue}const u=/^\\([a-zA-Z]+)(-?\d+)? ?/.exec(o.slice(e))
103
- if(!u){const s=o[e+1]
104
- if("*"===s){const r=/^\\\*\\([a-zA-Z]+)/.exec(o.slice(e))
105
- r&&!t.has(r[1])||(i().skip=!0),e+=1
106
- continue}if("'"===s){const t=o.slice(e+2,e+4)
175
+ continue}const l=/^\\([a-zA-Z]+)(-?\d+)? ?/.exec(o.slice(e))
176
+ if(!l){const s=o[e+1]
177
+ if("*"===s){const t=/^\\\*\\([a-zA-Z]+)/.exec(o.slice(e))
178
+ t&&!r.has(t[1])||(i().skip=!0),e+=1
179
+ continue}if("'"===s){const r=o.slice(e+2,e+4)
107
180
  if(e+=3,i().skipChars>0){i().skipChars--
108
- continue}c((l=parseInt(t,16)||0)<128?String.fromCharCode(l):n[l-128]??"")
109
- continue}if(void 0!==s&&void 0!==r[s]){c(r[s]),e+=1
181
+ continue}c(t(parseInt(r,16)||0))
182
+ continue}if(void 0!==s&&void 0!==n[s]){c(n[s]),e+=1
110
183
  continue}e+=1
111
- continue}const[d,p,f]=u
112
- e+=d.length-1
113
- const m=void 0===f?void 0:Number(f)
114
- if(t.has(p))i().skip=!0
115
- 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
116
- else{const e=i().skipChars>0
117
- 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
118
- 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*$/,"")
119
- return e.includes(" | ")?`| ${t} |`:t})).join("\n").trim()}
120
- 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"},52039:(e,exports,t)=>{async function r(e,r={}){const{spawn:n}=await Promise.resolve().then(t.t.bind(t,35317,23))
121
- 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}),a=[],i=[]
122
- let c=!1,l=!1
123
- const u=e=>{if(s.pid)try{o?s.kill(e):process.kill(-s.pid,e)}catch{}}
124
- let d,p
125
- 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=>{a.push(e),r.onChunk?.("stdout",e)})),s.stderr?.on("data",(e=>{i.push(e),r.onChunk?.("stderr",e)}))
126
- const f=e=>{l||(l=!0,p&&clearTimeout(p),d&&clearTimeout(d),t({stdout:Buffer.concat(a).toString("utf-8"),stderr:Buffer.concat(i).toString("utf-8"),exitCode:e,timedOut:c}))}
127
- 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,...a]=e.split(" "),i=(0,n.spawn)(s,a,{cwd:t.cwd||process.cwd(),stdio:["pipe","pipe","pipe"]})
128
- let c="",l=""
129
- i.stdout?.on("data",(e=>{c+=e.toString()})),i.stderr?.on("data",(e=>{l+=e.toString()})),i.on("close",(e=>{r({stdout:c,stderr:l,exitCode:e||0})})),i.on("error",(t=>{o(new Error(`Command failed: ${e}\nError: ${t.message}`))})),t.timeout&&setTimeout((()=>{i.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(603).then(t.bind(t,53603)),a=s(),i=(new Date).toISOString(),c=n.cwd??process.cwd()
130
- let l
131
- fetch(`${a}/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:i,logPath:o.logPath,timeoutMs:n.timeoutMs}),signal:AbortSignal.timeout(2e3)}).catch((()=>{}))
132
- try{l=await r(e,n)}catch(e){throw fetch(`${a}/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(`${a}/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}
133
- const n=t(35317)
134
- 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"},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)
135
- return 0===o.exit?null:o.spawnError??((o.stderr||"").trim()||`chown exited ${o.exit}`)}
136
- const r=t(6175)
137
- exports.SCRATCH_VOLUME_ARGS=["--mount","type=volume,dst=/scratch"]},64936:(e,exports,t)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.ContainerRunner=void 0
138
- const r=t(6175),n=t(53157),o=t(16603),s=t(64264),a=t(4703)
139
- 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"}
140
- const t=e.image??this.image,n={}
141
- let i=Date.now()
142
- const c=e=>{const t=Date.now()
143
- n[e]=(n[e]??0)+(t-i),i=t},l=await(0,r.ensureImage)(t)
144
- if(c("image"),l)return{steps:[],ok:!1,error:l}
145
- let u=await(0,r.docker)(this.createArgs(e,t,!0),r.DOCKER_OP_TIMEOUT_MS)
146
- if(0!==u.exit)return{steps:[],ok:!1,error:u.spawnError??`docker create failed: ${(u.stderr||String(u.exit)).trim()}`}
147
- let d=u.stdout.trim()
148
- 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()}`}
149
- d=u.stdout.trim()}c("scratch")
150
- try{const t=await(0,r.docker)(["start",d],r.DOCKER_OP_TIMEOUT_MS)
151
- if(c("start"),0!==t.exit)return{steps:[],ok:!1,error:`docker start failed: ${(t.stderr||String(t.exit)).trim()}`}
152
- const s=[]
153
- let i=await(0,a.readOomKills)(d)??0
154
- for(const t of e.steps){const n=Date.now(),c=await(0,r.docker)(["exec","-e",`${o.RUN_ENV_VAR}=${(0,o.withShellInit)(e.shellInit,t.run)}`,d,"/bin/sh","-c",o.RUN_FROM_ENV],t.timeoutMs??this.stepTimeoutMs),l=Date.now()-n,u=await(0,a.readOomKills)(d),p=null!=u?Math.max(0,u-i):0
155
- null!=u&&(i=u)
156
- const f=p>0?`${c.stderr}${c.stderr&&!c.stderr.endsWith("\n")?"\n":""}${(0,a.oomNote)(p,this.resources.memory??"1g")}\n`:c.stderr
157
- 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()
158
- 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`]))
159
- 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)
160
- if(t)return t.work
161
- const r=(async()=>{const t=await(0,u.docker)(["image","inspect","--format",`{{ index .Config.Labels "${p}" }}`,e.image],u.DOCKER_OP_TIMEOUT_MS)
162
- if(t.spawnError)return t.spawnError
163
- if(0===t.exit&&t.stdout.trim()===e.recipeHash)return
164
- const r=i.mkdtempSync(l.join(c.tmpdir(),"alchemylab-image-"))
165
- try{i.writeFileSync(l.join(r,"Dockerfile"),e.dockerfile)
166
- const t=await(0,u.docker)(["build","--label",`${p}=${e.recipeHash}`,"-t",e.image,r],exports.BUILD_TIMEOUT_MS)
167
- if(0!==t.exit){const r=(t.stderr||t.stdout||"").trim().split("\n").slice(-12).join("\n")
168
- return`building ${e.image} failed${t.timedOut?" (timed out)":""}: ${r}`}return}finally{i.rmSync(r,{recursive:!0,force:!0})}})()
169
- 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)
170
- var o=Object.getOwnPropertyDescriptor(t,r)
171
- 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=[]
172
- for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r)
173
- return t},n(e)},function(e){if(e&&e.__esModule)return e
174
- var t={}
175
- if(null!=e)for(var r=n(e),a=0;a<r.length;a++)"default"!==r[a]&&o(t,e,r[a])
176
- return s(t,e),t})
177
- 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)
178
- if(t)return{state:"building",since:t.since}
179
- const r=await(0,u.docker)(["image","inspect","--format",`{{ index .Config.Labels "${p}" }}`,e.image],u.DOCKER_OP_TIMEOUT_MS)
180
- if(r.spawnError)return{state:"no-docker",error:"Docker is not installed on this machine (no docker command)"}
181
- if(0===r.exit&&r.stdout.trim()===e.recipeHash)return{state:"ready"}
182
- 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"}
183
- const n=h.get(e.image)
184
- 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()}}
185
- const i=a(t(73024)),c=a(t(48161)),l=a(t(76760)),u=t(6175),d=t(7740),p="dev.alchemylab.recipe"
186
- exports.BUILD_TIMEOUT_MS=15e5
187
- 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)
188
- 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"}]
189
- 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)
190
- 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()
184
+ continue}const[u,d,p]=l
185
+ e+=u.length-1
186
+ const f=void 0===p?void 0:Number(p)
187
+ if(r.has(d))i().skip=!0
188
+ else{if("u"===d){const e=i().skipChars>0
189
+ i().skipChars=Math.max(0,a[a.length-1].ucSkip??1),e||void 0===f||c(String.fromCodePoint(f<0?f+65536:f))
190
+ continue}"uc"!==d?"cell"!==d&&"nestcell"!==d?"row"!==d&&"nestrow"!==d?void 0===n[d]||c(n[d]):c("\n"):c(" | "):i().ucSkip=f??1}}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*$/,"")
191
+ return e.includes(" | ")?`| ${t} |`:t}).join("\n").trim()}
192
+ const r=new Set(["fonttbl","colortbl","stylesheet","listtable","listoverridetable","revtbl","rsidtbl","generator","info","pict","object","themedata","colorschememapping","latentstyles","datastore","xmlnstbl","filetbl","upr","fldinst","nonshppict","shppict","panose"]),n={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","-":"",_:"-","{":"{","}":"}","\\":"\\"}},36018(e,exports,t){async function r(e){return(await Promise.resolve().then(()=>t.t(88194,23))).default.loadAsync(e)}async function n(e,t){const r=e.file(t)
193
+ 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()
191
194
  if("amp"===r)return"&"
192
195
  if("lt"===r)return"<"
193
196
  if("gt"===r)return">"
194
197
  if("quot"===r)return'"'
195
198
  if("apos"===r)return"'"
196
199
  const n=r.startsWith("#x")?parseInt(r.slice(2),16):parseInt(r.slice(1),10)
197
- return Number.isFinite(n)?String.fromCodePoint(n):e}))}function s(e,t){const r=new RegExp(`(?:^|\\s)${t.replace(":","\\:")}="([^"]*)"`).exec(e)
200
+ return Number.isFinite(n)?String.fromCodePoint(n):e})}function s(e,t){const r=new RegExp(`(?:^|\\s)${t.replace(":","\\:")}="([^"]*)"`).exec(e)
198
201
  return r?o(r[1]):void 0}function a(e,t){const r=new Map
199
202
  if(!e)return r
200
203
  for(const n of e.matchAll(/<Relationship\b([^>]*)\/?>/g)){const e=s(n[1],"Id"),o=s(n[1],"Target")
@@ -205,19 +208,19 @@ return{path:`${t}/_rels/${e.slice(e.lastIndexOf("/")+1)}.rels`,dir:t}}function l
205
208
  return r?`[image: ${r}]`:"[image]"}async function u(e,t){const r=new Map
206
209
  for(const[o,s]of t){if(!/charts\/chart[^/]*\.xml$/.test(s))continue
207
210
  const t=await n(e,s)
208
- 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))]
211
+ 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=>C[e[1]]).filter(Boolean))]
209
212
  "bar"===r[0]&&/<barDir val="col"/.test(t)&&(r[0]="column")
210
- 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""
211
- const t=/<f>([\s\S]*?)<\/f>/.exec(e)?.[1],r=[...e.matchAll(/<v>([\s\S]*?)<\/v>/g)].map((e=>o(e[1])))
213
+ 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""
214
+ const t=/<f>([\s\S]*?)<\/f>/.exec(e)?.[1],r=[...e.matchAll(/<v>([\s\S]*?)<\/v>/g)].map(e=>o(e[1]))
212
215
  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])
213
- return`${n||"series"}${a?`: ${a}`:""}${i?` by ${i}`:""}`}))
216
+ return`${n||"series"}${a?`: ${a}`:""}${i?` by ${i}`:""}`})
214
217
  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=[]
215
218
  let a=null,i="",c=!1,u=!1,d=null,p=0
216
219
  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
217
- for(const m of e.matchAll(f)){const[,e,f,h,b,w]=m
218
- if("mc:Fallback"===f){b||(p+=e?-1:1)
220
+ for(const m of e.matchAll(f)){const[,e,f,h,w,b]=m
221
+ if("mc:Fallback"===f){w||(p+=e?-1:1)
219
222
  continue}if(p>0)continue
220
- if(void 0!==w){u&&a&&a.push(o(w))
223
+ if(void 0!==b){u&&a&&a.push(o(b))
221
224
  continue}const g=n[n.length-1]
222
225
  if(e)switch(f){case"w:drawing":{if(!d)break
223
226
  const e=d.chart??l(d.descr,d.name)
@@ -235,9 +238,9 @@ case"w:tr":g?.row&&(g.rows.push(g.row),g.row=null)
235
238
  break
236
239
  case"w:tbl":{const e=n.pop()
237
240
  if(!e)break
238
- const t=e.rows.map((e=>`| ${e.map((e=>e.replace(/\|/g,"\\|"))).join(" | ")} |`)),o=n[n.length-1]
241
+ const t=e.rows.map(e=>`| ${e.map(e=>e.replace(/\|/g,"\\|")).join(" | ")} |`),o=n[n.length-1]
239
242
  o?.cell?o.cell.push(t.join(" ")):r.push(...t,"")
240
- break}}else switch(f){case"w:drawing":b||(d={})
243
+ break}}else switch(f){case"w:drawing":w||(d={})
241
244
  break
242
245
  case"wp:docPr":d&&(d.name=s(h,"name"),d.descr=s(h,"descr"))
243
246
  break
@@ -251,7 +254,7 @@ case"w:pStyle":i=s(h,"w:val")??""
251
254
  break
252
255
  case"w:numPr":c=!0
253
256
  break
254
- case"w:t":b||(u=!0)
257
+ case"w:t":w||(u=!0)
255
258
  break
256
259
  case"w:tab":a?.push("\t")
257
260
  break
@@ -269,32 +272,28 @@ const i=p(o),d=c(t),f=await u(e,a(await n(e,d.path),d.dir))
269
272
  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}`:""
270
273
  if(n){r.push(`${(f.get(n)??"[chart]").replace(/\]$/,`${a}]`)}`)
271
274
  continue}const i=/<pic>[\s\S]*?<cNvPr\b([^>]*)\/?>/.exec(t)
272
- i&&r.push(l(s(i[1],"descr"),s(i[1],"name")).replace(/\]$/,`${a}]`))}}return r}function h(e){if(!e)return[]
273
- const t=[]
274
- for(const r of e.matchAll(/<si\b[^>]*>([\s\S]*?)<\/si>/g)){const e=[]
275
- for(const t of r[1].matchAll(/<t\b[^>]*>([\s\S]*?)<\/t>/g))e.push(o(t[1]))
276
- t.push(e.join(""))}return t}function b(e){const t=/^[A-Z]+/i.exec(e)?.[0].toUpperCase()??"A"
275
+ i&&r.push(l(s(i[1],"descr"),s(i[1],"name")).replace(/\]$/,`${a}]`))}}return r}function h(e){const t=/^[A-Z]+/i.exec(e)?.[0].toUpperCase()??"A"
277
276
  let r=0
278
277
  for(const e of t)r=26*r+(e.charCodeAt(0)-64)
279
278
  return r-1}function w(e){let t=""
280
279
  for(let r=e+1;r>0;r=Math.floor((r-1)/26))t=String.fromCharCode(65+(r-1)%26)+t
281
- return t}function g(e,t){const r=[]
280
+ return t}function b(e,t){const r=[]
282
281
  let n=0,a=!1
283
- for(const i of e.matchAll(/<row\b([^>]*?)(?:\/>|>([\s\S]*?)<\/row>)/g)){if(r.length>=T){a=!0
282
+ for(const i of e.matchAll(/<row\b([^>]*?)(?:\/>|>([\s\S]*?)<\/row>)/g)){if(r.length>=S){a=!0
284
283
  break}const e=i[2]??"",c=[]
285
284
  let l=0
286
- for(const r of e.matchAll(/<c\b([^>]*?)(?:\/>|>([\s\S]*?)<\/c>)/g)){const e=s(r[1],"r"),n=e?b(e):l
285
+ for(const r of e.matchAll(/<c\b([^>]*?)(?:\/>|>([\s\S]*?)<\/c>)/g)){const e=s(r[1],"r"),n=e?h(e):l
287
286
  l=n+1
288
287
  const a=s(r[1],"t"),i=r[2]??"",u=/<f\b[^>]*>([\s\S]*?)<\/f>/.exec(i)?.[1]
289
288
  let d=""
290
- if("inlineStr"===a)d=[...i.matchAll(/<t\b[^>]*>([\s\S]*?)<\/t>/g)].map((e=>o(e[1]))).join("")
289
+ if("inlineStr"===a)d=[...i.matchAll(/<t\b[^>]*>([\s\S]*?)<\/t>/g)].map(e=>o(e[1])).join("")
291
290
  else{const e=/<v\b[^>]*>([\s\S]*?)<\/v>/.exec(i)?.[1]
292
- 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)
291
+ 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:g(r,n),truncated:a}}function g(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 x(e,t){const r=[],n=p(e)
293
292
  for(const e of n.matchAll(/<pic\b[^>]*>[\s\S]*?<\/pic>|<graphicFrame\b[^>]*>[\s\S]*?<\/graphicFrame>/g)){const n=e[0]
294
293
  if(/^<pic\b/.test(n)){const e=/<cNvPr\b([^>]*)\/?>/.exec(n)?.[1]??""
295
294
  r.push(l(s(e,"descr"),s(e,"name")))
296
295
  continue}const o=/<chart\b[^>]*r:id="([^"]+)"/.exec(n)?.[1]
297
- o&&r.push(t.get(o)??"[chart]")}return r}function E(e){const t=[]
296
+ o&&r.push(t.get(o)??"[chart]")}return r}function _(e){const t=[]
298
297
  for(const r of e.matchAll(/<a:p\b[^>]*>([\s\S]*?)<\/a:p>/g)){const e=[]
299
298
  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")
300
299
  const n=e.join("").trim()
@@ -304,61 +303,60 @@ const c=new Map
304
303
  for(const e of Object.keys(s.files)){const t=/^(.+)\/content\.xml$/.exec(e)?.[1]
305
304
  if(!t)continue
306
305
  const r=await n(s,e)
307
- r&&/<chart:chart\b/.test(r)&&c.set(t,O(r))}return{xml:i.split(/<office:body\b/)[1]??i,objects:c}}function v(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 O(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]
306
+ r&&/<chart:chart\b/.test(r)&&c.set(t,$(r))}return{xml:i.split(/<office:body\b/)[1]??i,objects:c}}function v(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){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]
308
307
  if(a)for(const e of a.matchAll(/<table:table-row\b[^>]*>([\s\S]*?)<\/table:table-row>/g)){const t=[]
309
- 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),P)
308
+ 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),256)
310
309
  for(let r=0;r<n;r++)t.push(e)}n.push(t)}const i=e=>{const t=/^\$?([A-Z]+)\$?(\d+)$/.exec(e)
311
- return t?{col:b(t[1]),row:Number(t[2])-1}:null},c=e=>{if(!e)return""
312
- const t=e.split(":").map((e=>({table:e.slice(0,e.lastIndexOf(".")).replace(/^'(.*)'$/,"$1"),ref:e.slice(e.lastIndexOf(".")+1)})))
310
+ return t?{col:h(t[1]),row:Number(t[2])-1}:null},c=e=>{if(!e)return""
311
+ const t=e.split(":").map(e=>({table:e.slice(0,e.lastIndexOf(".")).replace(/^'(.*)'$/,"$1"),ref:e.slice(e.lastIndexOf(".")+1)}))
313
312
  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
314
313
  if(!e||!r)return""
315
314
  const o=[]
316
315
  for(let t=e.row;t<=r.row;t++)for(let s=e.col;s<=r.col;s++)o.push(n[t]?.[s]??"")
317
- return`${o.slice(0,8).join(", ")}${o.length>8?`, ... (${o.length})`:""}`}const r=t.map((e=>e.ref.replace(/\$/g,"")))
318
- 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"))
319
- return`${c(s(e[1],"chart:label-cell-address"))||"series"}${t?`: ${t}`:""}${l?` by ${l}`:""}`}))
320
- return`[chart: ${D[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,"")
321
- return r?`${r}!${n}`:n})).join(":")))}function y(e,t,r){switch(e){case"text:tab":return r.push("\t"),!0
316
+ return`${o.slice(0,8).join(", ")}${o.length>8?`, ... (${o.length})`:""}`}const r=t.map(e=>e.ref.replace(/\$/g,""))
317
+ 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"))
318
+ return`${c(s(e[1],"chart:label-cell-address"))||"series"}${t?`: ${t}`:""}${l?` by ${l}`:""}`})
319
+ return`[chart: ${I[t]??t}${r?` "${r}"`:""}${u.length?`; ${u.join("; ")}`:""}]`}function y(e,t,r){switch(e){case"text:tab":return r.push("\t"),!0
322
320
  case"text:line-break":return r.push("\n"),!0
323
321
  case"text:s":return r.push(" ".repeat(Math.min(100,Number(s(t,"text:c")??1)||1))),!0
324
- default:return!1}}function M(e,t=new Map){const r=[],n=[],a=new L
322
+ default:return!1}}function E(e,t=new Map){const r=[],n=[],a=new R
325
323
  let i=0,c=0,l=null,u=null
326
- for(const d of e.matchAll(j)){const[,e,p,f,m,h]=d
324
+ for(const d of e.matchAll(T)){const[,e,p,f,m,h]=d
327
325
  if(void 0!==h){if(c)continue
328
326
  u&&l?l[u]=(l[u]??"")+o(h):a.push(o(h))
329
- continue}if(N.has(p)){m||(c+=e?-1:1)
327
+ continue}if(A.has(p)){m||(c+=e?-1:1)
330
328
  continue}if(c)continue
331
- const b=n[n.length-1]
329
+ const w=n[n.length-1]
332
330
  if(e)switch(p){case"svg:title":case"svg:desc":u=null
333
331
  break
334
332
  case"draw:frame":{const e=l?v(l,t):null
335
333
  if(l=null,!e)break
336
- a.current?a.pushSpaced(e):b?.cell?b.cell.push(e):r.push(e)
334
+ a.current?a.pushSpaced(e):w?.cell?w.cell.push(e):r.push(e)
337
335
  break}case"text:p":case"text:h":{const e=a.close()
338
336
  if(!e)break
339
- if(b?.cell){e.plain&&b.cell.push(e.plain)
337
+ if(w?.cell){e.plain&&w.cell.push(e.plain)
340
338
  break}if(!e.line){r.length&&""!==r[r.length-1]&&r.push("")
341
339
  break}r.push(e.line)
342
340
  break}case"text:list-item":i=Math.max(0,i-1)
343
341
  break
344
- case"table:table-cell":case"table:covered-table-cell":b?.cell&&b.row&&(b.row.push(b.cell.join(" ")),b.cell=null)
342
+ case"table:table-cell":case"table:covered-table-cell":w?.cell&&w.row&&(w.row.push(w.cell.join(" ")),w.cell=null)
345
343
  break
346
- case"table:table-row":b?.row&&(b.rows.push(b.row),b.row=null)
344
+ case"table:table-row":w?.row&&(w.rows.push(w.row),w.row=null)
347
345
  break
348
346
  case"table:table":{const e=n.pop()
349
347
  if(!e)break
350
- const t=e.rows.map((e=>`| ${e.map((e=>e.replace(/\|/g,"\\|"))).join(" | ")} |`)),o=n[n.length-1]
348
+ const t=e.rows.map(e=>`| ${e.map(e=>e.replace(/\|/g,"\\|")).join(" | ")} |`),o=n[n.length-1]
351
349
  o?.cell?o.cell.push(t.join(" ")):r.push(...t,"")
352
350
  break}}else{if(y(p,f,a))continue
353
- 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)
351
+ switch(p){case"text:p":case"text:h":m?!w?.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)
354
352
  break
355
353
  case"text:list-item":m||i++
356
354
  break
357
355
  case"table:table":m||n.push({rows:[],row:null,cell:null})
358
356
  break
359
- case"table:table-row":b&&!m&&(b.row=[])
357
+ case"table:table-row":w&&!m&&(w.row=[])
360
358
  break
361
- case"table:table-cell":case"table:covered-table-cell":b&&(m?b.row?.push(""):b.cell=[])
359
+ case"table:table-cell":case"table:covered-table-cell":w&&(m?w.row?.push(""):w.cell=[])
362
360
  break
363
361
  case"draw:frame":m||(l={name:s(f,"draw:name")})
364
362
  break
@@ -366,16 +364,57 @@ case"draw:image":l&&(l.image=!0)
366
364
  break
367
365
  case"draw:object":case"draw:object-ole":l&&(l.object=!0,l.href=s(f,"xlink:href"))
368
366
  break
369
- 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=[]
367
+ 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()}exports.bi=void 0,exports.documentKindFor=function(e){const t=(0,O.formatFor)(e)
368
+ return t?.text?t.kind:void 0},exports.extractDocumentText=async function e(i,c,l={}){if(i.byteLength>exports.bi)throw new Error(`file is ${(i.byteLength/1048576).toFixed(1)} MB; text extraction stops at ${exports.bi/1048576} MB`)
369
+ const d=(0,O.formatOfKind)(c).textVia
370
+ if(d){if(!l.convert)throw new Error(`.${c} files are read by converting them in the office box, which is not reachable from here`)
371
+ const t=await e(await l.convert(i,c,d),d)
372
+ return{...t,kind:c,note:`Converted from .${c} to .${d} in the office box first. ${t.note??""}`.trim()}}switch(c){case"pdf":return async function(e){const r=await Promise.resolve().then(()=>t.t(88891,23)),{getDocumentProxy:n,extractText:o}=r?.default??r,s=await n(new Uint8Array(e),{isEvalSupported:!1})
373
+ 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())
374
+ 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?.(()=>{}))}}(i)
375
+ case"docx":return async function(e){const t=await r(e),o=await n(t,"word/document.xml")
376
+ if(!o)throw new Error("not a Word document (word/document.xml is missing)")
377
+ 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."}}(i)
378
+ case"xlsx":return async function(e){const t=await r(e),i=await n(t,"xl/workbook.xml")
379
+ if(!i)throw new Error("not an Excel workbook (xl/workbook.xml is missing)")
380
+ const c=a(await n(t,"xl/_rels/workbook.xml.rels"),"xl"),l=function(e){if(!e)return[]
381
+ const t=[]
382
+ for(const r of e.matchAll(/<si\b[^>]*>([\s\S]*?)<\/si>/g)){const e=[]
383
+ for(const t of r[1].matchAll(/<t\b[^>]*>([\s\S]*?)<\/t>/g))e.push(o(t[1]))
384
+ t.push(e.join(""))}return t}(await n(t,"xl/sharedStrings.xml")),u=[]
385
+ let d=!1,p=0
386
+ for(const e of i.matchAll(/<sheet\b([^>]*)\/?>/g)){const r=s(e[1],"name")??`Sheet ${p+1}`,o=s(e[1],"r:id"),a=o?c.get(o):void 0,i=a?await n(t,a):void 0
387
+ if(p++,!i){u.push(`## Sheet: ${r}\n(empty)`)
388
+ continue}const{text:f,truncated:h}=b(i,l)
389
+ d=d||h
390
+ const w=await m(t,a)
391
+ u.push(`## Sheet: ${r}\n${f||"(empty)"}${w.length?`\n\n${w.join("\n")}`:""}`)}return{kind:"xlsx",text:u.join("\n\n"),units:p,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."+(d?" Sheets over 5000 rows are cut off.":"")}}(i)
392
+ case"pptx":return async function(e){const t=await r(e),o=await n(t,"ppt/presentation.xml")
393
+ if(!o)throw new Error("not a PowerPoint deck (ppt/presentation.xml is missing)")
394
+ const i=a(await n(t,"ppt/_rels/presentation.xml.rels"),"ppt")
395
+ let c=[...o.matchAll(/<p:sldId\b([^>]*)\/?>/g)].map(e=>{const t=s(e[1],"r:id")
396
+ return t?i.get(t):void 0}).filter(e=>!!e)
397
+ 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])))
398
+ const l=[]
399
+ for(let e=0;e<c.length;e++){const r=c[e],o=await n(t,r),s=o?_(o):[],i=r.slice(0,r.lastIndexOf("/")),d=r.slice(r.lastIndexOf("/")+1),p=a(await n(t,`${i}/_rels/${d}.rels`),i)
400
+ o&&s.push(...x(o,await u(t,p)))
401
+ const f=[...p.values()].find(e=>/notesSlide\d*\.xml$/.test(e)),m=f?await n(t,f):void 0,h=m?_(m).filter(e=>!/^(\d+|<number>)$/.test(e)):[]
402
+ let w=`## Slide ${e+1}\n${s.join("\n")||"(no text)"}`
403
+ h.length&&(w+=`\n\nNotes:\n${h.join("\n")}`),l.push(w)}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."}}(i)
404
+ case"odt":return async function(e){const{xml:t,objects:r}=await k(e,"application/vnd.oasis.opendocument.text","text document")
405
+ return{kind:"odt",text:E(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."}}(i)
406
+ case"ods":return async function(e){const{xml:t,objects:r}=await k(e,"application/vnd.oasis.opendocument.spreadsheet","spreadsheet"),{sheets:n,truncated:a}=function(e,t=new Map){const r=[]
370
407
  let n=!1,a=null,i=null,c=null,l=null,u=null,d=0,p=!1
371
- for(const f of e.matchAll(j)){const[,e,m,h,b,w]=f
372
- if(void 0!==w){if(d)continue
373
- u&&l?l[u]=(l[u]??"")+o(w):c&&p&&c.parts.push(o(w))
374
- continue}if(N.has(m)){b||(d+=e?-1:1)
408
+ for(const f of e.matchAll(T)){const[,e,m,h,w,b]=f
409
+ if(void 0!==b){if(d)continue
410
+ u&&l?l[u]=(l[u]??"")+o(b):c&&p&&c.parts.push(o(b))
411
+ continue}if(A.has(m)){w||(d+=e?-1:1)
375
412
  continue}if(d)continue
376
- const g=()=>{if(!c||!i)return
413
+ const x=()=>{if(!c||!i)return
377
414
  let e=c.parts.join("").trim()||c.value||""
378
- if(c.formula&&(e=`${e}${e?" ":""}(=${$(c.formula)})`),e)for(let t=0;t<Math.min(c.repeat,P);t++)i.cells[i.col+t]=e.replace(/[\t\r\n]+/g," ")
415
+ if(c.formula&&(e=`${e}${e?" ":""}(=${t=c.formula,t.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,"")
416
+ return r?`${r}!${n}`:n}).join(":"))})`),e)for(let t=0;t<Math.min(c.repeat,256);t++)i.cells[i.col+t]=e.replace(/[\t\r\n]+/g," ")
417
+ var t
379
418
  i.col+=c.repeat,c=null}
380
419
  if(e)switch(m){case"svg:title":case"svg:desc":u=null
381
420
  break
@@ -383,36 +422,38 @@ case"draw:frame":{const e=l?v(l,t):null
383
422
  l=null,e&&a&&a.figures.push(e)
384
423
  break}case"text:p":p=!1
385
424
  break
386
- case"table:table-cell":case"table:covered-table-cell":g()
425
+ case"table:table-cell":case"table:covered-table-cell":x()
387
426
  break
388
427
  case"table:table-row":if(!i||!a)break
389
- if(i.cells.some((e=>void 0!==e))){for(let e=0;e<Math.min(i.repeat,F);e++){if(a.rows.length>=T){n=!0
428
+ if(i.cells.some(e=>void 0!==e)){for(let e=0;e<Math.min(i.repeat,50);e++){if(a.rows.length>=S){n=!0
390
429
  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
391
430
  break
392
431
  case"table:table":if(!a)break
393
- 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})
432
+ r.push({name:a.name,text:g(a.rows,a.width),figures:a.figures}),a=null}else switch(m){case"table:table":w||(a={name:s(h,"table:name")??`Sheet ${r.length+1}`,rows:[],width:0,figures:[],rowIndex:0})
394
433
  break
395
434
  case"table:table-row":{const e=Math.max(1,Number(s(h,"table:number-rows-repeated")??1)||1)
396
- b?a&&(a.rowIndex+=e):i={cells:[],col:0,repeat:e}
435
+ w?a&&(a.rowIndex+=e):i={cells:[],col:0,repeat:e}
397
436
  break}case"table:table-cell":case"table:covered-table-cell":if(!i)break
398
- 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()
437
+ 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")},w&&x()
399
438
  break
400
- case"text:p":c&&!b&&(c.parts.length&&c.parts.push(" "),p=!0)
439
+ case"text:p":c&&!w&&(c.parts.length&&c.parts.push(" "),p=!0)
401
440
  break
402
441
  case"text:s":case"text:tab":case"text:line-break":c&&p&&c.parts.push(" ")
403
442
  break
404
- case"draw:frame":b||(l={name:s(h,"draw:name")})
443
+ case"draw:frame":w||(l={name:s(h,"draw:name")})
405
444
  break
406
445
  case"draw:image":l&&(l.image=!0)
407
446
  break
408
447
  case"draw:object":case"draw:object-ole":l&&(l.object=!0,l.href=s(h,"xlink:href"))
409
448
  break
410
- case"svg:title":case"svg:desc":!b&&l&&(u="svg:title"===m?"title":"desc")}}return{sheets:r,truncated:n}}function I(e,t=new Map){const r=[]
449
+ case"svg:title":case"svg:desc":!w&&l&&(u="svg:title"===m?"title":"desc")}}return{sheets:r,truncated:n}}(t,r)
450
+ 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."+(a?" Sheets over 5000 rows are cut off.":"")}}(i)
451
+ case"odp":return async function(e){const{xml:t,objects:r}=await k(e,"application/vnd.oasis.opendocument.presentation","presentation"),n=function(e,t=new Map){const r=[]
411
452
  let n=null
412
- const a=new L
453
+ const a=new R
413
454
  let i=0,c=0,l=null,u=null
414
- for(const d of e.matchAll(j)){const[,e,p,f,m,h]=d
415
- if(void 0===h){if(N.has(p))m||(c+=e?-1:1)
455
+ for(const d of e.matchAll(T)){const[,e,p,f,m,h]=d
456
+ if(void 0===h){if(A.has(p))m||(c+=e?-1:1)
416
457
  else if(!c)if(e)switch(p){case"svg:title":case"svg:desc":u=null
417
458
  break
418
459
  case"text:p":case"text:h":{const e=a.close()
@@ -438,67 +479,68 @@ break
438
479
  case"draw:object":case"draw:object-ole":l&&(l.object=!0,l.href=s(f,"xlink:href"))
439
480
  break
440
481
  case"svg:title":case"svg:desc":!m&&l&&(u="svg:title"===p?"title":"desc")}}}else{if(c)continue
441
- 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,C.formatFor)(e)
442
- 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`)
443
- const l=(0,C.formatOfKind)(i).textVia
444
- 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`)
445
- const t=await e(await c.convert(o,i,l),l)
446
- 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})
447
- 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()))
448
- 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)
449
- case"docx":return async function(e){const t=await r(e),o=await n(t,"word/document.xml")
450
- if(!o)throw new Error("not a Word document (word/document.xml is missing)")
451
- 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)
452
- case"xlsx":return async function(e){const t=await r(e),o=await n(t,"xl/workbook.xml")
453
- if(!o)throw new Error("not an Excel workbook (xl/workbook.xml is missing)")
454
- const i=a(await n(t,"xl/_rels/workbook.xml.rels"),"xl"),c=h(await n(t,"xl/sharedStrings.xml")),l=[]
455
- let u=!1,d=0
456
- 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
457
- if(d++,!p){l.push(`## Sheet: ${r}\n(empty)`)
458
- continue}const{text:f,truncated:h}=g(p,c)
459
- u=u||h
460
- const b=await m(t,a)
461
- 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 ${T} rows are cut off.`:"")}}(o)
462
- case"pptx":return async function(e){const t=await r(e),o=await n(t,"ppt/presentation.xml")
463
- if(!o)throw new Error("not a PowerPoint deck (ppt/presentation.xml is missing)")
464
- const i=a(await n(t,"ppt/_rels/presentation.xml.rels"),"ppt")
465
- let c=[...o.matchAll(/<p:sldId\b([^>]*)\/?>/g)].map((e=>{const t=s(e[1],"r:id")
466
- return t?i.get(t):void 0})).filter((e=>!!e))
467
- 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]))))
468
- const l=[]
469
- for(let e=0;e<c.length;e++){const r=c[e],o=await n(t,r),s=o?E(o):[],i=r.slice(0,r.lastIndexOf("/")),d=r.slice(r.lastIndexOf("/")+1),p=a(await n(t,`${i}/_rels/${d}.rels`),i)
470
- o&&s.push(..._(o,await u(t,p)))
471
- const f=[...p.values()].find((e=>/notesSlide\d*\.xml$/.test(e))),m=f?await n(t,f):void 0,h=m?E(m).filter((e=>!/^(\d+|<number>)$/.test(e))):[]
472
- let b=`## Slide ${e+1}\n${s.join("\n")||"(no text)"}`
473
- 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)
474
- case"odt":return async function(e){const{xml:t,objects:r}=await k(e,"application/vnd.oasis.opendocument.text","text document")
475
- 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)
476
- case"ods":return async function(e){const{xml:t,objects:r}=await k(e,"application/vnd.oasis.opendocument.spreadsheet","spreadsheet"),{sheets:n,truncated:o}=S(t,r)
477
- 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 ${T} rows are cut off.`:"")}}(o)
478
- case"odp":return async function(e){const{xml:t,objects:r}=await k(e,"application/vnd.oasis.opendocument.presentation","presentation"),n=I(t,r)
479
- 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)
480
- case"rtf":return{kind:"rtf",text:(0,R.rtfToText)(o),note:"Text, paragraphs and table rows; styling, pictures and layout are dropped. To see the pages, view_asset this path."}
481
- 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=E,exports.odfChartSummary=O,exports.odfFormula=$,exports.odtXmlToText=M,exports.odsXmlToText=S,exports.odpXmlToText=I
482
- const C=t(70610),R=t(50478)
483
- exports.MAX_DOCUMENT_BYTES=52428800
484
- const T=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"},j=/<(\/?)([A-Za-z][\w.-]*:[\w.-]+)\b([^>]*?)(\/?)>|([^<]+)/g,N=new Set(["text:note","office:annotation","text:tracked-changes","office:forms","text:sequence-decls"]),P=256,F=50,D={circle:"pie",ring:"doughnut"}
485
- 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
482
+ u&&l?l[u]=(l[u]??"")+o(h):a.push(o(h))}}return r}(t,r)
483
+ 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."}}(i)
484
+ case"rtf":return{kind:"rtf",text:(0,M.rtfToText)(i),note:"Text, paragraphs and table rows; styling, pictures and layout are dropped. To see the pages, view_asset this path."}
485
+ default:throw new Error(`no text form for .${c}`)}}
486
+ const O=t(12661),M=t(43701)
487
+ exports.bi=52428800
488
+ const S=5e3,C={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"},T=/<(\/?)([A-Za-z][\w.-]*:[\w.-]+)\b([^>]*?)(\/?)>|([^<]+)/g,A=new Set(["text:note","office:annotation","text:tracked-changes","office:forms","text:sequence-decls"]),I={circle:"pie",ring:"doughnut"}
489
+ class R{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
486
490
  if(!t)return
487
491
  const r=t[t.length-1]??""
488
492
  t.push(`${!r||/\s$/.test(r)?"":" "}${e} `)}close(){const e=this.stack.pop()
489
493
  if(!e)return null
490
494
  const t=e.parts.join("").replace(/[ \t]+\n/g,"\n").trim()
491
- 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:""}}}}},s={}
492
- 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
495
+ 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:""}}}},95900(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"})
496
+ if(!n.ok)throw new Error(n.error)
497
+ return n.bytes}async function r(e){const r=(0,u.documentKindFor)(e)
498
+ if(!r)return`(AlchemyLab: no text form for ${e.split(".").pop()} files)\n`
499
+ try{const n=await(0,u.extractDocumentText)(new Uint8Array(await(0,i.readFile)(e)),r,{convert:t})
500
+ 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)
501
+ var n,o=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r)
502
+ var o=Object.getOwnPropertyDescriptor(t,r)
503
+ 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=[]
504
+ for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r)
505
+ return t},n(e)},function(e){if(e&&e.__esModule)return e
506
+ var t={}
507
+ if(null!=e)for(var r=n(e),a=0;a<r.length;a++)"default"!==r[a]&&o(t,e,r[a])
508
+ return s(t,e),t})
509
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.textconv=r
510
+ const i=e(91943),c=a(e(70857)),l=a(e(16928)),u=e(36018),d=e(3517)
511
+ if(e.c[e.s]===module){const e=process.argv[2]
512
+ 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"))}},88196(e,exports){exports.EndsKeeper=void 0,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
513
+ 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}}},44600(e,exports,t){async function r(e,r={}){const{spawn:n}=await Promise.resolve().then(()=>t.t(35317,23))
514
+ 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}),a=[],i=[]
515
+ let c=!1,l=!1
516
+ const u=e=>{if(s.pid)try{o?s.kill(e):process.kill(-s.pid,e)}catch{}}
517
+ let d,p
518
+ 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=>{a.push(e),r.onChunk?.("stdout",e)}),s.stderr?.on("data",e=>{i.push(e),r.onChunk?.("stderr",e)})
519
+ const f=e=>{l||(l=!0,p&&clearTimeout(p),d&&clearTimeout(d),t({stdout:Buffer.concat(a).toString("utf-8"),stderr:Buffer.concat(i).toString("utf-8"),exitCode:e,timedOut:c}))}
520
+ 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,...a]=e.split(" "),i=(0,n.spawn)(s,a,{cwd:t.cwd||process.cwd(),stdio:["pipe","pipe","pipe"]})
521
+ let c="",l=""
522
+ i.stdout?.on("data",e=>{c+=e.toString()}),i.stderr?.on("data",e=>{l+=e.toString()}),i.on("close",e=>{r({stdout:c,stderr:l,exitCode:e||0})}),i.on("error",t=>{o(new Error(`Command failed: ${e}\nError: ${t.message}`))}),t.timeout&&setTimeout(()=>{i.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(79414)),a=s(),i=(new Date).toISOString(),c=n.cwd??process.cwd()
523
+ let l
524
+ fetch(`${a}/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:i,logPath:o.logPath,timeoutMs:n.timeoutMs}),signal:AbortSignal.timeout(2e3)}).catch(()=>{})
525
+ try{l=await r(e,n)}catch(e){throw fetch(`${a}/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(`${a}/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}
526
+ const n=t(35317)
527
+ 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"},88194(module){module.exports=require("jszip")},9956(module){module.exports=require("undici")},88891(module){module.exports=require("unpdf")},35317(module){module.exports=require("child_process")},76982(module){module.exports=require("crypto")},79896(module){module.exports=require("fs")},91943(module){module.exports=require("fs/promises")},16698(module){module.exports=require("node:async_hooks")},31421(module){module.exports=require("node:child_process")},73024(module){module.exports=require("node:fs")},48161(module){module.exports=require("node:os")},76760(module){module.exports=require("node:path")},70857(module){module.exports=require("os")},16928(module){module.exports=require("path")},2203(module){module.exports=require("stream")}}
528
+ const r={}
529
+ e.m=t,e.c=r,(()=>{const t=Object.getPrototypeOf
530
+ let r
531
+ e.t=function(n,o){if(1&o&&(n=this(n)),8&o)return n
493
532
  if("object"==typeof n&&n){if(4&o&&n.__esModule)return n
494
- if(16&o&&"function"==typeof n.then)return n}var s=Object.create(null)
533
+ if(16&o&&"function"==typeof n.then)return n}const s=Object.create(null)
495
534
  e.r(s)
496
- var a={}
497
- t=t||[null,r({}),r([]),r(r)]
498
- for(var i=2&o&&n;"object"==typeof i&&!~t.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach((e=>a[e]=()=>n[e]))
499
- 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.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
500
- for(var a in r)e.o(r,a)&&(e.m[a]=r[a])
535
+ const a={}
536
+ r=r||[null,t({}),t([]),t(t)]
537
+ for(var i=2&o&&n;("object"==typeof i||"function"==typeof i)&&!~r.indexOf(i);i=t(i))Object.getOwnPropertyNames(i).forEach(e=>a[e]=()=>n[e])
538
+ 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.f={},e.e=t=>{const r=[]
539
+ return e.f.require(t,r),Promise.all(r)},e.u=e=>e+".js",e.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e.r=exports=>{Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports,"__esModule",{value:!0})},e.nmd=module=>(module.paths=[],module.children||(module.children=[]),module),(()=>{const t={830:1}
540
+ e.f.require=r=>{if(!t[r]){const n=require("./"+e.u(r))
541
+ t[r]||(r=>{const n=r.modules,o=r.ids,s=r.runtime
542
+ for(var a in n)e.o(n,a)&&(e.m[a]=n[a])
501
543
  s&&s(e)
502
- for(var i=0;i<o.length;i++)n[o[i]]=1})(require("./"+e.u(t)))}
503
- var a=e(e.s=15845)
504
- module.exports=a})()
544
+ for(var i=0;i<o.length;i++)t[o[i]]=1})(n)}}})()
545
+ let n=e(e.s=95900)
546
+ module.exports=n})()