{"_id":"@tenkicloud/sandbox","_rev":"30-b0b025e52cd547b00be11f6283ff0e08","name":"@tenkicloud/sandbox","dist-tags":{"latest":"1.4.1"},"versions":{"0.1.0":{"name":"@tenkicloud/sandbox","version":"0.1.0","license":"MIT","_id":"@tenkicloud/sandbox@0.1.0","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"333e18f3e88017abec1beda8b32d39c0f39fa216","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.1.0.tgz","fileCount":8,"integrity":"sha512-+q1beNSwcYjKNAOGtCX4dseqPqjB+08krjMdVEbCcxVp/4IoK8hc+PQwKyqfpeEA0m/z2ZF6o6whtyhHimzv5w==","signatures":[{"sig":"MEUCIQCxUhvSpV73H9y/BgxGvbUe+zFeu8cRbQL4bfwxahjcfQIgXjcmWV1R1uYumsrpn2DPqz2C8tCtsyunBglfAh0ZBv0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2658506},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"738e209ec90ce967301db806b1f5b4f4698cd8eb","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"albertilagan","email":"albertilagan0018@gmail.com"},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.11.0","@connectrpc/connect":"2.1.1","@connectrpc/connect-node":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.7","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.1.0_1780583427299_0.7285920923364988","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@tenkicloud/sandbox","version":"0.1.1","license":"MIT","_id":"@tenkicloud/sandbox@0.1.1","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"5400012ea0b940ab38bef54786182b9e6e41ba48","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.1.1.tgz","fileCount":8,"integrity":"sha512-K+0A/w80OKM8wM593hAeYKhMhyC4UddqLgcuCE13E8yNbeZt7BJV+CqZZP42v1OfFB3QK4QF0iGZTvQTpjDSWQ==","signatures":[{"sig":"MEUCIFgxoNNPbsmiA9CjYyPryar1Zw0qNlr1nSQui2shK+I4AiEA+z7iAXIRaN89tSxkx6sufzTr4sEW+MkCcpM7ordUTR0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2659030},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"738e209ec90ce967301db806b1f5b4f4698cd8eb","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"albertilagan","email":"albertilagan0018@gmail.com"},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.11.0","@connectrpc/connect":"2.1.1","@connectrpc/connect-node":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.7","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.1.1_1780585103609_0.374114946123806","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@tenkicloud/sandbox","version":"0.1.2","license":"MIT","_id":"@tenkicloud/sandbox@0.1.2","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"fee25d3173d2ad006788742d7497a2e47a74b353","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.1.2.tgz","fileCount":8,"integrity":"sha512-qWPErkMtShYpH1LIDUu2GFmONKtExT8toTwfXmhurFHXxgUH79K/KjhPKICC9idqZgq1jVzF7LM6ZpRfyaYtDw==","signatures":[{"sig":"MEQCID/PgjbCyKQtkmWM5zajlJN82/BONwTfda1R3rFqzNGJAiAHAzWdOGEpoUA0A2Xspdz0fqEjl9qojoWb0aUalA8AZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2659030},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"b854fa7b0e8a7df95b9de2ed67e38d1116cd00b1","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.11.0","@connectrpc/connect":"2.1.1","@connectrpc/connect-node":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.7","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.1.2_1780592949319_0.9294483832581952","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@tenkicloud/sandbox","version":"0.1.3","license":"MIT","_id":"@tenkicloud/sandbox@0.1.3","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"b71c9477c7e91d99754f87b8215dc0934b0f932a","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.1.3.tgz","fileCount":8,"integrity":"sha512-S6FYzXTQu5eV5U6m91YQi3L32Cawc0ZBzU+DHsRruimZlTQTAkZFa8Y29LOudSaIOIUuV8VkC/UOejtOGgauRQ==","signatures":[{"sig":"MEQCIFqP4UGilHqjR9ggtbdpmHJFN3v5eg/mUTLQAyf8HK46AiBA4gwQp82n6/8pinjIZMyHaq332TQ3Zq3Y5FmQeA2WKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2656156},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"2ed2a485419b98ac8b967afaa7b81053302096e1","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.11.0","@connectrpc/connect":"2.1.1","@connectrpc/connect-node":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.7","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.1.3_1780676293398_0.802510650634243","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@tenkicloud/sandbox","version":"0.3.0","license":"MIT","_id":"@tenkicloud/sandbox@0.3.0","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"9d2cc9b8d02a41315cebf725a178cd1b096a7ff7","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.3.0.tgz","fileCount":8,"integrity":"sha512-RAZ740tWkar6iERlenj84H9MOeeQOzHbLZifaKKZc70BmUEZxr0z3BeZ92gk1gHs6TnVE2WC5MFCkqfJSsg8Bg==","signatures":[{"sig":"MEYCIQDOPzV8Lt9T4Hc3HmZ864DTXHqep6AElHx2PtnLfMBqIwIhAOsHXGRQTJOmFyqxMcSi1G4uZpARMMG4biP4gb8t0GUx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2607997},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"d6c853248afed2845d6a46efbc058be6e6716527","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.12.0","@connectrpc/connect":"2.1.1","@connectrpc/connect-node":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.8","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.3.0_1781718036512_0.9256936211224038","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@tenkicloud/sandbox","version":"0.3.1","license":"MIT","_id":"@tenkicloud/sandbox@0.3.1","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"0139cfe506d31dd26ce293216a036a0e019edf73","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.3.1.tgz","fileCount":8,"integrity":"sha512-YrVOehzrJF4R+SXADmVc3K5jrG/Gqal2lVKK+1628/Z9j7RAhospS1+KYMa4zanRDQdgvYw4+lc9XpA+1B5CIQ==","signatures":[{"sig":"MEQCIAjYm+xUl6WXviE0ncHY8OtQgsFycronFdksw1Nxqz7oAiALK4rC1lkv4EuPNdX0fscZldad7n8vNRdAe6AACH1UyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2610673},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"679cbfed578503728e58439af8ef1b6e8bb3f006","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.12.0","@connectrpc/connect":"2.1.1","@connectrpc/connect-node":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.8","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.3.1_1781811535264_0.016163755010005554","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@tenkicloud/sandbox","version":"0.3.2","license":"MIT","_id":"@tenkicloud/sandbox@0.3.2","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"95761c7a581e1b48495269afdeb5fd6f8791a1f7","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.3.2.tgz","fileCount":8,"integrity":"sha512-HkjKC5zWO5kVJLeUQq8PDlFxwe6vNvvYbu8tuBTJh6wE2M6gt+cPZHnHBzWgDYCAdMzbmsBOmT3XEa8ZgMkvfg==","signatures":[{"sig":"MEUCIBq34BUNjG+BVLyCXWZEmI3MB4bpgSAv3E6jHfN7IywwAiEAma3pDevXCoFWg/ijgHzVg9rX6WFMqTGlARDMrI/mB/4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2623890},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"266c456e3e2c4fbe943595857838161a42affb20","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.12.0","@connectrpc/connect":"2.1.1","@connectrpc/connect-node":"2.1.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.8","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.3.2_1782127554186_0.995194146320939","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@tenkicloud/sandbox","version":"0.3.3","license":"MIT","_id":"@tenkicloud/sandbox@0.3.3","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"bf80260fc167b541fc90acee6a8b4f085a017304","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.3.3.tgz","fileCount":8,"integrity":"sha512-SHPMLwlwYnKY93QlLMwJP8QzlmPwNyyRu0gJTM9Olk5q9mHr0fnhlxmUMY5+WiQ0rlwfOAVcnXZl3kHNijPE6w==","signatures":[{"sig":"MEUCIFeWQvOZGihj9HX+bk2CdJDxeghaKb9ONCwtGrO8GXx8AiEAme2ENWaZzIamFzHctyR4oz2LeZE6LzbBON5ANP8EuFc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2645416},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"568c6ee42b3874ea4c582301b6142ebf2eaa1a76","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.12.0","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.9","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.3.3_1782350259584_0.9390107052083563","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@tenkicloud/sandbox","version":"0.3.4","license":"MIT","_id":"@tenkicloud/sandbox@0.3.4","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"53cc169d854a35866eefe423b2778f0392c4fa69","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.3.4.tgz","fileCount":8,"integrity":"sha512-zrl1oiUOI2b7p/uxB3i4I2+aW3sEukK6TyQPLyC6ubqvukvHXFZDbdEbfn7kcQkr2uDl+ur8GCE569LdbPJ6/g==","signatures":[{"sig":"MEUCIBbfNE2tNmIUUxGXj1E/rWutnNiQN5/pf0XlclSvJFiwAiEAwx6nZhl6DTTXAbtFzR5AYE52tAbpvU8/nc6Fzjpccuo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2612380},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"5a5bd7fe53e8c8c42887750ccf9efb3eb69c3ca6","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.9","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.3.4_1783543977082_0.0647094613510022","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@tenkicloud/sandbox","version":"0.3.5","license":"MIT","_id":"@tenkicloud/sandbox@0.3.5","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"87612cd621303af03d3ce6b4add1c779521cee6d","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.3.5.tgz","fileCount":8,"integrity":"sha512-B3FnbzvXInysubhbEVXYtLcoCCdBTVndQMOyM5sDdycJNpBVLklxhrJ1mBIOzV+Eqr48do7BdgrfUGtzC53s+Q==","signatures":[{"sig":"MEUCIBAOCiDJY5/cYG/VapQVQM5aNmkXGVtv6v+N5zazWX8rAiEAg++ZTK1oyMTkL0vnBYeftlCpgOKZMs5so1YD4is6lnM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2616686},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"e3899df66e308b128de1750b465c27f44cac8017","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.9","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.3.5_1783627223123_0.5975188259785751","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@tenkicloud/sandbox","version":"0.3.6","license":"MIT","_id":"@tenkicloud/sandbox@0.3.6","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"383f020b8230626067b85b6d7d2771f17d4e3137","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.3.6.tgz","fileCount":8,"integrity":"sha512-nCjCStmVUj5OG2Ek5aFMZnNI2UAw2tJb3enZobf1hFcoV7h9QVCYuKrpsf11SWcVVh7P39T+vZq+rlJkcyB6vQ==","signatures":[{"sig":"MEYCIQDUrVkcroxkdsq3IWeQ4A6Hmn2oGyd2HMBy/5AxhJOAsgIhAMyOrZ5yY1BnKNgdERIgkBM6YcdhfwkQDnreEyrYOZdG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2620725},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"b5cc2af3f17335e6825a0169c6daec5a89d2dba6","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.9","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.3.6_1783699507460_0.6554130125946234","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@tenkicloud/sandbox","version":"0.3.7","license":"MIT","_id":"@tenkicloud/sandbox@0.3.7","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"e6dbd139cc4136aec86e2d66e4a2e46d24bbeb78","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.3.7.tgz","fileCount":8,"integrity":"sha512-gvRLKRpHOANjaPJW6T0CyXBDAjarxsSJvasdY3Uo/5+CHXh3YwGbc4n5ap8F8n7RT68MrXK2sr6B/gF7zKOnZg==","signatures":[{"sig":"MEUCIQCF0KUvtjwXc5ynkkcaBc7srZPSqkU9vnu+ezoUKLBO6AIgUoT3wbZ8jXvQVN4j+nTlMAUl+JfFv2x7KlhoAZYnH7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3082908},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"383bd5c88e82ed9fd389224f892225d40b13904c","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.3.7_1784170268365_0.5928860752463228","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@tenkicloud/sandbox","version":"0.4.0","license":"MIT","_id":"@tenkicloud/sandbox@0.4.0","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"8217704e85cb832a2c6d81e0b090dd45adf13004","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.4.0.tgz","fileCount":8,"integrity":"sha512-p9GiQutfqEhEEAQlEOph/wuP2Vk0kDof4GjhIvnV96TbvzoqPFp1pD6iEjUcJMri6sJsEXBGf0Grsyl+X52GiA==","signatures":[{"sig":"MEUCIF42wWMNkJy42RpWd8GQtpZGMakXYMLwSqOLvgGECl8qAiEA8Id53OwviwU/9Tkn7cDHFiV+m8gSzfCo8jmP9HYIoDE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3140268},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"6600baa3bf2bca8c2362ffd6df2e7a11bd7f3297","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86babb24-4be5-42a5-8313-7711133051c3"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.0","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.4.0_1784221638115_0.012391267675585294","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@tenkicloud/sandbox","version":"0.5.0","license":"MIT","_id":"@tenkicloud/sandbox@0.5.0","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"63bd374fcaa3738e8ed2bb386695ed8b8129cfe5","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.5.0.tgz","fileCount":46,"integrity":"sha512-hTkR22lX+fd5Aj24zSi+12tuuhnmhWvgRY/1voDH239oz/mLVwPUZsOSaacD522gOPhwBbt756EHal1r4wcTxA==","signatures":[{"sig":"MEUCIQCPJXjg2prmQ2yaOoLca5LNxyZYZEUwAcRNxlqrOEEIiQIgJFwxyjJr9LA/HXBMtNZWBp6+BsJksPmjqyCvw9qgjUs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3238374},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"2819db6441fb723ca316bde08971acc13d4c9d14","scripts":{"test":"vitest run","build":"tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.5.0_1784835368585_0.5868496973058461","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@tenkicloud/sandbox","version":"0.5.1","license":"MIT","_id":"@tenkicloud/sandbox@0.5.1","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"825356b6e5555dec4fd8f3adecc89ebd2198ad82","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.5.1.tgz","fileCount":46,"integrity":"sha512-2yz11vnOcmka3+69Yw/yT/EhErjifNmvPxhgAI635mOStEDq0uNY14ibQpVl5r4brsTC/oSy4ZvntBt5cOzkOQ==","signatures":[{"sig":"MEQCIFkEvmA+d8J/qE+zGCKAIL2gumN5uNf3vd3rLYW5amN5AiAcUQbtbZ91bHqypZz4Hw45qRdEJluw2ekc0lEaZXIMBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3242674},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"c54690a90bd6fe70da3176f164c32416a880f27c","scripts":{"test":"vitest run","build":"tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.5.1_1784946097532_0.8409192806102994","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@tenkicloud/sandbox","version":"0.5.2","license":"MIT","_id":"@tenkicloud/sandbox@0.5.2","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"67343bbe87404021bb9a58cb479ac084e73be6e0","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.5.2.tgz","fileCount":46,"integrity":"sha512-iDHSpGanBqCzyQHjgBPJSeIjPqf9bQ9wzqDo1DwAyIEx7LDVtiDjwbYCbbSWJEH7gqUgpPqaA4N2isWrhshY/g==","signatures":[{"sig":"MEYCIQCiCf2mt/io6rty2OzBPgyJvuA42L15hXinEscziTImwgIhAOBP0z54XqDcTvTpOzaqd4yeYfkR3/tPb6+PfE+/Eu4h","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3249757},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"540a3fdc7637f57f00d789e7dfd56fb7d922d3f2","scripts":{"test":"vitest run","build":"tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.5.2_1785195892454_0.19585744253226278","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@tenkicloud/sandbox","version":"0.5.3","license":"MIT","_id":"@tenkicloud/sandbox@0.5.3","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"22a9fa33544ef0ba16a99185eea58e93d1bd0c5d","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.5.3.tgz","fileCount":46,"integrity":"sha512-0ITOkmWBTntO4lIk5D4aYttKcNauw22laUzSl+vZ6WwUmWeRp0jJjfe/A0Mp6CfjcCsRM6QbPCMViOgvL4ND8w==","signatures":[{"sig":"MEUCIAg+ObrVe4mwUCerECiSHZ2oy3nMaLrfJKBgkirESAF2AiEAwIGYND8NWlNg2Aes9d76Vrr4Q1D6BxKFJc24SZtHOj0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3250267},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"2de23b3e1d2c74dc0eb0d41fffe3668aa26a33b7","scripts":{"test":"vitest run","build":"tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.5.3_1785234341181_0.11563681906133372","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@tenkicloud/sandbox","version":"0.5.4","license":"MIT","_id":"@tenkicloud/sandbox@0.5.4","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"2fa4633091cef1893b8e5844dd1cde8257ff5144","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-0.5.4.tgz","fileCount":46,"integrity":"sha512-U/oV8TAB1rjpXHuo9DIrpxnd2tlO2MojNjzLjqKgx4+zkD4NjgpR6QzRv5awoXib0DND3bnu0qoQCIgsfcXTCw==","signatures":[{"sig":"MEUCIQDxSyRKOgERaPQCn43VlC6w241sukns/juoMVz8PvbJLAIgf38N74hw2IRi7VmllLrxlahTU2yvGWym/6NE+kjfftQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3253623},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"a2b7650155ca86744a9520ed1a14e18946161b8c","scripts":{"test":"vitest run","build":"tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_0.5.4_1785323301914_0.6388948708848046","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@tenkicloud/sandbox","version":"1.0.0","license":"MIT","_id":"@tenkicloud/sandbox@1.0.0","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"63da67ea97a6ef69c843a7db28383c70a4ea02f5","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.0.0.tgz","fileCount":42,"integrity":"sha512-gHR5xRd//eXswQ36VKks/477AoW44cxQ9y5ECD7QO8/OXL9sf//AsrawYeA5bgg8vbS3V2FocX5lYwG7rO0c/w==","signatures":[{"sig":"MEQCIGn1FZGvflPyOZkRneiVktnpm/fIm7TF8lUfcVsfffxOAiAVVhp62QYYSt6hCEtIb31z1ycLSyXlB6MsWblP7Qz5Gg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3093201},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"89fc0055476de87e63b39e74ceba4831777f894e","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.0.0_1786876798912_0.4121899564427687","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@tenkicloud/sandbox","version":"1.0.1","license":"MIT","_id":"@tenkicloud/sandbox@1.0.1","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"c231148923cd431174252161e83370317f925ef8","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.0.1.tgz","fileCount":42,"integrity":"sha512-WtZyVj14zYDXb+ZE0iTm4vYAKg3MU7QyH6aZ2eYlXvAIAs1PZT2Z6vlGjFnCsvCarqhox4F50bDYV/Gt3Ifqgw==","signatures":[{"sig":"MEYCIQCVtyQiurT1/NcoeffEy1g1T+lCiw9EX6XxYGxnJACBfgIhAL6mJEXBuJ30zbNxQ6r15bxiRQSzKFqt9Z12DgLl40uw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3112084},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"f1e61e8c6519abf7049a4d617f6a859c9bd8610d","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.0.1_1787318429965_0.8548427346719034","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@tenkicloud/sandbox","version":"1.0.2","license":"MIT","_id":"@tenkicloud/sandbox@1.0.2","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"7511cef0386547023bcef0a38ac34dfa431caef5","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.0.2.tgz","fileCount":43,"integrity":"sha512-YSVbR2758lmTlHUmLDINa/XRfdrwLje/1LY7iw5sFZT3c+7R7X9PRsIKfhOM3u+/OxApw0RAgbxXmzjZPHZFrg==","signatures":[{"sig":"MEUCIAgNFL8zVcPJ9lFK5r+v5Ckezp4GPrHO97y4SDC8TcvtAiEA5bxWBzbMCAVNu4HZn8qm5njOFDXw936jf36p2DvRTCs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCUz+j04Mg5rSpyVeHoKQ15BnFC39IgA6QerLhCnDRnbQIgJWefsX1bvfPGbUM5t4F/EcnQOnhIieYt9EOQoQNg6Ek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3162391},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"27ebd82963d853ddb367881b94936dcdf958883a","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.0.2_1787859730175_0.7882532466475616","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@tenkicloud/sandbox","version":"1.0.3","license":"MIT","_id":"@tenkicloud/sandbox@1.0.3","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"6a06529372d6cc018ea7b8ec2b72ec7aecc11e31","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.0.3.tgz","fileCount":44,"integrity":"sha512-4ILe57lRDfwD73yBIG2WcJsqoplWZEa6vJWM4oLLu9EzDQNJo7tzAHKZzY5hdpIhgTVgkAdQn9Ib2fx7YqdAYQ==","signatures":[{"sig":"MEYCIQC/nIQc1oXvTNCS214J6KeuGFgaQVTZ4d7Pos1ZmCag7AIhAI/QuWOXWjw4xUEHgULNwbVG8XKMDJbf6onnhTt4wpWx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCfX1SJFvOnXS8caGx8OyDAZCcHbYN+Zdi6RZpxIKFkKQIgGMv7qRt0sMjoMVutzGx5XPYsmFNPeDjedw4sjDyQDSE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3244272},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"8183c2564f90fb6706d97e51f9a977c501c83674","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.0.3_1788443790663_0.577897018544135","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@tenkicloud/sandbox","version":"1.0.4","license":"MIT","_id":"@tenkicloud/sandbox@1.0.4","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"5809d5d645c5e63784283a0c4a9e48a7c833764b","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.0.4.tgz","fileCount":44,"integrity":"sha512-YynN84EEPfm9YeYIX6tMJ/qI2RCp0xmg1W8WIS8VO4df69IRlBaONgVgiak0ZB77hDQhj5nYHnkeEnvWOb+QPg==","signatures":[{"sig":"MEQCIC72sEmSjJuQ3+ZNC9Pky2zAWM4wf3lOV7RgwEGzPwCWAiAWX7Pjg18QnviKJ00o6Y/PNH4WY9eMhlNvpc/f1tZx6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE3aIFpziNDUrN7ikX1v9aYHJpOTfAIKeL8qN+1jw9E3AiAqnsywVW76AFNY3h4SIfFyjHe5YlG2AzsWvOpfCQ5E8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3242176},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"d09068e34a9aafdf3001d4aaf43231976c6b2f0d","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.0.4_1788463208940_0.5395581042423736","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@tenkicloud/sandbox","version":"1.0.5","license":"MIT","_id":"@tenkicloud/sandbox@1.0.5","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"50571cdef5a93bf0ea264fae45b19c455e9163e8","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.0.5.tgz","fileCount":44,"integrity":"sha512-jNdoMB1A22nVUjdMAP2BMXIdxHPHuNK19HEB7UwuCtSipRBfXSh/lHL5jXkiyB8hlRHX9TFxcOCyCKlwt3bKUg==","signatures":[{"sig":"MEYCIQC965SvPPKZ0Z5NpXxKCVbXMA6/toKN0TedX0c9vUDVBgIhAIGBaNB6PNii0jMQUruy0AOZAeRRPWVaqY3LeTUKPnME","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCnzinc3elA4lM62MZYnWq4mZYMEhwieQVUEv1zynnnNAIgMtI7lAklcVv5Z1pnOu/VFpxdR5Uu7RqkWCgoAcnwjgw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3245564},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"6846bc6f97f2e616b64cd88b7103c7400d715f3a","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.0.5_1788553304933_0.5844051680536142","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@tenkicloud/sandbox","version":"1.0.6","license":"MIT","_id":"@tenkicloud/sandbox@1.0.6","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"d6976e3239374bb9c9144f2d257dea9b9df76e62","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.0.6.tgz","fileCount":45,"integrity":"sha512-47sFKaMutq47+k8RYYx+grpVM7Cb1Vh1nMh96sfzIDZqDGA0EIVKGO1LBNQcwKUxE9Ga8zS8m9cyQ0eklWUITw==","signatures":[{"sig":"MEUCIGWWT0l4Y35uxiyzJiN2nP+lqhv+BEQ05TAx1ud1/1F4AiEAzM/EG2Qsm0kcgmVYCf6yyE4yzS0nE7yyRJqaMkl20FQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIC0RIC6qDqboqhJ6PVeXvD3Tz4FkgQClcZOkk+fKUsxwAiBDyX0D79MA2pHj1dY1JMxn22AC9oiH/Tnljx00wZj3hw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3253926},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"b76b9bea34f97c085e2822a385987d5ca9ef12d4","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.1","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.10","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.0.6_1788797239796_0.568792356710655","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@tenkicloud/sandbox","version":"1.1.0","license":"MIT","_id":"@tenkicloud/sandbox@1.1.0","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"99c062a6ee373f89f6d84bc763058df72df409f2","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.1.0.tgz","fileCount":49,"integrity":"sha512-sPUDac5/wIBJvp3+GoBsYzjL096vQe0sF6bxLhenXA7BhKhjFiAt1AEt9eM8UfoQWRe2SjEpHnJ/ZsuSKV0oVQ==","signatures":[{"sig":"MEYCIQCjp9rd4cRn7ArFQVLL4iP1kb5b+wC3otro48EFkJ/7SQIhALGuEr6QFh+AqAggWF8/VDUyLFhEAHxg05aACm5rAvxj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIETTUt3vril1E0jGbft/gRF+OtEqSJtvTc7mqLsmuPYUAiEAx2gV91hxE4PdOIf1YXO4KNdifO1wM1tD5x1oHAaFXqI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3441386},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"dc5dd79580a6e81e2c3fcdeb55da68820f221f4c","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.3","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.11","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.1.0_1789655655869_0.8091877513055401","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@tenkicloud/sandbox","version":"1.2.0","license":"MIT","_id":"@tenkicloud/sandbox@1.2.0","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"dc768e053ec732d387a7b887c02e2ab26e86be27","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.2.0.tgz","fileCount":49,"integrity":"sha512-yFIPosWjnQ1M7h7rc6/jYIgFb0l2oWlXd5O8euoOQuL6uuOOCf/6huv1goyf/TO88IZWfT4OUoZZn1A/LTOkRg==","signatures":[{"sig":"MEUCIGJfviPo7IQFw834/RdFa77cLWc0d6b4P0Mhs3jKUCoAAiEAoBc36GNJkwkiHO3vtxR4eoo9DpFxKDMlZIChidbjT7Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDwXmyHtT5/6I8xXg+tFCrP7l/UGZ4PHnFALT/aTn4JHAiEA0/SWISzEs8MF9P5pkw3HVD1v5HmtAqPI9EqhMZSs3BI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3441386},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"12bce2a6fcb19c2c079b22ef516222760199be26","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.3","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.11","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.2.0_1789657913138_0.7378394330267499","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@tenkicloud/sandbox","version":"1.3.0","license":"MIT","_id":"@tenkicloud/sandbox@1.3.0","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"7207e754fdb1b26b49494e78ad7118788f7f58ed","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.3.0.tgz","fileCount":51,"integrity":"sha512-wJ5dFLs7cZJl87ATP0MAZ0r8FIeYw1EorKu+JpQFxwwq6OYplewlGvpddBaOn1hLw601QL/jHXJzAKy8e85zvA==","signatures":[{"sig":"MEQCIA8vYCJIG8qF96A0qlu7NEpdzlxT34L+KqafTNLboCAsAiAUpGq78pQrDYjpA3ms++9IGE41YHL+WFG8iHKq5hfegQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFtr1m/PdPmHUmKkUTvByFIjU6oqmtfM71ymJFCv/wg+AiEAkIPaADteaAPaTvmIhAv6dhgaSbcykfk6cXZ/mLGSd+0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3554643},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"c39c3374de1fa739ddaa32321556748bf24dab03","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.3","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.11","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.3.0_1790261292640_0.8525148181542725","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@tenkicloud/sandbox","version":"1.4.0","license":"MIT","_id":"@tenkicloud/sandbox@1.4.0","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"dist":{"shasum":"712075e388eb91d45a3117e398e3383fa231b032","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.4.0.tgz","fileCount":53,"integrity":"sha512-1fio6b1I+5gK9uw8UkHYkcdNU0EDzswL2I1/6RRQfC5cAqmO6YjIlvnbn2Ia5APhqufHvPrHVbKZfwq0gp8tXA==","signatures":[{"sig":"MEQCID8WhR7mgO8zhWJDrMPWEYcAJB8Z32eNrnZ9noVrxy/AAiBJoxpAAEx1FzVUNdZ4024seRlnWGgvm+Jkkt+e2giAYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBujSdSSLuKds3S+EMO+ss+rEKqWN3y2RRXqQu4y3oJvAiA91Wlo0GqbVz1qj652rXRg0ilwnTw7hFY/P4CQkdsICA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3663388},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"d26c923251c927eb74f42a0245c4ed66bfcea6e3","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.3","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.11","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sandbox_1.4.0_1790744426856_0.6293353595320685","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"_id":"@tenkicloud/sandbox@1.4.1","dist":{"shasum":"fe699dd3ffdd68be7fa97687357277dccbb4848b","tarball":"https://registry.npmjs.org/@tenkicloud/sandbox/-/sandbox-1.4.1.tgz","fileCount":53,"integrity":"sha512-0H7+EornkIlTc6GTMFMdkSKijvXOjqYkSWsZNeEcYh7vPjtnxFmrElTUXEBmPTeZXL2gmt+iPrhEcBthBopGHw==","signatures":[{"sig":"MEUCIETst0xXDA5zBobZj3Yb24MSDfIRwBQIDeTv5rLm9iR6AiEAx1ALJPiNLUBEnH9HpVkPZaQ/9d7Ai5GrdZXePxamzuk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD16VPwvNyRexoY1riwNGm/seiZXpHuNz9Tvwf/Nf+t+AIgPpEDCVv1EsbQDCk7gML5WrwrH6p/++0kuj4XGf831hU="}],"unpackedSize":3669640},"main":"./dist/index.cjs","name":"@tenkicloud/sandbox","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"ee12fcdc04b7f8999a77d6530573cbf84320a734","license":"MIT","scripts":{"test":"vitest run","build":"rm -rf dist && tsup && tsc --emitDeclarationOnly --declarationMap false","typecheck":"tsc --noEmit","test:watch":"vitest"},"version":"1.4.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"73c98156-5d50-4a4c-868a-d9cc3cdc6abe"}},"_npmVersion":"11.6.2","description":"TypeScript SDK for Tenki Sandbox","directories":{},"maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"_nodeVersion":"24.13.0","dependencies":{"ws":"8.21.3","@bufbuild/protobuf":"2.12.1","@connectrpc/connect":"2.1.2","@connectrpc/connect-node":"2.1.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"8.5.1","vitest":"4.1.11","@types/ws":"8.18.1","typescript":"npm:@typescript/typescript6@6.0.2","@types/node":"24.10.9","@typescript/native":"npm:typescript@7.0.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sandbox_1.4.1_1790869275201_0.6339602777110376"}}},"time":{"created":"2026-06-04T14:30:27.177Z","modified":"2026-10-01T15:41:15.875Z","0.1.0":"2026-06-04T14:30:27.515Z","0.1.1":"2026-06-04T14:58:23.814Z","0.1.2":"2026-06-04T17:09:09.546Z","0.1.3":"2026-06-05T16:18:13.573Z","0.3.0":"2026-06-17T17:40:36.761Z","0.3.1":"2026-06-18T19:38:55.439Z","0.3.2":"2026-06-22T11:25:54.334Z","0.3.3":"2026-06-25T01:17:39.742Z","0.3.4":"2026-07-08T20:52:57.214Z","0.3.5":"2026-07-09T20:00:23.328Z","0.3.6":"2026-07-10T16:05:07.667Z","0.3.7":"2026-07-16T02:51:08.563Z","0.4.0":"2026-07-16T17:07:18.344Z","0.5.0":"2026-07-23T19:36:08.782Z","0.5.1":"2026-07-25T02:21:37.717Z","0.5.2":"2026-07-27T23:44:52.607Z","0.5.3":"2026-07-28T10:25:41.367Z","0.5.4":"2026-07-29T11:08:22.082Z","1.0.0":"2026-08-16T10:39:59.066Z","1.0.1":"2026-08-21T13:20:30.142Z","1.0.2":"2026-08-27T19:42:10.310Z","1.0.3":"2026-09-03T13:56:30.793Z","1.0.4":"2026-09-03T19:20:09.050Z","1.0.5":"2026-09-04T20:21:45.045Z","1.0.6":"2026-09-07T16:07:19.947Z","1.1.0":"2026-09-17T14:34:15.968Z","1.2.0":"2026-09-17T15:11:53.300Z","1.3.0":"2026-09-24T14:48:12.766Z","1.4.0":"2026-09-30T05:00:26.970Z","1.4.1":"2026-10-01T15:41:15.340Z"},"license":"MIT","description":"TypeScript SDK for Tenki Sandbox","maintainers":[{"name":"tenkiadmin","email":"eddie@luxor.tech"},{"name":"eddiewang","email":"bonjour@eddiewang.me"},{"name":"albertilagan","email":"albertilagan0018@gmail.com"}],"readme":"# @tenkicloud/sandbox\n\nTypeScript SDK for [Tenki Sandbox](https://tenki.cloud), programmatic cloud sandboxes for AI agents.\n\n## Install\n\n```bash\nnpm install @tenkicloud/sandbox\n```\n\nRequires Node.js 18 or newer. Bun 1.3 or newer also works.\n\n## Quick Start\n\n```typescript\nimport { TenkiSandbox } from \"@tenkicloud/sandbox\";\n\nconst sandbox = new TenkiSandbox(); // reads TENKI_AUTH_TOKEN\n// create() waits by default via a single server-held request and returns a\n// run-ready sandbox with data-plane access primed.\nconst session = await sandbox.create({\n  cpuCores: 2,\n  memoryMb: 4096,\n});\n\ntry {\n  const result = await session.run([\"echo\", \"hello\"]);\n  console.log(result.exitCode); // 0\n} finally {\n  await session.close();\n}\n```\n\n`Session` also implements `AsyncDisposable`, so `await using` works in runtimes that support explicit resource management.\n\n### Tailnet attachment\n\nUse `TailnetAuthKey` so string, JSON, and Node debug formatting redact the credential.\n`waitForOnline` keeps the session in creation until Tenki verifies the registered node.\n\n```typescript\nimport { TailnetAuthKey, TenkiSandbox } from \"@tenkicloud/sandbox\";\n\nconst session = await new TenkiSandbox().create({\n  tailnet: {\n    authKey: new TailnetAuthKey(process.env.TAILNET_AUTH_KEY!),\n    tags: [\"tag:sandbox\"],\n    exposePorts: [3000],\n    acceptRoutes: true,\n    waitForOnline: true,\n  },\n});\nconsole.log(session.tailnetStatus?.state, session.tailnetStatus?.fqdn);\n```\n\nThe direct key is write-only and never appears on `Session`.\nThe server may reject options from later milestones, including wake-on-connect and recreate-on-resume.\n\n## Authentication\n\nPass an API key or service token starting with `tk_` explicitly, or set `TENKI_AUTH_TOKEN` or `TENKI_API_KEY`:\n\n```typescript\nconst sandbox = new TenkiSandbox({ authToken: \"tk_...\" });\n```\n\n`apiKey` is an alias for `authToken`. If both are supplied, `authToken` wins.\nBlank or whitespace-only values count as absent.\n\nThe credential determines the Workspace automatically; ordinary Sandbox calls do not require a Workspace ID.\n\n### Migrating to v0.7.0\n\nVersion 0.7.0 removes the generated workspace settings and pause-retention RPCs.\nUse `getUsage()` for read-only workspace usage and limit data. Its shared\nconcurrency entry now uses the `max_concurrent_jobs` key.\n\n### Migrating to v0.6.0\n\nVersion 0.6.0 removes `ClientOptions.cookieName` and support for Ory session\ntokens and browser cookie values. Pass a `tk_` API key or service token through\n`authToken`; the SDK sends it as an `Authorization: Bearer` credential.\n\n## Sessions\n\n```typescript\nconst session = await sandbox.create({\n  name: \"my-sandbox\",\n  cpuCores: 4,\n  memoryMb: 8192,\n  diskSizeGb: 10,\n  allowInbound: true,\n  allowOutbound: true,\n  env: { NODE_ENV: \"production\" },\n  metadata: { purpose: \"ci\" },\n  tags: [\"ci\"],\n  cloneRepoUrl: \"https://github.com/org/repo\",\n  githubToken: process.env.GITHUB_TOKEN,\n  sticky: true,\n});\n\nawait session.refresh();\nawait session.extend(10 * 60 * 1000);\nawait session.update({ name: \"renamed\", tags: [\"ci\", \"kept\"] });\nawait session.pause();\nawait session.resume();\nawait session.close();\n```\n\n`idleTimeoutMinutes` is deprecated and ignored: sandboxes do not auto-pause on\nidle. Use `maxDurationMs`, or `session.pause()` to pause explicitly.\n\n`sticky: true` discards `maxDurationMs` and runs the session until it is\nterminated. Manual pause and resume do not clear sticky. The returned\n`session.warnings` array retains the structured warning. By default,\n`TenkiSandbox` writes each warning to `console.warn`. Set `warningHandler` to\nroute warnings through your logger, or pass `null` to suppress emission:\n\n```typescript\nconst sandbox = new TenkiSandbox({\n  warningHandler: (warning) => process.emitWarning(warning.message),\n});\n\nconst session = await sandbox.create({ sticky: true, maxDurationMs: 60 * 60 * 1000 });\nif (session.warnings[0]?.code === \"STICKY_OVERRIDES_MAX_DURATION\") {\n  console.log(\"maxDurationMs was discarded\");\n}\n```\n\nCreate from an image or snapshot:\n\n```typescript\nawait sandbox.create({ image: \"workspace/name:tag\" });\nawait sandbox.create({ snapshotId: \"snap_...\" });\n```\n\n### Durable pause\n\n`pauseAsync()` returns after the service durably accepts the request and moves the session to `PAUSING` on a node that supports asynchronous pause.\nSnapshot capture and persistence continue in the background; acceptance does not mean the VM has stopped or the snapshot is durable.\n`pause()` retains its existing completion behavior for compatibility.\nCall `waitPaused()` before resuming or relying on a durable checkpoint.\nIt resolves at `PAUSED` and throws `PauseFailedError` if a verified rollback restores `RUNNING`.\nPass `0` as `timeoutMs` to wait until an abort signal cancels the call.\n\n`DURABLE_CEPH` snapshots can resume on a capability-matched host in the same datacenter while R2 replication continues.\n`DURABLE` snapshots are portable to eligible hosts.\n`LOCAL_READY` is not resumable for pause operations.\n\n### What survives a pause\n\nPause captures the VM's full memory, not only its disk: a resumed session is the\nsame running machine, not a reboot. Processes keep their PIDs and their in-memory\nstate, and the guest clock stops for the duration of the pause.\n\n`/tmp` is cleared across a pause. Keep durable state under `/home/tenki`, which\nis preserved.\n\nWhile a session is paused it serves no traffic: preview requests return `404`\nuntil it resumes. The client connection itself is not dropped — a held\nkeep-alive connection returns `200` again after resume — so treat a paused\nsession as unavailable rather than disconnected.\n\nSSH is different: a held transport fails on use while paused and does not\nrecover after resume, so reconnect rather than retry on it. A fresh\nconnection succeeds as soon as the session is `RUNNING` again.\n\n```typescript\nasync function text(cmd: string): Promise<string> {\n  const result = await session.exec([\"bash\", \"-lc\", cmd]);\n  return new TextDecoder().decode(result.stdout).trim();\n}\n\nawait text(\"echo hello > ~/marker\");\nawait text(\"setsid nohup sleep 3600 >/dev/null 2>&1 </dev/null &\");\nconst pid = await text(\"pgrep -n sleep\");\n\nawait session.pause();\nawait session.resume();\n\nconsole.log(await text(\"cat ~/marker\")); // \"hello\" - the marker file survived\nconsole.log(await text(`kill -0 ${pid} && echo alive`)); // \"alive\" - same process, same memory\n```\n\n## Commands\n\n```typescript\nconst proc = session.run([\"npm\", \"test\"], { cwd: \"app\", env: { CI: \"true\" } });\n\nconst reader = proc.stdout.getReader();\ntry {\n  for (;;) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    process.stdout.write(value);\n  }\n} finally {\n  reader.releaseLock();\n}\n\nconst result = await proc;\nconsole.log(result.exitCode);\n```\n\n`exec` takes argv either as a command plus `options.args` or as a single array:\n\n```typescript\nawait session.exec(\"sh\", { args: [\"-c\", \"echo hi\"] });\nawait session.exec([\"sh\", \"-c\", \"echo hi\"]); // equivalent\n```\n\nFor simple commands, you can await `run` directly:\n\n```typescript\nconst result = await session.run([\"echo\", \"hello\"]);\nconsole.log(new TextDecoder().decode(result.stdout));\n```\n\nProcess `cwd` values follow the guest contract: relative paths are normalized\nunder the sandbox guest workdir (`/home/tenki` by default), absolute paths are\nused unchanged, and missing or non-directory targets fail before the process\nstarts.\n\n`cwd` sets the spawned process's directory. A login shell (`bash -lc`) sources\nthe guest's startup files first, so a `cd` in `~/.bashrc` or `~/.profile` runs\nbefore your command and wins over `cwd`; use `bash -c` when the directory must\nhold.\n\n### Timeouts and cancellation\n\nCommands are unbounded by default. Pass `timeoutMs` for a budget, or a `signal`\nto cancel.\n\nThe budget is enforced by the guest-agent, which signals the process on expiry\n(`SIGTERM`, escalating to `SIGKILL`) and reports the run as timed out. That is\n**not** an exception — it resolves with `status: \"TIMED_OUT\"`, carrying the output\ncaptured before the budget expired:\n\n```typescript\nconst result = await session.exec(\"bash\", { args: [\"-lc\", \"npm ci\"], timeoutMs: 120_000 });\nif (result.status === \"TIMED_OUT\") {\n  // result.reason is \"timeout\", or \"grace_timeout\" when the guest could not reap\n  // the process. Partial output usually shows where it stalled.\n  console.error(result.reason, new TextDecoder().decode(result.stdout));\n}\n```\n\nAborting **is** an exception — the call rejects with the signal's reason:\n\n```typescript\nconst controller = new AbortController();\nconst pending = session.exec(\"bash\", { args: [\"-lc\", \"make build\"], signal: controller.signal });\ncontroller.abort();\n```\n\nThe guest caps the request at its own configured maximum command timeout, and\nolder guest-agents accept `timeoutMs` but ignore it, leaving the run unbounded.\n\n### Background processes and long-running services\n\nA command returns when its **stdout and stderr reach EOF**, not when the shell\nexits. A backgrounded process inherits both streams and holds them open, so this\nwaits for the server rather than the shell:\n\n```typescript\n// Hangs: the server inherits stdout/stderr.\nawait session.exec(\"sh\", { args: [\"-lc\", \"python3 -m http.server 3000 &\"] });\n```\n\nRedirect **both** streams to detach it:\n\n```typescript\nawait session.exec(\"sh\", { args: [\"-lc\", \"python3 -m http.server 3000 >/home/tenki/http.log 2>&1 &\"] });\n```\n\nRedirecting only stdout is not enough — stderr still holds the stream open — and\n`nohup` does not help, because it blocks `SIGHUP` rather than stream inheritance.\nThis is standard POSIX behavior, the same as Node's own `child_process.exec`.\n\nTo keep hold of a service instead, use `session.run()` and read from the handle\nrather than awaiting it; for services you always want running, start them from a\ntemplate `startCmd` instead.\n\nThat last option is the durable one. Every exec child runs inside the\nguest-agent's own systemd cgroup, so a guest-agent restart kills it, and `nohup`\ndoes not change that. Pause and resume restore VM memory, so a backgrounded\nprocess does survive a pause with the same PID — which makes an ad-hoc service\nlook more durable than it is. Anything load-bearing belongs in a template start\ncommand with a readiness probe.\n\n### Stopping a process\n\n`signal()` and `kill()` enqueue a signal frame and resolve immediately — they do\n**not** wait for the process to die, matching Node's `child_process.kill()`.\nAwaiting the handle is what resolves once the process has actually exited:\n\n```typescript\nconst proc = session.run([\"sleep\", \"3600\"]);\nawait proc.signal(\"SIGTERM\"); // resolves once the frame is queued\nconst result = await proc; // resolves once the process has exited\nconsole.log(result.signal); // \"terminated\"\n```\n\n`result.signal` carries the guest's own name for the signal, not the name you\npassed: SIGTERM reports `\"terminated\"` and SIGKILL reports `\"killed\"`. Compare\nagainst those values, not against `\"TERM\"`/`\"KILL\"`.\n\nSignalling before the guest acknowledges the spawn is safe: the SDK may still be\nretrying the stream open, and a signal queued during that window is replayed onto\nthe replacement stream rather than being dropped.\n\n`kill()` takes no argument and always sends SIGKILL; use `signal(name)` for\nanything else. Only `KILL`, `TERM`, `INT`, `HUP`, `USR1` and `USR2` are\nsupported (with or without the `SIG` prefix), and **any unrecognized name is\nsilently sent as SIGTERM** — a typo like `signal(\"SIGTRM\")` stops the process\ngracefully instead of throwing, and so does `signal(\"unspecified\")`, which is a\nharmless no-op in the Python SDK. (Python raises `ValueError` for unknown names\ninstead.) Signalling a process that has already exited is a no-op, not an error,\nso the result of `signal()`/`kill()` is best-effort by design.\n\nProcess lifetime is bound to the Run stream, not to the handle. Once that stream\ntears down — the connection breaks, or the edge times the idle connection out\n(~30s) — the platform sends SIGTERM, escalates to SIGKILL after 5s if the process\nis still alive, and reaps it within 10s.\n\nDropping the handle does **not** close the stream on its own: the outbound queue\nis closed only once the result settles. An abandoned process can keep running,\nand one that keeps writing output keeps its own stream alive indefinitely. To\nstop a process, signal it and await the handle rather than abandoning it. There\nis no reattach — a caller that loses the handle must respawn.\n\n## Files\n\nSimple helpers:\n\n```typescript\nawait session.writeFile(\"/tmp/config.json\", '{\"key\":\"value\"}');\nconst data = await session.readFile(\"/tmp/config.json\");\nconsole.log(new TextDecoder().decode(data));\n```\n\nFilesystem API:\n\n```typescript\nawait session.fs.mkdir(\"/tmp/example\");\nawait session.fs.stat(\"/tmp/example\");\nconst entries = await session.fs.list(\"/tmp\");\nawait session.fs.remove(\"/tmp/example\");\n```\n\n### Disk space\n\nThe root disk defaults to 5 GB and holds the base image as well as your work, so a fresh\nsandbox already reports around 56% used. It is fixed at create time and cannot be grown in\nplace — pass `diskSizeGb` (5–100) to `create` if you need more. Budget for it before a\nlarge install.\n\nEvery `ExecResult` carries `disk`. `isDiskExhausted(result.disk)` reports whether the\nsandbox ran out of space at any point during the command — check it even when the command\nexited 0, since npm reports `ENOSPC` as a warning and still exits successfully with a\nbroken install.\n\n## Networking\n\n`allowInbound` and `allowOutbound` both default to `true`, so a session reaches the internet and can expose\nports without passing either option. They are create-time settings and cannot be changed on an existing\nsession; `session.inboundEnabled` / `session.outboundEnabled` report what a session was created with.\n\n### Egress allowlist\n\nRestrict outbound access with `allowDomains` and `allowCidrs`. A session that may only reach PyPI:\n\n```typescript\nconst session = await client.create({\n  allowDomains: [\"pypi.org\", \"*.pypi.org\", \"files.pythonhosted.org\"],\n});\n```\n\n`allowOutbound: false` still blocks everything, regardless of `allowDomains`/`allowCidrs`.\nRead the allowlist back from `session.egress`.\n\nExpose a sandbox port:\n\n```typescript\nconst port = await session.exposePort(3000, { ttlMs: 60 * 60 * 1000, slug: \"my-preview\" });\nconsole.log(port.previewUrl);\n\nconst ports = await session.listExposedPorts();\nawait session.unexposePort(3000);\n```\n\nDial from your program into the sandbox:\n\n```typescript\nconst conn = await session.dial(\"/var/run/docker.sock\");\n// conn has Web Streams: { readable, writable }.\n```\n\nExpose a local host port to the sandbox:\n\n```typescript\nconst tunnel = await session.resilientHostPortTunnel(\"127.0.0.1\", 3000, {\n  sandboxPort: 8080,\n});\n\nconst [address, port] = tunnel.endpoint();\nawait tunnel.close();\n```\n\n## Git\n\n```typescript\nawait session.git.clone(\"https://github.com/org/repo\", { depth: 1, directory: \"/home/tenki/repo\" });\nawait session.git.checkout(\"feature-branch\");\nconst diff = await session.git.diff({ base: \"main\", head: \"HEAD\" });\nconst log = await session.git.log({ maxCount: 10 });\nawait session.git.fetchPR(42, { remote: \"origin\", directory: \"/home/tenki/repo\" });\n```\n\n## Snapshots\n\n```typescript\nconst snapshot = await sandbox.createSnapshotAndWait(session.id, {\n  name: \"after-setup\",\n  expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),\n});\n\nconst restored = await sandbox.create({ snapshotId: snapshot.id });\n```\n\n## Registry\n\n```typescript\nconst published = await sandbox.publishRegistryImage({\n  fromSnapshotId: snapshot.id,\n  workspaceId: \"ws_...\",\n  name: \"my-image\",\n  tag: \"latest\",\n  visibility: \"private\",\n});\n\nconst resolved = await sandbox.resolveRegistryRef(\"my-image:latest\");\nconst next = await sandbox.create({ image: resolved.resolvedRef });\n\n// Only untagged, non-latest, unshared versions can be deleted.\nawait sandbox.deleteRegistryImageVersion(\n  \"01900000-0000-7000-8000-000000000001\",\n  \"01900000-0000-7000-8000-000000000002\",\n);\n```\n\n## Templates\n\nTemplates are typed, immutable recipes built from a Git context into private digest-addressed images. `TemplateSpec` is a fluent immutable builder: every method returns a new spec, the default base is the Tenki image `sandbox`, and `copy` sources are always relative to the checked-out Git context - nothing is uploaded from your local filesystem.\n\n```typescript\nimport { TemplateSpec } from \"@tenkicloud/sandbox\";\n\nconst spec = new TemplateSpec()\n  .fromImage(\"sandbox-v2\") // or .fromTemplate(parent) / .fromSnapshot(snapshot)\n  .withGitContext({ repo: \"https://github.com/acme/node-api\", ref: \"main\" })\n  .workdir(\"/home/tenki/app\")\n  .run(\"npm ci\", { name: \"Install dependencies\" })\n  .runtimeEnv({ NODE_ENV: \"production\" })\n  .startArgs([\"npm\", \"start\"], {\n    runAt: \"boot\",\n    readyWhen: [{ http: \"http://localhost:3000/health\" }],\n  });\n\nconst violations = spec.validate(); // local [{ field, message }]; the server stays authoritative\n\nconst template = await sandbox.createTemplate({\n  name: \"node-api\",\n  spec,\n});\n```\n\nBuild it, observing ordered log/progress events. Build secrets are explicit request-time values: they never land in the template, spec hash, provenance, or logs. Interrupting the observer (handler error, AbortSignal, Ctrl-C) stops watching only; cancelling the remote build is always explicit via `cancelTemplateBuild`.\n\n```typescript\nconst build = await sandbox.buildTemplate(template, {\n  buildSecrets: { GITHUB_TOKEN: token },\n  waitForCompletion: true,\n  onEvent(event) {\n    // Discriminated union, delivered in order; async handlers are awaited sequentially.\n    if (event.type === \"log\") process.stdout.write(event.data);\n    else console.log(`[${event.phase}] ${event.state}`, event.step?.label);\n  },\n});\n\nconsole.log(build.specHash, build.image?.digestRef); // e.g. acme/node-api@sha256:...\n```\n\nA waited build failure throws `TemplateBuildFailedError` carrying the final build. `waitForTemplateBuild(build)` reconnects to an in-flight build with the same ordered, deduplicated event delivery.\n\nLaunch sandboxes from the built image. `waitForRuntime: true` also waits for the declared runtime to become READY; runtime failure leaves the sandbox RUNNING and throws `TemplateRuntimeFailedError` carrying the session and redacted failure.\n\n```typescript\nconst session = await sandbox.create({ image: build.image, waitForRuntime: true });\n```\n\nFilesystem snapshots (the default) capture the built filesystem and start the runtime on boot. `snapshotMode: \"memory\"` (with `runAt: \"build\"` and a `readyWhen` deadline) captures the running process for near-instant restore; when memory restore is unavailable or incompatible the platform cold-boots the same image rootfs, starts the declared runtime, and waits on the same `readyWhen` contract - never silently falling back to a clean base image.\n\n```typescript\nconst memorySpec = new TemplateSpec()\n  .withGitContext({ repo: \"https://github.com/acme/node-api\", ref: \"main\" })\n  .run(\"npm ci\")\n  .startArgs([\"npm\", \"run\", \"dev\"], {\n    runAt: \"build\",\n    snapshotMode: \"memory\",\n    readyWhen: { timeoutSeconds: 60, checks: [{ port: 3000 }] },\n  });\n```\n\nSpecs round-trip through strict authored JSON with `JSON.stringify(spec)` / `TemplateSpec.fromJSON(json)`. Enum fields use short lowercase values: checkout `mode` is `\"contents\"` or `\"directory\"`; runtime `runAt`, `restartPolicy`, and `snapshotMode` use values such as `\"build\"`, `\"on-failure\"`, and `\"memory\"`. Existing full protobuf enum names remain accepted, unknown fields are rejected, and the canonical spec hash is computed server-side only.\n\n## SSH\n\nUse `session.run()` for normal command execution. `session.ssh()` is a low-level,\nbidirectional byte transport for SSH protocol implementations that accept a\ncustom stream. It does not open a shell or execute command text itself.\n\nA custom SSH integration needs a caller-owned key pair; the private key stays\nwith your application. Pass the public key in OpenSSH `authorized_keys` format\nto Tenki, then authenticate the SSH client with the matching private key and\nreturned certificate. The minimal SDK sequence is:\n\n```typescript\nconst credentials = await sandbox.issueSandboxSSHCert(session.id, publicKey);\nconst transport = await session.ssh();\ntry {\n  // Adapt transport.read(), write(), and close() to your SSH client.\n  // Authenticate with the matching private key and credentials.sshCert.\n} finally {\n  transport.close();\n}\n```\n\n`credentials.expiresAt` is the absolute certificate expiry.\n`credentials.renewalAfterMs` is an optional elapsed-time hint for minting a new\ncertificate before opening a later connection. `credentials.permissions`\nreports the SSH features allowed for the certificate.\n\nFor OpenSSH, save `credentials.sshCert` beside the private key as\n`<key>-cert.pub`, or pass it with `CertificateFile`. OpenSSH cannot consume\n`session.ssh()` directly because the SDK transport is not a TCP socket; it\nrequires a transport adapter such as a ProxyCommand.\n\nGateway selection is automatic. Most users should not set `gatewayAddress` or\n`TENKI_SANDBOX_GATEWAY_URL`; they are advanced overrides for environments with\na custom SSH gateway address. Setting either disables automatic selection.\n`sshAuthorizedKeys` installs public keys inside the sandbox, but connections\nthrough Tenki's SSH gateway also require a short-lived certificate from\n`issueSandboxSSHCert`.\n\n## Identity\n\n```typescript\nconst me = await sandbox.whoAmI();\nconsole.log(\n  me.ownerId,\n  me.workspaces.map((w) => w.id),\n);\n```\n\n## Error Handling\n\nAll SDK errors extend `SandboxError`:\n\n```typescript\nimport { SandboxError } from \"@tenkicloud/sandbox\";\n\ntry {\n  await session.run([\"false\"]);\n} catch (err) {\n  if (err instanceof SandboxError) {\n    console.error(err.message);\n  }\n}\n```\n\n## Size Constants\n\n```typescript\nimport { GB, GiB, KB, KiB, MB, MiB, TB, TiB } from \"@tenkicloud/sandbox\";\n```\n\n## Workspace secrets\n\n`WorkspaceClient` exposes workspace resources through `workspace.secrets`, independently of sandbox Sessions:\n\n```typescript\nimport { WorkspaceClient } from \"@tenkicloud/sandbox\";\n\nawait using workspace = new WorkspaceClient({ workspaceId });\nconst secret = await workspace.secrets.create(\"TOKEN\", valueBytes, requestId);\n```\n\nAuthentication uses `TENKI_AUTH_TOKEN` or `TENKI_API_KEY`. Set `baseUrl` or\n`TENKI_CLOUD_API_URL` to override the cloud API endpoint independently of sandbox\nconfiguration. Set `workspaceId` once on the client. An omitted or empty workspace ID uses the authenticated workspace key's scope;\nother callers must specify one.\n\n`create`, `update`, `get`, `list`, `listVersions`, `revoke`, and `delete` return\nmetadata only. Values are `Uint8Array`; omitting `value` on update retains it, while\nan empty array creates an empty value. Update, revoke, and delete require\n`expectedRevision`. To select an existing version, update `activeVersion` with\n`value` omitted. Revoking without `version` revokes every version. Revoking the active version revokes\nthe secret until a new value or an unrevoked version is made active.\n\nMutations generate a request ID when none is supplied. For retries after an\nuncertain result, supply and reuse the same request ID and identical arguments.\nThe SDK does not retry mutations automatically. `WorkspaceSecretError.code`\npreserves the RPC status, including revision conflicts.\n\nWorkspace secrets can be referenced by a managed runtime without passing their values:\n\n```typescript\nconst runtime = new TemplateSpec().start(\"npm start\", {\n  secretEnv: { API_TOKEN: \"app-token\" },\n});\nconst session = await sandbox.create({\n  image: \"team/base:v1\",\n  directRuntime: runtime,\n  secretOverrides: { \"app-token\": \"development-token\" },\n});\n```\n\nThe same `secretEnv` option works with `startArgs` and `processCompose` in stored\ntemplates. Names resolve in the launching workspace. `directRuntime` accepts a\nruntime-only `TemplateSpec` and starts at boot; use create options for the image\nand resources. Secret targets cannot also appear in ordinary runtime/session env.\n`session.hasRuntimeSecrets` and `snapshot.hasRuntimeSecrets` are read-only markers.\n\n## Runtime secret files\n\nPut `secrets://API_TOKEN` in any text file, regardless of filename or extension. Built templates capture unresolved source text from the guest image; direct launches supply content read on the caller. Values resolve from the launching workspace before managed startup.\n\n```typescript\nimport { readFile } from \"node:fs/promises\";\n\n// Built template: source is already inside the image.\nconst spec = new TemplateSpec().start(\"python3 /app/server.py\", {\n  secretFiles: [{ source: \"/app/env.tpl-sandbox\", path: \"/app/.env\" }],\n});\n\n// Direct launch: read on the caller and upload unresolved text.\nconst session = await client.create({\n  image: \"my-template:latest\",\n  secretFiles: [{ path: \"/app/.env\", content: await readFile(\"./env.tpl-sandbox\", \"utf8\") }],\n  secretOverrides: { API_TOKEN: \"STAGING_API_TOKEN\" },\n});\n```\n\nRendering performs one literal pass, without YAML/JSON/dotenv escaping, environment expansion, or recursive substitution. A backslash before a marker escapes it. Authors must ensure the actual consumer accepts the result; do not shell-source rendered secret text. Use a raw reference for exact-byte credentials, including binary values.\n\nAllowed destinations are under `/home/tenki/`, `/workspace/`, or `/app/`. Files are private, owned by tenki, and replaced atomically. Duplicate destinations, unsafe paths, and missing references fail startup. Limits: 64 KiB per secret, 256 KiB per source/output file, 1 MiB total source/output, 32 files, and 64 references across environment and files.\n\nGuest values remain frozen across retries, restart, and ordinary resume; replacement Sessions adopt updates. Escape a file marker as `\\secrets://NAME` to preserve `secrets://NAME` for separately authorized outbound injection; the marker grants no authority by itself. See [the file delivery contract](../../../docs/sandbox-secret-files.md) for lifecycle and path details.\n\n## Transparent HTTPS secrets\n\nCreate `API_TOKEN` through the workspace Secrets client, then save and select a request policy:\n\n```typescript\nawait workspaceClient.secrets.policies.create(\"example\", [\n  {\n    origin: \"https://api.example.com\",\n    methods: [\"POST\"],\n    pathPrefix: \"/v1/\",\n    header: \"Authorization\",\n    secrets: [\"API_TOKEN\"],\n  },\n]);\nconst sandbox = await client.create({ secretPolicies: [\"example\"] });\n```\n\nUse `secretPolicies` in template `start`, `startArgs`, or `processCompose` options for required policies.\n\nSend `Authorization: Bearer secrets://API_TOKEN` from the sandbox. The reference uses the actual secret name. No alias or injection override is required. Rules can instead select a `queryParameter` or `jsonPointer`, with one location per rule and one or more names in `secrets`.\n\nPolicies belong to a workspace and apply only to sessions that select them. Template-required names resolve in the launching workspace; explicit selections add to them. Policy edits and deletion affect subsequent requests on attached sessions. Rotation uses the active value, and revoked or deleted secrets are denied. Deleting and recreating a name does not retarget existing bindings.\n\nEvery referenced location must match a selected policy before the request is forwarded. Existing egress rules still apply. An unavailable resolver fails closed. Ordinary values and absent fields remain unchanged.\n\nHTTPS interception requires a capable node and guest trust in the managed CA. Permit only trusted origins and paths: an upstream that echoes credentials can expose a value to the guest. See the [workspace secrets guide](../../../docs/src/product/workspace-secrets.md) for location limits and lifecycle behavior.\n","readmeFilename":"README.md"}