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