@wildshard/shard-format 0.0.1 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/brasscap-mesa/blobs/bin/02da0052111419cdff3a29f1c6d0ff0d223e0b53a956c16c65ed63d87928b3b9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/068a121cd780a2a9164416f6e4fde44834f2d2f3a5ed65c174e480b7a2d3f627.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/07d5a061cd338618e528747d61eb2b17709510550ef0ba40a58b67761b200f3f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/086e3706070555baca863f6ecf9dbca09c084afa501d92d4246d896b09546f36.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/08b1b9ab7c732d7dbe8f961f1fc40e84042d1fe42544f55c9ee89f04dffe3d5e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/18bdbdc704cb8aac93435d208dfe0e9a44374efb73afa3bc58c631650e0a2995.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/1a210fcddcb9749ecb1c244837e8e37ea69b038faae191dee6bbbde228d31a18.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/264ab9ede386504a5ff9814b0a620b879cb29f3f45a80bcfc0c80b8ee236e364.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2b6fbea4c846a23cf4802ebdb1804e128896c8dd87e5d23509db6729e5b1be4e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d755cc635dee90b0f3958272855a821e2dd605a189a5ffcd480a325155fe84f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d76c6829fe77fb55cc2541e4aca5ce5d18b68508dcdf3fa957fe4a83b9c887a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/32c15d55a4548501740593807c5007217c72dbc10a21f4613ef5e0cee0b90d1d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3539b362cf3a61a79e92e113ebf8f255d0b25ec2d2edd816498879de831fa912.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3af38a2377bc89f6c6c82ee1e83df674efa2793db932b50a23bbce7ec9cd7941.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3c176a7a0d0850fdcee790ed2641216fc3d1cba025928de3d7784262bb9b6f4a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3fb37e488aa81a64c997b3dd09794e988994c6ee3476c6d653ced1670888dd8e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/424dcc7b320317bf3f2c62c8f19bc80564035127eb38ab811e460934d57ea38c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/45cea35fab6bb06051a3286fca2307944850c7f9ed7aa89b7c24fafef28efda6.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/499cc7863851f97d79dbfc64e76f9e6978894199184a0d80ebdca13066a8fa78.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4b7217644763b00c6ee6ae3f176c726914966fb791654a385c0638bb998b6dd2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4cf11c7177bb082f335e5bc7a037ef00d09355c5ad8263e284a96a92630ff9ae.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/536b37cab5a1edd6a68a71d122aab6898e44c68a5470a4ca8a9a72c57c02e034.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/55d3628b27e0fcea383df86c434a69761439f51a013359f0829675b07ee2b616.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5652ba90fbd8146edaf42660329cc81798752f2f60b8d03956714460d5ba75ef.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/57459ab5e2ac6cec65ef5e59789dd82b9666d8573df41c4a398df603f1fa456f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5915b6aed21bba49b841b45574f44f60d26b44810bd68ac70b22f3f3b0dab072.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5c4a5c7a8e99253561105c5fa3faf14326cf0c23adc32bfe7f8aea4dbf4b05f9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/61822a412cfd461f4f7ae50bc13f242a0fca6c5c58fca72247b596ab037a1c85.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/673b7712908966718341508469b39cd49e6461f690ca3c23d4621ea7eba0cc30.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/69394a49520f84f6dccc1655f1c89eedc913ac53a7e48ac5dc1bff4141639bb4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/6e58a53a6c2acd50f9f80fd270ca034c54421df8a587e181101b4b75b952ac5d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/75dc9f23ee71e11a3a0c67eb77275d741a281c3398808fb42efd52b9973d5d04.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/76c6a403293a68ed3d6ad14e9dd27b555c3a1ef4a3cae12a2bd2ab3e67c5ad02.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/82b73ce3a18e47092840fc029177861887aa2867b007248ac79ffa20895a4491.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8430d9bbfb4e2b678c54595ad95555c3c73d0e1b144a4d6e29664ccb4371baf0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/848d4492508689f5c4a224079dca8809e872e33b8f2635c9f16da5dc21beed16.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/84941ac387a0d245ea20bd663ff4ee78c5315bedfa058ada0961765aff61acaf.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/859b7bbcf048a4525db0548b8f5afef83bfc4870914767153f44c05e83436ec5.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/87b68b45680a57c796eed9183211b03335a6ad6737372b3ef476c2cf42efa631.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8cef94308af8d09670e4c99a3b6c3d9280b7a27d386653a3bd7d482b2cdf2b65.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8e564bce3f352c2186ae09ed7fbca9739c10abc46fd5f6893c68cb47178bd2b4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8f89e79d0fb9b04d48c7b5719e1d024161c6a2119835b18dcb193ff51123a9be.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8fe511ad48656a0b10801100b9100edab1be605a8a182dc5c834d298bf0d9166.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/900bda6562d06fafda54c495e325d57dbb7931813178ee207449c5519d89d537.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/997b1b7d9210bfa77dc71f16a57c6bd66bc7c648686dc2a2666044c95042978a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a111bb4c6cec536bcf57dddc744b871ac9f3d094ce459c16243adca19020db77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a2208bf899e6c84942eef9fbab569d597f574551afae5864f1953c6a517af068.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a302ddb2598a72ece53780094b64ad861dc68e6913d8a1ea08f5d141736e2986.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/afcbc671326d0dac14e460662c1f793335877ba53cc965f67c0306833b087e7c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/b657159e6a28c801a211024f96a7ef60e388ce928a7b41ae3d7555a6f8fd2e3e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/be6bbc6cd15ba525790075252ba0ed0b28dae5cfbfa118c00dfb9ea1ab95e668.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c1360e3cbe6b3dc8894bc66c359853854c2e5adeac9c7cd5ba63f5db448be601.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c7983018dbf8e384ddf73191f526075bd0b29907061ab17642ecdc18ea7b9897.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/cea66f27ca60ea173ee0a2bcd91964dc2638eb5657250fe3aa5bd3e41faf8730.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d052be571a0f3ab69926951f3a4c9d63f05da2ca6d91e5963dd63e04ecb515de.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d162a993a60dd682c8c21dd111429d84d8d30413a000cf481cf98d06ca83e706.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d238c3d3d054911714ebe30dafc99e6ad13925b7a600ba9f8d532d0f515f3f5a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d9a98cfe2865a9bb0e94f35c735a570b0625b58f890a6b1f6e14fab2401f0af2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/dc27ae954b7b8a13a9459d6ca6ef2997f662715ff5f5453ea0da169f141748b8.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e3ff1fd41cf76668b8e1927c0c2e4056b63a293ebbd300a8f1b1d27d87786271.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e45b7344d373b3ef4a94f560cf4e17b1eb3b8cd89d1e552fc9be11d6b7b546f0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/eb14eb898224d5d81d1012bec54f2b79f9377dc60fa1d01e49b4c3e148292d77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/ed0e0101a3d91a3a615f9e78ef36f7deb8bb0eab0f133241d621925d0b596599.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f722e3a3b1f0a3d7b9f7d7c66c46d8c87245de5f8eece055daf95c7086f8c267.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f76013aedfd810f136fa689a151024bcb942687ef42ae7edf1fd3513ac4e22c7.bin +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0547e63693282614673b13bade4c08eb772020757b131b7c80f2077873aab70e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0cf89e9b1824440d213c8e9e33fb357734b7241b4c7eedaba3df7f8306e05425.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0e01060e3a507ffff6461c50b5c565c71380a6a67d9760cdd7a09afd3e30b584.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0ef326c5cf5292cd15b48b851460ee8156f51e0a5b62457c8f1f3c53c41665a3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1112ff4a3f69db3b62c6d2d6ae021e7c43ce0ca1feb1d3130376881decb3c6b0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11357cb8a0670fdc9a03780dd79a31e0aa7a0537786cbf66491bae1722d6feb3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11dbecc73bd343c375bd4b79db8dbda2272e76a6b8426ac29e90f2b1272ccfc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/133f639cfa837bc5da7915121c71fd32281660c2aaa0248bd59bde47e7faf8bc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/16812a090136b6678633aa4db03e4187920ae0aca776ad6da373c600cd341972.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/17e63980d7934cfe1d2823d78652af338fe9f0c2170106cd4506a2c4e7f4716f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/199224cafc86904bdefec8f01d131d7ca3e076a22b689bfc6a26dd20373cf286.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1a5c8cf223a2f64715ea5eaf14d97a0131f9ebdef4388dc4823dcfa57817724c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1b0ec09ad6718149d7ca514136cee09b04c96425f03af0559fd097112aa0daa5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e5024bbb1284b2ed39bbca2d0ade3acb5be2a2c6ba643291f269b76098c7f79.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e7635972e13468ffcbb1608f1d12559b066b4533912be2c35e3db07fd4a679d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1f03db3a38a21b8d4d02f8ede30e1303cd8d4c426815326a88f45a268b17a492.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/2624abb7bf45618be40f8c3221445179fca44f7321baff415fdf7ddd5e0afc6f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/27fc3bad6db6e2b5ade5d242867d882362482ddf19c647edef821afc27d52dc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/29959bdb5b04a9180e88ec1ed976bae55424d3dc50985f13c0f85bae11ae79ee.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/308cbce2b1b6360f9a2dc275d0bc28be1966fc3ff5e0a58844405ba867f3f668.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3674d7be969755aaffa368e57b8d1bb743bc98e766a57948859d54fdc7d2c066.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3736ca95c9c40b30e21302ae6c89148d8ac09264dfbb7e5764b08c265a73ba3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3bc90e1dc9411d249697e4ec352baa4886f91cacfe4940ac43aed879f60966c9.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3f519c7c7482307cae908b27602dcb7716e2da4b651eff39c4c37103998d18fa.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4767636d5554b60c94b447b87b77fc1456a2b9af42bfe08585389d27f306dd5e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4a3242773b3a73a73ee746a0cdf30c8d6d904bb4406dfdf9822dcd535d6ae308.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4c7bf3788cba151442d85c3f76553c2e356edf8566ae8243d0a535c9bcde51d0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4f3b9f4c818ed6d375947e9603dd058c539e14ff05aa193fb5054d899dbb82a2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4fdf7ee67d12de1cd30c3c2bbd9409032dcab5feb3a7d3977b92c50b1d161afe.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5821f33aa00e9acd2f4c0a29129978ee7006a879d163ce1463ae476031bfabcf.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5a986c3e44fc686a2efe7648c3945bb7b51cf303918381383f21f898dd312cad.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5c32fc1de6d198ed606d3e8c3264319acdd950dab18e8b723fc6332bf2f56aea.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/602ce4e8b00a0afbc1a894b65641e48d362ec834a559b9d97a4801473bb01da7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6180f9f96167522d8cab4de1d52598cecee8d7ee042f48e41669c98cf61c19c3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6205973ba63f7a554662ba05010d25131bed2d9656de422e2067ca54709d5b3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/693e556f2165232e8a38b1b2d68676f235ece5705c564992cfa7731426f4d376.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6a46175438bec5527c281b577bd220b6badedf3c74266b997d39e596f83b8853.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6ca1bcad7ea053a259b7f9fc5a7ec388a4cd29d44391d93386ea8b1143d94c21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6f9bc99656b611890d6acc76ee416f6222ca2d5f62167840b4216a21e020a4c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6fb1e7857996662233ab5314fc13f8aa30703f91c04542e352ec17f9dc4fc054.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7028ec39712143a7e9d09d2e1477282b654d0470102ca9d272ac82b23604cb21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73af65ac86efa61099178f3e7075dcd26d389ee9b9aa3546c18dede10c3dfda1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73b992b71bd3165ff7701ab1430c075cb5ba9b74e6363d24640377b1011ddc93.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7471261d4df59979ba41a622d93779b66ebecd50353ad433862e603ee65f8748.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/76e9a3fcca962c2f900cf79dc1a0851840bd405dc11231f629f784adbcb69d23.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/79d2d29e8cd8b642386b5f31429b39bc4d6f13e53107dda00ebc463abf80c79d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7de66fcfffe4ff108510cbe6bebec44e28ab4b78e98e9c1a38466db5b81881f7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/811fa798cb81ea99488db98e3d3ddea815aac8f6e7493ad04d0176f603978678.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/89b277f1636be220ff5658ff1f1c62efe14079d6e1f42efb373fbf0246801533.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/905c5fe666d9f6174e987382e47d3f325c5696cf8792d7a4a1dd120a438b8270.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/90efe3e05370ee853c0130b98ee82f00b86f7c7104e96b094715187fa49ac16f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/968a7c5cb13014bce00a29d43b344bd6943ff00ae2908abbc6b40a994f1172a1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9a955b4e69dfa5b38f071099053c1a3684cf85ec2d346420de2853c61768f8cc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9da2781216a2e482dd8a6ada5ebb43bcf48e0169430e787ac277559cb2ade19a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9db02aab14a3b52463deadefbf4ba771809941e7fcb137c905955bdc80ec23bd.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a3fe1788cf5d7f260249c722f0e0695a4d55744d1b14be44122377147a296256.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a5c75af8f090d3c95fa46d2be49be5031138d7cd1bae234ae028edf717bf299e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a771abd40bd337a464c1bd19f841b62e290124faa89b19ec50e85ab36bc740a5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a94a2ad2ed463a47cdda117df25b06b3cf6be37ddac08594bc5f5d76c7237730.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ad434e4a6490e495994b25f7574a5847a9f7d9c2ca5a2b229a9dfdd2e5e2bb72.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/aeae7b05404b852008a7897689e58aacef44a2c3bc0e87d2519ecdb4cb1e3ff5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b0c0c8a4985f92be3b358a8e703c67957427501882aeee05b4ccd3c7880930d4.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b25174c3cd13eea6e1d9c3104ee5197dc6330129b2f0f7676e8a429900999d9b.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b3eecdec571df96338edf690443394ff859383b4c94f4cf33d42c240006f8543.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b7aa0c61ff9e7411535c7b7b8e587849a92bad00d431171ab16ad47d55db0a53.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b9deef944c22331bc05220d1d6e46412e3cb1246ef041a4405d0cbbd90c2d624.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ba9376e4ac39b809133ab717edb4c88b5219118766db492d7c97534ce119c2ec.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/baf338e9c272158b905fb58a712e29410c657a45be2764f1c6c43ca87fd1db48.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/bd442ac9fbe52b9f2e4ba586670017c3f2d9fedf1cbdec77ef24e9f8b3a183c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c142adcf253be43b66f23ede8cea1e8fcfa256ebf53054a1068ace04745718a6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c6d7cbdc4b2ee9d416edf4d736a4f374f08aea98ca395ad371a50a1853744cfc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/cfb165a7675d15cee2c490b31095a58f73bace50ccc1e0fdf2c8dc4400f1df27.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d40f2ee59612473e9f687f17a0e203fdb4ba54c7185b05a8d81a433b04f24134.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d50ce95411156a6b6cf386aefa5ee58db659811813f74be74f323e7c5795056f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d6af418bbde39b4fc7d22a61401d416be7a3fc1214ea2d3f42b4549c392d22ca.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/de7222ceeb1f72693dfb7fd1f343798659e03772d77f2b498fd8ebece2d5550a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/e26975b198127ac3b6b4f5c4bc08ad47d6691398feee777743285391cd36d502.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ea428490cd5f2672676a2776a598b819b08246871e76de94b7196f9643144986.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eb96567a266d24be188cb5b08021112f2fad311cbead939d53c5565da11f6265.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ecf66230bf7b68050c0827c2e4caf3de90e46859d291b794faa0dd3816d9dac6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ed8f067763a4a8adb83d80c8324b2a9668f1061f5f5352f21295e6cc5132386f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ee507a38772865467736d370791fe73c6aa4d83fe3e7ff4baa156b9cb2894c1c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eedc5b62dc6f27d4a089e9f5b282f626129236d3f1689b001e04f8748bf8859c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f4119b9c6c23435619682b5d247743459e76584b9b0d6c5cb689d8e156906695.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f576047267a0bf9bd4bfc47072ea3d11066345b839953546292da678d1cb4722.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f8cdfb11997d4ccabea88bcdd3924cc8b621b33618b18fe5fbfd286edfc1d87e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/fce95ecc5db24c903bd46f338e366e2715411465a5efac180e2f0f46397e59de.glb +0 -0
- package/corpus/brasscap-mesa/blobs/image/0579557f9344df6f2c4b1225e6252e53ab86d417a4c9b504b5c714a08a388e47.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/9e18816a2ec16fbbb1f00f4a39c73ac2cbf6a8cdc17b4c96b1eba4cc9a754dc7.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/eb453c71cfb1f9441eb00b32281f98e226e49d9dcf75c231455575fcdc652222.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/json/e0072ed82115c519b891f53a194ea3b28fff7d3826d8ddf23460d6f21b7728d9.json +1 -0
- package/corpus/brasscap-mesa/blobs/json/ffb0e08eaaa7188db1f55931c9b6330937316091cc7463ed2eff6767bbfa33de.json +1 -0
- package/corpus/brasscap-mesa/blobs/wasm/1d6ace79610c4d510b60ad0c52915e42b57797d91f1ef292f60d8a3daec03dd6.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/24a4d4c1292677b1c984b5c0d3497ae2929528bf511df475f80cc20945bb08ec.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/b86d8afcc269fb063ebf64768fc3787635b65a7409a571115b07be2e4da39733.wasm +0 -0
- package/corpus/brasscap-mesa/cook.json +1 -0
- package/corpus/brasscap-mesa/mounts/shardfiles/brasscap-mesa/discovery.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/creatures.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/crowds.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/species.json +1 -0
- package/corpus/brasscap-mesa/sections/audio/audio.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/encounters.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/items.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/strikes.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/ledger.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/loot.json +1 -0
- package/corpus/brasscap-mesa/sections/look/look.json +1 -0
- package/corpus/brasscap-mesa/sections/look/materials.json +1 -0
- package/corpus/brasscap-mesa/sections/quests/quests.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/client-scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/hooks.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/plumbing.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/sim.json +1 -0
- package/corpus/brasscap-mesa/sections/state/migrations.json +1 -0
- package/corpus/brasscap-mesa/sections/state/state.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/card.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/compendium.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/level.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/ui.json +1 -0
- package/corpus/brasscap-mesa/sections/world/collision.json +1 -0
- package/corpus/brasscap-mesa/sections/world/days.json +1 -0
- package/corpus/brasscap-mesa/sections/world/edge.json +1 -0
- package/corpus/brasscap-mesa/sections/world/movers.json +1 -0
- package/corpus/brasscap-mesa/sections/world/navigation.json +1 -0
- package/corpus/brasscap-mesa/sections/world/props.json +1 -0
- package/corpus/brasscap-mesa/sections/world/spawn.json +1 -0
- package/corpus/brasscap-mesa/sections/world/terrain.json +1 -0
- package/corpus/brasscap-mesa/sections/world/tiles.json +1 -0
- package/corpus/brasscap-mesa/sections/world/traversal.json +1 -0
- package/corpus/brasscap-mesa/sections/world/water.json +1 -0
- package/corpus/brasscap-mesa/sections/world/weather.json +1 -0
- package/corpus/brasscap-mesa/shard.json +1 -0
- package/corpus/brasscap-mesa/validation.json +1 -0
- package/corpus/handwritten/blobs/bin/027822f6ae9c374ce1ced851f2227cb9acb03077e5cc6b7fecb245c31f021abd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0377ce182bd604bcf4d501f14bf954c434ea64ad856ad9d71c502d1045612703.bin +0 -0
- package/corpus/handwritten/blobs/bin/05ad93d239eeeb5d9afa09b00d90c56098d88e8850e5b5e691fcaa7520dec3cd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0c8980141e6e394ea473df1eb11c347ba617a1a9a4b39b3fa1871b5d15b97d87.bin +0 -0
- package/corpus/handwritten/blobs/bin/14eb11f8d809320e0a68b1edea7837d7a5b4a3da71f1ce4f54068e0afe0b039b.bin +0 -0
- package/corpus/handwritten/blobs/bin/16590066c039ac71e5038a9866a53ccb95e21af13db29cb655b379c4fcfef7bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/1795b5147ad52482445d2414ee22823b947c43a917b6e96fd9ec017f17000912.bin +0 -0
- package/corpus/handwritten/blobs/bin/18f2e24ecc1ed1b1d12ae1c89732a5a1a618ab6e973d4ff0332cf9ecc4e4f4a6.bin +0 -0
- package/corpus/handwritten/blobs/bin/1a18ade01095f1a9ebe75650127861ef27dda0bb17c2b91bde057ec88ef2e98a.bin +0 -0
- package/corpus/handwritten/blobs/bin/1dba017cddb874bc147efb00c55418846ffa344a696f4df702bbabeea55034d0.bin +0 -0
- package/corpus/handwritten/blobs/bin/248c703537e4687ddd2b69a40d1ef3936da718626289d6867ce0a6866f562ba4.bin +0 -0
- package/corpus/handwritten/blobs/bin/2612d9fd4727f8c349f2dbfb7b1650bb7a752d0798a4966ac22cf2b6cdd9fcef.bin +0 -0
- package/corpus/handwritten/blobs/bin/28c54c766e90e3b046a2377b9fa015b0ce45cf3da4420f2b10553251f86c06aa.bin +0 -0
- package/corpus/handwritten/blobs/bin/30866b4807b12579f50218f6525c3db00919fbd43c97921daf47b3244b25dca6.bin +0 -0
- package/corpus/handwritten/blobs/bin/3d14fae85d77406a9b8c59f2e973cdae9587d49108ea92fb460679ca860196b8.bin +0 -0
- package/corpus/handwritten/blobs/bin/3f2201a53c441abcfb52089fe9bbb01f26fac8744099d3fb6668452885c2fa11.bin +0 -0
- package/corpus/handwritten/blobs/bin/42f270a99367fc4cc901518ccaa344ab595e265f113be944510da745c11f69d1.bin +0 -0
- package/corpus/handwritten/blobs/bin/43fd4327fedd51a586684ac611bcad4a8b9d62e51e03967de71fb42c9bf0f6e1.bin +0 -0
- package/corpus/handwritten/blobs/bin/484adda0898a881b6f095dad447f6a619bf0933f65efe940b72f1ab7f3630c22.bin +0 -0
- package/corpus/handwritten/blobs/bin/4a38cd49e8797429ce76265c3d8972195d5b0a02a35fc05fc513eab11240f415.bin +0 -0
- package/corpus/handwritten/blobs/bin/4fe636237bbbd4f836b0816bc61702f4c224d4cb91fbd94f244c731e24a1b945.bin +0 -0
- package/corpus/handwritten/blobs/bin/51b1cff782dc7ebb382bc429ee965023d4cdb52c7b3e37d6ffff5ef55c1c2813.bin +0 -0
- package/corpus/handwritten/blobs/bin/52561f02071ecaa98432fab5e8ece407a8e8f733a01f8eb7c543d1efe02614da.bin +0 -0
- package/corpus/handwritten/blobs/bin/556d6333923afea9641c4738741a41d6a46ae28a508288b9a49a749a344c1398.bin +0 -0
- package/corpus/handwritten/blobs/bin/5caeb97f32c7f31e1029eebdf31131f879f781bb5e3a225206a646710d83fd75.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d1131e42a045083225105b640ff72e02c7f353ee6285545ac264d01bea26b1b.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d80b30eee9f8342a92f6756fd0d84fb9d2d2ce994d222627641e584ad45d2a8.bin +0 -0
- package/corpus/handwritten/blobs/bin/5e0f9f7f2a85abe11a0a61ede853c9b9942b4494c3eb9943785cf6ae221e40e3.bin +0 -0
- package/corpus/handwritten/blobs/bin/5fdc5485343bba8201185c9bae862ad8618498ab5ce63b53514e4e0226fa7bdb.bin +0 -0
- package/corpus/handwritten/blobs/bin/6623dcb0b31c9ca0be342f6dca6b9e607ec3c12ff82068fa6030c142c2df77f7.bin +0 -0
- package/corpus/handwritten/blobs/bin/6887131a04175edbd1989aa95e8749d1703e7f2d0b8464e85f6bad28d6964125.bin +0 -0
- package/corpus/handwritten/blobs/bin/6cf89771d998486cad9049e6f4fc177d742a18ad79fafa4596814ff9d3cf1952.bin +0 -0
- package/corpus/handwritten/blobs/bin/74bbb0fc219e8476cd5550014a357ee18abc981ff3fe787ae3e60d4593705ec5.bin +0 -0
- package/corpus/handwritten/blobs/bin/76784a7f519ac43ce113a0c9365881839b75f66f96aa009fe8d3c8ab539ef283.bin +0 -0
- package/corpus/handwritten/blobs/bin/79a2f693ee2da546bb551f8b641b9c3affd2b8bfb5632ed7f417daba9d900af9.bin +0 -0
- package/corpus/handwritten/blobs/bin/7b593b0f9eefb957fb9d58b316d9836971203038d7c8127284bba44ccb3090bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/7bb8e518ca5606de78972a6c648b57623f8bc12d7e06b4bbf43c60ac419a9bbd.bin +0 -0
- package/corpus/handwritten/blobs/bin/7c6133f3350147257fa501f41269cb77cb11d8ed96d351e873333b079cee524a.bin +0 -0
- package/corpus/handwritten/blobs/bin/7f5acf1893828995256f5b2c54948f80ba21e53de72db26ea72ce2479f5b0682.bin +0 -0
- package/corpus/handwritten/blobs/bin/836516253cf0f3e6e79537609fdbe6331c8c5c974f9ec4d3fbe4a7db48cf123d.bin +0 -0
- package/corpus/handwritten/blobs/bin/89900344f82d5c1474d2a163f8d29903447bac64e9c9775123ef499be70c2380.bin +0 -0
- package/corpus/handwritten/blobs/bin/95d76a9273c3edd98b3643c54e2e7989800bdcaf6f815230ef09f601e760330f.bin +0 -0
- package/corpus/handwritten/blobs/bin/a7b5a5fe053a38c93eed899bde5051cddd80e0a3f3c82b6fd814869097f0944b.bin +0 -0
- package/corpus/handwritten/blobs/bin/b29be84df0bfd1bc97a1464fd5ea068130947bfed3328e167640c81326eb45d7.bin +0 -0
- package/corpus/handwritten/blobs/bin/b6518dc352be03332a256f1cd9d1149da262fe6829e87ba43364f19c687ca7c9.bin +0 -0
- package/corpus/handwritten/blobs/bin/b7edb8095beeb158adb61ae3caa1653773757afbcd8fb2764c94b975a43fe9e2.bin +0 -0
- package/corpus/handwritten/blobs/bin/b86d617ae7fa397df51ff7af87cd89fa113ac19abd3840ea8f3a086d6c82905c.bin +0 -0
- package/corpus/handwritten/blobs/bin/bb860b5c67ee7f2fafd67588822152228d6f6c9de1231123eeafa4844732b18b.bin +0 -0
- package/corpus/handwritten/blobs/bin/bf8c3971bbb224075d488ffa9cfc20e322c61f9ca0c59c356838415f6778014b.bin +0 -0
- package/corpus/handwritten/blobs/bin/c2edd52ee14ebdc9fcc01d38c15d6ab3379df7a20098c260c546551898959cd1.bin +0 -0
- package/corpus/handwritten/blobs/bin/c3de13c551c5b45270143dcbb9fc9a31651f6012355823c0709c2fe6cafda940.bin +0 -0
- package/corpus/handwritten/blobs/bin/c57a8d9da18b1289afd16de00dd1ec75027048b8dcf7dd218da36bc3276ff035.bin +0 -0
- package/corpus/handwritten/blobs/bin/cc2975c9dea4c31b1bf380623a8f44059423004653f9cae4f603d374174323b7.bin +0 -0
- package/corpus/handwritten/blobs/bin/d476abba2e1c63ad3c7527617559173484ee837a5be2744d968466d5527c286b.bin +0 -0
- package/corpus/handwritten/blobs/bin/db242f89115c878cf0c3b976a1647e9cdeb6a1a51813b1dacaf1188715603294.bin +0 -0
- package/corpus/handwritten/blobs/bin/dcc4b9b3bc4ca777d11c494ae5478f17ad7cf2efa18dcba30def872d55355bc3.bin +0 -0
- package/corpus/handwritten/blobs/bin/dd99da483f385327d6b8319d6e2e9000b580280069353718aa0fda2230707e8b.bin +0 -0
- package/corpus/handwritten/blobs/bin/dfc139dba26f1789e16f72602e654636f2d99bcd41e3f10454da74b3a6a64dda.bin +0 -0
- package/corpus/handwritten/blobs/bin/e15ab3cc9f60657321cfe8d9751e086f025734f4e7068271e0baf6066a686f18.bin +0 -0
- package/corpus/handwritten/blobs/bin/e16a83a71213db6f804ce1d53981a2308062752c85c440022d9eeb7605fd37c8.bin +0 -0
- package/corpus/handwritten/blobs/bin/e7355876487f660ac9f25c9d9dfcd66eaf432e1e1669eb89d12ce8267a8d3e86.bin +0 -0
- package/corpus/handwritten/blobs/bin/e81a632e2da0f6a4d801f18aadfe2c6e640401cc1178935a9099ebb8e3af6cc1.bin +0 -0
- package/corpus/handwritten/blobs/bin/f0721c60d0b1046579d8c587fac8482a70822f0b39a85f9acc0cfc31f82b7dd2.bin +0 -0
- package/corpus/handwritten/blobs/bin/f301cf574de6d84030f839098ca44705dca115f9d3e4ee848e0b35fff3deaf77.bin +0 -0
- package/corpus/handwritten/blobs/bin/f7797f295a7570c437bf7020a1ddf208fea2a7aab595333320a6396c1608d360.bin +0 -0
- package/corpus/handwritten/blobs/glb/08de0bb2439ac812adef528b4b073bdb954bbeada972a2f3afb1757bd0540396.glb +0 -0
- package/corpus/handwritten/blobs/glb/153681171c35d2898569324e21ebe734b8418d4122833618a1e64ea326be1e5e.glb +0 -0
- package/corpus/handwritten/blobs/glb/1df5ce0b6cae72ec4cf3c41510681ba70ebb474f9745d536ebd4f03e8fc82de9.glb +0 -0
- package/corpus/handwritten/blobs/glb/262031e2fa710bd8d586eafce1019ca1434a2170e407567741aac1d99fc9c5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/27466efb180fb5b5074b40e424bd0b8d78f7ff0f5f3663748e014daeeeb5bedd.glb +0 -0
- package/corpus/handwritten/blobs/glb/2d2f6d00a14c89a4efb7f679b371118f564f258797ed8b8b42baf4ae60902ea6.glb +0 -0
- package/corpus/handwritten/blobs/glb/31f327d215ed7ef422e2169172f3869769e9816c9da979616844081e74f2eb09.glb +0 -0
- package/corpus/handwritten/blobs/glb/3bfe0e9ca18077ffee9c284ef40fed9f2fc354f7495612c785a6f980b5966559.glb +0 -0
- package/corpus/handwritten/blobs/glb/3db43042b3eeb1dee7ce9de1cc00322cefc348aa18c37d168b0858e6af6ca7a4.glb +0 -0
- package/corpus/handwritten/blobs/glb/46460a50da44fb8e792b48a646ec9ce025bb309d315dbcf67d2e9598591750de.glb +0 -0
- package/corpus/handwritten/blobs/glb/4902213556fedaf269fba6f0f195e424b2e49973ab45dcb8b69e34d253d9d8ff.glb +0 -0
- package/corpus/handwritten/blobs/glb/4dda463c9cd4bf339e5611871d4ba2fe16fe1487389a88b2888e96bc55e45d93.glb +0 -0
- package/corpus/handwritten/blobs/glb/4ed23469bd2b6b73183564cfc80a1ebcd0ffe2666a90a556752af0ca147fd2f7.glb +0 -0
- package/corpus/handwritten/blobs/glb/4fe74a1bed6b67129885b90cfcae01b5ca82e23e6d40507e280f02fca7fda54f.glb +0 -0
- package/corpus/handwritten/blobs/glb/50521bb3a50cc7199d324a0b25bc167c2e9d69770cb500490428efefc81ce3ea.glb +0 -0
- package/corpus/handwritten/blobs/glb/5ecca36d1e503edc092af0ef42f139cdcad99b8c2008318eb6ad337023d57296.glb +0 -0
- package/corpus/handwritten/blobs/glb/60fc036925852568cdb1b9fb85218dc43a8bf2ed86d3971a221ad942ece203a7.glb +0 -0
- package/corpus/handwritten/blobs/glb/611633cee0e5822b744486e6dff5414ad5b159eaabffe1c0ba0bb68be794bfa1.glb +0 -0
- package/corpus/handwritten/blobs/glb/67c7f983a0bcb9f84425378acac121a53f30795dce3181643bc1b763d0ae80b5.glb +0 -0
- package/corpus/handwritten/blobs/glb/6ecc0d307030943727484b49b1872643479c55ccc92252fca06e9e3cbe98fa90.glb +0 -0
- package/corpus/handwritten/blobs/glb/774b366df4de56cb6f9e3c904f02ec98016ac2ec489dc9e214b09220fca2f8e5.glb +0 -0
- package/corpus/handwritten/blobs/glb/785bae514ffc029e611d602259db7d37cbef589409a0814b9d37175d8b6c0a45.glb +0 -0
- package/corpus/handwritten/blobs/glb/79e79524efb2830e90af3c945c5b36ef07c1a38f2da2958112203a99eac52a16.glb +0 -0
- package/corpus/handwritten/blobs/glb/7bebdcdaf0be30d9f8d21bde72af68c32d825d12dc668f48109223ed7ff71c9f.glb +0 -0
- package/corpus/handwritten/blobs/glb/7d8b5ec9326a11362b3f9fa3409cb59d11b99f549cc304319c63c1ec55cbf5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/82e886f826315e4bf962363165fadadd3d93f85132c1909095045e0a7ccc0b34.glb +0 -0
- package/corpus/handwritten/blobs/glb/84b4ef190c3994ae7ca1b1f7a936526d1d20ad7deac13f949e3fe6bb7ba139ed.glb +0 -0
- package/corpus/handwritten/blobs/glb/85b7153e943fbe8c659bd6e4b323511dc6f6e2c7a3a1185e7a9a29ea6ddfdfa6.glb +0 -0
- package/corpus/handwritten/blobs/glb/85cf2d2be91cedbaf454ca42ad53c0c17b311088528d274695dbcea490d6c684.glb +0 -0
- package/corpus/handwritten/blobs/glb/8662b4cdc626c61a45e63f71dc866746c083cd0d4644b817a373105f936a7047.glb +0 -0
- package/corpus/handwritten/blobs/glb/8a4d33bfbb17d865e5deb0a0bdf3de67fc2312950a7568ed2635c22fbe4b1ecf.glb +0 -0
- package/corpus/handwritten/blobs/glb/8b11171d41c9027411ca8b87797d9ec70355471bdd3a247c114c49b8b781bbd9.glb +0 -0
- package/corpus/handwritten/blobs/glb/9026e1c4f0250832b69a989e69fe3071e5cad72adfe9c22ce11c409b18bb3357.glb +0 -0
- package/corpus/handwritten/blobs/glb/945b946f17b6393ea040230641c3083678bb6ab42e1d7239aeb9c950d0e7d5bb.glb +0 -0
- package/corpus/handwritten/blobs/glb/9afab455d603f1f8a38074c5a6cbed26d7d7f2cfd8a531820bd165d4b37399ee.glb +0 -0
- package/corpus/handwritten/blobs/glb/a6d702fb1be1095517625bfb2a2383f5f9638775059fd7e0d093d2044651b848.glb +0 -0
- package/corpus/handwritten/blobs/glb/aae479c2f99848998a1b499bbcad815d971349c2442bc363786aef63baad4337.glb +0 -0
- package/corpus/handwritten/blobs/glb/b155bd41f260d5303e293d691b657e0fb9b9c8b2f8aa589a0187061baa033eb7.glb +0 -0
- package/corpus/handwritten/blobs/glb/b1e8b770d99e8ca4396f21fd512f632c587149fc13db69deba388f702a46982f.glb +0 -0
- package/corpus/handwritten/blobs/glb/b382c318a5baac35da59a7b99ebaad6992e30c4bac327e85851ce0b2f89aa58b.glb +0 -0
- package/corpus/handwritten/blobs/glb/ba4478198696802808262af9bbfc224fe37e24e3f8c13de91debc87d3e1a9d41.glb +0 -0
- package/corpus/handwritten/blobs/glb/baf02cd967d1bf3c6a2ae878f4ca4ed34d0c39302ca2b8b6e3560a4e87b5c16f.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc14dd152815ea6ed39458dcf89f2d69173d61d6e2b57be99d31ce2da64ccf67.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc4e4d3bcf7ace855183efec0fbf242d444a32714d8b2fd8a45fa7b539ef2c73.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc53475e2aa2fc9c2c0574b36a449fd57259c462d771e2b360def5c338d37c26.glb +0 -0
- package/corpus/handwritten/blobs/glb/c35d9e50f392c29f2587e3a6eb4f21143ba08e48d76a53b9de62d3b5be46c1a5.glb +0 -0
- package/corpus/handwritten/blobs/glb/c6911e059d3ac6aea75bc0ad3dd8b220704bfbba8ba98b57705e7aa3ecbe0050.glb +0 -0
- package/corpus/handwritten/blobs/glb/c84d88b6ed878490bcf9fa985b5e6a7a683de8ee7808ee4151a3b6a898fbe4f2.glb +0 -0
- package/corpus/handwritten/blobs/glb/c9d5d02ef0e38ac2898d3e6ecbc2ea0a6d2bd04531118550ab54b5e83293d7ec.glb +0 -0
- package/corpus/handwritten/blobs/glb/cd9d04e361e4c3d0aeb82f8682d71114ff8318b8fc4980bccee3c5e5c16afc27.glb +0 -0
- package/corpus/handwritten/blobs/glb/d32499928422a0cd1a32b1afaeacc31d2d84d74876f6805b36218dc04402a921.glb +0 -0
- package/corpus/handwritten/blobs/glb/dc7ea629fcddeba445599d73a5d721f4d5004e056c3c140baa3e6817393c6462.glb +0 -0
- package/corpus/handwritten/blobs/glb/dce79b59c85ca5a7f9fc25e585d253b15558f8f5d8497a76923c9071601de8b1.glb +0 -0
- package/corpus/handwritten/blobs/glb/e7fa1b02bae6c8d19ace0e8db44810beab9a1be9f8172d5816324760267d6d11.glb +0 -0
- package/corpus/handwritten/blobs/glb/eb664feed0fdcc3ac73cecbe737109994fe5dfad8a33997de88598965fa936ba.glb +0 -0
- package/corpus/handwritten/blobs/glb/ec6a771ca852b0b69e55a12df9d347384d01e611c8c6151ea771910f1601605d.glb +0 -0
- package/corpus/handwritten/blobs/glb/ede05013f575b4216d2b4b3f8a14d611ef28756f952f702bb169529c8ab02eff.glb +0 -0
- package/corpus/handwritten/blobs/glb/fec21fa96950340a1a031b31b37407468361ab0a7645c683e0d7773c18591a26.glb +0 -0
- package/corpus/handwritten/blobs/glb/ff21ea082bb00b01006900e7dbbb85220f31f45c144405c840a70872f9e09cb9.glb +0 -0
- package/corpus/handwritten/blobs/image/248fe9601e921305ffb35421414bc5f03e9f1b3dba15bf9b5c3387d8f255da17.png +0 -0
- package/corpus/handwritten/blobs/image/4b47420aff1ded28c9c6cf1eb92d6e2d7b01d057f2654654405445ff8d562e55.webp +0 -0
- package/corpus/handwritten/blobs/image/5dbc818ed0be692e6ba3df87898fd623280a2686eed5a538333e1325764b238d.png +0 -0
- package/corpus/handwritten/blobs/image/d5ae692911bbc2b60b5fdde239b70aad4ce9be0d7665c4a91b438de6077e21e3.jpg +0 -0
- package/corpus/handwritten/blobs/ktx2/df0dd2e8adc1d9479148bb198cb750471df454680cf0c9ffd6dc85d6262ed676.ktx2 +0 -0
- package/corpus/handwritten/blobs/wasm/ecc886d8bbebcf190298ff9162b6bb364f2125606f5bdc8cc220ea28044f96ea.wasm +0 -0
- package/corpus/handwritten/cook.json +1 -0
- package/corpus/handwritten/mounts/shardfiles/blender-template/discovery.json +1 -0
- package/corpus/handwritten/sections/actors/creatures.json +1 -0
- package/corpus/handwritten/sections/actors/crowds.json +1 -0
- package/corpus/handwritten/sections/actors/species.json +1 -0
- package/corpus/handwritten/sections/audio/audio.json +1 -0
- package/corpus/handwritten/sections/client/plan.json +1 -0
- package/corpus/handwritten/sections/combat/encounters.json +1 -0
- package/corpus/handwritten/sections/combat/items.json +1 -0
- package/corpus/handwritten/sections/combat/strikes.json +1 -0
- package/corpus/handwritten/sections/economy/ledger.json +1 -0
- package/corpus/handwritten/sections/economy/loot.json +1 -0
- package/corpus/handwritten/sections/look/look.json +1 -0
- package/corpus/handwritten/sections/look/map.json +1 -0
- package/corpus/handwritten/sections/look/materials.json +1 -0
- package/corpus/handwritten/sections/quests/quests.json +1 -0
- package/corpus/handwritten/sections/sim/client-scripts.json +1 -0
- package/corpus/handwritten/sections/sim/hooks.json +1 -0
- package/corpus/handwritten/sections/sim/plumbing.json +1 -0
- package/corpus/handwritten/sections/sim/sim.json +1 -0
- package/corpus/handwritten/sections/state/migrations.json +1 -0
- package/corpus/handwritten/sections/state/state.json +1 -0
- package/corpus/handwritten/sections/ui/card.json +1 -0
- package/corpus/handwritten/sections/ui/compendium.json +1 -0
- package/corpus/handwritten/sections/ui/level.json +1 -0
- package/corpus/handwritten/sections/ui/ui.json +1 -0
- package/corpus/handwritten/sections/world/collision.json +1 -0
- package/corpus/handwritten/sections/world/days.json +1 -0
- package/corpus/handwritten/sections/world/edge.json +1 -0
- package/corpus/handwritten/sections/world/movers.json +1 -0
- package/corpus/handwritten/sections/world/navigation.json +1 -0
- package/corpus/handwritten/sections/world/props.json +1 -0
- package/corpus/handwritten/sections/world/spawn.json +1 -0
- package/corpus/handwritten/sections/world/terrain.json +1 -0
- package/corpus/handwritten/sections/world/tiles.json +1 -0
- package/corpus/handwritten/sections/world/traversal.json +1 -0
- package/corpus/handwritten/sections/world/water.json +1 -0
- package/corpus/handwritten/sections/world/weather.json +1 -0
- package/corpus/handwritten/shard.json +1 -0
- package/corpus/handwritten/validation.json +1 -0
- package/package.json +508 -2
- package/packages/wire/src/net-command.ts +150 -0
- package/src/cli/bin.mjs +9 -0
- package/src/cli/main.ts +148 -0
- package/src/cli/pack.ts +262 -0
- package/src/cli/validate.ts +210 -0
- package/src/cli/version.ts +13 -0
- package/src/format/aacIndex.ts +160 -0
- package/src/format/accent.ts +35 -0
- package/src/format/achievementCounters.ts +22 -0
- package/src/format/actorMoves.ts +615 -0
- package/src/format/actorProjectionV2.ts +93 -0
- package/src/format/admissionControl.ts +66 -0
- package/src/format/admissionLate.ts +22 -0
- package/src/format/admissionLimits.ts +11 -0
- package/src/format/admissionServer.ts +30 -0
- package/src/format/ambientLife.ts +123 -0
- package/src/format/arenaRoomDocument.ts +114 -0
- package/src/format/arenaScriptRows.ts +107 -0
- package/src/format/arenaView.ts +30 -0
- package/src/format/assetAdmission.ts +279 -0
- package/src/format/audio-measure.ts +184 -0
- package/src/format/audio-mp4.ts +234 -0
- package/src/format/audio-rules.ts +295 -0
- package/src/format/audio-waiver.ts +55 -0
- package/src/format/audio.ts +463 -0
- package/src/format/audioBank.ts +37 -0
- package/src/format/audioProfiles.ts +501 -0
- package/src/format/audioRouting.ts +67 -0
- package/src/format/audioScene.ts +342 -0
- package/src/format/bakedTerrainBytes.ts +35 -0
- package/src/format/bakedTerrainSampling.ts +66 -0
- package/src/format/bakedTiles.ts +407 -0
- package/src/format/binarySource.ts +32 -0
- package/src/format/bodySlots.ts +90 -0
- package/src/format/bossEncounter.ts +354 -0
- package/src/format/bossProfiles.ts +709 -0
- package/src/format/bossSocketRig.ts +92 -0
- package/src/format/bowVariantRows.ts +68 -0
- package/src/format/brains.ts +252 -0
- package/src/format/budget.ts +214 -0
- package/src/format/buildings.ts +496 -0
- package/src/format/builtIndexes.ts +26 -0
- package/src/format/catalogueEconomy.ts +65 -0
- package/src/format/caveInterior.ts +225 -0
- package/src/format/cellBounds.ts +47 -0
- package/src/format/cellField.ts +98 -0
- package/src/format/chapterDirector.ts +193 -0
- package/src/format/clientChannels.ts +450 -0
- package/src/format/clientCues.ts +34 -0
- package/src/format/clientNative.ts +358 -0
- package/src/format/clientOwnership.ts +43 -0
- package/src/format/clientPlan.ts +306 -0
- package/src/format/clientScripts.ts +116 -0
- package/src/format/clientState.ts +273 -0
- package/src/format/clientTrails.ts +56 -0
- package/src/format/collectionDisplay.ts +232 -0
- package/src/format/colourFunction.ts +44 -0
- package/src/format/colourLut.ts +4 -0
- package/src/format/commonsCosts.ts +28 -0
- package/src/format/compendiumRows.ts +151 -0
- package/src/format/compendiumSketches.ts +23 -0
- package/src/format/completion.ts +83 -0
- package/src/format/contentBounds.ts +76 -0
- package/src/format/contentCost.ts +50 -0
- package/src/format/contracts.ts +305 -0
- package/src/format/cook-data.ts +148 -0
- package/src/format/cook-preparation.ts +241 -0
- package/src/format/coverAppearance.ts +53 -0
- package/src/format/creatures.ts +175 -0
- package/src/format/crowdPresentation.ts +87 -0
- package/src/format/crowds.ts +46 -0
- package/src/format/cueDirector.ts +134 -0
- package/src/format/dayCycle.ts +28 -0
- package/src/format/dayLook.ts +44 -0
- package/src/format/decisionBindings.ts +80 -0
- package/src/format/decisionPublication.ts +35 -0
- package/src/format/decisionScripts.ts +327 -0
- package/src/format/declaredQuestPage.ts +101 -0
- package/src/format/deviceMemoryCost.ts +50 -0
- package/src/format/director.ts +52 -0
- package/src/format/directorProduct.ts +27 -0
- package/src/format/directorStages.ts +165 -0
- package/src/format/directorWhen.ts +78 -0
- package/src/format/discoveryValues.ts +416 -0
- package/src/format/easedFields.ts +48 -0
- package/src/format/edgeProfiles.ts +40 -0
- package/src/format/eliteContinuation.ts +110 -0
- package/src/format/eliteEntryRows.ts +351 -0
- package/src/format/eliteFeature.ts +605 -0
- package/src/format/eliteScripts.ts +60 -0
- package/src/format/encounterRows.ts +1030 -0
- package/src/format/encounters.ts +65 -0
- package/src/format/engine-music.ts +42 -0
- package/src/format/entryClearance.ts +86 -0
- package/src/format/entryCoverage.ts +61 -0
- package/src/format/entryGeometry.ts +56 -0
- package/src/format/entryLanding.ts +83 -0
- package/src/format/entryReads.ts +45 -0
- package/src/format/entrywayAssets.ts +33 -0
- package/src/format/entryways.ts +58 -0
- package/src/format/exchange.ts +25 -0
- package/src/format/explorerCatalogue.ts +312 -0
- package/src/format/feature-sides.ts +233 -0
- package/src/format/fieldPresentation.ts +62 -0
- package/src/format/figures.ts +437 -0
- package/src/format/findsCatalogue.ts +67 -0
- package/src/format/fixedDraws.ts +24 -0
- package/src/format/flyers.ts +226 -0
- package/src/format/forestNativeInputs.ts +37 -0
- package/src/format/forestPage.ts +285 -0
- package/src/format/forestWeather.ts +333 -0
- package/src/format/geometryPack.ts +136 -0
- package/src/format/glbBuffers.ts +77 -0
- package/src/format/glbCost.ts +212 -0
- package/src/format/glbImages.ts +95 -0
- package/src/format/glbTriangles.ts +95 -0
- package/src/format/graphArmsRows.ts +200 -0
- package/src/format/grapple.ts +123 -0
- package/src/format/grazers.ts +164 -0
- package/src/format/grid-catalogue.ts +247 -0
- package/src/format/gridReadiness.ts +49 -0
- package/src/format/groupBrains.ts +249 -0
- package/src/format/heldArms.ts +576 -0
- package/src/format/heldEquipment.ts +78 -0
- package/src/format/heldFinishes.ts +415 -0
- package/src/format/heldGear.ts +68 -0
- package/src/format/heldJianDocument.ts +75 -0
- package/src/format/heldMelee.ts +866 -0
- package/src/format/heldView.ts +26 -0
- package/src/format/heldWeaponDocuments.ts +36 -0
- package/src/format/herdShelter.ts +58 -0
- package/src/format/hooks.ts +45 -0
- package/src/format/immutable.ts +59 -0
- package/src/format/inputDeclarations.ts +157 -0
- package/src/format/islandLibrary.ts +51 -0
- package/src/format/issue-codes.ts +262 -0
- package/src/format/items.ts +229 -0
- package/src/format/json.ts +143 -0
- package/src/format/keyedSky.ts +314 -0
- package/src/format/kitFigure.ts +68 -0
- package/src/format/ktx2Cost.ts +47 -0
- package/src/format/ledger.ts +56 -0
- package/src/format/liftApproach.ts +75 -0
- package/src/format/liftRider.ts +10 -0
- package/src/format/lightEmitters.ts +105 -0
- package/src/format/lights.ts +135 -0
- package/src/format/limbCollision.ts +136 -0
- package/src/format/limbPopulation.ts +33 -0
- package/src/format/limbRig.ts +202 -0
- package/src/format/loadout.ts +156 -0
- package/src/format/look-light.ts +153 -0
- package/src/format/lootBag.ts +145 -0
- package/src/format/lootEconomy.ts +235 -0
- package/src/format/materialFamilies.ts +565 -0
- package/src/format/materialGraph.ts +1220 -0
- package/src/format/materials.ts +449 -0
- package/src/format/memoryAdmission.ts +84 -0
- package/src/format/memoryGates.json +7 -0
- package/src/format/meshCollision.ts +56 -0
- package/src/format/meshCollisionAssets.ts +19 -0
- package/src/format/meshCollisionBytes.ts +102 -0
- package/src/format/meshEntryways.ts +54 -0
- package/src/format/meshopt-decoder.wasm +0 -0
- package/src/format/meshopt-module.ts +177 -0
- package/src/format/meshopt-static.mjs +11 -0
- package/src/format/meshopt-wasm.ts +61 -0
- package/src/format/migrations.ts +209 -0
- package/src/format/minimap.ts +1052 -0
- package/src/format/mixedPopulation.ts +222 -0
- package/src/format/modes.ts +304 -0
- package/src/format/mountedSpecimenRows.ts +64 -0
- package/src/format/moverLifecycle.ts +34 -0
- package/src/format/moverMotion.ts +271 -0
- package/src/format/movers.ts +224 -0
- package/src/format/namedJsonContracts.ts +423 -0
- package/src/format/nativeActors.ts +45 -0
- package/src/format/nativeAssembly.ts +141 -0
- package/src/format/nativeGround.ts +37 -0
- package/src/format/nativeGroundAssets.ts +35 -0
- package/src/format/nativeItems.ts +184 -0
- package/src/format/nativePhysics.ts +140 -0
- package/src/format/nativeQuestComposition.ts +398 -0
- package/src/format/nativeRiding.ts +103 -0
- package/src/format/nativeRuntimePlan.ts +89 -0
- package/src/format/navigation.ts +99 -0
- package/src/format/navigationBytes.ts +111 -0
- package/src/format/nearPlaceholder.ts +111 -0
- package/src/format/nearPlaceholderAssets.ts +23 -0
- package/src/format/netCommand.ts +11 -0
- package/src/format/npcs.ts +546 -0
- package/src/format/outputAddress.ts +11 -0
- package/src/format/outputDownload.ts +34 -0
- package/src/format/outputFields.ts +123 -0
- package/src/format/outputIndex.ts +352 -0
- package/src/format/overdraw.ts +41 -0
- package/src/format/pageLife.ts +303 -0
- package/src/format/pagePreparation.ts +60 -0
- package/src/format/paintedLook.ts +55 -0
- package/src/format/paintedResources.ts +158 -0
- package/src/format/panelTemplate.ts +139 -0
- package/src/format/placeholderSource.ts +209 -0
- package/src/format/platformDataSections.ts +146 -0
- package/src/format/platformFileFamilies.ts +299 -0
- package/src/format/plumbing.ts +165 -0
- package/src/format/populationEnvironment.ts +210 -0
- package/src/format/populationKeeper.ts +163 -0
- package/src/format/populationProjection.ts +496 -0
- package/src/format/populationRespawn.ts +48 -0
- package/src/format/populationRoster.ts +158 -0
- package/src/format/portalFloor.ts +56 -0
- package/src/format/portalLink.ts +112 -0
- package/src/format/portalLinkAssets.ts +42 -0
- package/src/format/portalRide.ts +22 -0
- package/src/format/postGraphDocument.ts +36 -0
- package/src/format/postGraphLook.ts +477 -0
- package/src/format/postStack.ts +114 -0
- package/src/format/practiceCourseRows.ts +466 -0
- package/src/format/preflight.ts +155 -0
- package/src/format/presentation.ts +33 -0
- package/src/format/product-audio.ts +76 -0
- package/src/format/product-reads.ts +178 -0
- package/src/format/product-stream-admit.ts +114 -0
- package/src/format/product-stream-assets.ts +511 -0
- package/src/format/product-stream-facts.ts +208 -0
- package/src/format/product-stream-miss.ts +15 -0
- package/src/format/product-stream-node.ts +47 -0
- package/src/format/product-stream-packs.ts +247 -0
- package/src/format/product-stream-rows.ts +234 -0
- package/src/format/product-stream-tar.ts +204 -0
- package/src/format/product-stream.ts +297 -0
- package/src/format/product.ts +366 -0
- package/src/format/productValidation.ts +236 -0
- package/src/format/propMaterials.ts +254 -0
- package/src/format/props.ts +137 -0
- package/src/format/questContinuation.ts +42 -0
- package/src/format/questFigures.ts +227 -0
- package/src/format/questGraph.ts +30 -0
- package/src/format/questHost.ts +314 -0
- package/src/format/questInteractionSource.ts +57 -0
- package/src/format/questInteractions.ts +642 -0
- package/src/format/questPageComposition.ts +92 -0
- package/src/format/questPageFacets.ts +121 -0
- package/src/format/questRuntime.ts +118 -0
- package/src/format/questSteps.ts +182 -0
- package/src/format/questStory.ts +512 -0
- package/src/format/questStoryBindings.ts +43 -0
- package/src/format/questWorld.ts +36 -0
- package/src/format/quests.ts +333 -0
- package/src/format/rainPresentation.ts +131 -0
- package/src/format/rangedPage.ts +117 -0
- package/src/format/receipt-cost.ts +71 -0
- package/src/format/registeredJson.ts +530 -0
- package/src/format/returnProgramDocument.ts +40 -0
- package/src/format/returnProjectionV2.ts +84 -0
- package/src/format/riding.ts +377 -0
- package/src/format/riggedHulls.ts +160 -0
- package/src/format/roamingBossProjection.ts +178 -0
- package/src/format/roamingCombat.ts +22 -0
- package/src/format/ropeDeckSite.ts +148 -0
- package/src/format/rows.ts +86 -0
- package/src/format/runtime.ts +38 -0
- package/src/format/runtimeBinds.ts +49 -0
- package/src/format/runtimeCost.ts +80 -0
- package/src/format/runtimeSpawns.ts +73 -0
- package/src/format/scalarChannel.ts +38 -0
- package/src/format/scaledPost.ts +27 -0
- package/src/format/scaledPostContract.ts +51 -0
- package/src/format/sceneBuffers.ts +122 -0
- package/src/format/sceneDraws.ts +89 -0
- package/src/format/sceneDressing.ts +247 -0
- package/src/format/sceneInstances.ts +192 -0
- package/src/format/sceneMotion.ts +122 -0
- package/src/format/sceneRefs.ts +71 -0
- package/src/format/sceneSources.ts +730 -0
- package/src/format/script-side-grandfather.ts +62 -0
- package/src/format/script-sides.ts +289 -0
- package/src/format/scriptAbi.ts +14 -0
- package/src/format/scriptAbiV1.ts +56 -0
- package/src/format/scriptActionsV2.ts +101 -0
- package/src/format/scriptAdmission.ts +165 -0
- package/src/format/scriptAdmissionV2.ts +126 -0
- package/src/format/scriptContract.ts +170 -0
- package/src/format/scriptFuelV2.ts +124 -0
- package/src/format/scriptGroupBankV2.ts +54 -0
- package/src/format/scriptGroupStepV2.ts +165 -0
- package/src/format/scriptInputStateV2.ts +52 -0
- package/src/format/scriptLimits.ts +5 -0
- package/src/format/scriptMemoryV2.ts +17 -0
- package/src/format/scriptModuleV2.ts +116 -0
- package/src/format/scriptObservationColumnsV2.ts +226 -0
- package/src/format/scriptQueriesV2.ts +164 -0
- package/src/format/scriptQueryStateV2.ts +40 -0
- package/src/format/scriptRngV2.ts +52 -0
- package/src/format/scriptWireV2.ts +106 -0
- package/src/format/scripts.ts +31 -0
- package/src/format/sections.ts +140 -0
- package/src/format/shardSchema.ts +632 -0
- package/src/format/shardSections.ts +383 -0
- package/src/format/sketch.ts +79 -0
- package/src/format/skin-materials.ts +172 -0
- package/src/format/skinAssets.ts +107 -0
- package/src/format/skinData.ts +110 -0
- package/src/format/skinLayers.ts +90 -0
- package/src/format/skins.ts +37 -0
- package/src/format/socketLift.ts +58 -0
- package/src/format/socketLiftAssets.ts +81 -0
- package/src/format/socketRigCreature.ts +66 -0
- package/src/format/sourceResidency.ts +16 -0
- package/src/format/spawnCombat.ts +26 -0
- package/src/format/spawnScriptV2.ts +145 -0
- package/src/format/spawnScripts.ts +229 -0
- package/src/format/spawnTables.ts +46 -0
- package/src/format/spawnView.ts +26 -0
- package/src/format/speciesActorsFile.ts +86 -0
- package/src/format/speciesBookRows.ts +84 -0
- package/src/format/speciesBrain.ts +96 -0
- package/src/format/speciesLooks.ts +1021 -0
- package/src/format/speciesPrograms.ts +97 -0
- package/src/format/speciesScripts.ts +45 -0
- package/src/format/specimenCatalogue.ts +94 -0
- package/src/format/splatTerrain.ts +192 -0
- package/src/format/standalone-catalogue.ts +144 -0
- package/src/format/standaloneControl.ts +44 -0
- package/src/format/state.ts +61 -0
- package/src/format/stateLineage.ts +71 -0
- package/src/format/stealth.ts +106 -0
- package/src/format/stillImage.ts +135 -0
- package/src/format/streamedCover.ts +105 -0
- package/src/format/surfaceLooks.ts +50 -0
- package/src/format/tar-fields.ts +54 -0
- package/src/format/tar-paths.ts +104 -0
- package/src/format/tar-source.ts +13 -0
- package/src/format/tar-write.ts +152 -0
- package/src/format/tar.ts +204 -0
- package/src/format/targets.ts +217 -0
- package/src/format/terrain.ts +241 -0
- package/src/format/terrainTileBytes.ts +104 -0
- package/src/format/tierSelection.ts +195 -0
- package/src/format/toonLighting.ts +32 -0
- package/src/format/toonLook.ts +332 -0
- package/src/format/trail.ts +17 -0
- package/src/format/traversal.ts +13 -0
- package/src/format/treeSetRows.ts +93 -0
- package/src/format/ui.ts +90 -0
- package/src/format/uiStrings.ts +17 -0
- package/src/format/uniformRows.ts +31 -0
- package/src/format/upload-wire.ts +184 -0
- package/src/format/validationReceipt.ts +142 -0
- package/src/format/version.ts +9 -0
- package/src/format/vertexWear.ts +45 -0
- package/src/format/viewProgram.ts +329 -0
- package/src/format/voicePatches.ts +47 -0
- package/src/format/water.ts +247 -0
- package/src/format/waterWaves.ts +7 -0
- package/src/format/waterWorld.ts +34 -0
- package/src/format/weaponProfiles.ts +1315 -0
- package/src/format/weatherBundle.ts +36 -0
- package/src/format/weatherEffects.ts +78 -0
- package/src/format/weatherProgram.ts +422 -0
- package/src/format/wildlifePopulation.ts +210 -0
- package/src/format/wireLimits.ts +9 -0
- package/src/format/worldAssembly.ts +104 -0
- package/src/format/worldEntry.ts +151 -0
- package/src/format/worldPhysics.ts +292 -0
- package/src/format/worldSceneBatch.ts +106 -0
- package/src/format/worldSceneModels.ts +79 -0
- package/src/format/worldScenePages.ts +89 -0
- package/src/format/worldScenePlacement.ts +191 -0
- package/src/format/worldSceneSlabs.ts +43 -0
- package/src/format/worldSceneSurface.ts +113 -0
- package/src/format/worldSceneWeld.ts +702 -0
- package/src/format/worldScenes.ts +184 -0
- package/src/format/worldTargets.ts +111 -0
- package/src/format/worldUpdates.ts +229 -0
- package/src/hook/format-hook.d.mts +2 -0
- package/src/hook/format-hook.mjs +47 -0
- package/src/tools/runtime-hosts.json +497 -0
- package/README.md +0 -8
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { SCRIPT_V1_REFERENCE_KINDS, type DecisionScriptRow, type ScriptV1ReferenceKind } from './decisionScripts.ts';
|
|
2
|
+
import type { Shardfile } from './shardSchema.ts';
|
|
3
|
+
import type { ActorMove } from './actorMoves.ts';
|
|
4
|
+
import type { WorldTargets } from './worldTargets.ts';
|
|
5
|
+
import type { CreatureStrikes } from './creatures.ts';
|
|
6
|
+
|
|
7
|
+
/** Authoritative platform ids; actor handles are never allocated from aliases or guessed from row order. */
|
|
8
|
+
export type DecisionRegistries = Readonly<Partial<Record<ScriptV1ReferenceKind, ReadonlyMap<string, number>>>>;
|
|
9
|
+
type Namespace = ScriptV1ReferenceKind | 'timers';
|
|
10
|
+
/** One defining map for generated constants, the production resolver and scenario labels. */
|
|
11
|
+
export interface DecisionBindingMap {
|
|
12
|
+
ids: Readonly<Partial<Record<Namespace, Readonly<Record<string, number>>>>>;
|
|
13
|
+
inverse: Readonly<Partial<Record<Namespace, ReadonlyMap<number, string>>>>;
|
|
14
|
+
paramNames: readonly string[];
|
|
15
|
+
stateNames: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
/** Resolve an admitted row against real registries. Only binding-local timers receive newly allocated ids. */
|
|
18
|
+
export function decisionBindingMap(row: DecisionScriptRow, registries: DecisionRegistries): DecisionBindingMap {
|
|
19
|
+
const ids: Partial<Record<Namespace, Readonly<Record<string, number>>>> = {};
|
|
20
|
+
const inverse: Partial<Record<Namespace, ReadonlyMap<number, string>>> = {};
|
|
21
|
+
for (const kind of SCRIPT_V1_REFERENCE_KINDS) {
|
|
22
|
+
const registry = registries[kind], handles = new Set<number>();
|
|
23
|
+
for (const handle of registry?.values() ?? []) {
|
|
24
|
+
if (!Number.isSafeInteger(handle) || handle < 1 || handle > 0x7fffffff || handles.has(handle)) throw new Error(`Invalid or duplicate ${kind} registry handle`);
|
|
25
|
+
handles.add(handle);
|
|
26
|
+
}
|
|
27
|
+
const entries: [string, number][] = [], names = new Map<number, string>(), aliases = row[kind] ?? {};
|
|
28
|
+
for (const alias of Object.keys(aliases).sort()) {
|
|
29
|
+
const target = aliases[alias], handle = target === undefined ? undefined : registry?.get(target);
|
|
30
|
+
if (handle === undefined) throw new Error(`Missing ${kind} registry target for ${alias}`);
|
|
31
|
+
if (names.has(handle)) throw new Error(`Duplicate ${kind} alias handle`);
|
|
32
|
+
entries.push([alias, handle]); names.set(handle, alias);
|
|
33
|
+
}
|
|
34
|
+
ids[kind] = Object.freeze(Object.fromEntries(entries)); inverse[kind] = names;
|
|
35
|
+
}
|
|
36
|
+
if (new Set(row.timers).size !== row.timers.length) throw new Error('Duplicate local timer');
|
|
37
|
+
const timers = [...row.timers].sort(), timerIds: [string, number][] = [], timerNames = new Map<number, string>();
|
|
38
|
+
for (const [index, name] of timers.entries()) { timerIds.push([name, index + 1]); timerNames.set(index + 1, name); }
|
|
39
|
+
ids.timers = Object.freeze(Object.fromEntries(timerIds)); inverse.timers = timerNames;
|
|
40
|
+
return { ids: Object.freeze(ids), inverse: Object.freeze(inverse), paramNames: Object.freeze(Object.keys(row.params).sort()), stateNames: Object.freeze(row.state.map(slot => slot.name)) };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The actual player occupies a reserved handle, outside the bounded actor catalogue. */
|
|
44
|
+
export const DECISION_PLAYER_HANDLE = 0x7fffffff;
|
|
45
|
+
function catalogue(names: readonly string[]): ReadonlyMap<string, number> {
|
|
46
|
+
if (new Set(names).size !== names.length || names.length >= DECISION_PLAYER_HANDLE) throw new Error('Duplicate decision catalogue identity');
|
|
47
|
+
return new Map([...names].sort().map((name, index) => [name, index + 1]));
|
|
48
|
+
}
|
|
49
|
+
/** Declared group membership, shared by compilation, native reads and scenario fixtures. */
|
|
50
|
+
export function decisionSpawnGroups(source: Pick<Shardfile, 'creatures'>, scripts: readonly DecisionScriptRow[] = []): ReadonlyMap<string, readonly string[]> {
|
|
51
|
+
const groups = new Map<string, readonly string[]>(source.creatures.groups.map(group => [group.id, group.members]));
|
|
52
|
+
for (const script of scripts) if ('spawnGroup' in script.binding) {
|
|
53
|
+
if (groups.has(script.binding.spawnGroup)) throw new Error('Duplicate decision spawn group');
|
|
54
|
+
groups.set(script.binding.spawnGroup, Object.values(script.actors));
|
|
55
|
+
}
|
|
56
|
+
return groups;
|
|
57
|
+
}
|
|
58
|
+
/** Wire handles come from real platform rows, independently of alias spelling or declaration order.
|
|
59
|
+
* Unsupported namespaces remain absent and refuse in decisionBindingMap. Existing v0 handles are unchanged.
|
|
60
|
+
* Compiler glue and the authoritative sim use this same catalogue for a given product.
|
|
61
|
+
* nativeStrikeRows comes from the verified actors/strikes section; duplicate root/native ids refuse.
|
|
62
|
+
* scripts supplies declared spawn-group membership alongside the existing actor spawn ids.
|
|
63
|
+
*/
|
|
64
|
+
export function buildDecisionRegistries(source: Pick<Shardfile, 'creatures' | 'rows' | 'state' | 'quests' | 'audio' | 'targets' | 'ledger' | 'clientChannels' | 'movers'> & Partial<Pick<Shardfile, 'runtime'>>,
|
|
65
|
+
moves: readonly ActorMove[], worldTargets?: WorldTargets, nativeStrikeRows: readonly CreatureStrikes[number][] = [], scripts: readonly DecisionScriptRow[] = [], nativeActors: readonly string[] = []): DecisionRegistries {
|
|
66
|
+
const runtime = source.runtime?.spawns;
|
|
67
|
+
const actors = [...source.creatures.spawns, ...runtime?.homes ?? [], ...runtime?.bosses ?? [], ...runtime?.actors ?? []].map(row => row.id).concat(nativeActors);
|
|
68
|
+
return {
|
|
69
|
+
actors: catalogue(actors),
|
|
70
|
+
moves: catalogue(moves.map(row => row.id)), strikes: catalogue([...source.rows.strikes, ...nativeStrikeRows].map(row => row.id)),
|
|
71
|
+
fields: new Map(source.state.shared.filter(row => row.type !== 'string' && row.privacy === 'public').map(row => [row.name, row.id])),
|
|
72
|
+
flags: catalogue(source.quests.flags), zones: catalogue(source.quests.triggers.filter(row => row.kind === 'region').map(row => row.id)),
|
|
73
|
+
cues: catalogue(source.audio.cues.map(row => row.id)), channels: catalogue((source.clientChannels ?? []).map(row => row.id)),
|
|
74
|
+
targets: catalogue(source.targets.interactions.map(row => row.id)), spawns: catalogue([...actors, ...decisionSpawnGroups(source, scripts).keys()]),
|
|
75
|
+
spots: catalogue(worldTargets?.spots.map(row => row.id) ?? []),
|
|
76
|
+
facts: catalogue(source.ledger.map(row => row.fact)), rewards: catalogue(source.ledger.map(row => row.fact)),
|
|
77
|
+
signals: catalogue(source.movers.filter(row => row.atEnd !== undefined).map(row => row.id)),
|
|
78
|
+
weather: catalogue(source.rows.weather.map(row => row.id)),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
|
|
3
|
+
const id = v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(0x7fffffff));
|
|
4
|
+
const finite = v.pipe(v.number(), v.finite());
|
|
5
|
+
/** Bounded sim-to-view data. No module memory, functions or private decision slots cross the boundary. */
|
|
6
|
+
export const DecisionPublicationSchema: v.GenericSchema<DecisionPublicationInput, DecisionPublication> = v.strictObject({
|
|
7
|
+
tick: id,
|
|
8
|
+
fields: v.pipe(v.array(v.strictObject({ actor: id, field: id, value: finite })), v.maxLength(240000)),
|
|
9
|
+
channels: v.pipe(v.array(v.strictObject({ channel: id, value: finite })), v.maxLength(512)),
|
|
10
|
+
events: v.pipe(v.array(v.strictObject({ kind: v.picklist(['move', 'strike', 'cue']), actor: id, id, target: id })), v.maxLength(16384)),
|
|
11
|
+
});
|
|
12
|
+
/** One committed fixed-step publication, detached from the simulation's mutable storage. */
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
16
|
+
export type DecisionPublicationInput = DecisionPublication;
|
|
17
|
+
interface DecisionPublicationFields {
|
|
18
|
+
tick: number;
|
|
19
|
+
fields: ({
|
|
20
|
+
actor: number;
|
|
21
|
+
field: number;
|
|
22
|
+
value: number;
|
|
23
|
+
})[];
|
|
24
|
+
channels: ({
|
|
25
|
+
channel: number;
|
|
26
|
+
value: number;
|
|
27
|
+
})[];
|
|
28
|
+
events: ({
|
|
29
|
+
kind: 'move' | 'strike' | 'cue';
|
|
30
|
+
actor: number;
|
|
31
|
+
id: number;
|
|
32
|
+
target: number;
|
|
33
|
+
})[];
|
|
34
|
+
}
|
|
35
|
+
export type DecisionPublication = { [Key in keyof DecisionPublicationFields]: DecisionPublicationFields[Key] };
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { isJsonData } from './json.ts';
|
|
3
|
+
import { SCRIPT_V1_COMMANDS, SCRIPT_V1_EVENTS, SCRIPT_V1_LISTS, SCRIPT_V1_READS } from './scriptAbiV1.ts';
|
|
4
|
+
import { SCRIPT_LIMITS } from './scriptLimits.ts';
|
|
5
|
+
import { SCRIPT_V1_SIDES, VIEW_WRITES_GAMEPLAY, isViewCommand } from './script-sides.ts';
|
|
6
|
+
|
|
7
|
+
function keys<T extends Readonly<Record<string, number>>>(table: T): (keyof T & string)[] { return Object.keys(table); }
|
|
8
|
+
const id = v.pipe(v.string(), v.regex(/^[A-Za-z][A-Za-z0-9.:-]*$/u), v.maxLength(128));
|
|
9
|
+
const local = v.pipe(v.string(), v.regex(/^[A-Za-z_][A-Za-z0-9_.-]*$/u), v.maxLength(64));
|
|
10
|
+
const finite = v.pipe(v.number(), v.finite());
|
|
11
|
+
const positive = v.pipe(finite, v.integer(), v.minValue(1), v.maxValue(0x7fffffff));
|
|
12
|
+
const aliases = v.pipe(v.record(local, id), v.check(value => Object.keys(value).length <= 256, 'bounded script id map'));
|
|
13
|
+
const unique = (values: readonly unknown[]): boolean => new Set(values).size === values.length;
|
|
14
|
+
const readNames: ("x" | "y" | "z" | "yaw" | "hpShare" | "alive" | "field" | "distance" | "nearestPlayer" | "flag" | "timerLeft" | "random" | "actorInZone" | "playersInZone" | "moving" | "strikeState" | "playerFlag" | "spawnGroupAlive" | "bearing" | "bodyX" | "bodyY" | "bodyZ" | "bodyAlive" | "bodyYaw" | "bodyVisible" | "playerIntent" | "actorsInZone" | "playersWithin" | "groundHeight" | "nearestWalkable" | "path" | "radial" | "declaredFloor")[] = [...keys(SCRIPT_V1_READS), ...keys(SCRIPT_V1_LISTS)];
|
|
15
|
+
const state = v.strictObject({ name: local, type: v.picklist(['bool', 'i32', 'f64']), default: v.union([v.boolean(), finite]),
|
|
16
|
+
scope: v.picklist(['binding', 'actor', 'player']), min: v.exactOptional(finite), max: v.exactOptional(finite) });
|
|
17
|
+
/** Named ids that must resolve in another platform section. Timers are binding-local names. */
|
|
18
|
+
export const SCRIPT_V1_REFERENCE_KINDS = ['actors', 'moves', 'strikes', 'cues', 'fields', 'flags', 'zones', 'spots', 'targets', 'spawns', 'signals', 'facts', 'rewards', 'channels', 'impulses', 'weather', 'bodies', 'colliders'] as const;
|
|
19
|
+
export type ScriptV1ReferenceKind = typeof SCRIPT_V1_REFERENCE_KINDS[number];
|
|
20
|
+
const rowEntries = {
|
|
21
|
+
// SERVER-PARITY SS7: `sim` is server-owned gameplay; `view` runs on the page only and writes no gameplay (row rules).
|
|
22
|
+
// Per-frame view is still the v2 view lane's (view/modules, client view.program).
|
|
23
|
+
id, abi: v.literal('1.0'), side: v.picklist(SCRIPT_V1_SIDES),
|
|
24
|
+
module: v.pipe(v.string(), v.regex(/^blobs\/wasm\/[a-f0-9]{64}\.wasm$/u)),
|
|
25
|
+
source: v.pipe(v.string(), v.maxLength(256), v.regex(/^behaviour\/(?:[A-Za-z0-9_-][A-Za-z0-9_.-]*\/)*[A-Za-z0-9_-][A-Za-z0-9_.-]*\.as$/u),
|
|
26
|
+
v.check(value => !value.split('/').includes('generated'), 'authored script source, not generated glue')),
|
|
27
|
+
sourceHash: v.exactOptional(v.pipe(v.string(), v.regex(/^[a-f0-9]{64}$/u))),
|
|
28
|
+
binding: v.union([v.strictObject({ encounter: id }), v.strictObject({ quest: id }), v.strictObject({ zone: id }), v.strictObject({ shard: v.literal(true) }), v.strictObject({ spawnGroup: id })]),
|
|
29
|
+
pages: v.optional(v.pipe(positive, v.maxValue(4)), 1), onFail: v.picklist(['hold', 'reset', 'skip']),
|
|
30
|
+
on: v.pipe(v.array(v.picklist(keys(SCRIPT_V1_EVENTS))), v.minLength(1), v.maxLength(23), v.check(values => unique(values), 'unique subscribed events')),
|
|
31
|
+
tick: v.optional(v.nullable(v.picklist([1, 2, 5, 10])), null),
|
|
32
|
+
reads: v.pipe(v.array(v.picklist(readNames)), v.maxLength(readNames.length), v.check(values => unique(values), 'unique script reads')),
|
|
33
|
+
commands: v.pipe(v.array(v.picklist(keys(SCRIPT_V1_COMMANDS))), v.maxLength(21), v.check(values => unique(values), 'unique script commands')),
|
|
34
|
+
actors: v.optional(aliases, {}), moves: v.optional(aliases, {}), strikes: v.optional(aliases, {}), cues: v.optional(aliases, {}),
|
|
35
|
+
fields: v.optional(aliases, {}), flags: v.optional(aliases, {}), zones: v.optional(aliases, {}), spots: v.optional(aliases, {}),
|
|
36
|
+
targets: v.optional(aliases, {}), spawns: v.optional(aliases, {}), signals: v.optional(aliases, {}), facts: v.optional(aliases, {}),
|
|
37
|
+
rewards: v.optional(aliases, {}), channels: v.optional(aliases, {}), impulses: v.optional(aliases, {}), weather: v.optional(aliases, {}),
|
|
38
|
+
bodies: v.exactOptional(aliases), colliders: v.exactOptional(aliases),
|
|
39
|
+
timers: v.optional(v.pipe(v.array(local), v.maxLength(64), v.check(values => unique(values), 'unique timer names')), []),
|
|
40
|
+
stateVersion: positive, state: v.pipe(v.array(state), v.maxLength(16)),
|
|
41
|
+
params: v.pipe(v.record(local, finite), v.check(value => Object.keys(value).length <= 32, 'bounded script parameters')),
|
|
42
|
+
} as const;
|
|
43
|
+
const row: v.GenericSchema<DecisionScriptRowInput, DecisionScriptRow> = v.strictObject(rowEntries);
|
|
44
|
+
|
|
45
|
+
/** Unused additive namespaces have no wire representation in pre-extension programs. */
|
|
46
|
+
function omitEmptyBodyMaps(script: DecisionScriptRow): DecisionScriptRow {
|
|
47
|
+
const { bodies, colliders, ...original } = script;
|
|
48
|
+
return { ...original, ...(bodies === undefined || Object.keys(bodies).length === 0 ? {} : { bodies }),
|
|
49
|
+
...(colliders === undefined || Object.keys(colliders).length === 0 ? {} : { colliders }) };
|
|
50
|
+
}
|
|
51
|
+
const reserved = new Set('abstract as assert async await boolean break case catch class const constructor continue debugger declare default delete do else enum export extends false final finally for from function get if implements import in instanceof interface is keyof let namespace never new null number of package private protected public readonly return set static string super switch symbol __proto__ prototype this throw true try type typeof undefined unknown var void while with yield bool i32 i64 f32 f64 usize'.split(' '));
|
|
52
|
+
/** The same generated identifier rule applies to all namespaces, slots and parameters. */
|
|
53
|
+
export function scriptV1Identifier(name: string): string {
|
|
54
|
+
const value = name.replaceAll(/[._-]+([A-Za-z0-9])/gu, (_match, next: string) => next.toUpperCase());
|
|
55
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(value) || reserved.has(name) || reserved.has(value)) throw new Error(`Invalid script binding identifier ${name}`);
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
function validNames(names: readonly string[]): boolean {
|
|
59
|
+
try { return unique(names.map(scriptV1Identifier)); } catch { return false; }
|
|
60
|
+
}
|
|
61
|
+
/** Row-local checks, independent of any renderer, module execution or source-code evaluator. */
|
|
62
|
+
export function decisionScriptRowRules(script: DecisionScriptRow): string[] {
|
|
63
|
+
const errors: string[] = [];
|
|
64
|
+
if ('spawnGroup' in script.binding && (Object.keys(script.actors).length === 0 || script.state.some(slot => slot.scope !== 'actor')))
|
|
65
|
+
errors.push('spawn groups declare members and actor-scoped simulation state');
|
|
66
|
+
if ((script.tick !== null) !== script.on.includes('tick')) errors.push('tick subscription has a declared 1/2/5/10 Hz rate');
|
|
67
|
+
if (script.on.some(name => SCRIPT_V1_EVENTS[name] >= 30) || script.commands.some(name => SCRIPT_V1_COMMANDS[name] >= 100)) errors.push('simulation script uses only simulation ops');
|
|
68
|
+
if (script.side === 'view' && !script.commands.every(isViewCommand)) { errors.push(VIEW_WRITES_GAMEPLAY); }
|
|
69
|
+
for (const names of [...SCRIPT_V1_REFERENCE_KINDS.map(kind => Object.keys(script[kind] ?? {})), script.timers, script.state.map(slot => slot.name), Object.keys(script.params)]) {
|
|
70
|
+
if (!validNames(names)) errors.push('unique nonreserved generated binding names');
|
|
71
|
+
}
|
|
72
|
+
for (const slot of script.state) {
|
|
73
|
+
if (slot.type === 'bool') {
|
|
74
|
+
if (typeof slot.default !== 'boolean' || slot.min !== undefined || slot.max !== undefined) errors.push('typed script state defaults and bounds');
|
|
75
|
+
} else {
|
|
76
|
+
const low = slot.type === 'i32' ? -2147483648 : -Number.MAX_VALUE, high = slot.type === 'i32' ? 2147483647 : Number.MAX_VALUE;
|
|
77
|
+
const min = slot.min ?? low, max = slot.max ?? high;
|
|
78
|
+
if (typeof slot.default !== 'number' || slot.default < min || slot.default > max || min < low || max > high || min > max
|
|
79
|
+
|| (slot.type === 'i32' && ![slot.default, min, max].every(Number.isInteger))) errors.push('typed script state defaults and bounds');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return [...new Set(errors)];
|
|
83
|
+
}
|
|
84
|
+
function safeInput(value: unknown): boolean {
|
|
85
|
+
if (!isJsonData(value)) return false;
|
|
86
|
+
const safe = (input: unknown): boolean => {
|
|
87
|
+
if (typeof input !== 'object' || input === null) return true;
|
|
88
|
+
return Object.entries(input).every(([key, child]) => !['__proto__', 'constructor', 'prototype'].includes(key) && safe(child));
|
|
89
|
+
};
|
|
90
|
+
return safe(value);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Plain platform section: v1 script rows. Existing v0 bindings remain a separate format during the W1 migration. */
|
|
94
|
+
export const DecisionScriptsSchema: v.GenericSchema<unknown, DecisionScripts> & { readonly pipe: readonly [unknown, unknown, v.ArraySchema<typeof row, undefined>, unknown, unknown, unknown, unknown, unknown] } = v.pipe(v.unknown(), v.check(safeInput, 'plain JSON without unsafe property names'), v.array(v.pipe(row, v.check(value => decisionScriptRowRules(value).length === 0, 'script row semantic rules'))),
|
|
95
|
+
v.maxLength(64), v.check(rows => unique(rows.map(value => value.id)), 'unique script ids'),
|
|
96
|
+
v.check(rows => rows.reduce((count, value) => count + ('spawnGroup' in value.binding ? Object.keys(value.actors).length : 1), 0) <= 64, 'at most 64 logical decision bindings'),
|
|
97
|
+
// G20a / G769: the host's instance cap (nine), so Pine's contract guest ships as a named module beside its eight others.
|
|
98
|
+
v.check(rows => new Set(rows.map(value => value.module)).size <= SCRIPT_LIMITS.instances, 'at most nine decision modules'),
|
|
99
|
+
v.transform(rows => rows.map(omitEmptyBodyMaps)));
|
|
100
|
+
|
|
101
|
+
/** Exact authored script document: the original native admission validates the
|
|
102
|
+
* untouched value, while the structural view preserves omitted default fields.
|
|
103
|
+
* Runtime parsing still owns normalization and every resource/owner check. */
|
|
104
|
+
export const DecisionScriptRowDocumentSchema: v.GenericSchema<unknown, DecisionScriptRowInput> = v.pipe(
|
|
105
|
+
v.unknown(), v.check(input => v.safeParse(DecisionScriptsSchema, [input]).success, 'Complete native script admission'),
|
|
106
|
+
v.strictObject({ ...rowEntries,
|
|
107
|
+
pages: v.exactOptional(rowEntries.pages.wrapped),
|
|
108
|
+
tick: v.exactOptional(rowEntries.tick.wrapped),
|
|
109
|
+
actors: v.exactOptional(rowEntries.actors.wrapped),
|
|
110
|
+
moves: v.exactOptional(rowEntries.moves.wrapped),
|
|
111
|
+
strikes: v.exactOptional(rowEntries.strikes.wrapped),
|
|
112
|
+
cues: v.exactOptional(rowEntries.cues.wrapped),
|
|
113
|
+
fields: v.exactOptional(rowEntries.fields.wrapped),
|
|
114
|
+
flags: v.exactOptional(rowEntries.flags.wrapped),
|
|
115
|
+
zones: v.exactOptional(rowEntries.zones.wrapped),
|
|
116
|
+
spots: v.exactOptional(rowEntries.spots.wrapped),
|
|
117
|
+
targets: v.exactOptional(rowEntries.targets.wrapped),
|
|
118
|
+
spawns: v.exactOptional(rowEntries.spawns.wrapped),
|
|
119
|
+
signals: v.exactOptional(rowEntries.signals.wrapped),
|
|
120
|
+
facts: v.exactOptional(rowEntries.facts.wrapped),
|
|
121
|
+
rewards: v.exactOptional(rowEntries.rewards.wrapped),
|
|
122
|
+
channels: v.exactOptional(rowEntries.channels.wrapped),
|
|
123
|
+
impulses: v.exactOptional(rowEntries.impulses.wrapped),
|
|
124
|
+
weather: v.exactOptional(rowEntries.weather.wrapped),
|
|
125
|
+
timers: v.exactOptional(rowEntries.timers.wrapped),
|
|
126
|
+
}),
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
/** Parse unknown direct input only after rejecting accessors, prototypes and non-JSON values. */
|
|
130
|
+
export function parseDecisionScripts(input: unknown): DecisionScripts {
|
|
131
|
+
if (!isJsonData(input)) throw new Error('Decision scripts must be plain JSON');
|
|
132
|
+
return v.parse(DecisionScriptsSchema, input);
|
|
133
|
+
}
|
|
134
|
+
/** Mechanical continuation identity excludes provenance and unused additive body namespaces.
|
|
135
|
+
* Pre-extension scripts retain their exact original serialized declaration. */
|
|
136
|
+
export function decisionScriptContract(script: DecisionScriptRow): Omit<DecisionScriptRow, 'sourceHash' | 'bodies' | 'colliders'> & Partial<Pick<DecisionScriptRow, 'bodies' | 'colliders'>> {
|
|
137
|
+
const { sourceHash: _sourceHash, ...original } = script;
|
|
138
|
+
return omitEmptyBodyMaps(original);
|
|
139
|
+
}
|
|
140
|
+
/** One authored group row resolves to one logical invocation/state owner per member.
|
|
141
|
+
* Every invocation still shares the admitted module image. Alias order never changes identities.
|
|
142
|
+
*/
|
|
143
|
+
export function actorDecisionRows(script: DecisionScriptRow): readonly DecisionScriptRow[] {
|
|
144
|
+
if (!('spawnGroup' in script.binding)) return [script];
|
|
145
|
+
const members: DecisionScriptRow[] = [];
|
|
146
|
+
for (const [alias, actor] of Object.entries(script.actors).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) {
|
|
147
|
+
members.push({ ...script, id: `${script.id}.actor.${alias}`, actors: { [alias]: actor } });
|
|
148
|
+
}
|
|
149
|
+
return members;
|
|
150
|
+
}
|
|
151
|
+
/** Cross-section facts come from admitted platform registries, never from aliases in the script row itself. */
|
|
152
|
+
export interface DecisionScriptReferences {
|
|
153
|
+
modules: ReadonlyMap<string, { abi: number; pages: number }>;
|
|
154
|
+
ids: Readonly<Partial<Record<ScriptV1ReferenceKind, ReadonlySet<string>>>>;
|
|
155
|
+
bindings: { encounters: ReadonlySet<string>; quests: ReadonlySet<string>; zones: ReadonlySet<string> };
|
|
156
|
+
migrations: readonly { scope: string; from: number; to: number }[];
|
|
157
|
+
}
|
|
158
|
+
/** Every alias resolves in the matching registry, memory matches admitted bytes and migrations reach the latest slots. */
|
|
159
|
+
export function decisionScriptRules(scripts: readonly DecisionScriptRow[], references: DecisionScriptReferences): string[] {
|
|
160
|
+
const errors: string[] = [];
|
|
161
|
+
for (const script of scripts) {
|
|
162
|
+
errors.push(...decisionScriptRowRules(script));
|
|
163
|
+
const module = references.modules.get(script.module);
|
|
164
|
+
if (module?.abi !== 1 || module.pages !== script.pages) errors.push('script module has matching admitted ABI and fixed pages');
|
|
165
|
+
for (const kind of SCRIPT_V1_REFERENCE_KINDS) for (const value of Object.values(script[kind] ?? {})) {
|
|
166
|
+
if (references.ids[kind]?.has(value) !== true) errors.push(`script ${kind} reference resolves in its platform section`);
|
|
167
|
+
}
|
|
168
|
+
const binding = script.binding;
|
|
169
|
+
if (('encounter' in binding && !references.bindings.encounters.has(binding.encounter))
|
|
170
|
+
|| ('quest' in binding && !references.bindings.quests.has(binding.quest))
|
|
171
|
+
|| ('zone' in binding && !references.bindings.zones.has(binding.zone))) errors.push('script binding resolves in its platform section');
|
|
172
|
+
const migrations = references.migrations.filter(value => value.scope === `script:${script.id}`);
|
|
173
|
+
if (!unique(migrations.map(value => value.from)) || migrations.some(value => !Number.isSafeInteger(value.from) || value.from < 1 || value.to !== value.from + 1 || value.to > script.stateVersion)) errors.push('unambiguous consecutive script migrations');
|
|
174
|
+
const chain = [...migrations].sort((a, b) => a.from - b.from);
|
|
175
|
+
if (chain.length !== script.stateVersion - 1 || chain.some((value, index) => value.from !== index + 1 || value.to !== index + 2)) errors.push('script migration chain reaches stateVersion');
|
|
176
|
+
}
|
|
177
|
+
return [...new Set(errors)];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** A live species lends its existing body/encounter to one admitted decision script.
|
|
181
|
+
* Presentation fields and contact impulses are names/numbers, never shard callbacks.
|
|
182
|
+
*/
|
|
183
|
+
export const BorrowedDecisionSchema: v.GenericSchema<BorrowedDecisionRowsInput, BorrowedDecisionRows> = v.pipe(v.strictObject({ script: id, actor: v.exactOptional(id), group: v.exactOptional(id), perch: v.exactOptional(id),
|
|
184
|
+
leanField: v.exactOptional(local), bankField: v.exactOptional(local),
|
|
185
|
+
marks: v.exactOptional(v.strictObject({ fight: local, phase: local })),
|
|
186
|
+
idle: v.exactOptional(v.strictObject({ move: id, progress: local })),
|
|
187
|
+
strikeEffects: v.pipe(v.array(v.strictObject({ strike: id, aimHeight: finite, speed: v.pipe(finite, v.minValue(0), v.maxValue(40)),
|
|
188
|
+
lift: v.pipe(finite, v.minValue(0), v.maxValue(40)) })), v.maxLength(32)),
|
|
189
|
+
}), v.check(value => (value.actor === undefined) !== (value.group === undefined), 'one actor or spawn group owner'));
|
|
190
|
+
export type BorrowedDecision = v.InferOutput<typeof BorrowedDecisionSchema>;
|
|
191
|
+
|
|
192
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
193
|
+
interface DecisionScriptRowInputFields {
|
|
194
|
+
id: string;
|
|
195
|
+
abi: '1.0';
|
|
196
|
+
side: 'sim' | 'view';
|
|
197
|
+
module: string;
|
|
198
|
+
source: string;
|
|
199
|
+
sourceHash?: string;
|
|
200
|
+
binding: ({
|
|
201
|
+
encounter: string;
|
|
202
|
+
}) | ({
|
|
203
|
+
quest: string;
|
|
204
|
+
}) | ({
|
|
205
|
+
zone: string;
|
|
206
|
+
}) | ({
|
|
207
|
+
shard: true;
|
|
208
|
+
}) | ({
|
|
209
|
+
spawnGroup: string;
|
|
210
|
+
});
|
|
211
|
+
pages?: number | undefined;
|
|
212
|
+
onFail: 'hold' | 'reset' | 'skip';
|
|
213
|
+
on: (keyof typeof SCRIPT_V1_EVENTS)[];
|
|
214
|
+
tick?: (1 | 2 | 5 | 10) | null | undefined;
|
|
215
|
+
reads: ((typeof readNames)[number])[];
|
|
216
|
+
commands: (keyof typeof SCRIPT_V1_COMMANDS)[];
|
|
217
|
+
actors?: Record<string, string> | undefined;
|
|
218
|
+
moves?: Record<string, string> | undefined;
|
|
219
|
+
strikes?: Record<string, string> | undefined;
|
|
220
|
+
cues?: Record<string, string> | undefined;
|
|
221
|
+
fields?: Record<string, string> | undefined;
|
|
222
|
+
flags?: Record<string, string> | undefined;
|
|
223
|
+
zones?: Record<string, string> | undefined;
|
|
224
|
+
spots?: Record<string, string> | undefined;
|
|
225
|
+
targets?: Record<string, string> | undefined;
|
|
226
|
+
spawns?: Record<string, string> | undefined;
|
|
227
|
+
signals?: Record<string, string> | undefined;
|
|
228
|
+
facts?: Record<string, string> | undefined;
|
|
229
|
+
rewards?: Record<string, string> | undefined;
|
|
230
|
+
channels?: Record<string, string> | undefined;
|
|
231
|
+
impulses?: Record<string, string> | undefined;
|
|
232
|
+
weather?: Record<string, string> | undefined;
|
|
233
|
+
bodies?: Record<string, string>;
|
|
234
|
+
colliders?: Record<string, string>;
|
|
235
|
+
timers?: (string)[] | undefined;
|
|
236
|
+
stateVersion: number;
|
|
237
|
+
state: ({
|
|
238
|
+
name: string;
|
|
239
|
+
type: 'bool' | 'i32' | 'f64';
|
|
240
|
+
default: (boolean) | (number);
|
|
241
|
+
scope: 'binding' | 'actor' | 'player';
|
|
242
|
+
min?: number;
|
|
243
|
+
max?: number;
|
|
244
|
+
})[];
|
|
245
|
+
params: Record<string, number>;
|
|
246
|
+
}
|
|
247
|
+
export type DecisionScriptRowInput = { [Key in keyof DecisionScriptRowInputFields]: DecisionScriptRowInputFields[Key] };
|
|
248
|
+
interface DecisionScriptRowFields {
|
|
249
|
+
id: string;
|
|
250
|
+
abi: '1.0';
|
|
251
|
+
side: 'sim' | 'view';
|
|
252
|
+
module: string;
|
|
253
|
+
source: string;
|
|
254
|
+
sourceHash?: string;
|
|
255
|
+
binding: ({
|
|
256
|
+
encounter: string;
|
|
257
|
+
}) | ({
|
|
258
|
+
quest: string;
|
|
259
|
+
}) | ({
|
|
260
|
+
zone: string;
|
|
261
|
+
}) | ({
|
|
262
|
+
shard: true;
|
|
263
|
+
}) | ({
|
|
264
|
+
spawnGroup: string;
|
|
265
|
+
});
|
|
266
|
+
pages: number;
|
|
267
|
+
onFail: 'hold' | 'reset' | 'skip';
|
|
268
|
+
on: (keyof typeof SCRIPT_V1_EVENTS)[];
|
|
269
|
+
tick: (1 | 2 | 5 | 10) | null;
|
|
270
|
+
reads: ((typeof readNames)[number])[];
|
|
271
|
+
commands: (keyof typeof SCRIPT_V1_COMMANDS)[];
|
|
272
|
+
actors: Record<string, string>;
|
|
273
|
+
moves: Record<string, string>;
|
|
274
|
+
strikes: Record<string, string>;
|
|
275
|
+
cues: Record<string, string>;
|
|
276
|
+
fields: Record<string, string>;
|
|
277
|
+
flags: Record<string, string>;
|
|
278
|
+
zones: Record<string, string>;
|
|
279
|
+
spots: Record<string, string>;
|
|
280
|
+
targets: Record<string, string>;
|
|
281
|
+
spawns: Record<string, string>;
|
|
282
|
+
signals: Record<string, string>;
|
|
283
|
+
facts: Record<string, string>;
|
|
284
|
+
rewards: Record<string, string>;
|
|
285
|
+
channels: Record<string, string>;
|
|
286
|
+
impulses: Record<string, string>;
|
|
287
|
+
weather: Record<string, string>;
|
|
288
|
+
bodies?: Record<string, string>;
|
|
289
|
+
colliders?: Record<string, string>;
|
|
290
|
+
timers: (string)[];
|
|
291
|
+
stateVersion: number;
|
|
292
|
+
state: ({
|
|
293
|
+
name: string;
|
|
294
|
+
type: 'bool' | 'i32' | 'f64';
|
|
295
|
+
default: (boolean) | (number);
|
|
296
|
+
scope: 'binding' | 'actor' | 'player';
|
|
297
|
+
min?: number;
|
|
298
|
+
max?: number;
|
|
299
|
+
})[];
|
|
300
|
+
params: Record<string, number>;
|
|
301
|
+
}
|
|
302
|
+
export type DecisionScriptRow = { [Key in keyof DecisionScriptRowFields]: DecisionScriptRowFields[Key] };
|
|
303
|
+
export type BorrowedDecisionRowsInput = BorrowedDecisionRows;
|
|
304
|
+
interface BorrowedDecisionRowsFields {
|
|
305
|
+
script: string;
|
|
306
|
+
actor?: string;
|
|
307
|
+
group?: string;
|
|
308
|
+
perch?: string;
|
|
309
|
+
leanField?: string;
|
|
310
|
+
bankField?: string;
|
|
311
|
+
marks?: {
|
|
312
|
+
fight: string;
|
|
313
|
+
phase: string;
|
|
314
|
+
};
|
|
315
|
+
idle?: {
|
|
316
|
+
move: string;
|
|
317
|
+
progress: string;
|
|
318
|
+
};
|
|
319
|
+
strikeEffects: ({
|
|
320
|
+
strike: string;
|
|
321
|
+
aimHeight: number;
|
|
322
|
+
speed: number;
|
|
323
|
+
lift: number;
|
|
324
|
+
})[];
|
|
325
|
+
}
|
|
326
|
+
export type BorrowedDecisionRows = { [Key in keyof BorrowedDecisionRowsFields]: BorrowedDecisionRowsFields[Key] };
|
|
327
|
+
export type DecisionScripts = (DecisionScriptRow)[];
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { isJsonData } from './json.ts';
|
|
3
|
+
import { ObservationRefSchema, ScenePointRefSchema } from './sceneRefs.ts';
|
|
4
|
+
import { QuestEffectSchema } from './questSteps.ts';
|
|
5
|
+
|
|
6
|
+
const id = v.pipe(v.string(), v.minLength(1), v.maxLength(128));
|
|
7
|
+
const text = v.pipe(v.string(), v.maxLength(4096));
|
|
8
|
+
const finite = v.pipe(v.number(), v.finite());
|
|
9
|
+
const ids = v.pipe(v.array(id), v.maxLength(64));
|
|
10
|
+
const condition = v.strictObject({ all: v.exactOptional(ids), any: v.exactOptional(ids), none: v.exactOptional(ids) });
|
|
11
|
+
const need = v.strictObject({ ...condition.entries, else: v.exactOptional(id) });
|
|
12
|
+
/** Presentation commands name only the existing service or published resource.
|
|
13
|
+
* Story acceptance and saved flags remain in the admitted native interactions. */
|
|
14
|
+
const effects = v.pipe(v.array(QuestEffectSchema), v.maxLength(64));
|
|
15
|
+
const unique = (rows: readonly { readonly id: string }[]) => new Set(rows.map(row => row.id)).size === rows.length;
|
|
16
|
+
const promptDefinition = { id, action: id, label: text, when: v.exactOptional(condition),
|
|
17
|
+
labels: v.optional(v.pipe(v.array(v.strictObject({ when: condition, text })), v.maxLength(16)), []) };
|
|
18
|
+
/** Z11 page rows contain no borrowed owners, paths, calls or executable hooks. */
|
|
19
|
+
export const DeclaredQuestPageSchema: v.GenericSchema<DeclaredQuestPageInput, DeclaredQuestPage> = v.pipe(v.unknown(), v.check(isJsonData, 'Quest page requires plain JSON'), v.strictObject({
|
|
20
|
+
version: v.literal(1), quest: id,
|
|
21
|
+
prompts: v.pipe(v.array(v.union([
|
|
22
|
+
v.strictObject({ ...promptDefinition, at: ScenePointRefSchema, radius: v.pipe(finite, v.minValue(0), v.maxValue(100)) }),
|
|
23
|
+
v.strictObject({ id, action: id, label: text, channel: id }),
|
|
24
|
+
])), v.maxLength(128)),
|
|
25
|
+
observations: v.optional(v.pipe(v.array(v.strictObject({ id, source: ObservationRefSchema })), v.maxLength(128)), []),
|
|
26
|
+
actions: v.pipe(v.array(v.strictObject({ id, interaction: v.exactOptional(id),
|
|
27
|
+
needs: v.optional(v.pipe(v.array(need), v.maxLength(16)), []), denied: v.optional(v.record(id, text), {}),
|
|
28
|
+
refused: v.optional(v.pipe(v.record(id, effects), v.check(rows => Object.keys(rows).length <= 16, 'Bounded refusal effects')), {}),
|
|
29
|
+
before: v.optional(effects, []), after: v.optional(effects, []) })), v.maxLength(128)),
|
|
30
|
+
initial: v.optional(v.pipe(v.array(v.strictObject({ when: condition, effects })), v.maxLength(64)), []),
|
|
31
|
+
}), v.check(row => unique(row.prompts) && unique(row.observations) && unique(row.actions)
|
|
32
|
+
&& row.prompts.every(prompt => row.actions.some(action => action.id === prompt.action)), 'Unique declared page ids and accepted prompt actions'));
|
|
33
|
+
|
|
34
|
+
/** Admission precedes prompt allocation or restore effects. */
|
|
35
|
+
export function parseDeclaredQuestPage(input: unknown): DeclaredQuestPage { return v.parse(DeclaredQuestPageSchema, input); }
|
|
36
|
+
|
|
37
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
38
|
+
export type DeclaredQuestPageInput = unknown;
|
|
39
|
+
interface DeclaredQuestPageFields {
|
|
40
|
+
version: 1;
|
|
41
|
+
quest: string;
|
|
42
|
+
prompts: ((Omit<{
|
|
43
|
+
id: string;
|
|
44
|
+
action: string;
|
|
45
|
+
label: string;
|
|
46
|
+
when?: {
|
|
47
|
+
all?: (string)[];
|
|
48
|
+
any?: (string)[];
|
|
49
|
+
none?: (string)[];
|
|
50
|
+
};
|
|
51
|
+
labels: ({
|
|
52
|
+
when: {
|
|
53
|
+
all?: (string)[];
|
|
54
|
+
any?: (string)[];
|
|
55
|
+
none?: (string)[];
|
|
56
|
+
};
|
|
57
|
+
text: string;
|
|
58
|
+
})[];
|
|
59
|
+
}, keyof ({
|
|
60
|
+
at: v.InferOutput<typeof ScenePointRefSchema>;
|
|
61
|
+
radius: number;
|
|
62
|
+
})> & {
|
|
63
|
+
at: v.InferOutput<typeof ScenePointRefSchema>;
|
|
64
|
+
radius: number;
|
|
65
|
+
}) | ({
|
|
66
|
+
id: string;
|
|
67
|
+
action: string;
|
|
68
|
+
label: string;
|
|
69
|
+
channel: string;
|
|
70
|
+
}))[];
|
|
71
|
+
observations: ({
|
|
72
|
+
id: string;
|
|
73
|
+
source: v.InferOutput<typeof ObservationRefSchema>;
|
|
74
|
+
})[];
|
|
75
|
+
actions: ({
|
|
76
|
+
id: string;
|
|
77
|
+
interaction?: string;
|
|
78
|
+
needs: (Omit<{
|
|
79
|
+
all?: (string)[];
|
|
80
|
+
any?: (string)[];
|
|
81
|
+
none?: (string)[];
|
|
82
|
+
}, keyof ({
|
|
83
|
+
else?: string;
|
|
84
|
+
})> & {
|
|
85
|
+
else?: string;
|
|
86
|
+
})[];
|
|
87
|
+
denied: Record<string, string>;
|
|
88
|
+
refused: Record<string, (v.InferOutput<typeof QuestEffectSchema>)[]>;
|
|
89
|
+
before: (v.InferOutput<typeof QuestEffectSchema>)[];
|
|
90
|
+
after: (v.InferOutput<typeof QuestEffectSchema>)[];
|
|
91
|
+
})[];
|
|
92
|
+
initial: ({
|
|
93
|
+
when: {
|
|
94
|
+
all?: (string)[];
|
|
95
|
+
any?: (string)[];
|
|
96
|
+
none?: (string)[];
|
|
97
|
+
};
|
|
98
|
+
effects: (v.InferOutput<typeof QuestEffectSchema>)[];
|
|
99
|
+
})[];
|
|
100
|
+
}
|
|
101
|
+
export type DeclaredQuestPage = { [Key in keyof DeclaredQuestPageFields]: DeclaredQuestPageFields[Key] };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { CONTENT_CAPS as C, type TextureTranscodeSupport } from './contentBounds.ts';
|
|
2
|
+
import { worstContentCostSteps, type worstContentCost } from './budget.ts';
|
|
3
|
+
import type { Shardfile } from './shardSchema.ts';
|
|
4
|
+
import type { MemoryAdmission } from './memoryAdmission.ts';
|
|
5
|
+
import { parseKtx2, ktx2DeviceGpu, type Ktx2DeviceCosts } from './ktx2Cost.ts';
|
|
6
|
+
|
|
7
|
+
/** Apply the existing total-memory policy to declared or measured costs. */
|
|
8
|
+
export function acceptsProductCost(memory: MemoryAdmission | undefined, source: Shardfile, stage: 'declared' | 'actual', cost: ReturnType<typeof worstContentCost>): boolean {
|
|
9
|
+
if (memory === undefined) return cost.playing <= C.playing && cost.loading <= C.loading;
|
|
10
|
+
return memory.accept({ stage, owner: source.identity.slug, id: `${source.identity.slug}:worst-location`,
|
|
11
|
+
claimedBytes: cost.accounted, accountedBytes: cost.accounted, playingBytes: cost.playing, loadingBytes: cost.loading });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Reapply the current trusted memory policy to a previously validated exact declaration. */
|
|
15
|
+
export function acceptValidatedCost(source: Shardfile, cost: ReturnType<typeof worstContentCost>, memory?: MemoryAdmission): void {
|
|
16
|
+
if (!acceptsProductCost(memory, source, 'declared', cost)) throw new Error(`declared worst-location total exceeds envelope: ${cost.playing}`);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Device cost projection after byte admission; source ceilings retain their full RGBA fallback. A KTX2 file's declared
|
|
20
|
+
* decoded bytes never stay resident beside its upload (the format charges it none, and the loader drops its transcoded
|
|
21
|
+
* mips once uploaded), so on every device only its GPU bytes are charged. The optional device facts must come from
|
|
22
|
+
* exact body validation; callers without that authority keep the original admitted-byte parser. */
|
|
23
|
+
export function textureLibrarySource(source: Shardfile, assets: ReadonlyMap<string, Uint8Array>, support?: TextureTranscodeSupport, deviceCosts?: ReadonlyMap<string, Ktx2DeviceCosts>): Shardfile {
|
|
24
|
+
const transcodes = support !== undefined && (support.astc || support.bc7);
|
|
25
|
+
const files = new Map(source.files.map(file => [file.hash, file])), seen = new Set<string>(), pending = [...source.library];
|
|
26
|
+
let saving = 0;
|
|
27
|
+
while (pending.length > 0) {
|
|
28
|
+
const ref = pending.pop(); if (ref === undefined || seen.has(ref)) continue;
|
|
29
|
+
seen.add(ref);
|
|
30
|
+
const file = files.get(ref); if (file === undefined) continue;
|
|
31
|
+
pending.push(...file.dependencies);
|
|
32
|
+
if (file.kind !== 'ktx2') continue;
|
|
33
|
+
saving += file.decoded;
|
|
34
|
+
if (!transcodes) continue;
|
|
35
|
+
const known = deviceCosts?.get(ref);
|
|
36
|
+
if (known !== undefined) saving += known.rgba - ktx2DeviceGpu(known, support);
|
|
37
|
+
else {
|
|
38
|
+
const bytes = assets.get(ref); if (bytes === undefined) throw new Error('Missing admitted texture cost bytes');
|
|
39
|
+
saving += parseKtx2(bytes).gpu - parseKtx2(bytes, support).gpu;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (saving === 0) return source;
|
|
43
|
+
return { ...source, budgets: { ...source.budgets, library: { ...source.budgets.library, resident: Math.max(0, source.budgets.library.resident - saving) } } };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Trusted device's exact library projection, with all existing conservative neighbour and fallback ceilings retained. */
|
|
47
|
+
export function* deviceLibraryCostSteps(source: Shardfile, assets: ReadonlyMap<string, Uint8Array>, support?: TextureTranscodeSupport, deviceCosts?: ReadonlyMap<string, Ktx2DeviceCosts>): Generator<void, ReturnType<typeof worstContentCost>> {
|
|
48
|
+
const commons = Object.values(source.requires.commonsCosts).reduce((sum, row) => sum + row.decoded + row.gpu, 0);
|
|
49
|
+
return yield* worstContentCostSteps(textureLibrarySource(source, assets, support, deviceCosts), commons);
|
|
50
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
|
|
3
|
+
const finite = v.pipe(v.number(), v.finite(), v.minValue(-10000), v.maxValue(10000));
|
|
4
|
+
const id = v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(0x7fffffff));
|
|
5
|
+
const key = v.pipe(v.string(), v.regex(/^[a-z][a-z0-9.-]*$/u), v.maxLength(128));
|
|
6
|
+
const event = v.strictObject({ id, key, direction: v.picklist(['input', 'output']), type: v.picklist(['none', 'boolean', 'number']), min: finite, max: finite });
|
|
7
|
+
/** Shard director declarations bound numeric events and observations; grid subscriptions are reserved, with no v1 delivery. */
|
|
8
|
+
export const DirectorSchema: v.GenericSchema<DirectorDataInput, DirectorData> = v.pipe(v.strictObject({
|
|
9
|
+
id: key, entity: id, module: v.pipe(v.string(), v.regex(/^[a-f0-9]{64}$/u)),
|
|
10
|
+
inputs: v.pipe(v.array(v.strictObject({ key, min: finite, max: finite })), v.maxLength(16)),
|
|
11
|
+
parameters: v.pipe(v.array(finite), v.maxLength(64)),
|
|
12
|
+
events: v.pipe(v.array(event), v.maxLength(32)),
|
|
13
|
+
subscriptions: v.pipe(v.array(v.strictObject({ event: key, scope: v.picklist(['shard', 'grid']) })), v.maxLength(32)),
|
|
14
|
+
}), v.check((data) => new Set(data.inputs.map((row) => row.key)).size === data.inputs.length
|
|
15
|
+
&& new Set(data.events.map((row) => row.id)).size === data.events.length && new Set(data.events.map((row) => row.key)).size === data.events.length
|
|
16
|
+
&& data.inputs.every((row) => row.min <= row.max) && data.events.every((row) => row.min <= row.max
|
|
17
|
+
&& (row.type === 'number' || (row.min === 0 && row.max === (row.type === 'none' ? 0 : 1))))
|
|
18
|
+
&& new Set(data.subscriptions.map((row) => `${row.scope}:${row.event}`)).size === data.subscriptions.length
|
|
19
|
+
&& data.subscriptions.every((row) => row.scope === 'grid' || data.events.some((entry) => entry.direction === 'input' && entry.key === row.event)), 'Unique, bounded director declarations'));
|
|
20
|
+
/** Validated director data, with stable ids and immutable script parameters. */
|
|
21
|
+
|
|
22
|
+
/** Validate before admission, allocation or registration. */
|
|
23
|
+
export function parseDirector(input: unknown): DirectorData { return v.parse(DirectorSchema, input); }
|
|
24
|
+
/** Typed output delivered only after a successful, atomically committed script call. */
|
|
25
|
+
export interface DirectorEvent { director: string; tick: number; key: string; type: 'none' | 'boolean' | 'number'; value: number }
|
|
26
|
+
|
|
27
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
28
|
+
export type DirectorDataInput = DirectorData;
|
|
29
|
+
interface DirectorDataFields {
|
|
30
|
+
id: string;
|
|
31
|
+
entity: number;
|
|
32
|
+
module: string;
|
|
33
|
+
inputs: ({
|
|
34
|
+
key: string;
|
|
35
|
+
min: number;
|
|
36
|
+
max: number;
|
|
37
|
+
})[];
|
|
38
|
+
parameters: (number)[];
|
|
39
|
+
events: ({
|
|
40
|
+
id: number;
|
|
41
|
+
key: string;
|
|
42
|
+
direction: 'input' | 'output';
|
|
43
|
+
type: 'none' | 'boolean' | 'number';
|
|
44
|
+
min: number;
|
|
45
|
+
max: number;
|
|
46
|
+
})[];
|
|
47
|
+
subscriptions: ({
|
|
48
|
+
event: string;
|
|
49
|
+
scope: 'shard' | 'grid';
|
|
50
|
+
})[];
|
|
51
|
+
}
|
|
52
|
+
export type DirectorData = { [Key in keyof DirectorDataFields]: DirectorDataFields[Key] };
|