{"_id":"ai-evaluate","_rev":"13-ce9dc6910af41a919abc74358340ff9b","name":"ai-evaluate","dist-tags":{"latest":"2.4.0"},"versions":{"0.1.0":{"name":"ai-evaluate","version":"0.1.0","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@0.1.0","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"c475042faeec2c487c473a750a05d6445e7e6421","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-0.1.0.tgz","fileCount":42,"integrity":"sha512-d1S7lBHKsbdCXgO7mmqymi5v9AyhgLl5qaKBAiSFCzoH0sOG5o0nFI6hGrsCWzGyI94iC4OnQxI+5pWIU1AMIQ==","signatures":[{"sig":"MEUCIQCjusY/i0T6BRvrhB2nyARrJOOjPj9zt6ZlF1xyTgl9/QIgZs8ZIbmKveSqpUyGXpZoEwbiZURnJoWzl06E66St1s4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":523277},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.3","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.20.0","dependencies":{"rpc.do":"^0.1.0","capnweb":"^0.2.0","ai-tests":"workspace:*","ai-functions":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_0.1.0_1766232921737_0.04206194606438807","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"ai-evaluate","version":"2.0.1","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.0.1","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"ea3312522330cfc974c891667c329ce4b723ef2f","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.0.1.tgz","fileCount":30,"integrity":"sha512-Vf6OVUr8GPJot3xcGPiDQbpjOsWQMNXF4fYeR/EBIJ/ebQDnYQ0dknv/r6VG7wHRtk1PhH8Bxj6hGP/VKsNoBQ==","signatures":[{"sig":"MEYCIQDhnloqoiL2QGoX3z+dIFfXad4ngzr5ufhyekMWowRO9QIhAKKfhi2yWfE7ONpAi5LeH0yR5+SymTbRv6sxFmyCcOL+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":352004},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ac8efb4f619d42d0e969e231ab56ad6c41c497e8","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.3","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.20.0","dependencies":{"rpc.do":"^0.1.0","capnweb":"^0.2.0","ai-tests":"workspace:*","ai-functions":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.0.1_1766457081253_0.6060101847263719","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"ai-evaluate","version":"2.0.2","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.0.2","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"c8b951c5707fc47a6e87146a42f6dae31e45b71b","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.0.2.tgz","fileCount":30,"integrity":"sha512-S0n54y2gETg0zwT5CJPEd0LE7AN4yGBlEgOlUM1U4eIJwFdB7wkT7HZNPU0ARSU8qaLuSU0ZY+SA0BInMsMAWw==","signatures":[{"sig":"MEUCIQC+Ns6uV1qURcteVoliEkmfs/kmOc/OG9klfEM73PeA2wIgCL1qVWPxzbVyCkBzE3t+oXTDqZAvdvfm/mVVOxFZLNM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":352087},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ac8efb4f619d42d0e969e231ab56ad6c41c497e8","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.3","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.20.0","dependencies":{"rpc.do":"^0.1.0","capnweb":"^0.2.0","ai-tests":"2.0.2","ai-functions":"2.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.0.2_1766457363040_0.17751227828711058","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"ai-evaluate","version":"2.1.1","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.1.1","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"e1d38625dff75e8a8de2d80eb11a3d1ff390b53e","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.1.1.tgz","fileCount":39,"integrity":"sha512-wSupzlLCNK+z35rQXlzG6l0auobrGtcE3pZzKawM7/QcRWBrO/Di8Hodg6JWpcg8UCsY5yGmb/5mTACpkekUfw==","signatures":[{"sig":"MEQCIGH6L0j6Q6jjhfXZPfHYar1G5M0SYaObMQEyxtS0QEyTAiAshQXOMTj0teIz/wT4gdnCXRvgdFhSujDlmvnmFwe04w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":529416},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"7cdbc6f07c322c9ffb12042eb13f9f57b117061a","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.4","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.21.1","dependencies":{"capnweb":"^0.2.0","ai-tests":"2.1.1","ai-functions":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.1.1_1767964823022_0.8649054089539896","host":"s3://npm-registry-packages-npm-production"}},"2.1.3":{"name":"ai-evaluate","version":"2.1.3","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.1.3","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"8f855505e3cf0d80841dd18cf7f476288dce3c0d","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.1.3.tgz","fileCount":40,"integrity":"sha512-aJ0XBuAbIJa0zgmnpzx8GDB6EiyJCkxwwjTzjgGHLZPIwVKoZ+4cBjACh2ExloUa5ha45sN9GGqTk8tTM3L6BQ==","signatures":[{"sig":"MEYCIQCM+rC1h3aVO//DG3/SAEqtilh0zhY3Pt+4DpkjTXJ/twIhAMPimAF5fUg9eCp8UWUjEr8EbXcGnxxj8sHAJJZoofsP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":529156},"main":"dist/index.js","type":"module","_from":"file:ai-evaluate-2.1.3.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_resolved":"/private/var/folders/6_/2ksld9sd0zn2kvsnl7qrjz400000gn/T/ca3fc00490e56fcc908e3f345048595c/ai-evaluate-2.1.3.tgz","_integrity":"sha512-aJ0XBuAbIJa0zgmnpzx8GDB6EiyJCkxwwjTzjgGHLZPIwVKoZ+4cBjACh2ExloUa5ha45sN9GGqTk8tTM3L6BQ==","_npmVersion":"10.9.4","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.21.1","dependencies":{"capnweb":"^0.2.0","ai-tests":"2.1.3","ai-functions":"2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.1.3_1768242353640_0.9966261728834642","host":"s3://npm-registry-packages-npm-production"}},"2.1.4":{"name":"ai-evaluate","version":"2.1.4","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.1.4","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"b99dd7dadfda749b1f12e4c68f60ea6535fab893","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.1.4.tgz","fileCount":41,"integrity":"sha512-8vYIDcgADmStvNkmW1w/i2NQ22EYxL4VEQESqwHBnkGRTV/0r6it5fIkPtmELp4at5+9iz95HJ4PYIb70YDP0A==","signatures":[{"sig":"MEUCIQDrDVAUrCwH6ilCVyl1wPzciQXEROgtrLxezcmiaGT2UQIgSXv1ldzkVu5V+aq1Es+XqDoRN6UfFWf3tm5dXewhlGU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":530963},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8bf06bcb172436398cad513846819fe7b205f127","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.4","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.21.1","dependencies":{"capnweb":"^0.2.0","ai-tests":"workspace:*","ai-functions":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.1.4_1768312615253_0.9013560657650814","host":"s3://npm-registry-packages-npm-production"}},"2.1.5":{"name":"ai-evaluate","version":"2.1.5","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.1.5","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"31aa20a65dca2ef690c76470cc94f60822c5f765","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.1.5.tgz","fileCount":41,"integrity":"sha512-9qVTQK3IEQ9Vop2vwUh8KPJXYrUYJ2TCl9qTRTCV58egivi4qyRhziZUxgIgJyiY4JM5LWcuqkig2S3V5vt0Aw==","signatures":[{"sig":"MEQCIDtpLFe8fUVDw+0vUGj4oPzAA1W9sFRrvNGkNcSflqB7AiBZgMB84Rykr4NgDB2LuqwLE7erbLv9hv5umLf13txNvg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":530951},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"604b41bf52c754abc382899104d3c6aba3b9ddcb","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.4","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.21.1","dependencies":{"capnweb":"^0.2.0","ai-tests":"2.1.3","ai-functions":"2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.1.5_1768557406265_0.5203022984617123","host":"s3://npm-registry-packages-npm-production"}},"2.1.6":{"name":"ai-evaluate","version":"2.1.6","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.1.6","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"baf8ac0d7faa210174c315b4842485b7781b9501","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.1.6.tgz","fileCount":64,"integrity":"sha512-liauTp8OMX1rGtP3/Pe+1+xedhyk27/Fl8cOxL6/pAItOFmxBw9qF+kqWj3FjP40AcqtOKP6Qsdg30Eh6jvCaA==","signatures":[{"sig":"MEYCIQC9hq06E+hE1hdVQ7gEyXtjz66rxbbH6CAVC86XIQM3iwIhAImIqAyEvFasca+6IKngQmXpMkQmdsjuM7RR9sXvCwQ8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":604642},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./repl":{"types":"./dist/repl.d.ts","import":"./dist/repl.js"}},"gitHead":"5d69dfa61657ddd4ff06afa343482b107e9e746e","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.4","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.21.1","dependencies":{"capnweb":"^0.2.0","ai-tests":"2.1.3","ai-functions":"2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.1.6_1769342714532_0.8428922699503274","host":"s3://npm-registry-packages-npm-production"}},"2.1.7":{"name":"ai-evaluate","version":"2.1.7","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.1.7","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"b42d854c96b5952a58d523064b5ddd2fa440c611","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.1.7.tgz","fileCount":69,"integrity":"sha512-g7t4xaV5WddUw6hhWyyijGOEDFuhrx1VtYi3O9y4S9k6E3690f/M6Od6bA7Bi0tV6tkfc8s9rxMn/NwjE8XfJg==","signatures":[{"sig":"MEQCIBKf+MNLA19EtS7HPh7qHafXodMbw8HuywoHcwujBUQJAiAA5IsXsUNaGmAn9k/AmQuM/3V1+4fMLCMGV6d06b132A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":861216},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./repl":{"types":"./dist/repl.d.ts","import":"./dist/repl.js"}},"gitHead":"96bc3baf631aa3b2eeac0bc816285cec9197bf50","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.4","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.21.1","dependencies":{"capnweb":"^0.2.0","ai-tests":"2.1.3","ai-functions":"2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.1.7_1769351331968_0.5818140633732918","host":"s3://npm-registry-packages-npm-production"}},"2.1.8":{"name":"ai-evaluate","version":"2.1.8","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.1.8","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"a54f3c4bd274dd61270ec60a4fb0d968c723bd89","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.1.8.tgz","fileCount":110,"integrity":"sha512-lBPiX3laGqIB1k0fEfwITxyRFu7JAvjByq5C+wC9AI1Awb7/jnTW2ZXpoxBFLJ6eJd5pygJoEuk9592lTz1RxQ==","signatures":[{"sig":"MEUCIHxos733Pq+Vxd1KMoXM8knNhSohII3Xh4s9LrrYHE1uAiEA8hzwQx3dMk+o0ZXnMfKAtqPlWtxPBLRSjyAo0i3gQRA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1001106},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./repl":{"types":"./dist/repl.d.ts","import":"./dist/repl.js"}},"gitHead":"38c6166028c06975c36ef9540fac483cda02cfa5","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.4","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.21.1","dependencies":{"capnweb":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.1.8_1769385129421_0.861182563707229","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"ai-evaluate","version":"2.2.0","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.2.0","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"74fae22616a1985f7ce719114b5f7f5a734858df","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.2.0.tgz","fileCount":77,"integrity":"sha512-PEchqtYOhnOSCpX9gB7XsRXIFmMwVTYzsIewD06pc6S373MjwbhAfRPyFUG5tuLU9qM3Elvd237YSXPeOLsWew==","signatures":[{"sig":"MEUCIDkfT+jeTE0XtGv19RGjzI/FHvWF4gSLKjnJFWewxKCBAiEAm3KqTp5D88VqPFe+/j+b5LfvavUBxIeFsQTTF+TIpaw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":693629},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./repl":{"types":"./dist/repl.d.ts","import":"./dist/repl.js"},"./static":{"types":"./dist/static/index.d.ts","import":"./dist/static/index.js"},"./static/index.mjs":"./public/index.mjs","./static/capnweb.mjs":"./public/capnweb.mjs","./static/scaffold.mjs":"./public/scaffold.mjs"},"gitHead":"a19c6fb5b2a9013cc390a72f19aebae5e2816062","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest","build":"tsc -p tsconfig.json && npm run build:static","clean":"rm -rf dist public","typecheck":"tsc --noEmit","build:static":"npx tsx scripts/build-static.ts"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.4","description":"Secure code execution in sandboxed environments","directories":{},"_nodeVersion":"22.21.1","dependencies":{"capnweb":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.2.0_1769392529546_0.20064078455360157","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"ai-evaluate","version":"2.3.0","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.3.0","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"dist":{"shasum":"1000be3214829463addc4e38bd74c065587ae673","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.3.0.tgz","fileCount":73,"integrity":"sha512-ATfLMfVjDrdfquIFBLfGgZNwa6hax1r1Y1XIAbpyJ39VcJ9pEsELl8d0/Q94qjoGPEZvJ18d76xNbRt3P4gJew==","signatures":[{"sig":"MEUCIQDiDCN7UsCW7Bw5vwGdtODIZ6X6rZbAwbHUOaenlRoqvQIgZICcTsEFVl1C2uDyzhgMaT2nhoXznjgddSbQQFG5Fyc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550687},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./repl":{"types":"./dist/repl.d.ts","import":"./dist/repl.js"},"./static":{"types":"./dist/static/index.d.ts","import":"./dist/static/index.js"},"./static/index.mjs":"./public/index.mjs","./static/capnweb.mjs":"./public/capnweb.mjs","./static/scaffold.mjs":"./public/scaffold.mjs"},"gitHead":"78b420b1b63c647743df94a16a2ebe2e4c1e0223","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint .","test":"vitest run","build":"tsc -p tsconfig.json && npm run build:static","clean":"rm -rf dist public","typecheck":"tsc --noEmit","build:static":"npx tsx scripts/build-static.ts"},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"_npmVersion":"10.9.4","description":"Runtime sandboxed execution of AI-generated code in V8 isolates","directories":{},"_nodeVersion":"22.21.1","dependencies":{"capnweb":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-evaluate_2.3.0_1779796809099_0.5004678230272406","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"ai-evaluate","version":"2.4.0","description":"Runtime sandboxed execution of AI-generated code in V8 isolates","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"},"./node":{"import":"./dist/node.js","types":"./dist/node.d.ts"},"./repl":{"import":"./dist/repl.js","types":"./dist/repl.d.ts"},"./static":{"import":"./dist/static/index.js","types":"./dist/static/index.d.ts"},"./static/index.mjs":"./public/index.mjs","./static/capnweb.mjs":"./public/capnweb.mjs","./static/scaffold.mjs":"./public/scaffold.mjs"},"scripts":{"build":"tsc -p tsconfig.json && npm run build:static","build:static":"npx tsx scripts/build-static.ts","dev":"tsc -p tsconfig.json --watch","test":"vitest run","typecheck":"tsc --noEmit","lint":"eslint .","clean":"rm -rf dist public"},"dependencies":{"capnweb":"^0.2.0"},"devDependencies":{"@vitest/coverage-v8":"^2.1.0","tsx":"^4.7.0","vitest":"^2.1.0"},"optionalDependencies":{"esbuild":"^0.24.0","miniflare":"^3.20241106.0"},"keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"license":"MIT","_id":"ai-evaluate@2.4.0","gitHead":"e937c4231877ed215c704393b2f9f6a1996edd06","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-DssjJdthZT0ufrJYUTvWFDueybD9knbTY/62b0185/k+mMwKp4gL1tk6z/FhewpgVIkpQUdG+QFZJce4QrCVEA==","shasum":"2e9b861e8defa178d2da874125fd26f2cd9dc94c","tarball":"https://registry.npmjs.org/ai-evaluate/-/ai-evaluate-2.4.0.tgz","fileCount":73,"unpackedSize":551108,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICZh6KpAmI736m+72n4M3OFb3tShGMjpddsCncQrAnNfAiB8VPrX4c7H/kX0pWyY+XlDwG3OEHHF43ynXDiG3LYC6Q=="}]},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"directories":{},"maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-evaluate_2.4.0_1779806789117_0.8088321216298773"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-20T12:15:21.736Z","modified":"2026-05-26T14:46:29.389Z","0.1.0":"2025-12-20T12:15:21.903Z","2.0.1":"2025-12-23T02:31:21.470Z","2.0.2":"2025-12-23T02:36:03.193Z","2.1.1":"2026-01-09T13:20:23.180Z","2.1.3":"2026-01-12T18:25:53.797Z","2.1.4":"2026-01-13T13:56:55.404Z","2.1.5":"2026-01-16T09:56:46.401Z","2.1.6":"2026-01-25T12:05:14.689Z","2.1.7":"2026-01-25T14:28:52.205Z","2.1.8":"2026-01-25T23:52:09.609Z","2.2.0":"2026-01-26T01:55:29.728Z","2.3.0":"2026-05-26T12:00:09.260Z","2.4.0":"2026-05-26T14:46:29.272Z"},"license":"MIT","keywords":["ai","sandbox","evaluate","cloudflare","workers","miniflare","primitives"],"description":"Runtime sandboxed execution of AI-generated code in V8 isolates","maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"readme":"# ai-evaluate\n\n![Stability: Experimental](https://img.shields.io/badge/stability-experimental-red)\n\nRuntime sandboxed execution of AI-generated (or otherwise untrusted) code in V8 isolates, backed by Cloudflare Workers `worker_loaders` in production and Miniflare locally.\n\n## Lifecycle\n\n**Runtime (production).** `ai-evaluate` is for executing untrusted code while your application is serving real requests — agent-generated scripts, user-supplied snippets, dynamic tool implementations. Reach for it when you need to run code you didn't write at request time without exposing your host environment.\n\n## Not for\n\n- **Replacing your test runner.** Unit and integration tests should use [`ai-tests`](../ai-tests) plus `vitest`. `ai-evaluate` runs *inside* production; it isn't a vitest substitute.\n- **A/B testing variants under traffic.** Use [`ai-experiments`](../ai-experiments) for production traffic splitting and outcome measurement.\n- **Trusted, statically-known code.** If you wrote and shipped the code yourself, just call it directly — sandboxing has overhead.\n\n---\n\n**You need to run user code. But untrusted code is terrifying.**\n\nOne malicious snippet could crash your server, access your file system, or make unauthorized network requests. You've seen the horror stories. You know the risks.\n\nWhat if you could run any code with confidence?\n\n## The Solution\n\n`ai-evaluate` runs untrusted code in V8 isolates with zero access to your system. No file system. No network (by default). No risk.\n\n```typescript\n// Before: Dangerous eval\nconst result = eval(userCode) // Could do ANYTHING\n\n// After: Sandboxed execution\nimport { evaluate } from 'ai-evaluate'\n\nconst result = await evaluate({ script: userCode }, env)\n// Runs in isolated V8 context - your system is protected\n```\n\n## Quick Start\n\n### REST API (eval.workers.do)\n\nTry it now with curl:\n\n```bash\n# Simple script execution\ncurl -X POST https://eval.workers.do \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"script\": \"return 1 + 1\"}'\n# {\"success\":true,\"value\":2,\"logs\":[],\"duration\":2}\n\n# With module exports\ncurl -X POST https://eval.workers.do \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"module\": \"export const add = (a, b) => a + b\", \"script\": \"return add(2, 3)\"}'\n# {\"success\":true,\"value\":5,\"logs\":[],\"duration\":2}\n\n# With console output\ncurl -X POST https://eval.workers.do \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"script\": \"console.log(42); return 42\"}'\n# {\"success\":true,\"value\":42,\"logs\":[{\"level\":\"log\",\"message\":\"42\",...}],\"duration\":2}\n\n# With external imports (npm packages)\ncurl -X POST https://eval.workers.do \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"script\": \"return _.chunk([1, 2, 3, 4, 5, 6], 2)\", \"imports\": [\"lodash\"]}'\n# {\"success\":true,\"value\":[[1,2],[3,4],[5,6]],\"logs\":[],\"duration\":42}\n\n# With versioned imports\ncurl -X POST https://eval.workers.do \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"script\": \"return dayjs().format(\\\"YYYY-MM-DD\\\")\", \"imports\": [\"dayjs@1.11.10\"]}'\n# {\"success\":true,\"value\":\"2026-01-25\",\"logs\":[],\"duration\":35}\n```\n\n### Deploy Your Own\n\n```bash\ncd example\npnpm install\npnpm deploy\n```\n\nSee [`example/`](./example) for a complete working Worker.\n\n### Cloudflare Workers (Production)\n\n**1. Install**\n\n```bash\npnpm add ai-evaluate\n```\n\n**2. Configure wrangler.jsonc**\n\n> **Important**: Requires wrangler v4+ (`pnpm add -D wrangler@4`)\n\n```jsonc\n{\n  \"name\": \"my-worker\",\n  \"main\": \"src/index.ts\",\n  \"compatibility_date\": \"2026-01-01\",\n  \"worker_loaders\": [\n    { \"binding\": \"loader\" }\n  ]\n}\n```\n\n**3. Use in your Worker**\n\n```typescript\nimport { evaluate } from 'ai-evaluate'\n\nexport default {\n  async fetch(request: Request, env: Env) {\n    const result = await evaluate({ script: '1 + 1' }, env)\n    return Response.json(result)\n    // { success: true, value: 2, logs: [], duration: 5 }\n  }\n}\n\ninterface Env {\n  loader: unknown\n}\n```\n\n### Node.js / Local Development\n\nFor local development, import from the `/node` subpath which uses Miniflare:\n\n```bash\npnpm add ai-evaluate miniflare\n```\n\n```typescript\nimport { evaluate } from 'ai-evaluate/node'\n\nconst result = await evaluate({ script: '1 + 1' })\n// { success: true, value: 2, logs: [], duration: 50 }\n```\n\n## API Reference\n\n### evaluate(options, env?)\n\n```typescript\ninterface EvaluateOptions {\n  module?: string              // Module code with exports\n  tests?: string               // Vitest-style test code\n  script?: string              // Script to execute\n  timeout?: number             // Default: 5000ms, max: 60000ms\n  env?: Record<string, string> // Environment variables\n  sdk?: SDKConfig | boolean    // Enable $, db, ai globals\n  imports?: string[]           // External npm packages (see below)\n}\n```\n\n### External Imports\n\nThe `imports` option lets you use npm packages in your sandboxed code. Supports:\n\n```typescript\n// Bare package names (auto-resolved via esm.sh)\nimports: ['lodash', 'dayjs', 'uuid']\n\n// Versioned packages\nimports: ['lodash@4.17.21', 'dayjs@1.11.10']\n\n// Scoped packages\nimports: ['@faker-js/faker']\n\n// Full URLs (for custom CDNs)\nimports: ['https://esm.sh/lodash@4.17.21']\n```\n\nImported packages are available as globals matching their package name:\n- `lodash` → `_` (special case) and `lodash`\n- `dayjs` → `dayjs`\n- `uuid` → `uuid`\n\n```typescript\nconst result = await evaluate({\n  imports: ['lodash', 'dayjs'],\n  script: `\n    const chunks = _.chunk([1,2,3,4,5,6], 2)\n    const today = dayjs().format('YYYY-MM-DD')\n    return { chunks, today }\n  `\n}, env)\n\ninterface EvaluateResult {\n  success: boolean             // Execution succeeded\n  value?: unknown              // Script return value\n  logs: LogEntry[]             // Console output\n  testResults?: TestResults    // Test results if tests provided\n  error?: string               // Error message if failed\n  duration: number             // Execution time in ms\n}\n```\n\n### createEvaluator(env)\n\nBind to a Cloudflare Workers environment for cleaner syntax:\n\n```typescript\nimport { createEvaluator } from 'ai-evaluate'\n\nexport default {\n  async fetch(request, env) {\n    const sandbox = createEvaluator(env)\n    const result = await sandbox({ script: '1 + 1' })\n    return Response.json(result)\n  }\n}\n```\n\n## Usage Examples\n\n### Simple Script\n\n```typescript\nconst result = await evaluate({\n  script: `\n    const x = 10\n    const y = 20\n    return x + y\n  `\n}, env)\n// result.value === 30\n```\n\n### Module with Exports\n\n```typescript\nconst result = await evaluate({\n  module: `\n    export const greet = (name) => \\`Hello, \\${name}!\\`\n    export const sum = (...nums) => nums.reduce((a, b) => a + b, 0)\n  `,\n  script: `\n    console.log(greet('World'))\n    return sum(1, 2, 3, 4, 5)\n  `\n}, env)\n// result.value === 15\n// result.logs[0].message === 'Hello, World!'\n```\n\n### Testing User Code\n\n```typescript\nconst result = await evaluate({\n  module: `\n    export const isPrime = (n) => {\n      if (n < 2) return false\n      for (let i = 2; i <= Math.sqrt(n); i++) {\n        if (n % i === 0) return false\n      }\n      return true\n    }\n  `,\n  tests: `\n    describe('isPrime', () => {\n      it('returns false for numbers less than 2', () => {\n        expect(isPrime(0)).toBe(false)\n        expect(isPrime(1)).toBe(false)\n      })\n\n      it('returns true for prime numbers', () => {\n        expect(isPrime(2)).toBe(true)\n        expect(isPrime(17)).toBe(true)\n      })\n\n      it('returns false for composite numbers', () => {\n        expect(isPrime(4)).toBe(false)\n        expect(isPrime(100)).toBe(false)\n      })\n    })\n  `\n}, env)\n\n// result.testResults = { total: 3, passed: 3, failed: 0, ... }\n```\n\n## Test Framework\n\nFull vitest-compatible API with async support.\n\n### Test Structure\n\n```typescript\ndescribe('group', () => {\n  it('test name', () => { /* ... */ })\n  test('another test', () => { /* ... */ })\n  it.skip('skipped', () => { /* ... */ })\n  it.only('focused', () => { /* ... */ })\n})\n```\n\n### Async Tests\n\n```typescript\nit('async/await', async () => {\n  const result = await someAsyncFunction()\n  expect(result).toBe('expected')\n})\n```\n\n### Hooks\n\n```typescript\ndescribe('with setup', () => {\n  let data\n\n  beforeEach(() => { data = { count: 0 } })\n  afterEach(() => { data = null })\n\n  it('uses setup', () => {\n    data.count++\n    expect(data.count).toBe(1)\n  })\n})\n```\n\n### Matchers\n\n```typescript\n// Equality\nexpect(value).toBe(expected)\nexpect(value).toEqual(expected)\nexpect(value).toStrictEqual(expected)\n\n// Truthiness\nexpect(value).toBeTruthy()\nexpect(value).toBeFalsy()\nexpect(value).toBeNull()\nexpect(value).toBeUndefined()\nexpect(value).toBeDefined()\n\n// Numbers\nexpect(value).toBeGreaterThan(n)\nexpect(value).toBeLessThan(n)\nexpect(value).toBeCloseTo(n, digits)\n\n// Strings & Arrays\nexpect(value).toMatch(/pattern/)\nexpect(value).toContain(item)\nexpect(value).toHaveLength(n)\n\n// Objects\nexpect(value).toHaveProperty('path')\nexpect(value).toMatchObject(partial)\n\n// Errors\nexpect(fn).toThrow()\nexpect(fn).toThrow('message')\n\n// Negation\nexpect(value).not.toBe(expected)\n\n// Promises\nawait expect(promise).resolves.toBe(value)\nawait expect(promise).rejects.toThrow('error')\n```\n\n## REPL Sessions\n\nFor interactive or multi-step evaluations, use the `/repl` export:\n\n```typescript\nimport { createReplSession } from 'ai-evaluate/repl'\n\n// Create a persistent session\nconst session = await createReplSession({ local: true })\n\n// Evaluate multiple expressions with shared context\nawait session.eval('const sum = (a, b) => a + b')\nconst result = await session.eval('sum(1, 2)')\nconsole.log(result.value) // 3\n\n// Context persists across evaluations\nawait session.eval('const x = 10')\nconst result2 = await session.eval('sum(x, 5)')\nconsole.log(result2.value) // 15\n\n// Clean up\nawait session.close()\n```\n\n### REPL Configuration\n\n```typescript\ninterface ReplSessionConfig {\n  local?: boolean           // Use Miniflare (default: false, uses remote)\n  auth?: string             // Auth token for remote execution\n  sdk?: SDKConfig | boolean // Enable platform primitives ($, db, ai)\n  prelude?: string          // Code to run at session start\n  timeout?: number          // Eval timeout in ms (default: 5000)\n  allowNetwork?: boolean    // Allow fetch (default: true)\n}\n```\n\n### Quick Eval\n\nFor one-off evaluations without session management:\n\n```typescript\nimport { quickEval } from 'ai-evaluate/repl'\n\nconst result = await quickEval('1 + 2 * 3')\nconsole.log(result.value) // 7\n```\n\n## Requirements\n\n| Environment | Requirement |\n|-------------|-------------|\n| Cloudflare Workers | wrangler v4+, `worker_loaders` binding |\n| Node.js | miniflare (peer dependency) |\n\n## Security Model\n\n| Protection | Description |\n|------------|-------------|\n| V8 Isolate | Code runs in isolated V8 context |\n| Network Control | Configurable: allow, block, or allowlist |\n| No File System | Zero filesystem access |\n| Memory Limits | Standard Worker limits apply |\n| CPU Limits | Execution time bounded |\n\n### Network Access Control\n\n```typescript\n// Allow all network (default)\nawait evaluate({ script: '...', fetch: true })\n\n// Block all network\nawait evaluate({ script: '...', fetch: false })\n\n// Allowlist specific domains (wildcards supported)\nawait evaluate({\n  script: '...',\n  fetch: ['api.example.com', '*.trusted.com']\n})\n```\n\n## Troubleshooting\n\n### \"Unexpected fields found in top-level field: worker_loaders\"\n\nUpgrade wrangler to v4+:\n```bash\npnpm add -D wrangler@4\n```\n\n### \"Code generation from strings disallowed\"\n\nUser code must be embedded at build time, not evaluated with `new Function()` or `eval()`. This is handled automatically by ai-evaluate - just pass your code as strings to `evaluate()`.\n\n### \"No loader binding\"\n\nEnsure your wrangler.jsonc has the worker_loaders config and you're passing `env` to `evaluate()`:\n\n```jsonc\n{\n  \"worker_loaders\": [{ \"binding\": \"loader\" }]\n}\n```\n\n```typescript\nawait evaluate({ script: code }, env)  // Don't forget env!\n```\n\n## Types\n\n```typescript\ninterface LogEntry {\n  level: 'log' | 'warn' | 'error' | 'info' | 'debug'\n  message: string\n  timestamp: number\n}\n\ninterface TestResults {\n  total: number\n  passed: number\n  failed: number\n  skipped: number\n  tests: TestResult[]\n  duration: number\n}\n\ninterface TestResult {\n  name: string\n  passed: boolean\n  error?: string\n  duration: number\n}\n```\n\n---\n\n**Stop worrying about untrusted code. Start building.**\n\n```bash\npnpm add ai-evaluate\n```\n","readmeFilename":"README.md"}