{"_id":"@benev/archimedes","_rev":"12-f4bae90fc15ff2ebba642ed95ab31951","name":"@benev/archimedes","dist-tags":{"latest":"0.2.0-2"},"versions":{"0.1.0-1":{"name":"@benev/archimedes","version":"0.1.0-1","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-1","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benevolent-games/archimedes#readme","bugs":{"url":"https://github.com/benevolent-games/archimedes/issues"},"dist":{"shasum":"f05896e55b517beb4507d0a37fab191461908053","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-1.tgz","fileCount":133,"integrity":"sha512-zVQdI54B0wA3/9vjHROeTM7S/+6APgn+rrhYTcTcyMyaY7tbMzODVABXYFXXi9XJbO8/Pqw31YWdoIaMwOZ6GA==","signatures":[{"sig":"MEQCIEscL5Db5OVJeckMhdtiucFCsZZQvetNXmPS0InSwmW1AiB+IFqRBGjjF5+5CAGtFB3J+A/dEi+es8QNmdhYijQrAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98363},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"54cf8a2f6496d4722ce728740f33d8adb130d360","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"octo-s 'rm -rf x' 'mkdir x' 'tsc'","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"chasemoskal","email":"chasemoskal@gmail.com"},"repository":{"url":"git+https://github.com/benevolent-games/archimedes.git","type":"git"},"_npmVersion":"11.11.0","description":"game ecs with auto networking","directories":{},"_nodeVersion":"25.6.1","dependencies":{"@e280/stz":"^0.2.27","sparrow-rtc":"^0.2.15","@e280/renraku":"^0.5.7","@msgpack/msgpack":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.0","typescript":"^6.0.2","npm-run-all":"^4.1.5","@e280/science":"^0.1.9"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-1_1775004183715_0.9957860773199574","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-2":{"name":"@benev/archimedes","version":"0.1.0-2","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-2","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benevolent-games/archimedes#readme","bugs":{"url":"https://github.com/benevolent-games/archimedes/issues"},"dist":{"shasum":"aab0835490159fff230628c3ff08aae40bfdb014","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-2.tgz","fileCount":133,"integrity":"sha512-o05PemLILn43lnYgCoGSQT4Iq9CCzjrWq09a3Pyab0061osbw9MD2fu5jcECb1TRQCTYt4O8cLmtDhyvdXwwPw==","signatures":[{"sig":"MEQCHwtlMMXMNQ0UGjmPPF3aiY+lhd4To4jN5vwQHWD1VacCIQDNWn2tOVpozh3Gd1RKDhRD8wvrHFDol7kKxNbKEXEN8g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.1.0-2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":98363},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"8e5660da984a59ea89e0b269dd483a91273e900c","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"octo-s 'rm -rf x' 'mkdir x' 'tsc'","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c91d3e30-a46e-481a-ba5c-00bae3dabc7d"}},"repository":{"url":"git+https://github.com/benevolent-games/archimedes.git","type":"git"},"_npmVersion":"11.11.1","description":"game ecs with auto networking","directories":{},"_nodeVersion":"25.8.2","dependencies":{"@e280/stz":"^0.2.27","sparrow-rtc":"^0.2.15","@e280/renraku":"^0.5.7","@msgpack/msgpack":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.0","typescript":"^6.0.2","npm-run-all":"^4.1.5","@e280/science":"^0.1.9"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-2_1775020073043_0.4662017135612522","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-3":{"name":"@benev/archimedes","version":"0.1.0-3","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-3","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benevolent-games/archimedes#readme","bugs":{"url":"https://github.com/benevolent-games/archimedes/issues"},"dist":{"shasum":"5c0c535d337e7690318790b59a6c20b5f977afe0","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-3.tgz","fileCount":137,"integrity":"sha512-K/2gynh6YCbDK23PiqY6l/rrbe6PiTRSxKbkzzf/3teWM773mo4PLznevfTLGwVET3Yk1o6t6PKYCtFN64wY+A==","signatures":[{"sig":"MEYCIQCtHBKVhjst8zriHlFbkDSPtvE+GAlbwl9KOCD+eUBmFAIhAP2rodxabZcmOsSvzz+spVgTwuipa6t5LG6xXUsoxH54","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.1.0-3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":106071},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"29e85c37565dc4d0e35dc24fa3533ea3b3cd2441","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"octo-s 'rm -rf x' 'mkdir x' 'tsc'","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c91d3e30-a46e-481a-ba5c-00bae3dabc7d"}},"repository":{"url":"git+https://github.com/benevolent-games/archimedes.git","type":"git"},"_npmVersion":"11.11.1","description":"game ecs with auto networking","directories":{},"_nodeVersion":"25.8.2","dependencies":{"@e280/stz":"^0.2.27","sparrow-rtc":"^0.2.15","@e280/renraku":"^0.5.7","@msgpack/msgpack":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.0","typescript":"^6.0.2","npm-run-all":"^4.1.5","@e280/science":"^0.1.9"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-3_1775021584340_0.5808136905978534","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-4":{"name":"@benev/archimedes","version":"0.1.0-4","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-4","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benevolent-games/archimedes#readme","bugs":{"url":"https://github.com/benevolent-games/archimedes/issues"},"dist":{"shasum":"c2e25e16eed0c3648bf3ef5014d047b6bc779575","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-4.tgz","fileCount":137,"integrity":"sha512-cxBkN7BSyEPZWq+o4F7J35Yuyqp3TjJtDRYhxD30vQ25EqD0t0kDuZlcLPQ/0Q6atipfgj8/ko/P7MMvETRdsg==","signatures":[{"sig":"MEYCIQD8SbwObEYdK51cKCTI2rXVX9zSWo84czicjV6IQSWLZAIhAMQfbXQpTu0skajuO4s2ETBD0+7mbkYqBnGV+WYQQV75","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.1.0-4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":113775},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"a2e272939c88db4030cd19e3d6057b7ce9324e40","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"rm -rf x && mkdir x && tsc","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c91d3e30-a46e-481a-ba5c-00bae3dabc7d"}},"repository":{"url":"git+https://github.com/benevolent-games/archimedes.git","type":"git"},"_npmVersion":"11.12.1","description":"game ecs with auto networking","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@e280/stz":"^0.2.29","sparrow-rtc":"^0.2.15","@e280/renraku":"^0.5.7","@msgpack/msgpack":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.0","typescript":"^6.0.2","npm-run-all":"^4.1.5","@e280/science":"^0.1.10"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-4_1775266960497_0.27966689197689165","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-5":{"name":"@benev/archimedes","version":"0.1.0-5","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-5","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benevolent-games/archimedes#readme","bugs":{"url":"https://github.com/benevolent-games/archimedes/issues"},"dist":{"shasum":"43c6fb3d32cd4fcbce7be4b523aa512f4226eb54","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-5.tgz","fileCount":137,"integrity":"sha512-RbY0fg9czlzc5thTewyU0VtgxgXfQKSYDcmtm/3Vqjnep/ejZkRzDYMVvsi2RAmAftVArw8NbRp88PARR7VZGw==","signatures":[{"sig":"MEYCIQCD8t03VqMvIbYZUY225kAL9k/xytNdj7KaGqFjlDYATAIhAPwcPBfxv8kWAtcSactXqIK3h3dvLhvWkTnoyY1sw6jB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.1.0-5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":119583},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"5ed6a93d36427951c544452448e1563408da3f59","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"rm -rf x && mkdir x && tsc","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c91d3e30-a46e-481a-ba5c-00bae3dabc7d"}},"repository":{"url":"git+https://github.com/benevolent-games/archimedes.git","type":"git"},"_npmVersion":"11.12.1","description":"game ecs with auto networking","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@e280/stz":"^0.2.29","sparrow-rtc":"^0.2.15","@e280/renraku":"^0.5.7","@msgpack/msgpack":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.0","typescript":"^6.0.2","npm-run-all":"^4.1.5","@e280/science":"^0.1.10"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-5_1775375576198_0.7580272561126058","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-6":{"name":"@benev/archimedes","version":"0.1.0-6","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-6","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benevolent-games/archimedes#readme","bugs":{"url":"https://github.com/benevolent-games/archimedes/issues"},"dist":{"shasum":"d083185cabb83d2faf2f90365d5ea1a01cadca41","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-6.tgz","fileCount":137,"integrity":"sha512-R7jcUM7wgBA+SwSKWlZtEGOaIwIeV1sSnBBzIvBe5pOqyDV30K8W8W0z6rm0ERdnHGVYV+EQp13GSlF8w1P4Ng==","signatures":[{"sig":"MEQCIBdeKsmzYAgFsw7/cb5PGhq0EO1g9YrZ9kUlWiXO+xOsAiAYxK3WPIudw5b5/PIzCCNDseRWfnfewuDHIq/0WPWAhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.1.0-6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":121411},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"84fd4bae40765cd1a9d36eb0c964cd5e26f16710","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"rm -rf x && mkdir x && tsc","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c91d3e30-a46e-481a-ba5c-00bae3dabc7d"}},"repository":{"url":"git+https://github.com/benevolent-games/archimedes.git","type":"git"},"_npmVersion":"11.12.1","description":"game ecs with auto networking","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@e280/stz":"^0.2.30","sparrow-rtc":"^0.2.15","@e280/renraku":"^0.5.7","@msgpack/msgpack":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.0","typescript":"^6.0.2","npm-run-all":"^4.1.5","@e280/science":"^0.1.10"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-6_1775686067252_0.9911441923637949","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-7":{"name":"@benev/archimedes","version":"0.1.0-7","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-7","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benevolent-games/archimedes#readme","bugs":{"url":"https://github.com/benevolent-games/archimedes/issues"},"dist":{"shasum":"06d45bf92499f3114df498afb69879c7e1add7db","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-7.tgz","fileCount":137,"integrity":"sha512-4QZk04OkKPAXgZDq9bs8okMmZ0tWQlGkstcJlPtp4BauTDQXdNAhFrrXqK0C+ao3ThU/m3HbMQSRYKp0zSIgjQ==","signatures":[{"sig":"MEUCIBTqalcGRIg2xKJB+IdRajeT9gyHUvWIOfOyYJ7OtyM5AiEAmxim6dZ6bHzdgm0zaKLEEV8v2NDkelYgsFtcjMMfz3U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.1.0-7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":121324},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"9d575b6a09005b02a59c21207fb42c03246f489f","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"rm -rf x && mkdir x && tsc","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c91d3e30-a46e-481a-ba5c-00bae3dabc7d"}},"repository":{"url":"git+https://github.com/benevolent-games/archimedes.git","type":"git"},"_npmVersion":"11.12.1","description":"game ecs with auto networking","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@e280/stz":"^0.2.32","sparrow-rtc":"^0.2.15","@e280/renraku":"^0.5.7","@msgpack/msgpack":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.0","typescript":"^6.0.2","@e280/science":"^0.1.10"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-7_1776067605172_0.44344198987713956","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-8":{"name":"@benev/archimedes","version":"0.1.0-8","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-8","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benev-gg/archimedes#readme","bugs":{"url":"https://github.com/benev-gg/archimedes/issues"},"dist":{"shasum":"e2c47726b1ea16e9fecb1a1096e077c7a9d8d857","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-8.tgz","fileCount":137,"integrity":"sha512-LbWI8gjcbNUPskSr9x6O6NWnMwYqtYouVoA6BlA9PaDAmXB461z+IKUD+dhfsVS8Bzq2JlWNrdDpfAxKXixYqA==","signatures":[{"sig":"MEUCICC6pV91Hsf2utojRiinhePHbjDL/ySf2UXgvhABt/b0AiEAwZ9K4z9fM4yDUEpOtMmG1AcP+KeQyESd5YZX/wHZEeU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.1.0-8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":122627},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"27b738836abbaaf1e93df28e052b64360dd7d916","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"rm -rf x && mkdir x && tsc","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e6015509-994e-486b-89bc-affc50287627"}},"repository":{"url":"git+https://github.com/benev-gg/archimedes.git","type":"git"},"_npmVersion":"11.12.1","description":"🏛️ game ecs and netcode","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@e280/stz":"^0.3.7","sparrow-rtc":"^0.2.15","@e280/renraku":"^0.5.8","@msgpack/msgpack":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.3","typescript":"^7.0.2","@e280/science":"^0.1.11"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-8_1784766772517_0.40982424720256216","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-9":{"name":"@benev/archimedes","version":"0.1.0-9","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-9","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benev-gg/archimedes#readme","bugs":{"url":"https://github.com/benev-gg/archimedes/issues"},"dist":{"shasum":"396183f7832623d9ed1692b00e27f0b1f02ecf3d","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-9.tgz","fileCount":137,"integrity":"sha512-gP/x66QENj8Z6Cl/2dDsTfUa9bgKNtWQGxnimtmy4uAyig718BjwWZSvfLUkkWoBHNfW/k8rAZHXtSPKWjKbYA==","signatures":[{"sig":"MEYCIQCluZF/mIni2FQU/by0v+3sS/0Z7c86PkxriVMqkPHFMwIhAIr6BR8M7w++Fp6gf5m7YEBd3FhoG16tGiIj7sH7qUwK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.1.0-9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":122668},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"2b4fe5ca06f9af6260cd1f26cfd35c4f96497b60","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"rm -rf x && mkdir x && tsc","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e6015509-994e-486b-89bc-affc50287627"}},"repository":{"url":"git+https://github.com/benev-gg/archimedes.git","type":"git"},"_npmVersion":"11.12.1","description":"🏛️ game ecs and netcode","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@e280/stz":"^0.3.10","sparrow-rtc":"^0.2.15","@e280/renraku":"^0.5.9","@msgpack/msgpack":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.5","typescript":"^7.0.2","@e280/science":"^0.1.12"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-9_1788311159679_0.6044533053703498","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-10":{"name":"@benev/archimedes","version":"0.1.0-10","keywords":["networking","rollforward","web-games"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.1.0-10","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benev-gg/archimedes#readme","bugs":{"url":"https://github.com/benev-gg/archimedes/issues"},"dist":{"shasum":"7e5099bc644ab0cbd1ee22f9504ae0b450c4268c","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.1.0-10.tgz","fileCount":137,"integrity":"sha512-x0Eu3ha/4wzLsiNWuOq5p6szSfknlNJG2boJVhsvYtIvZg/ewGfT19Z2ZtvboUzV79T8U91nupHUabMOvSDxvQ==","signatures":[{"sig":"MEYCIQCHrWszwnwruAKqkR2XR5FmV9GY0FPnynnQvhkskCQ80AIhAPNh5Ifu/4JcOhqMT3vzVIN5vaGjMMMveFe6CaIupiQq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCmzE9yjMLrU9NjptIKiLDrjc4B9y65e3KxuTr6mS0GJwIhAJXhOZa+9WHiiwCM0wqNtALVFDnDEm6uCyHthp7NhaEO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.1.0-10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":122733},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"a78ee7ed91751da12bd9b96f36a9e90994c59204","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"rm -rf x && mkdir x && tsc","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e6015509-994e-486b-89bc-affc50287627"}},"repository":{"url":"git+https://github.com/benev-gg/archimedes.git","type":"git"},"_npmVersion":"11.12.1","description":"🏛️ game ecs and netcode","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@e280/stz":"^0.3.12"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.5","typescript":"^7.0.2","@e280/science":"^0.1.12"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.1.0-10_1789638697495_0.5328645725472436","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-1":{"name":"@benev/archimedes","version":"0.2.0-1","keywords":["ecs","game","web game","architecture"],"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","_id":"@benev/archimedes@0.2.0-1","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"homepage":"https://github.com/benev-gg/archimedes#readme","bugs":{"url":"https://github.com/benev-gg/archimedes/issues"},"dist":{"shasum":"52c252a08811852dbb0b0a4b6230601bf17c6b23","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.2.0-1.tgz","fileCount":111,"integrity":"sha512-nohOchN+DfNj8RXbBnPR7as1opLVRpThlshTMEA8tzLRt+xGZ7GvpGu/7wFwWtcPhY3HXeAv3OBCj5xUsCuhvQ==","signatures":[{"sig":"MEUCIQDEBa6m29KhUZTblF+5K7rS9QibTIj0dx77q9NVXxx+UwIgRP10Aj6/i0BzMQbWWJj9V8A4KW9w4o0glEPz1/5PRi8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCtgjlphPiujLb3mNArPqucq4pyu7mKXHKwNzWcR1tv+wIhAJRckrEicvOcsyy0URdVx+fEPU1jWSUUBR9qyON2qp/+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.2.0-1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":159271},"main":"x/index.js","type":"module","types":"./x/index.d.ts","gitHead":"526f8eb9293780a63ba121ef8f4f45e7934293e9","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"rm -rf x && mkdir x && tsc","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e6015509-994e-486b-89bc-affc50287627"}},"repository":{"url":"git+https://github.com/benev-gg/archimedes.git","type":"git"},"_npmVersion":"11.19.1","description":"🌀 architecture for web games","directories":{},"_nodeVersion":"26.10.0","dependencies":{"@e280/stz":"^0.4.2","@awasm/noble":"^0.1.4"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.5","typescript":"^7.0.2","@e280/science":"^0.1.12"},"_npmOperationalInternal":{"tmp":"tmp/archimedes_0.2.0-1_1790248649829_0.7673836250255899","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-2":{"_id":"@benev/archimedes@0.2.0-2","bugs":{"url":"https://github.com/benev-gg/archimedes/issues"},"dist":{"shasum":"b84ac43b4f1054ca1bc5c84a587da9d769ceeebc","tarball":"https://registry.npmjs.org/@benev/archimedes/-/archimedes-0.2.0-2.tgz","fileCount":123,"integrity":"sha512-SZbFnDo4xRJg6oUvOdj2QFG2rjDtlcLVlAcHdJD1OZvOHsJcmSSceX3EXv67DGmiqds26Qb3zZGbR+Je1dbzNQ==","signatures":[{"sig":"MEUCIQDBNkRmCkxjh1NBpf9NN3Cei23vu8+4gp4ZygqnK0kF4QIgL468IUbb7eRPiwdGKz2+wpmGpoS3cdXIdTvzTJvLJls=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIE/FxFEk9qp6EsYhSifnWgjUpUj4XZ61EoH7aHgAdfOtAiAMwnQz5cp9FLBPl3vjxMRjJTx4OuateKhzhZHR8wzukQ=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@benev%2farchimedes@0.2.0-2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":169744},"main":"x/index.js","name":"@benev/archimedes","type":"module","types":"./x/index.d.ts","author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"gitHead":"3719a7ef274840ff1d55fe5fdc84d8ff34c1c16b","license":"MIT","scripts":{"dev":"octo 'node --watch x/test.js' 'tsc -w'","test":"node x/test.js","build":"rm -rf x && mkdir x && tsc","count":"find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"},"version":"0.2.0-2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e6015509-994e-486b-89bc-affc50287627"}},"homepage":"https://github.com/benev-gg/archimedes#readme","keywords":["ecs","game","web game","architecture"],"repository":{"url":"git+https://github.com/benev-gg/archimedes.git","type":"git"},"_npmVersion":"11.19.1","description":"🌀 architecture for web games","directories":{},"maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"_nodeVersion":"26.10.0","dependencies":{"@e280/stz":"^0.4.2","@awasm/noble":"^0.1.4"},"_hasShrinkwrap":false,"devDependencies":{"@e280/octo":"^0.1.5","typescript":"^7.0.2","@e280/science":"^0.1.12"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/archimedes_0.2.0-2_1790315899542_0.7243259086268761"}}},"time":{"created":"2026-04-01T00:43:03.602Z","modified":"2026-09-25T05:58:20.018Z","0.1.0-1":"2026-04-01T00:43:03.876Z","0.1.0-2":"2026-04-01T05:07:53.198Z","0.1.0-3":"2026-04-01T05:33:04.515Z","0.1.0-4":"2026-04-04T01:42:40.674Z","0.1.0-5":"2026-04-05T07:52:56.381Z","0.1.0-6":"2026-04-08T22:07:47.421Z","0.1.0-7":"2026-04-13T08:06:45.295Z","0.1.0-8":"2026-07-23T00:32:52.667Z","0.1.0-9":"2026-09-02T01:05:59.861Z","0.1.0-10":"2026-09-17T09:51:37.579Z","0.2.0-1":"2026-09-24T11:17:29.919Z","0.2.0-2":"2026-09-25T05:58:19.639Z"},"bugs":{"url":"https://github.com/benev-gg/archimedes/issues"},"author":{"name":"Chase Moskal","email":"chasemoskal@gmail.com"},"license":"MIT","homepage":"https://github.com/benev-gg/archimedes#readme","keywords":["ecs","game","web game","architecture"],"repository":{"url":"git+https://github.com/benev-gg/archimedes.git","type":"git"},"description":"🌀 architecture for web games","maintainers":[{"name":"chasemoskal","email":"chasemoskal@gmail.com"}],"readme":"\n![](https://i.imgur.com/mKSNcTS.png)\n\n# 🌀 archimedes, architecture for web games\n\n> [***\"do not disturb my circles!\"***](https://en.wikipedia.org/wiki/noli_turbare_circulos_meos!)  \n> &nbsp; &nbsp; — *archimedes, c. 212 bc*\n\n```bash\nnpm install @benev/archimedes\n```\n\n**archimedes is an ecs toolkit.**  \nentities feel like ordinary javascript objects.  \nbut underneath, archimedes is tightly packing bytes into contiguous memory blocks.  \n*ergonomic. compact. efficient. strongly typed.*  \n\n**built for where games get complicated.**  \ndesigned for multithreading, serialization, and rollback networking.  \n\n**not a rendering engine.**  \narchimedes helps structure your game simulation, but you bring your own renderer. try [babylon lite.](https://www.babylonjs.com/lite/)  \n\n- 🎮 ***[#simple,](#simple)*** **game example**\n- 👾 ***[#entities,](#entities)*** **things in your game**\n- 🧩 ***[#components,](#components)*** **properties your entities can have**\n- ⚙️ ***[#systems,](#systems)*** **game logic**\n\n\n\n<br/><a id=\"simple\"></a>\n\n## 🎮 simple, game example\n\n```ts\nimport {Entities, i8, vec2, makeId, gameloop} from \"@benev/archimedes\"\n```\n\n1. **entities and components.**\n    ```ts\n    const entities = new Entities({\n      health: i8,\n      position: vec2,\n    })\n    ```\n1. **create your first entity.**\n    ```ts\n    const id = entities.set(makeId(), {\n      health: 100,\n      position: [1, 2],\n    })\n    ```\n    (here's how you'd read it later)\n    ```ts\n    entities.get(id)\n      // {health: 100, position: [1, 2]}\n    ```\n1. **write some game logic.**\n    ```ts\n    function simulate() {\n\n      // hazards deal damage\n      for (const [id, entity] of entities.select(\"health\", \"position\")) {\n        if (entity.position[1] < 0)\n          entities.update(id, {health: entity.health - 1})\n      }\n\n      // dead things disappear\n      for (const [id, entity] of entities.select(\"health\"))\n        if (entity.health <= 0)\n          entities.delete(id)\n    }\n    ```\n1. **start the simulation at 60 hertz.**\n    ```ts\n    gameloop(60, simulate)\n    ```\n\n\n\n<br/><a id=\"entities\"></a>\n\n## 👾 entities, things in your game\n\n```ts\nimport {Entities, makeId} from \"@benev/archimedes\"\n```\n\nthis entities class is the bread and butter of archimedes.  \nit's a robust flexible primitive that you can build a whole damn game around.  \nit's ergonomic, efficient, and easily synced across network or web worker boundaries.  \n\nit feels like normal js map *(but it's secretly not, tee hee!)*\n\n- **new Entities,** establish your entities.\n    ```ts\n    const entities = new Entities(components)\n    ```\n- **entities.set,** create or overwrite an entity.\n    ```ts\n    // create an entity\n    const id = entities.set(makeId(), {\n      health: 100,\n      position: [1, 2, 3],\n    })\n    ```\n    - `makeId()` creates random 128-bit ids. provide parameters to make a deterministic hash id instead, which is better for multiplayer clientside prediction. `makeId(playerId, \"arrow\", arrowCount)`\n- **entities.update,** apply a partial patch for an existing entity.\n    ```ts\n    entities.update(id, {health: 99})\n      // update only the health value.\n    ```\n    ```ts\n    entities.update(id, {color: undefined})\n      // update undefined means \"deletes that value\".\n    ```\n- **has, get, got, delete, clear.**\n    ```ts\n    entities.has(id)\n      // true or false.\n    ```\n    ```ts\n    entities.get(id)\n      // {health: 100, position: [1, 2, 3]} or undefined.\n      // entity values are typescript readonly.\n    ```\n    ```ts\n    entities.got(id)\n      // {health: 100, position: [1, 2, 3]} or throw error.\n    ```\n    ```ts\n    entities.delete(id)\n    ```\n    ```ts\n    entities.clear()\n    ```\n    ```ts\n    // iteration, there's also .entries(), .keys(), .values().\n    for (const [id, values] of entities)\n      console.log(id, values)\n    ```\n- **entities.select,** get entities based on what values they have.\n    ```ts\n    // only select entities with both 'health' and 'position'\n    const selected = entities.select(\"health\", \"position\")\n    ```\n    - your game logic systems should be doing a lot of these select calls.\n    - select calls are optimized with indexes.\n- **entities.save,** get a binary snapshot file.\n    ```ts\n    const file = entities.save()\n    ```\n- **entities.load,** overwrite with a binary file.\n    ```ts\n    entities.load(file)\n    ```\n- **entities.version,** a hash of the component schema.\n    ```ts\n    entities.version\n      // \"ecf61ff8d547e6b06c4af5188e6c6cc7\"\n    ```\n    - this version changes if your component schema changes at all.\n    - a changed version will hard-break compatibility with old saves and networking.\n    - it's up to you to be careful about that, and plan for migrations.\n- **entities.readonly,** i use this so much actually.\n    ```ts\n    setupMyRenderer(entities.readonly)\n    ```\n    - it's the same object as `entities` but with a modified typescript type.\n    - i love to pass this around to systems that shouldn't be meddling with my simulation (like a renderer).\n- **entities.startRecordingChanges,** for recording changes.\n    ```ts\n    // start a recording (it listens for changes)\n    const recording = entities.startRecordingChanges()\n\n    // let changes happen\n    const id = makeId()\n    entities.set(id, {health: 99})\n    entities.update(id, {position: [1, 2]})\n\n    // get Uint8Array of changes (and stop listening)\n    const changes = recording.done()\n    ```\n    ```ts\n    recording.cancel()\n      // stop listening and discard the changes\n    ```\n    ```ts\n    // elsewhere on a remote copy of entities...\n    remoteEntities.applyChanges(changes)\n    ```\n- **entities.startRecordingRollback,** rollback is easier than you'd think.\n    ```ts\n    // start your rollback session (it listens for changes)\n    const rollback = entities.startRecordingRollback()\n\n    // let a bunch of crap happen\n    const id = makeId()\n    entities.set(id, {health: 99})\n    entities.update(id, {position: [1, 2]})\n\n    // screw that crap, let's revert! (and stop listening)\n    rollback.execute()\n      // now it's like none of that crap ever happened\n    ```\n    ```ts\n    rollback.cancel()\n      // stop listening and discard the rollback\n    ```\n\n\n\n<br/><a id=\"components\"></a>\n\n## 🧩 components, properties your entities can have\n\n```ts\nimport {asComponents, bool, u8, i16, vec3, f32, tuple, bytes, json} from \"@benev/archimedes\"\n```\n\n- **components tell archimedes how to store your entity data.**  \n    ```ts\n    const components = asComponents({\n      alive: bool,\n      level: u8,\n      health: i16,\n      color: vec3,\n      position: tuple(f32, f32, f32), // same as vec3\n      avatar: bytes(), // variable-sized Uint8Array\n      inventory: json<{items: string[]}>(), // arbitrary json data\n    })\n    ```\n- **built-in components:**\n    - numbers: (unsigned integers) `u8`, `u16`, `u32` (signed integers) `i8`, `i16`, `i32` (floats) `f32`, `f64` (bigints) `bigi64`, `bigu64`\n    - vectors: (f32) `vec2`, `vec3`, `vec4` (f64) `dvec2`, `dvec3`, `dvec4`\n    - other: `bool`, `id`\n    - variable components: `bytes`, `json`\n    - combine components with `tuple(...)`\n    - combine variable-and-fixed components with `vtuple(...)`\n    - `bytes` and `json` can accept a `version` string which you can bump for schema incompatibilities.\n- **define your own components,** with the `asComponent(...)` helper.\n\n\n\n<br/><a id=\"systems\"></a>\n\n## ⚙️ systems, game logic\n\nyou can really structure your game logic however you like.  \nyour game logic can just be a looping function that changes entities over time, using `entities.update` etc...  \n\necs philosophers like \"system\" functions, where each function selects entities by the few components they work on.\n\nif you like, archimedes does provide a composable concept of system functions:\n- **declare a context that every system should get:**\n    ```ts\n    type Context = {\n      entities: Entities<MyComponents>\n      whatever: MyWhatever\n    }\n    ```\n- **here's one formal system fn:**  \n    ```ts\n    import {asSystem} from \"@benev/archimedes\"\n\n    const bleeding = asSystem<Context>(context => {\n      const {entities} = context\n\n      // this gets called every tick\n      return () => {\n        for (const [id, values] of entities.select(\"health\", \"bleed\"))\n          entities.update(id, {health: values.health - values.bleed})\n      }\n    })\n    ```\n- **consolidate a nested tree of systems:**  \n    ```ts\n    import {consolidateSystems, lifecycle} from \"@benev/archimedes\"\n\n    const supersystem = consolidateSystems<Context>({\n      movement: {\n        walking,\n        jumping,\n      },\n      health: {\n        healing,\n        bleeding,\n\n        // use `lifecycle` to create a system that watches.\n        // great for stateful rendering concepts like 3d meshes etc.\n        bleedLogging: context => lifecycle(\n          context.entities,\n          [\"health\", \"bleed\"],\n          (id, {health, bleed}) => {\n            console.log(\"bleed started\", id, health)\n            return {\n              tick: ({health}) => console.log(\"bleed running\", health),\n              exit: () => console.log(\"bleed stopped\"),\n            }\n          },\n        ),\n\n        potions: {\n          fullHealthPotion,\n          slowHealingPotion,\n        },\n      },\n      victory: {\n        winAtFinishZone,\n        winKilledAllEnemies,\n      },\n    })\n    ```\n- **now your supersystem, like any system, takes in context and returns a tick fn.**  \n    ```ts\n    import {gameloop} from \"@benev/archimedes\"\n\n    gameloop(60, supersystem({\n      entities: new Entities(myComponents),\n      whatever: new Whatever(),\n    }))\n    ```\n\n\n\n<br/><br/>\n\n👼 *https://benev.gg/*\n\n","readmeFilename":"README.md"}