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