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