@wildshard/shard-format 0.0.1 → 0.4.5

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.
Files changed (746) hide show
  1. package/corpus/brasscap-mesa/blobs/bin/02da0052111419cdff3a29f1c6d0ff0d223e0b53a956c16c65ed63d87928b3b9.bin +0 -0
  2. package/corpus/brasscap-mesa/blobs/bin/068a121cd780a2a9164416f6e4fde44834f2d2f3a5ed65c174e480b7a2d3f627.bin +0 -0
  3. package/corpus/brasscap-mesa/blobs/bin/07d5a061cd338618e528747d61eb2b17709510550ef0ba40a58b67761b200f3f.bin +0 -0
  4. package/corpus/brasscap-mesa/blobs/bin/086e3706070555baca863f6ecf9dbca09c084afa501d92d4246d896b09546f36.bin +0 -0
  5. package/corpus/brasscap-mesa/blobs/bin/08b1b9ab7c732d7dbe8f961f1fc40e84042d1fe42544f55c9ee89f04dffe3d5e.bin +0 -0
  6. package/corpus/brasscap-mesa/blobs/bin/18bdbdc704cb8aac93435d208dfe0e9a44374efb73afa3bc58c631650e0a2995.bin +0 -0
  7. package/corpus/brasscap-mesa/blobs/bin/1a210fcddcb9749ecb1c244837e8e37ea69b038faae191dee6bbbde228d31a18.bin +0 -0
  8. package/corpus/brasscap-mesa/blobs/bin/264ab9ede386504a5ff9814b0a620b879cb29f3f45a80bcfc0c80b8ee236e364.bin +0 -0
  9. package/corpus/brasscap-mesa/blobs/bin/2b6fbea4c846a23cf4802ebdb1804e128896c8dd87e5d23509db6729e5b1be4e.bin +0 -0
  10. package/corpus/brasscap-mesa/blobs/bin/2d755cc635dee90b0f3958272855a821e2dd605a189a5ffcd480a325155fe84f.bin +0 -0
  11. package/corpus/brasscap-mesa/blobs/bin/2d76c6829fe77fb55cc2541e4aca5ce5d18b68508dcdf3fa957fe4a83b9c887a.bin +0 -0
  12. package/corpus/brasscap-mesa/blobs/bin/32c15d55a4548501740593807c5007217c72dbc10a21f4613ef5e0cee0b90d1d.bin +0 -0
  13. package/corpus/brasscap-mesa/blobs/bin/3539b362cf3a61a79e92e113ebf8f255d0b25ec2d2edd816498879de831fa912.bin +0 -0
  14. package/corpus/brasscap-mesa/blobs/bin/3af38a2377bc89f6c6c82ee1e83df674efa2793db932b50a23bbce7ec9cd7941.bin +0 -0
  15. package/corpus/brasscap-mesa/blobs/bin/3c176a7a0d0850fdcee790ed2641216fc3d1cba025928de3d7784262bb9b6f4a.bin +0 -0
  16. package/corpus/brasscap-mesa/blobs/bin/3fb37e488aa81a64c997b3dd09794e988994c6ee3476c6d653ced1670888dd8e.bin +0 -0
  17. package/corpus/brasscap-mesa/blobs/bin/424dcc7b320317bf3f2c62c8f19bc80564035127eb38ab811e460934d57ea38c.bin +0 -0
  18. package/corpus/brasscap-mesa/blobs/bin/45cea35fab6bb06051a3286fca2307944850c7f9ed7aa89b7c24fafef28efda6.bin +0 -0
  19. package/corpus/brasscap-mesa/blobs/bin/499cc7863851f97d79dbfc64e76f9e6978894199184a0d80ebdca13066a8fa78.bin +0 -0
  20. package/corpus/brasscap-mesa/blobs/bin/4b7217644763b00c6ee6ae3f176c726914966fb791654a385c0638bb998b6dd2.bin +0 -0
  21. package/corpus/brasscap-mesa/blobs/bin/4cf11c7177bb082f335e5bc7a037ef00d09355c5ad8263e284a96a92630ff9ae.bin +0 -0
  22. package/corpus/brasscap-mesa/blobs/bin/536b37cab5a1edd6a68a71d122aab6898e44c68a5470a4ca8a9a72c57c02e034.bin +0 -0
  23. package/corpus/brasscap-mesa/blobs/bin/55d3628b27e0fcea383df86c434a69761439f51a013359f0829675b07ee2b616.bin +0 -0
  24. package/corpus/brasscap-mesa/blobs/bin/5652ba90fbd8146edaf42660329cc81798752f2f60b8d03956714460d5ba75ef.bin +0 -0
  25. package/corpus/brasscap-mesa/blobs/bin/57459ab5e2ac6cec65ef5e59789dd82b9666d8573df41c4a398df603f1fa456f.bin +0 -0
  26. package/corpus/brasscap-mesa/blobs/bin/5915b6aed21bba49b841b45574f44f60d26b44810bd68ac70b22f3f3b0dab072.bin +0 -0
  27. package/corpus/brasscap-mesa/blobs/bin/5c4a5c7a8e99253561105c5fa3faf14326cf0c23adc32bfe7f8aea4dbf4b05f9.bin +0 -0
  28. package/corpus/brasscap-mesa/blobs/bin/61822a412cfd461f4f7ae50bc13f242a0fca6c5c58fca72247b596ab037a1c85.bin +0 -0
  29. package/corpus/brasscap-mesa/blobs/bin/673b7712908966718341508469b39cd49e6461f690ca3c23d4621ea7eba0cc30.bin +0 -0
  30. package/corpus/brasscap-mesa/blobs/bin/69394a49520f84f6dccc1655f1c89eedc913ac53a7e48ac5dc1bff4141639bb4.bin +0 -0
  31. package/corpus/brasscap-mesa/blobs/bin/6e58a53a6c2acd50f9f80fd270ca034c54421df8a587e181101b4b75b952ac5d.bin +0 -0
  32. package/corpus/brasscap-mesa/blobs/bin/75dc9f23ee71e11a3a0c67eb77275d741a281c3398808fb42efd52b9973d5d04.bin +0 -0
  33. package/corpus/brasscap-mesa/blobs/bin/76c6a403293a68ed3d6ad14e9dd27b555c3a1ef4a3cae12a2bd2ab3e67c5ad02.bin +0 -0
  34. package/corpus/brasscap-mesa/blobs/bin/82b73ce3a18e47092840fc029177861887aa2867b007248ac79ffa20895a4491.bin +0 -0
  35. package/corpus/brasscap-mesa/blobs/bin/8430d9bbfb4e2b678c54595ad95555c3c73d0e1b144a4d6e29664ccb4371baf0.bin +0 -0
  36. package/corpus/brasscap-mesa/blobs/bin/848d4492508689f5c4a224079dca8809e872e33b8f2635c9f16da5dc21beed16.bin +0 -0
  37. package/corpus/brasscap-mesa/blobs/bin/84941ac387a0d245ea20bd663ff4ee78c5315bedfa058ada0961765aff61acaf.bin +0 -0
  38. package/corpus/brasscap-mesa/blobs/bin/859b7bbcf048a4525db0548b8f5afef83bfc4870914767153f44c05e83436ec5.bin +0 -0
  39. package/corpus/brasscap-mesa/blobs/bin/87b68b45680a57c796eed9183211b03335a6ad6737372b3ef476c2cf42efa631.bin +0 -0
  40. package/corpus/brasscap-mesa/blobs/bin/8cef94308af8d09670e4c99a3b6c3d9280b7a27d386653a3bd7d482b2cdf2b65.bin +0 -0
  41. package/corpus/brasscap-mesa/blobs/bin/8e564bce3f352c2186ae09ed7fbca9739c10abc46fd5f6893c68cb47178bd2b4.bin +0 -0
  42. package/corpus/brasscap-mesa/blobs/bin/8f89e79d0fb9b04d48c7b5719e1d024161c6a2119835b18dcb193ff51123a9be.bin +0 -0
  43. package/corpus/brasscap-mesa/blobs/bin/8fe511ad48656a0b10801100b9100edab1be605a8a182dc5c834d298bf0d9166.bin +0 -0
  44. package/corpus/brasscap-mesa/blobs/bin/900bda6562d06fafda54c495e325d57dbb7931813178ee207449c5519d89d537.bin +0 -0
  45. package/corpus/brasscap-mesa/blobs/bin/997b1b7d9210bfa77dc71f16a57c6bd66bc7c648686dc2a2666044c95042978a.bin +0 -0
  46. package/corpus/brasscap-mesa/blobs/bin/a111bb4c6cec536bcf57dddc744b871ac9f3d094ce459c16243adca19020db77.bin +0 -0
  47. package/corpus/brasscap-mesa/blobs/bin/a2208bf899e6c84942eef9fbab569d597f574551afae5864f1953c6a517af068.bin +0 -0
  48. package/corpus/brasscap-mesa/blobs/bin/a302ddb2598a72ece53780094b64ad861dc68e6913d8a1ea08f5d141736e2986.bin +0 -0
  49. package/corpus/brasscap-mesa/blobs/bin/afcbc671326d0dac14e460662c1f793335877ba53cc965f67c0306833b087e7c.bin +0 -0
  50. package/corpus/brasscap-mesa/blobs/bin/b657159e6a28c801a211024f96a7ef60e388ce928a7b41ae3d7555a6f8fd2e3e.bin +0 -0
  51. package/corpus/brasscap-mesa/blobs/bin/be6bbc6cd15ba525790075252ba0ed0b28dae5cfbfa118c00dfb9ea1ab95e668.bin +0 -0
  52. package/corpus/brasscap-mesa/blobs/bin/c1360e3cbe6b3dc8894bc66c359853854c2e5adeac9c7cd5ba63f5db448be601.bin +0 -0
  53. package/corpus/brasscap-mesa/blobs/bin/c7983018dbf8e384ddf73191f526075bd0b29907061ab17642ecdc18ea7b9897.bin +0 -0
  54. package/corpus/brasscap-mesa/blobs/bin/cea66f27ca60ea173ee0a2bcd91964dc2638eb5657250fe3aa5bd3e41faf8730.bin +0 -0
  55. package/corpus/brasscap-mesa/blobs/bin/d052be571a0f3ab69926951f3a4c9d63f05da2ca6d91e5963dd63e04ecb515de.bin +0 -0
  56. package/corpus/brasscap-mesa/blobs/bin/d162a993a60dd682c8c21dd111429d84d8d30413a000cf481cf98d06ca83e706.bin +0 -0
  57. package/corpus/brasscap-mesa/blobs/bin/d238c3d3d054911714ebe30dafc99e6ad13925b7a600ba9f8d532d0f515f3f5a.bin +0 -0
  58. package/corpus/brasscap-mesa/blobs/bin/d9a98cfe2865a9bb0e94f35c735a570b0625b58f890a6b1f6e14fab2401f0af2.bin +0 -0
  59. package/corpus/brasscap-mesa/blobs/bin/dc27ae954b7b8a13a9459d6ca6ef2997f662715ff5f5453ea0da169f141748b8.bin +0 -0
  60. package/corpus/brasscap-mesa/blobs/bin/e3ff1fd41cf76668b8e1927c0c2e4056b63a293ebbd300a8f1b1d27d87786271.bin +0 -0
  61. package/corpus/brasscap-mesa/blobs/bin/e45b7344d373b3ef4a94f560cf4e17b1eb3b8cd89d1e552fc9be11d6b7b546f0.bin +0 -0
  62. package/corpus/brasscap-mesa/blobs/bin/eb14eb898224d5d81d1012bec54f2b79f9377dc60fa1d01e49b4c3e148292d77.bin +0 -0
  63. package/corpus/brasscap-mesa/blobs/bin/ed0e0101a3d91a3a615f9e78ef36f7deb8bb0eab0f133241d621925d0b596599.bin +0 -0
  64. package/corpus/brasscap-mesa/blobs/bin/f722e3a3b1f0a3d7b9f7d7c66c46d8c87245de5f8eece055daf95c7086f8c267.bin +0 -0
  65. package/corpus/brasscap-mesa/blobs/bin/f76013aedfd810f136fa689a151024bcb942687ef42ae7edf1fd3513ac4e22c7.bin +0 -0
  66. package/corpus/brasscap-mesa/blobs/glb/0547e63693282614673b13bade4c08eb772020757b131b7c80f2077873aab70e.glb +0 -0
  67. package/corpus/brasscap-mesa/blobs/glb/0cf89e9b1824440d213c8e9e33fb357734b7241b4c7eedaba3df7f8306e05425.glb +0 -0
  68. package/corpus/brasscap-mesa/blobs/glb/0e01060e3a507ffff6461c50b5c565c71380a6a67d9760cdd7a09afd3e30b584.glb +0 -0
  69. package/corpus/brasscap-mesa/blobs/glb/0ef326c5cf5292cd15b48b851460ee8156f51e0a5b62457c8f1f3c53c41665a3.glb +0 -0
  70. package/corpus/brasscap-mesa/blobs/glb/1112ff4a3f69db3b62c6d2d6ae021e7c43ce0ca1feb1d3130376881decb3c6b0.glb +0 -0
  71. package/corpus/brasscap-mesa/blobs/glb/11357cb8a0670fdc9a03780dd79a31e0aa7a0537786cbf66491bae1722d6feb3.glb +0 -0
  72. package/corpus/brasscap-mesa/blobs/glb/11dbecc73bd343c375bd4b79db8dbda2272e76a6b8426ac29e90f2b1272ccfc2.glb +0 -0
  73. package/corpus/brasscap-mesa/blobs/glb/133f639cfa837bc5da7915121c71fd32281660c2aaa0248bd59bde47e7faf8bc.glb +0 -0
  74. package/corpus/brasscap-mesa/blobs/glb/16812a090136b6678633aa4db03e4187920ae0aca776ad6da373c600cd341972.glb +0 -0
  75. package/corpus/brasscap-mesa/blobs/glb/17e63980d7934cfe1d2823d78652af338fe9f0c2170106cd4506a2c4e7f4716f.glb +0 -0
  76. package/corpus/brasscap-mesa/blobs/glb/199224cafc86904bdefec8f01d131d7ca3e076a22b689bfc6a26dd20373cf286.glb +0 -0
  77. package/corpus/brasscap-mesa/blobs/glb/1a5c8cf223a2f64715ea5eaf14d97a0131f9ebdef4388dc4823dcfa57817724c.glb +0 -0
  78. package/corpus/brasscap-mesa/blobs/glb/1b0ec09ad6718149d7ca514136cee09b04c96425f03af0559fd097112aa0daa5.glb +0 -0
  79. package/corpus/brasscap-mesa/blobs/glb/1e5024bbb1284b2ed39bbca2d0ade3acb5be2a2c6ba643291f269b76098c7f79.glb +0 -0
  80. package/corpus/brasscap-mesa/blobs/glb/1e7635972e13468ffcbb1608f1d12559b066b4533912be2c35e3db07fd4a679d.glb +0 -0
  81. package/corpus/brasscap-mesa/blobs/glb/1f03db3a38a21b8d4d02f8ede30e1303cd8d4c426815326a88f45a268b17a492.glb +0 -0
  82. package/corpus/brasscap-mesa/blobs/glb/2624abb7bf45618be40f8c3221445179fca44f7321baff415fdf7ddd5e0afc6f.glb +0 -0
  83. package/corpus/brasscap-mesa/blobs/glb/27fc3bad6db6e2b5ade5d242867d882362482ddf19c647edef821afc27d52dc2.glb +0 -0
  84. package/corpus/brasscap-mesa/blobs/glb/29959bdb5b04a9180e88ec1ed976bae55424d3dc50985f13c0f85bae11ae79ee.glb +0 -0
  85. package/corpus/brasscap-mesa/blobs/glb/308cbce2b1b6360f9a2dc275d0bc28be1966fc3ff5e0a58844405ba867f3f668.glb +0 -0
  86. package/corpus/brasscap-mesa/blobs/glb/3674d7be969755aaffa368e57b8d1bb743bc98e766a57948859d54fdc7d2c066.glb +0 -0
  87. package/corpus/brasscap-mesa/blobs/glb/3736ca95c9c40b30e21302ae6c89148d8ac09264dfbb7e5764b08c265a73ba3c.glb +0 -0
  88. package/corpus/brasscap-mesa/blobs/glb/3bc90e1dc9411d249697e4ec352baa4886f91cacfe4940ac43aed879f60966c9.glb +0 -0
  89. package/corpus/brasscap-mesa/blobs/glb/3f519c7c7482307cae908b27602dcb7716e2da4b651eff39c4c37103998d18fa.glb +0 -0
  90. package/corpus/brasscap-mesa/blobs/glb/4767636d5554b60c94b447b87b77fc1456a2b9af42bfe08585389d27f306dd5e.glb +0 -0
  91. package/corpus/brasscap-mesa/blobs/glb/4a3242773b3a73a73ee746a0cdf30c8d6d904bb4406dfdf9822dcd535d6ae308.glb +0 -0
  92. package/corpus/brasscap-mesa/blobs/glb/4c7bf3788cba151442d85c3f76553c2e356edf8566ae8243d0a535c9bcde51d0.glb +0 -0
  93. package/corpus/brasscap-mesa/blobs/glb/4f3b9f4c818ed6d375947e9603dd058c539e14ff05aa193fb5054d899dbb82a2.glb +0 -0
  94. package/corpus/brasscap-mesa/blobs/glb/4fdf7ee67d12de1cd30c3c2bbd9409032dcab5feb3a7d3977b92c50b1d161afe.glb +0 -0
  95. package/corpus/brasscap-mesa/blobs/glb/5821f33aa00e9acd2f4c0a29129978ee7006a879d163ce1463ae476031bfabcf.glb +0 -0
  96. package/corpus/brasscap-mesa/blobs/glb/5a986c3e44fc686a2efe7648c3945bb7b51cf303918381383f21f898dd312cad.glb +0 -0
  97. package/corpus/brasscap-mesa/blobs/glb/5c32fc1de6d198ed606d3e8c3264319acdd950dab18e8b723fc6332bf2f56aea.glb +0 -0
  98. package/corpus/brasscap-mesa/blobs/glb/602ce4e8b00a0afbc1a894b65641e48d362ec834a559b9d97a4801473bb01da7.glb +0 -0
  99. package/corpus/brasscap-mesa/blobs/glb/6180f9f96167522d8cab4de1d52598cecee8d7ee042f48e41669c98cf61c19c3.glb +0 -0
  100. package/corpus/brasscap-mesa/blobs/glb/6205973ba63f7a554662ba05010d25131bed2d9656de422e2067ca54709d5b3c.glb +0 -0
  101. package/corpus/brasscap-mesa/blobs/glb/693e556f2165232e8a38b1b2d68676f235ece5705c564992cfa7731426f4d376.glb +0 -0
  102. package/corpus/brasscap-mesa/blobs/glb/6a46175438bec5527c281b577bd220b6badedf3c74266b997d39e596f83b8853.glb +0 -0
  103. package/corpus/brasscap-mesa/blobs/glb/6ca1bcad7ea053a259b7f9fc5a7ec388a4cd29d44391d93386ea8b1143d94c21.glb +0 -0
  104. package/corpus/brasscap-mesa/blobs/glb/6f9bc99656b611890d6acc76ee416f6222ca2d5f62167840b4216a21e020a4c8.glb +0 -0
  105. package/corpus/brasscap-mesa/blobs/glb/6fb1e7857996662233ab5314fc13f8aa30703f91c04542e352ec17f9dc4fc054.glb +0 -0
  106. package/corpus/brasscap-mesa/blobs/glb/7028ec39712143a7e9d09d2e1477282b654d0470102ca9d272ac82b23604cb21.glb +0 -0
  107. package/corpus/brasscap-mesa/blobs/glb/73af65ac86efa61099178f3e7075dcd26d389ee9b9aa3546c18dede10c3dfda1.glb +0 -0
  108. package/corpus/brasscap-mesa/blobs/glb/73b992b71bd3165ff7701ab1430c075cb5ba9b74e6363d24640377b1011ddc93.glb +0 -0
  109. package/corpus/brasscap-mesa/blobs/glb/7471261d4df59979ba41a622d93779b66ebecd50353ad433862e603ee65f8748.glb +0 -0
  110. package/corpus/brasscap-mesa/blobs/glb/76e9a3fcca962c2f900cf79dc1a0851840bd405dc11231f629f784adbcb69d23.glb +0 -0
  111. package/corpus/brasscap-mesa/blobs/glb/79d2d29e8cd8b642386b5f31429b39bc4d6f13e53107dda00ebc463abf80c79d.glb +0 -0
  112. package/corpus/brasscap-mesa/blobs/glb/7de66fcfffe4ff108510cbe6bebec44e28ab4b78e98e9c1a38466db5b81881f7.glb +0 -0
  113. package/corpus/brasscap-mesa/blobs/glb/811fa798cb81ea99488db98e3d3ddea815aac8f6e7493ad04d0176f603978678.glb +0 -0
  114. package/corpus/brasscap-mesa/blobs/glb/89b277f1636be220ff5658ff1f1c62efe14079d6e1f42efb373fbf0246801533.glb +0 -0
  115. package/corpus/brasscap-mesa/blobs/glb/905c5fe666d9f6174e987382e47d3f325c5696cf8792d7a4a1dd120a438b8270.glb +0 -0
  116. package/corpus/brasscap-mesa/blobs/glb/90efe3e05370ee853c0130b98ee82f00b86f7c7104e96b094715187fa49ac16f.glb +0 -0
  117. package/corpus/brasscap-mesa/blobs/glb/968a7c5cb13014bce00a29d43b344bd6943ff00ae2908abbc6b40a994f1172a1.glb +0 -0
  118. package/corpus/brasscap-mesa/blobs/glb/9a955b4e69dfa5b38f071099053c1a3684cf85ec2d346420de2853c61768f8cc.glb +0 -0
  119. package/corpus/brasscap-mesa/blobs/glb/9da2781216a2e482dd8a6ada5ebb43bcf48e0169430e787ac277559cb2ade19a.glb +0 -0
  120. package/corpus/brasscap-mesa/blobs/glb/9db02aab14a3b52463deadefbf4ba771809941e7fcb137c905955bdc80ec23bd.glb +0 -0
  121. package/corpus/brasscap-mesa/blobs/glb/a3fe1788cf5d7f260249c722f0e0695a4d55744d1b14be44122377147a296256.glb +0 -0
  122. package/corpus/brasscap-mesa/blobs/glb/a5c75af8f090d3c95fa46d2be49be5031138d7cd1bae234ae028edf717bf299e.glb +0 -0
  123. package/corpus/brasscap-mesa/blobs/glb/a771abd40bd337a464c1bd19f841b62e290124faa89b19ec50e85ab36bc740a5.glb +0 -0
  124. package/corpus/brasscap-mesa/blobs/glb/a94a2ad2ed463a47cdda117df25b06b3cf6be37ddac08594bc5f5d76c7237730.glb +0 -0
  125. package/corpus/brasscap-mesa/blobs/glb/ad434e4a6490e495994b25f7574a5847a9f7d9c2ca5a2b229a9dfdd2e5e2bb72.glb +0 -0
  126. package/corpus/brasscap-mesa/blobs/glb/aeae7b05404b852008a7897689e58aacef44a2c3bc0e87d2519ecdb4cb1e3ff5.glb +0 -0
  127. package/corpus/brasscap-mesa/blobs/glb/b0c0c8a4985f92be3b358a8e703c67957427501882aeee05b4ccd3c7880930d4.glb +0 -0
  128. package/corpus/brasscap-mesa/blobs/glb/b25174c3cd13eea6e1d9c3104ee5197dc6330129b2f0f7676e8a429900999d9b.glb +0 -0
  129. package/corpus/brasscap-mesa/blobs/glb/b3eecdec571df96338edf690443394ff859383b4c94f4cf33d42c240006f8543.glb +0 -0
  130. package/corpus/brasscap-mesa/blobs/glb/b7aa0c61ff9e7411535c7b7b8e587849a92bad00d431171ab16ad47d55db0a53.glb +0 -0
  131. package/corpus/brasscap-mesa/blobs/glb/b9deef944c22331bc05220d1d6e46412e3cb1246ef041a4405d0cbbd90c2d624.glb +0 -0
  132. package/corpus/brasscap-mesa/blobs/glb/ba9376e4ac39b809133ab717edb4c88b5219118766db492d7c97534ce119c2ec.glb +0 -0
  133. package/corpus/brasscap-mesa/blobs/glb/baf338e9c272158b905fb58a712e29410c657a45be2764f1c6c43ca87fd1db48.glb +0 -0
  134. package/corpus/brasscap-mesa/blobs/glb/bd442ac9fbe52b9f2e4ba586670017c3f2d9fedf1cbdec77ef24e9f8b3a183c8.glb +0 -0
  135. package/corpus/brasscap-mesa/blobs/glb/c142adcf253be43b66f23ede8cea1e8fcfa256ebf53054a1068ace04745718a6.glb +0 -0
  136. package/corpus/brasscap-mesa/blobs/glb/c6d7cbdc4b2ee9d416edf4d736a4f374f08aea98ca395ad371a50a1853744cfc.glb +0 -0
  137. package/corpus/brasscap-mesa/blobs/glb/cfb165a7675d15cee2c490b31095a58f73bace50ccc1e0fdf2c8dc4400f1df27.glb +0 -0
  138. package/corpus/brasscap-mesa/blobs/glb/d40f2ee59612473e9f687f17a0e203fdb4ba54c7185b05a8d81a433b04f24134.glb +0 -0
  139. package/corpus/brasscap-mesa/blobs/glb/d50ce95411156a6b6cf386aefa5ee58db659811813f74be74f323e7c5795056f.glb +0 -0
  140. package/corpus/brasscap-mesa/blobs/glb/d6af418bbde39b4fc7d22a61401d416be7a3fc1214ea2d3f42b4549c392d22ca.glb +0 -0
  141. package/corpus/brasscap-mesa/blobs/glb/de7222ceeb1f72693dfb7fd1f343798659e03772d77f2b498fd8ebece2d5550a.glb +0 -0
  142. package/corpus/brasscap-mesa/blobs/glb/e26975b198127ac3b6b4f5c4bc08ad47d6691398feee777743285391cd36d502.glb +0 -0
  143. package/corpus/brasscap-mesa/blobs/glb/ea428490cd5f2672676a2776a598b819b08246871e76de94b7196f9643144986.glb +0 -0
  144. package/corpus/brasscap-mesa/blobs/glb/eb96567a266d24be188cb5b08021112f2fad311cbead939d53c5565da11f6265.glb +0 -0
  145. package/corpus/brasscap-mesa/blobs/glb/ecf66230bf7b68050c0827c2e4caf3de90e46859d291b794faa0dd3816d9dac6.glb +0 -0
  146. package/corpus/brasscap-mesa/blobs/glb/ed8f067763a4a8adb83d80c8324b2a9668f1061f5f5352f21295e6cc5132386f.glb +0 -0
  147. package/corpus/brasscap-mesa/blobs/glb/ee507a38772865467736d370791fe73c6aa4d83fe3e7ff4baa156b9cb2894c1c.glb +0 -0
  148. package/corpus/brasscap-mesa/blobs/glb/eedc5b62dc6f27d4a089e9f5b282f626129236d3f1689b001e04f8748bf8859c.glb +0 -0
  149. package/corpus/brasscap-mesa/blobs/glb/f4119b9c6c23435619682b5d247743459e76584b9b0d6c5cb689d8e156906695.glb +0 -0
  150. package/corpus/brasscap-mesa/blobs/glb/f576047267a0bf9bd4bfc47072ea3d11066345b839953546292da678d1cb4722.glb +0 -0
  151. package/corpus/brasscap-mesa/blobs/glb/f8cdfb11997d4ccabea88bcdd3924cc8b621b33618b18fe5fbfd286edfc1d87e.glb +0 -0
  152. package/corpus/brasscap-mesa/blobs/glb/fce95ecc5db24c903bd46f338e366e2715411465a5efac180e2f0f46397e59de.glb +0 -0
  153. package/corpus/brasscap-mesa/blobs/image/0579557f9344df6f2c4b1225e6252e53ab86d417a4c9b504b5c714a08a388e47.jpg +0 -0
  154. package/corpus/brasscap-mesa/blobs/image/9e18816a2ec16fbbb1f00f4a39c73ac2cbf6a8cdc17b4c96b1eba4cc9a754dc7.jpg +0 -0
  155. package/corpus/brasscap-mesa/blobs/image/eb453c71cfb1f9441eb00b32281f98e226e49d9dcf75c231455575fcdc652222.jpg +0 -0
  156. package/corpus/brasscap-mesa/blobs/json/e0072ed82115c519b891f53a194ea3b28fff7d3826d8ddf23460d6f21b7728d9.json +1 -0
  157. package/corpus/brasscap-mesa/blobs/json/ffb0e08eaaa7188db1f55931c9b6330937316091cc7463ed2eff6767bbfa33de.json +1 -0
  158. package/corpus/brasscap-mesa/blobs/wasm/1d6ace79610c4d510b60ad0c52915e42b57797d91f1ef292f60d8a3daec03dd6.wasm +0 -0
  159. package/corpus/brasscap-mesa/blobs/wasm/24a4d4c1292677b1c984b5c0d3497ae2929528bf511df475f80cc20945bb08ec.wasm +0 -0
  160. package/corpus/brasscap-mesa/blobs/wasm/b86d8afcc269fb063ebf64768fc3787635b65a7409a571115b07be2e4da39733.wasm +0 -0
  161. package/corpus/brasscap-mesa/cook.json +1 -0
  162. package/corpus/brasscap-mesa/mounts/shardfiles/brasscap-mesa/discovery.json +1 -0
  163. package/corpus/brasscap-mesa/sections/actors/creatures.json +1 -0
  164. package/corpus/brasscap-mesa/sections/actors/crowds.json +1 -0
  165. package/corpus/brasscap-mesa/sections/actors/species.json +1 -0
  166. package/corpus/brasscap-mesa/sections/audio/audio.json +1 -0
  167. package/corpus/brasscap-mesa/sections/combat/encounters.json +1 -0
  168. package/corpus/brasscap-mesa/sections/combat/items.json +1 -0
  169. package/corpus/brasscap-mesa/sections/combat/strikes.json +1 -0
  170. package/corpus/brasscap-mesa/sections/economy/ledger.json +1 -0
  171. package/corpus/brasscap-mesa/sections/economy/loot.json +1 -0
  172. package/corpus/brasscap-mesa/sections/look/look.json +1 -0
  173. package/corpus/brasscap-mesa/sections/look/materials.json +1 -0
  174. package/corpus/brasscap-mesa/sections/quests/quests.json +1 -0
  175. package/corpus/brasscap-mesa/sections/sim/client-scripts.json +1 -0
  176. package/corpus/brasscap-mesa/sections/sim/hooks.json +1 -0
  177. package/corpus/brasscap-mesa/sections/sim/plumbing.json +1 -0
  178. package/corpus/brasscap-mesa/sections/sim/scripts.json +1 -0
  179. package/corpus/brasscap-mesa/sections/sim/sim.json +1 -0
  180. package/corpus/brasscap-mesa/sections/state/migrations.json +1 -0
  181. package/corpus/brasscap-mesa/sections/state/state.json +1 -0
  182. package/corpus/brasscap-mesa/sections/ui/card.json +1 -0
  183. package/corpus/brasscap-mesa/sections/ui/compendium.json +1 -0
  184. package/corpus/brasscap-mesa/sections/ui/level.json +1 -0
  185. package/corpus/brasscap-mesa/sections/ui/ui.json +1 -0
  186. package/corpus/brasscap-mesa/sections/world/collision.json +1 -0
  187. package/corpus/brasscap-mesa/sections/world/days.json +1 -0
  188. package/corpus/brasscap-mesa/sections/world/edge.json +1 -0
  189. package/corpus/brasscap-mesa/sections/world/movers.json +1 -0
  190. package/corpus/brasscap-mesa/sections/world/navigation.json +1 -0
  191. package/corpus/brasscap-mesa/sections/world/props.json +1 -0
  192. package/corpus/brasscap-mesa/sections/world/spawn.json +1 -0
  193. package/corpus/brasscap-mesa/sections/world/terrain.json +1 -0
  194. package/corpus/brasscap-mesa/sections/world/tiles.json +1 -0
  195. package/corpus/brasscap-mesa/sections/world/traversal.json +1 -0
  196. package/corpus/brasscap-mesa/sections/world/water.json +1 -0
  197. package/corpus/brasscap-mesa/sections/world/weather.json +1 -0
  198. package/corpus/brasscap-mesa/shard.json +1 -0
  199. package/corpus/brasscap-mesa/validation.json +1 -0
  200. package/corpus/handwritten/blobs/bin/027822f6ae9c374ce1ced851f2227cb9acb03077e5cc6b7fecb245c31f021abd.bin +0 -0
  201. package/corpus/handwritten/blobs/bin/0377ce182bd604bcf4d501f14bf954c434ea64ad856ad9d71c502d1045612703.bin +0 -0
  202. package/corpus/handwritten/blobs/bin/05ad93d239eeeb5d9afa09b00d90c56098d88e8850e5b5e691fcaa7520dec3cd.bin +0 -0
  203. package/corpus/handwritten/blobs/bin/0c8980141e6e394ea473df1eb11c347ba617a1a9a4b39b3fa1871b5d15b97d87.bin +0 -0
  204. package/corpus/handwritten/blobs/bin/14eb11f8d809320e0a68b1edea7837d7a5b4a3da71f1ce4f54068e0afe0b039b.bin +0 -0
  205. package/corpus/handwritten/blobs/bin/16590066c039ac71e5038a9866a53ccb95e21af13db29cb655b379c4fcfef7bb.bin +0 -0
  206. package/corpus/handwritten/blobs/bin/1795b5147ad52482445d2414ee22823b947c43a917b6e96fd9ec017f17000912.bin +0 -0
  207. package/corpus/handwritten/blobs/bin/18f2e24ecc1ed1b1d12ae1c89732a5a1a618ab6e973d4ff0332cf9ecc4e4f4a6.bin +0 -0
  208. package/corpus/handwritten/blobs/bin/1a18ade01095f1a9ebe75650127861ef27dda0bb17c2b91bde057ec88ef2e98a.bin +0 -0
  209. package/corpus/handwritten/blobs/bin/1dba017cddb874bc147efb00c55418846ffa344a696f4df702bbabeea55034d0.bin +0 -0
  210. package/corpus/handwritten/blobs/bin/248c703537e4687ddd2b69a40d1ef3936da718626289d6867ce0a6866f562ba4.bin +0 -0
  211. package/corpus/handwritten/blobs/bin/2612d9fd4727f8c349f2dbfb7b1650bb7a752d0798a4966ac22cf2b6cdd9fcef.bin +0 -0
  212. package/corpus/handwritten/blobs/bin/28c54c766e90e3b046a2377b9fa015b0ce45cf3da4420f2b10553251f86c06aa.bin +0 -0
  213. package/corpus/handwritten/blobs/bin/30866b4807b12579f50218f6525c3db00919fbd43c97921daf47b3244b25dca6.bin +0 -0
  214. package/corpus/handwritten/blobs/bin/3d14fae85d77406a9b8c59f2e973cdae9587d49108ea92fb460679ca860196b8.bin +0 -0
  215. package/corpus/handwritten/blobs/bin/3f2201a53c441abcfb52089fe9bbb01f26fac8744099d3fb6668452885c2fa11.bin +0 -0
  216. package/corpus/handwritten/blobs/bin/42f270a99367fc4cc901518ccaa344ab595e265f113be944510da745c11f69d1.bin +0 -0
  217. package/corpus/handwritten/blobs/bin/43fd4327fedd51a586684ac611bcad4a8b9d62e51e03967de71fb42c9bf0f6e1.bin +0 -0
  218. package/corpus/handwritten/blobs/bin/484adda0898a881b6f095dad447f6a619bf0933f65efe940b72f1ab7f3630c22.bin +0 -0
  219. package/corpus/handwritten/blobs/bin/4a38cd49e8797429ce76265c3d8972195d5b0a02a35fc05fc513eab11240f415.bin +0 -0
  220. package/corpus/handwritten/blobs/bin/4fe636237bbbd4f836b0816bc61702f4c224d4cb91fbd94f244c731e24a1b945.bin +0 -0
  221. package/corpus/handwritten/blobs/bin/51b1cff782dc7ebb382bc429ee965023d4cdb52c7b3e37d6ffff5ef55c1c2813.bin +0 -0
  222. package/corpus/handwritten/blobs/bin/52561f02071ecaa98432fab5e8ece407a8e8f733a01f8eb7c543d1efe02614da.bin +0 -0
  223. package/corpus/handwritten/blobs/bin/556d6333923afea9641c4738741a41d6a46ae28a508288b9a49a749a344c1398.bin +0 -0
  224. package/corpus/handwritten/blobs/bin/5caeb97f32c7f31e1029eebdf31131f879f781bb5e3a225206a646710d83fd75.bin +0 -0
  225. package/corpus/handwritten/blobs/bin/5d1131e42a045083225105b640ff72e02c7f353ee6285545ac264d01bea26b1b.bin +0 -0
  226. package/corpus/handwritten/blobs/bin/5d80b30eee9f8342a92f6756fd0d84fb9d2d2ce994d222627641e584ad45d2a8.bin +0 -0
  227. package/corpus/handwritten/blobs/bin/5e0f9f7f2a85abe11a0a61ede853c9b9942b4494c3eb9943785cf6ae221e40e3.bin +0 -0
  228. package/corpus/handwritten/blobs/bin/5fdc5485343bba8201185c9bae862ad8618498ab5ce63b53514e4e0226fa7bdb.bin +0 -0
  229. package/corpus/handwritten/blobs/bin/6623dcb0b31c9ca0be342f6dca6b9e607ec3c12ff82068fa6030c142c2df77f7.bin +0 -0
  230. package/corpus/handwritten/blobs/bin/6887131a04175edbd1989aa95e8749d1703e7f2d0b8464e85f6bad28d6964125.bin +0 -0
  231. package/corpus/handwritten/blobs/bin/6cf89771d998486cad9049e6f4fc177d742a18ad79fafa4596814ff9d3cf1952.bin +0 -0
  232. package/corpus/handwritten/blobs/bin/74bbb0fc219e8476cd5550014a357ee18abc981ff3fe787ae3e60d4593705ec5.bin +0 -0
  233. package/corpus/handwritten/blobs/bin/76784a7f519ac43ce113a0c9365881839b75f66f96aa009fe8d3c8ab539ef283.bin +0 -0
  234. package/corpus/handwritten/blobs/bin/79a2f693ee2da546bb551f8b641b9c3affd2b8bfb5632ed7f417daba9d900af9.bin +0 -0
  235. package/corpus/handwritten/blobs/bin/7b593b0f9eefb957fb9d58b316d9836971203038d7c8127284bba44ccb3090bb.bin +0 -0
  236. package/corpus/handwritten/blobs/bin/7bb8e518ca5606de78972a6c648b57623f8bc12d7e06b4bbf43c60ac419a9bbd.bin +0 -0
  237. package/corpus/handwritten/blobs/bin/7c6133f3350147257fa501f41269cb77cb11d8ed96d351e873333b079cee524a.bin +0 -0
  238. package/corpus/handwritten/blobs/bin/7f5acf1893828995256f5b2c54948f80ba21e53de72db26ea72ce2479f5b0682.bin +0 -0
  239. package/corpus/handwritten/blobs/bin/836516253cf0f3e6e79537609fdbe6331c8c5c974f9ec4d3fbe4a7db48cf123d.bin +0 -0
  240. package/corpus/handwritten/blobs/bin/89900344f82d5c1474d2a163f8d29903447bac64e9c9775123ef499be70c2380.bin +0 -0
  241. package/corpus/handwritten/blobs/bin/95d76a9273c3edd98b3643c54e2e7989800bdcaf6f815230ef09f601e760330f.bin +0 -0
  242. package/corpus/handwritten/blobs/bin/a7b5a5fe053a38c93eed899bde5051cddd80e0a3f3c82b6fd814869097f0944b.bin +0 -0
  243. package/corpus/handwritten/blobs/bin/b29be84df0bfd1bc97a1464fd5ea068130947bfed3328e167640c81326eb45d7.bin +0 -0
  244. package/corpus/handwritten/blobs/bin/b6518dc352be03332a256f1cd9d1149da262fe6829e87ba43364f19c687ca7c9.bin +0 -0
  245. package/corpus/handwritten/blobs/bin/b7edb8095beeb158adb61ae3caa1653773757afbcd8fb2764c94b975a43fe9e2.bin +0 -0
  246. package/corpus/handwritten/blobs/bin/b86d617ae7fa397df51ff7af87cd89fa113ac19abd3840ea8f3a086d6c82905c.bin +0 -0
  247. package/corpus/handwritten/blobs/bin/bb860b5c67ee7f2fafd67588822152228d6f6c9de1231123eeafa4844732b18b.bin +0 -0
  248. package/corpus/handwritten/blobs/bin/bf8c3971bbb224075d488ffa9cfc20e322c61f9ca0c59c356838415f6778014b.bin +0 -0
  249. package/corpus/handwritten/blobs/bin/c2edd52ee14ebdc9fcc01d38c15d6ab3379df7a20098c260c546551898959cd1.bin +0 -0
  250. package/corpus/handwritten/blobs/bin/c3de13c551c5b45270143dcbb9fc9a31651f6012355823c0709c2fe6cafda940.bin +0 -0
  251. package/corpus/handwritten/blobs/bin/c57a8d9da18b1289afd16de00dd1ec75027048b8dcf7dd218da36bc3276ff035.bin +0 -0
  252. package/corpus/handwritten/blobs/bin/cc2975c9dea4c31b1bf380623a8f44059423004653f9cae4f603d374174323b7.bin +0 -0
  253. package/corpus/handwritten/blobs/bin/d476abba2e1c63ad3c7527617559173484ee837a5be2744d968466d5527c286b.bin +0 -0
  254. package/corpus/handwritten/blobs/bin/db242f89115c878cf0c3b976a1647e9cdeb6a1a51813b1dacaf1188715603294.bin +0 -0
  255. package/corpus/handwritten/blobs/bin/dcc4b9b3bc4ca777d11c494ae5478f17ad7cf2efa18dcba30def872d55355bc3.bin +0 -0
  256. package/corpus/handwritten/blobs/bin/dd99da483f385327d6b8319d6e2e9000b580280069353718aa0fda2230707e8b.bin +0 -0
  257. package/corpus/handwritten/blobs/bin/dfc139dba26f1789e16f72602e654636f2d99bcd41e3f10454da74b3a6a64dda.bin +0 -0
  258. package/corpus/handwritten/blobs/bin/e15ab3cc9f60657321cfe8d9751e086f025734f4e7068271e0baf6066a686f18.bin +0 -0
  259. package/corpus/handwritten/blobs/bin/e16a83a71213db6f804ce1d53981a2308062752c85c440022d9eeb7605fd37c8.bin +0 -0
  260. package/corpus/handwritten/blobs/bin/e7355876487f660ac9f25c9d9dfcd66eaf432e1e1669eb89d12ce8267a8d3e86.bin +0 -0
  261. package/corpus/handwritten/blobs/bin/e81a632e2da0f6a4d801f18aadfe2c6e640401cc1178935a9099ebb8e3af6cc1.bin +0 -0
  262. package/corpus/handwritten/blobs/bin/f0721c60d0b1046579d8c587fac8482a70822f0b39a85f9acc0cfc31f82b7dd2.bin +0 -0
  263. package/corpus/handwritten/blobs/bin/f301cf574de6d84030f839098ca44705dca115f9d3e4ee848e0b35fff3deaf77.bin +0 -0
  264. package/corpus/handwritten/blobs/bin/f7797f295a7570c437bf7020a1ddf208fea2a7aab595333320a6396c1608d360.bin +0 -0
  265. package/corpus/handwritten/blobs/glb/08de0bb2439ac812adef528b4b073bdb954bbeada972a2f3afb1757bd0540396.glb +0 -0
  266. package/corpus/handwritten/blobs/glb/153681171c35d2898569324e21ebe734b8418d4122833618a1e64ea326be1e5e.glb +0 -0
  267. package/corpus/handwritten/blobs/glb/1df5ce0b6cae72ec4cf3c41510681ba70ebb474f9745d536ebd4f03e8fc82de9.glb +0 -0
  268. package/corpus/handwritten/blobs/glb/262031e2fa710bd8d586eafce1019ca1434a2170e407567741aac1d99fc9c5ab.glb +0 -0
  269. package/corpus/handwritten/blobs/glb/27466efb180fb5b5074b40e424bd0b8d78f7ff0f5f3663748e014daeeeb5bedd.glb +0 -0
  270. package/corpus/handwritten/blobs/glb/2d2f6d00a14c89a4efb7f679b371118f564f258797ed8b8b42baf4ae60902ea6.glb +0 -0
  271. package/corpus/handwritten/blobs/glb/31f327d215ed7ef422e2169172f3869769e9816c9da979616844081e74f2eb09.glb +0 -0
  272. package/corpus/handwritten/blobs/glb/3bfe0e9ca18077ffee9c284ef40fed9f2fc354f7495612c785a6f980b5966559.glb +0 -0
  273. package/corpus/handwritten/blobs/glb/3db43042b3eeb1dee7ce9de1cc00322cefc348aa18c37d168b0858e6af6ca7a4.glb +0 -0
  274. package/corpus/handwritten/blobs/glb/46460a50da44fb8e792b48a646ec9ce025bb309d315dbcf67d2e9598591750de.glb +0 -0
  275. package/corpus/handwritten/blobs/glb/4902213556fedaf269fba6f0f195e424b2e49973ab45dcb8b69e34d253d9d8ff.glb +0 -0
  276. package/corpus/handwritten/blobs/glb/4dda463c9cd4bf339e5611871d4ba2fe16fe1487389a88b2888e96bc55e45d93.glb +0 -0
  277. package/corpus/handwritten/blobs/glb/4ed23469bd2b6b73183564cfc80a1ebcd0ffe2666a90a556752af0ca147fd2f7.glb +0 -0
  278. package/corpus/handwritten/blobs/glb/4fe74a1bed6b67129885b90cfcae01b5ca82e23e6d40507e280f02fca7fda54f.glb +0 -0
  279. package/corpus/handwritten/blobs/glb/50521bb3a50cc7199d324a0b25bc167c2e9d69770cb500490428efefc81ce3ea.glb +0 -0
  280. package/corpus/handwritten/blobs/glb/5ecca36d1e503edc092af0ef42f139cdcad99b8c2008318eb6ad337023d57296.glb +0 -0
  281. package/corpus/handwritten/blobs/glb/60fc036925852568cdb1b9fb85218dc43a8bf2ed86d3971a221ad942ece203a7.glb +0 -0
  282. package/corpus/handwritten/blobs/glb/611633cee0e5822b744486e6dff5414ad5b159eaabffe1c0ba0bb68be794bfa1.glb +0 -0
  283. package/corpus/handwritten/blobs/glb/67c7f983a0bcb9f84425378acac121a53f30795dce3181643bc1b763d0ae80b5.glb +0 -0
  284. package/corpus/handwritten/blobs/glb/6ecc0d307030943727484b49b1872643479c55ccc92252fca06e9e3cbe98fa90.glb +0 -0
  285. package/corpus/handwritten/blobs/glb/774b366df4de56cb6f9e3c904f02ec98016ac2ec489dc9e214b09220fca2f8e5.glb +0 -0
  286. package/corpus/handwritten/blobs/glb/785bae514ffc029e611d602259db7d37cbef589409a0814b9d37175d8b6c0a45.glb +0 -0
  287. package/corpus/handwritten/blobs/glb/79e79524efb2830e90af3c945c5b36ef07c1a38f2da2958112203a99eac52a16.glb +0 -0
  288. package/corpus/handwritten/blobs/glb/7bebdcdaf0be30d9f8d21bde72af68c32d825d12dc668f48109223ed7ff71c9f.glb +0 -0
  289. package/corpus/handwritten/blobs/glb/7d8b5ec9326a11362b3f9fa3409cb59d11b99f549cc304319c63c1ec55cbf5ab.glb +0 -0
  290. package/corpus/handwritten/blobs/glb/82e886f826315e4bf962363165fadadd3d93f85132c1909095045e0a7ccc0b34.glb +0 -0
  291. package/corpus/handwritten/blobs/glb/84b4ef190c3994ae7ca1b1f7a936526d1d20ad7deac13f949e3fe6bb7ba139ed.glb +0 -0
  292. package/corpus/handwritten/blobs/glb/85b7153e943fbe8c659bd6e4b323511dc6f6e2c7a3a1185e7a9a29ea6ddfdfa6.glb +0 -0
  293. package/corpus/handwritten/blobs/glb/85cf2d2be91cedbaf454ca42ad53c0c17b311088528d274695dbcea490d6c684.glb +0 -0
  294. package/corpus/handwritten/blobs/glb/8662b4cdc626c61a45e63f71dc866746c083cd0d4644b817a373105f936a7047.glb +0 -0
  295. package/corpus/handwritten/blobs/glb/8a4d33bfbb17d865e5deb0a0bdf3de67fc2312950a7568ed2635c22fbe4b1ecf.glb +0 -0
  296. package/corpus/handwritten/blobs/glb/8b11171d41c9027411ca8b87797d9ec70355471bdd3a247c114c49b8b781bbd9.glb +0 -0
  297. package/corpus/handwritten/blobs/glb/9026e1c4f0250832b69a989e69fe3071e5cad72adfe9c22ce11c409b18bb3357.glb +0 -0
  298. package/corpus/handwritten/blobs/glb/945b946f17b6393ea040230641c3083678bb6ab42e1d7239aeb9c950d0e7d5bb.glb +0 -0
  299. package/corpus/handwritten/blobs/glb/9afab455d603f1f8a38074c5a6cbed26d7d7f2cfd8a531820bd165d4b37399ee.glb +0 -0
  300. package/corpus/handwritten/blobs/glb/a6d702fb1be1095517625bfb2a2383f5f9638775059fd7e0d093d2044651b848.glb +0 -0
  301. package/corpus/handwritten/blobs/glb/aae479c2f99848998a1b499bbcad815d971349c2442bc363786aef63baad4337.glb +0 -0
  302. package/corpus/handwritten/blobs/glb/b155bd41f260d5303e293d691b657e0fb9b9c8b2f8aa589a0187061baa033eb7.glb +0 -0
  303. package/corpus/handwritten/blobs/glb/b1e8b770d99e8ca4396f21fd512f632c587149fc13db69deba388f702a46982f.glb +0 -0
  304. package/corpus/handwritten/blobs/glb/b382c318a5baac35da59a7b99ebaad6992e30c4bac327e85851ce0b2f89aa58b.glb +0 -0
  305. package/corpus/handwritten/blobs/glb/ba4478198696802808262af9bbfc224fe37e24e3f8c13de91debc87d3e1a9d41.glb +0 -0
  306. package/corpus/handwritten/blobs/glb/baf02cd967d1bf3c6a2ae878f4ca4ed34d0c39302ca2b8b6e3560a4e87b5c16f.glb +0 -0
  307. package/corpus/handwritten/blobs/glb/bc14dd152815ea6ed39458dcf89f2d69173d61d6e2b57be99d31ce2da64ccf67.glb +0 -0
  308. package/corpus/handwritten/blobs/glb/bc4e4d3bcf7ace855183efec0fbf242d444a32714d8b2fd8a45fa7b539ef2c73.glb +0 -0
  309. package/corpus/handwritten/blobs/glb/bc53475e2aa2fc9c2c0574b36a449fd57259c462d771e2b360def5c338d37c26.glb +0 -0
  310. package/corpus/handwritten/blobs/glb/c35d9e50f392c29f2587e3a6eb4f21143ba08e48d76a53b9de62d3b5be46c1a5.glb +0 -0
  311. package/corpus/handwritten/blobs/glb/c6911e059d3ac6aea75bc0ad3dd8b220704bfbba8ba98b57705e7aa3ecbe0050.glb +0 -0
  312. package/corpus/handwritten/blobs/glb/c84d88b6ed878490bcf9fa985b5e6a7a683de8ee7808ee4151a3b6a898fbe4f2.glb +0 -0
  313. package/corpus/handwritten/blobs/glb/c9d5d02ef0e38ac2898d3e6ecbc2ea0a6d2bd04531118550ab54b5e83293d7ec.glb +0 -0
  314. package/corpus/handwritten/blobs/glb/cd9d04e361e4c3d0aeb82f8682d71114ff8318b8fc4980bccee3c5e5c16afc27.glb +0 -0
  315. package/corpus/handwritten/blobs/glb/d32499928422a0cd1a32b1afaeacc31d2d84d74876f6805b36218dc04402a921.glb +0 -0
  316. package/corpus/handwritten/blobs/glb/dc7ea629fcddeba445599d73a5d721f4d5004e056c3c140baa3e6817393c6462.glb +0 -0
  317. package/corpus/handwritten/blobs/glb/dce79b59c85ca5a7f9fc25e585d253b15558f8f5d8497a76923c9071601de8b1.glb +0 -0
  318. package/corpus/handwritten/blobs/glb/e7fa1b02bae6c8d19ace0e8db44810beab9a1be9f8172d5816324760267d6d11.glb +0 -0
  319. package/corpus/handwritten/blobs/glb/eb664feed0fdcc3ac73cecbe737109994fe5dfad8a33997de88598965fa936ba.glb +0 -0
  320. package/corpus/handwritten/blobs/glb/ec6a771ca852b0b69e55a12df9d347384d01e611c8c6151ea771910f1601605d.glb +0 -0
  321. package/corpus/handwritten/blobs/glb/ede05013f575b4216d2b4b3f8a14d611ef28756f952f702bb169529c8ab02eff.glb +0 -0
  322. package/corpus/handwritten/blobs/glb/fec21fa96950340a1a031b31b37407468361ab0a7645c683e0d7773c18591a26.glb +0 -0
  323. package/corpus/handwritten/blobs/glb/ff21ea082bb00b01006900e7dbbb85220f31f45c144405c840a70872f9e09cb9.glb +0 -0
  324. package/corpus/handwritten/blobs/image/248fe9601e921305ffb35421414bc5f03e9f1b3dba15bf9b5c3387d8f255da17.png +0 -0
  325. package/corpus/handwritten/blobs/image/4b47420aff1ded28c9c6cf1eb92d6e2d7b01d057f2654654405445ff8d562e55.webp +0 -0
  326. package/corpus/handwritten/blobs/image/5dbc818ed0be692e6ba3df87898fd623280a2686eed5a538333e1325764b238d.png +0 -0
  327. package/corpus/handwritten/blobs/image/d5ae692911bbc2b60b5fdde239b70aad4ce9be0d7665c4a91b438de6077e21e3.jpg +0 -0
  328. package/corpus/handwritten/blobs/ktx2/df0dd2e8adc1d9479148bb198cb750471df454680cf0c9ffd6dc85d6262ed676.ktx2 +0 -0
  329. package/corpus/handwritten/blobs/wasm/ecc886d8bbebcf190298ff9162b6bb364f2125606f5bdc8cc220ea28044f96ea.wasm +0 -0
  330. package/corpus/handwritten/cook.json +1 -0
  331. package/corpus/handwritten/mounts/shardfiles/blender-template/discovery.json +1 -0
  332. package/corpus/handwritten/sections/actors/creatures.json +1 -0
  333. package/corpus/handwritten/sections/actors/crowds.json +1 -0
  334. package/corpus/handwritten/sections/actors/species.json +1 -0
  335. package/corpus/handwritten/sections/audio/audio.json +1 -0
  336. package/corpus/handwritten/sections/client/plan.json +1 -0
  337. package/corpus/handwritten/sections/combat/encounters.json +1 -0
  338. package/corpus/handwritten/sections/combat/items.json +1 -0
  339. package/corpus/handwritten/sections/combat/strikes.json +1 -0
  340. package/corpus/handwritten/sections/economy/ledger.json +1 -0
  341. package/corpus/handwritten/sections/economy/loot.json +1 -0
  342. package/corpus/handwritten/sections/look/look.json +1 -0
  343. package/corpus/handwritten/sections/look/map.json +1 -0
  344. package/corpus/handwritten/sections/look/materials.json +1 -0
  345. package/corpus/handwritten/sections/quests/quests.json +1 -0
  346. package/corpus/handwritten/sections/sim/client-scripts.json +1 -0
  347. package/corpus/handwritten/sections/sim/hooks.json +1 -0
  348. package/corpus/handwritten/sections/sim/plumbing.json +1 -0
  349. package/corpus/handwritten/sections/sim/sim.json +1 -0
  350. package/corpus/handwritten/sections/state/migrations.json +1 -0
  351. package/corpus/handwritten/sections/state/state.json +1 -0
  352. package/corpus/handwritten/sections/ui/card.json +1 -0
  353. package/corpus/handwritten/sections/ui/compendium.json +1 -0
  354. package/corpus/handwritten/sections/ui/level.json +1 -0
  355. package/corpus/handwritten/sections/ui/ui.json +1 -0
  356. package/corpus/handwritten/sections/world/collision.json +1 -0
  357. package/corpus/handwritten/sections/world/days.json +1 -0
  358. package/corpus/handwritten/sections/world/edge.json +1 -0
  359. package/corpus/handwritten/sections/world/movers.json +1 -0
  360. package/corpus/handwritten/sections/world/navigation.json +1 -0
  361. package/corpus/handwritten/sections/world/props.json +1 -0
  362. package/corpus/handwritten/sections/world/spawn.json +1 -0
  363. package/corpus/handwritten/sections/world/terrain.json +1 -0
  364. package/corpus/handwritten/sections/world/tiles.json +1 -0
  365. package/corpus/handwritten/sections/world/traversal.json +1 -0
  366. package/corpus/handwritten/sections/world/water.json +1 -0
  367. package/corpus/handwritten/sections/world/weather.json +1 -0
  368. package/corpus/handwritten/shard.json +1 -0
  369. package/corpus/handwritten/validation.json +1 -0
  370. package/package.json +504 -2
  371. package/packages/wire/src/net-command.ts +150 -0
  372. package/src/cli/bin.mjs +9 -0
  373. package/src/cli/main.ts +148 -0
  374. package/src/cli/pack.ts +262 -0
  375. package/src/cli/validate.ts +210 -0
  376. package/src/cli/version.ts +13 -0
  377. package/src/format/aacIndex.ts +160 -0
  378. package/src/format/accent.ts +35 -0
  379. package/src/format/achievementCounters.ts +22 -0
  380. package/src/format/actorMoves.ts +615 -0
  381. package/src/format/actorProjectionV2.ts +93 -0
  382. package/src/format/admissionControl.ts +66 -0
  383. package/src/format/admissionLate.ts +22 -0
  384. package/src/format/admissionLimits.ts +11 -0
  385. package/src/format/admissionServer.ts +30 -0
  386. package/src/format/ambientLife.ts +123 -0
  387. package/src/format/arenaRoomDocument.ts +114 -0
  388. package/src/format/arenaScriptRows.ts +107 -0
  389. package/src/format/arenaView.ts +30 -0
  390. package/src/format/assetAdmission.ts +279 -0
  391. package/src/format/audio-measure.ts +184 -0
  392. package/src/format/audio-mp4.ts +234 -0
  393. package/src/format/audio-rules.ts +271 -0
  394. package/src/format/audio-waiver.ts +55 -0
  395. package/src/format/audio.ts +463 -0
  396. package/src/format/audioBank.ts +37 -0
  397. package/src/format/audioProfiles.ts +501 -0
  398. package/src/format/audioRouting.ts +67 -0
  399. package/src/format/audioScene.ts +342 -0
  400. package/src/format/bakedTerrainBytes.ts +35 -0
  401. package/src/format/bakedTerrainSampling.ts +66 -0
  402. package/src/format/bakedTiles.ts +407 -0
  403. package/src/format/binarySource.ts +32 -0
  404. package/src/format/bodySlots.ts +90 -0
  405. package/src/format/bossEncounter.ts +354 -0
  406. package/src/format/bossProfiles.ts +709 -0
  407. package/src/format/bossSocketRig.ts +92 -0
  408. package/src/format/bowVariantRows.ts +68 -0
  409. package/src/format/brains.ts +252 -0
  410. package/src/format/budget.ts +214 -0
  411. package/src/format/buildings.ts +496 -0
  412. package/src/format/builtIndexes.ts +26 -0
  413. package/src/format/catalogueEconomy.ts +65 -0
  414. package/src/format/caveInterior.ts +225 -0
  415. package/src/format/cellBounds.ts +47 -0
  416. package/src/format/cellField.ts +98 -0
  417. package/src/format/chapterDirector.ts +193 -0
  418. package/src/format/clientChannels.ts +450 -0
  419. package/src/format/clientCues.ts +34 -0
  420. package/src/format/clientNative.ts +358 -0
  421. package/src/format/clientOwnership.ts +43 -0
  422. package/src/format/clientPlan.ts +306 -0
  423. package/src/format/clientScripts.ts +116 -0
  424. package/src/format/clientState.ts +273 -0
  425. package/src/format/clientTrails.ts +56 -0
  426. package/src/format/collectionDisplay.ts +232 -0
  427. package/src/format/colourFunction.ts +44 -0
  428. package/src/format/colourLut.ts +4 -0
  429. package/src/format/commonsCosts.ts +28 -0
  430. package/src/format/compendiumRows.ts +151 -0
  431. package/src/format/compendiumSketches.ts +23 -0
  432. package/src/format/completion.ts +83 -0
  433. package/src/format/contentBounds.ts +76 -0
  434. package/src/format/contentCost.ts +50 -0
  435. package/src/format/contracts.ts +305 -0
  436. package/src/format/cook-data.ts +148 -0
  437. package/src/format/cook-preparation.ts +241 -0
  438. package/src/format/coverAppearance.ts +53 -0
  439. package/src/format/creatures.ts +175 -0
  440. package/src/format/crowdPresentation.ts +87 -0
  441. package/src/format/crowds.ts +46 -0
  442. package/src/format/cueDirector.ts +134 -0
  443. package/src/format/dayCycle.ts +28 -0
  444. package/src/format/dayLook.ts +44 -0
  445. package/src/format/decisionBindings.ts +80 -0
  446. package/src/format/decisionPublication.ts +35 -0
  447. package/src/format/decisionScripts.ts +327 -0
  448. package/src/format/declaredQuestPage.ts +101 -0
  449. package/src/format/deviceMemoryCost.ts +50 -0
  450. package/src/format/director.ts +52 -0
  451. package/src/format/directorProduct.ts +27 -0
  452. package/src/format/directorStages.ts +165 -0
  453. package/src/format/directorWhen.ts +78 -0
  454. package/src/format/discoveryValues.ts +416 -0
  455. package/src/format/easedFields.ts +48 -0
  456. package/src/format/edgeProfiles.ts +40 -0
  457. package/src/format/eliteContinuation.ts +110 -0
  458. package/src/format/eliteEntryRows.ts +351 -0
  459. package/src/format/eliteFeature.ts +605 -0
  460. package/src/format/eliteScripts.ts +60 -0
  461. package/src/format/encounterRows.ts +1030 -0
  462. package/src/format/encounters.ts +65 -0
  463. package/src/format/engine-music.ts +42 -0
  464. package/src/format/entryClearance.ts +86 -0
  465. package/src/format/entryCoverage.ts +61 -0
  466. package/src/format/entryGeometry.ts +56 -0
  467. package/src/format/entryLanding.ts +83 -0
  468. package/src/format/entryReads.ts +45 -0
  469. package/src/format/entrywayAssets.ts +33 -0
  470. package/src/format/entryways.ts +58 -0
  471. package/src/format/exchange.ts +25 -0
  472. package/src/format/explorerCatalogue.ts +312 -0
  473. package/src/format/feature-sides.ts +233 -0
  474. package/src/format/fieldPresentation.ts +62 -0
  475. package/src/format/figures.ts +437 -0
  476. package/src/format/findsCatalogue.ts +67 -0
  477. package/src/format/fixedDraws.ts +24 -0
  478. package/src/format/flyers.ts +226 -0
  479. package/src/format/forestNativeInputs.ts +37 -0
  480. package/src/format/forestPage.ts +285 -0
  481. package/src/format/forestWeather.ts +333 -0
  482. package/src/format/geometryPack.ts +136 -0
  483. package/src/format/glbBuffers.ts +77 -0
  484. package/src/format/glbCost.ts +212 -0
  485. package/src/format/glbImages.ts +95 -0
  486. package/src/format/glbTriangles.ts +95 -0
  487. package/src/format/graphArmsRows.ts +200 -0
  488. package/src/format/grapple.ts +123 -0
  489. package/src/format/grazers.ts +164 -0
  490. package/src/format/grid-catalogue.ts +247 -0
  491. package/src/format/gridReadiness.ts +49 -0
  492. package/src/format/groupBrains.ts +249 -0
  493. package/src/format/heldArms.ts +576 -0
  494. package/src/format/heldEquipment.ts +78 -0
  495. package/src/format/heldFinishes.ts +415 -0
  496. package/src/format/heldGear.ts +68 -0
  497. package/src/format/heldJianDocument.ts +75 -0
  498. package/src/format/heldMelee.ts +866 -0
  499. package/src/format/heldView.ts +26 -0
  500. package/src/format/heldWeaponDocuments.ts +36 -0
  501. package/src/format/herdShelter.ts +58 -0
  502. package/src/format/hooks.ts +45 -0
  503. package/src/format/immutable.ts +59 -0
  504. package/src/format/inputDeclarations.ts +157 -0
  505. package/src/format/islandLibrary.ts +51 -0
  506. package/src/format/items.ts +229 -0
  507. package/src/format/json.ts +143 -0
  508. package/src/format/keyedSky.ts +314 -0
  509. package/src/format/kitFigure.ts +68 -0
  510. package/src/format/ktx2Cost.ts +47 -0
  511. package/src/format/ledger.ts +56 -0
  512. package/src/format/liftApproach.ts +75 -0
  513. package/src/format/liftRider.ts +10 -0
  514. package/src/format/lightEmitters.ts +105 -0
  515. package/src/format/lights.ts +135 -0
  516. package/src/format/limbCollision.ts +136 -0
  517. package/src/format/limbPopulation.ts +33 -0
  518. package/src/format/limbRig.ts +202 -0
  519. package/src/format/loadout.ts +156 -0
  520. package/src/format/look-light.ts +153 -0
  521. package/src/format/lootBag.ts +145 -0
  522. package/src/format/lootEconomy.ts +235 -0
  523. package/src/format/materialFamilies.ts +565 -0
  524. package/src/format/materialGraph.ts +1220 -0
  525. package/src/format/materials.ts +449 -0
  526. package/src/format/memoryAdmission.ts +84 -0
  527. package/src/format/memoryGates.json +7 -0
  528. package/src/format/meshCollision.ts +56 -0
  529. package/src/format/meshCollisionAssets.ts +19 -0
  530. package/src/format/meshCollisionBytes.ts +102 -0
  531. package/src/format/meshEntryways.ts +54 -0
  532. package/src/format/meshopt-decoder.wasm +0 -0
  533. package/src/format/meshopt-module.ts +177 -0
  534. package/src/format/meshopt-static.mjs +11 -0
  535. package/src/format/meshopt-wasm.ts +61 -0
  536. package/src/format/migrations.ts +209 -0
  537. package/src/format/minimap.ts +1052 -0
  538. package/src/format/mixedPopulation.ts +222 -0
  539. package/src/format/modes.ts +304 -0
  540. package/src/format/mountedSpecimenRows.ts +64 -0
  541. package/src/format/moverLifecycle.ts +34 -0
  542. package/src/format/moverMotion.ts +271 -0
  543. package/src/format/movers.ts +224 -0
  544. package/src/format/namedJsonContracts.ts +423 -0
  545. package/src/format/nativeActors.ts +45 -0
  546. package/src/format/nativeAssembly.ts +141 -0
  547. package/src/format/nativeGround.ts +37 -0
  548. package/src/format/nativeGroundAssets.ts +35 -0
  549. package/src/format/nativeItems.ts +184 -0
  550. package/src/format/nativePhysics.ts +140 -0
  551. package/src/format/nativeQuestComposition.ts +398 -0
  552. package/src/format/nativeRiding.ts +103 -0
  553. package/src/format/nativeRuntimePlan.ts +89 -0
  554. package/src/format/navigation.ts +99 -0
  555. package/src/format/navigationBytes.ts +111 -0
  556. package/src/format/nearPlaceholder.ts +111 -0
  557. package/src/format/nearPlaceholderAssets.ts +23 -0
  558. package/src/format/netCommand.ts +11 -0
  559. package/src/format/npcs.ts +546 -0
  560. package/src/format/outputAddress.ts +11 -0
  561. package/src/format/outputDownload.ts +34 -0
  562. package/src/format/outputFields.ts +123 -0
  563. package/src/format/outputIndex.ts +352 -0
  564. package/src/format/overdraw.ts +41 -0
  565. package/src/format/pageLife.ts +303 -0
  566. package/src/format/pagePreparation.ts +60 -0
  567. package/src/format/paintedLook.ts +55 -0
  568. package/src/format/paintedResources.ts +158 -0
  569. package/src/format/panelTemplate.ts +139 -0
  570. package/src/format/placeholderSource.ts +209 -0
  571. package/src/format/platformDataSections.ts +146 -0
  572. package/src/format/platformFileFamilies.ts +299 -0
  573. package/src/format/plumbing.ts +165 -0
  574. package/src/format/populationEnvironment.ts +210 -0
  575. package/src/format/populationKeeper.ts +163 -0
  576. package/src/format/populationProjection.ts +496 -0
  577. package/src/format/populationRespawn.ts +48 -0
  578. package/src/format/populationRoster.ts +158 -0
  579. package/src/format/portalFloor.ts +56 -0
  580. package/src/format/portalLink.ts +112 -0
  581. package/src/format/portalLinkAssets.ts +42 -0
  582. package/src/format/portalRide.ts +22 -0
  583. package/src/format/postGraphDocument.ts +36 -0
  584. package/src/format/postGraphLook.ts +477 -0
  585. package/src/format/postStack.ts +114 -0
  586. package/src/format/practiceCourseRows.ts +466 -0
  587. package/src/format/preflight.ts +155 -0
  588. package/src/format/presentation.ts +33 -0
  589. package/src/format/product-audio.ts +76 -0
  590. package/src/format/product-reads.ts +178 -0
  591. package/src/format/product-stream-admit.ts +100 -0
  592. package/src/format/product-stream-assets.ts +493 -0
  593. package/src/format/product-stream-facts.ts +208 -0
  594. package/src/format/product-stream-miss.ts +12 -0
  595. package/src/format/product-stream-node.ts +47 -0
  596. package/src/format/product-stream-packs.ts +242 -0
  597. package/src/format/product-stream-rows.ts +202 -0
  598. package/src/format/product-stream-tar.ts +192 -0
  599. package/src/format/product-stream.ts +284 -0
  600. package/src/format/product.ts +358 -0
  601. package/src/format/productValidation.ts +205 -0
  602. package/src/format/propMaterials.ts +254 -0
  603. package/src/format/props.ts +137 -0
  604. package/src/format/questContinuation.ts +42 -0
  605. package/src/format/questFigures.ts +227 -0
  606. package/src/format/questGraph.ts +30 -0
  607. package/src/format/questHost.ts +314 -0
  608. package/src/format/questInteractionSource.ts +57 -0
  609. package/src/format/questInteractions.ts +642 -0
  610. package/src/format/questPageComposition.ts +92 -0
  611. package/src/format/questPageFacets.ts +121 -0
  612. package/src/format/questRuntime.ts +118 -0
  613. package/src/format/questSteps.ts +182 -0
  614. package/src/format/questStory.ts +512 -0
  615. package/src/format/questStoryBindings.ts +43 -0
  616. package/src/format/questWorld.ts +36 -0
  617. package/src/format/quests.ts +333 -0
  618. package/src/format/rainPresentation.ts +131 -0
  619. package/src/format/rangedPage.ts +117 -0
  620. package/src/format/receipt-cost.ts +71 -0
  621. package/src/format/registeredJson.ts +530 -0
  622. package/src/format/returnProgramDocument.ts +40 -0
  623. package/src/format/returnProjectionV2.ts +84 -0
  624. package/src/format/riding.ts +377 -0
  625. package/src/format/riggedHulls.ts +160 -0
  626. package/src/format/roamingBossProjection.ts +178 -0
  627. package/src/format/roamingCombat.ts +22 -0
  628. package/src/format/ropeDeckSite.ts +148 -0
  629. package/src/format/rows.ts +86 -0
  630. package/src/format/runtime.ts +38 -0
  631. package/src/format/runtimeBinds.ts +49 -0
  632. package/src/format/runtimeCost.ts +80 -0
  633. package/src/format/runtimeSpawns.ts +73 -0
  634. package/src/format/scalarChannel.ts +38 -0
  635. package/src/format/scaledPost.ts +27 -0
  636. package/src/format/scaledPostContract.ts +51 -0
  637. package/src/format/sceneBuffers.ts +122 -0
  638. package/src/format/sceneDraws.ts +89 -0
  639. package/src/format/sceneDressing.ts +247 -0
  640. package/src/format/sceneInstances.ts +192 -0
  641. package/src/format/sceneMotion.ts +122 -0
  642. package/src/format/sceneRefs.ts +71 -0
  643. package/src/format/sceneSources.ts +730 -0
  644. package/src/format/script-side-grandfather.ts +62 -0
  645. package/src/format/script-sides.ts +289 -0
  646. package/src/format/scriptAbi.ts +14 -0
  647. package/src/format/scriptAbiV1.ts +56 -0
  648. package/src/format/scriptActionsV2.ts +101 -0
  649. package/src/format/scriptAdmission.ts +165 -0
  650. package/src/format/scriptAdmissionV2.ts +126 -0
  651. package/src/format/scriptContract.ts +170 -0
  652. package/src/format/scriptFuelV2.ts +124 -0
  653. package/src/format/scriptGroupBankV2.ts +54 -0
  654. package/src/format/scriptGroupStepV2.ts +165 -0
  655. package/src/format/scriptInputStateV2.ts +52 -0
  656. package/src/format/scriptLimits.ts +5 -0
  657. package/src/format/scriptMemoryV2.ts +17 -0
  658. package/src/format/scriptModuleV2.ts +116 -0
  659. package/src/format/scriptObservationColumnsV2.ts +226 -0
  660. package/src/format/scriptQueriesV2.ts +164 -0
  661. package/src/format/scriptQueryStateV2.ts +40 -0
  662. package/src/format/scriptRngV2.ts +52 -0
  663. package/src/format/scriptWireV2.ts +106 -0
  664. package/src/format/scripts.ts +31 -0
  665. package/src/format/sections.ts +140 -0
  666. package/src/format/shardSchema.ts +632 -0
  667. package/src/format/shardSections.ts +383 -0
  668. package/src/format/sketch.ts +79 -0
  669. package/src/format/skin-materials.ts +172 -0
  670. package/src/format/skinAssets.ts +107 -0
  671. package/src/format/skinData.ts +110 -0
  672. package/src/format/skinLayers.ts +90 -0
  673. package/src/format/skins.ts +37 -0
  674. package/src/format/socketLift.ts +58 -0
  675. package/src/format/socketLiftAssets.ts +81 -0
  676. package/src/format/socketRigCreature.ts +66 -0
  677. package/src/format/sourceResidency.ts +16 -0
  678. package/src/format/spawnCombat.ts +26 -0
  679. package/src/format/spawnScriptV2.ts +145 -0
  680. package/src/format/spawnScripts.ts +229 -0
  681. package/src/format/spawnTables.ts +46 -0
  682. package/src/format/spawnView.ts +26 -0
  683. package/src/format/speciesActorsFile.ts +86 -0
  684. package/src/format/speciesBookRows.ts +84 -0
  685. package/src/format/speciesBrain.ts +96 -0
  686. package/src/format/speciesLooks.ts +1021 -0
  687. package/src/format/speciesPrograms.ts +97 -0
  688. package/src/format/speciesScripts.ts +45 -0
  689. package/src/format/specimenCatalogue.ts +94 -0
  690. package/src/format/splatTerrain.ts +192 -0
  691. package/src/format/standalone-catalogue.ts +144 -0
  692. package/src/format/standaloneControl.ts +44 -0
  693. package/src/format/state.ts +61 -0
  694. package/src/format/stateLineage.ts +71 -0
  695. package/src/format/stealth.ts +106 -0
  696. package/src/format/stillImage.ts +135 -0
  697. package/src/format/streamedCover.ts +105 -0
  698. package/src/format/surfaceLooks.ts +50 -0
  699. package/src/format/tar-fields.ts +54 -0
  700. package/src/format/tar-paths.ts +103 -0
  701. package/src/format/tar-source.ts +13 -0
  702. package/src/format/tar-write.ts +152 -0
  703. package/src/format/tar.ts +203 -0
  704. package/src/format/targets.ts +217 -0
  705. package/src/format/terrain.ts +241 -0
  706. package/src/format/terrainTileBytes.ts +104 -0
  707. package/src/format/tierSelection.ts +195 -0
  708. package/src/format/toonLighting.ts +32 -0
  709. package/src/format/toonLook.ts +332 -0
  710. package/src/format/trail.ts +17 -0
  711. package/src/format/traversal.ts +13 -0
  712. package/src/format/treeSetRows.ts +93 -0
  713. package/src/format/ui.ts +90 -0
  714. package/src/format/uiStrings.ts +17 -0
  715. package/src/format/uniformRows.ts +31 -0
  716. package/src/format/upload-wire.ts +184 -0
  717. package/src/format/validationReceipt.ts +142 -0
  718. package/src/format/version.ts +9 -0
  719. package/src/format/vertexWear.ts +45 -0
  720. package/src/format/viewProgram.ts +329 -0
  721. package/src/format/voicePatches.ts +47 -0
  722. package/src/format/water.ts +247 -0
  723. package/src/format/waterWaves.ts +7 -0
  724. package/src/format/waterWorld.ts +34 -0
  725. package/src/format/weaponProfiles.ts +1315 -0
  726. package/src/format/weatherBundle.ts +36 -0
  727. package/src/format/weatherEffects.ts +78 -0
  728. package/src/format/weatherProgram.ts +422 -0
  729. package/src/format/wildlifePopulation.ts +210 -0
  730. package/src/format/wireLimits.ts +9 -0
  731. package/src/format/worldAssembly.ts +104 -0
  732. package/src/format/worldEntry.ts +151 -0
  733. package/src/format/worldPhysics.ts +292 -0
  734. package/src/format/worldSceneBatch.ts +106 -0
  735. package/src/format/worldSceneModels.ts +79 -0
  736. package/src/format/worldScenePages.ts +89 -0
  737. package/src/format/worldScenePlacement.ts +191 -0
  738. package/src/format/worldSceneSlabs.ts +43 -0
  739. package/src/format/worldSceneSurface.ts +113 -0
  740. package/src/format/worldSceneWeld.ts +702 -0
  741. package/src/format/worldScenes.ts +184 -0
  742. package/src/format/worldTargets.ts +111 -0
  743. package/src/format/worldUpdates.ts +229 -0
  744. package/src/hook/format-hook.d.mts +2 -0
  745. package/src/hook/format-hook.mjs +47 -0
  746. package/README.md +0 -8
@@ -0,0 +1,165 @@
1
+ import { SCRIPT_ABI, SCRIPT_EXPORTS, SCRIPT_IMPORTS } from './scriptAbi.ts';
2
+ import { SCRIPT_V1_EXPORTS, SCRIPT_V1_IMPORTS, SCRIPT_V1_LAYOUT } from './scriptAbiV1.ts';
3
+
4
+ class Reader {
5
+ pos = 0;
6
+ readonly bytes: Uint8Array;
7
+ constructor(bytes: Uint8Array) { this.bytes = bytes; }
8
+ byte(): number { const n = this.bytes[this.pos++]; if (n === undefined) throw new Error('Truncated module'); return n; }
9
+ uint(): number {
10
+ let n = 0;
11
+ for (let i = 0; i < 5; i++) { const b = this.byte(); if (i === 4 && b > 15) throw new Error('Invalid u32'); n += (b & 127) * 2 ** (i * 7); if (b < 128) return n; }
12
+ throw new Error('Invalid u32');
13
+ }
14
+ signed(max = 5): number {
15
+ let n = 0, shift = 0;
16
+ for (let i = 0; i < max; i++) { const b = this.byte(); n += (b & 127) * 2 ** shift; shift += 7; if (b < 128) return b & 64 ? n - 2 ** shift : n; }
17
+ throw new Error('Invalid signed integer');
18
+ }
19
+ take(n: number): Uint8Array { if (n < 0 || this.pos + n > this.bytes.length) throw new Error('Truncated section'); const b = this.bytes.subarray(this.pos, this.pos + n); this.pos += n; return b; }
20
+ name(): string { return new TextDecoder('utf-8', { fatal: true }).decode(this.take(this.uint())); }
21
+ done(): boolean { return this.pos === this.bytes.length; }
22
+ }
23
+ interface Signature { params: number[]; result: number | undefined }
24
+ interface Instruction { op: number; arg: number | undefined }
25
+ /** Limits and complete mutable-global snapshot names established without executing module code. */
26
+ export interface ScriptAdmission { initialPages: number; maximumPages: number; globals: readonly string[]; functions: number }
27
+ const NUMERIC = new Set([0x7f, 0x7e, 0x7d, 0x7c]);
28
+ function numeric(r: Reader): number { const n = r.byte(); if (!NUMERIC.has(n)) throw new Error('Non-numeric type'); return n; }
29
+ function equal(a: readonly number[], b: readonly number[]): boolean { return a.length === b.length && a.every((n, i) => n === b[i]); }
30
+ function signature(s: Signature): number[] { return [...s.params, s.result ?? 0]; }
31
+ function instructions(r: Reader): Instruction[] {
32
+ const out: Instruction[] = [];
33
+ while (!r.done()) {
34
+ const op = r.byte(); let arg: number | undefined;
35
+ if (op >= 0x02 && op <= 0x04) { const t = r.byte(); if (t !== 0x40 && !NUMERIC.has(t)) throw new Error('Multivalue block'); }
36
+ else if ([0x0c, 0x0d, 0x10, 0x20, 0x21, 0x22, 0x23, 0x24].includes(op)) arg = r.uint();
37
+ else if (op === 0x0e) { const n = r.uint(); if (n > SCRIPT_ABI.maxBytes) throw new Error('Branch table cap'); for (let i = 0; i <= n; i++) r.uint(); }
38
+ else if (op >= 0x28 && op <= 0x3e) { r.uint(); r.uint(); }
39
+ else if (op === 0x3f || op === 0x40) { if (r.byte() !== 0) throw new Error('Multiple memories'); }
40
+ else if (op === 0x41) arg = r.signed();
41
+ else if (op === 0x42) r.signed(10);
42
+ else if (op === 0x43) r.take(4);
43
+ else if (op === 0x44) r.take(8);
44
+ else if (op === 0xfc) {
45
+ const sub = r.uint();
46
+ if (sub <= 7) { /* Saturating numeric conversions. */ }
47
+ else throw new Error('Unsupported bulk instruction');
48
+ } else if (![0x00, 0x01, 0x05, 0x0b, 0x0f, 0x1a, 0x1b].includes(op) && !(op >= 0x45 && op <= 0xc4)) throw new Error('Banned instruction or feature');
49
+ out.push({ op, arg });
50
+ }
51
+ return out;
52
+ }
53
+ function isCall(i: Instruction | undefined, target: number): boolean { return i?.op === 0x10 && i.arg === target; }
54
+ function charge(code: readonly Instruction[], at: number, fuel: number, bytes: number): boolean {
55
+ const i = code[at]; return i?.op === 0x41 && (i.arg ?? 0) >= bytes && isCall(code[at + 1], fuel);
56
+ }
57
+ // Like v2 admission, retain only a small page-local set of successful byte
58
+ // inspections. Compare the complete bytes on every hit: identity alone cannot
59
+ // admit a mutated caller buffer. Results never share the mutable globals array.
60
+ const recentAdmissions: { abi: 0 | 1; bytes: Uint8Array; admission: ScriptAdmission }[] = [];
61
+ function sameBytes(a: Uint8Array, b: Uint8Array): boolean {
62
+ if (a.byteLength !== b.byteLength) return false;
63
+ for (let i = 0; i < a.byteLength; i++) if (a[i] !== b[i]) return false;
64
+ return true;
65
+ }
66
+ /** Validate bytes and metering without instantiating or executing any module code. Tables are capped at zero in v0. */
67
+ export function admitScript(bytes: Uint8Array, abi: 0 | 1 = 0): ScriptAdmission {
68
+ if (bytes.length > SCRIPT_ABI.maxBytes) throw new Error('Invalid or oversized module');
69
+ // Read the typed array's actual storage, not caller-overridden slice,
70
+ // iterator or byteLength properties. Inspection and the cache share it.
71
+ const snapshot = new Uint8Array(bytes);
72
+ const known = recentAdmissions.find(row => row.abi === abi && sameBytes(row.bytes, snapshot));
73
+ if (known !== undefined) return { ...known.admission, globals: [...known.admission.globals] };
74
+ const admission = inspectScript(snapshot, abi);
75
+ recentAdmissions.unshift({ abi, bytes: snapshot, admission: { ...admission, globals: [...admission.globals] } });
76
+ recentAdmissions.length = Math.min(recentAdmissions.length, 16);
77
+ return admission;
78
+ }
79
+ function inspectScript(bytes: Uint8Array, abi: 0 | 1): ScriptAdmission {
80
+ const required = abi === 1 ? SCRIPT_V1_EXPORTS : SCRIPT_EXPORTS;
81
+ const allowed = abi === 1 ? SCRIPT_V1_IMPORTS : SCRIPT_IMPORTS;
82
+ if (bytes.length > SCRIPT_ABI.maxBytes || !WebAssembly.validate(new Uint8Array(bytes))) throw new Error('Invalid or oversized module');
83
+ const r = new Reader(bytes); r.take(8);
84
+ const types: Signature[] = [], functions: number[] = [], imports = new Map<string, number>();
85
+ const exports = new Map<string, { kind: number; index: number }>();
86
+ const mutable: number[] = [], bodies: { code: Instruction[]; bytes: number; locals: number }[] = [];
87
+ let imported = 0, initialPages = 0, maximumPages = 0;
88
+ let declaredDataCount: number | undefined, dataCount = 0;
89
+ while (!r.done()) {
90
+ const id = r.byte(), s = new Reader(r.take(r.uint()));
91
+ if (id === 0) continue;
92
+ if (id === 1) {
93
+ const count = s.uint(); if (count > SCRIPT_ABI.maxFunctions) throw new Error('Type cap');
94
+ for (let i = 0; i < count; i++) { if (s.byte() !== 0x60) throw new Error('GC type'); const n = s.uint(); if (n > 16) throw new Error('Parameter cap'); const params = Array.from({ length: n }, () => numeric(s)); const results = s.uint(); if (results > 1) throw new Error('Multivalue'); types.push({ params, result: results === 1 ? numeric(s) : undefined }); }
95
+ } else if (id === 2) {
96
+ const count = s.uint(); if (count > 9) throw new Error('Import cap');
97
+ for (let i = 0; i < count; i++) {
98
+ const mod = s.name(), name = s.name(), kind = s.byte(); if (mod !== 'env' || imports.has(name)) throw new Error('Import outside ABI');
99
+ if (kind === 0) {
100
+ const t = s.uint(), expected = allowed[name], actual = types[t];
101
+ if (!expected || !actual || !equal(signature(actual), expected)) throw new Error('Import signature outside ABI');
102
+ imports.set(name, imported++); functions.push(t);
103
+ } else if (kind === 2 && name === 'memory' && initialPages === 0) {
104
+ if (s.uint() !== 1) throw new Error('Memory must be capped and unshared'); initialPages = s.uint(); maximumPages = s.uint();
105
+ if (initialPages < 1 || maximumPages < initialPages || maximumPages > SCRIPT_ABI.memoryPages) throw new Error('Memory cap'); imports.set(name, -1);
106
+ if (abi === 1 && (maximumPages !== initialPages || maximumPages > SCRIPT_V1_LAYOUT.maximumPages)) throw new Error('Decision memory must be fixed at 1..4 pages');
107
+ } else throw new Error('Import outside ABI');
108
+ }
109
+ } else if (id === 3) { const count = s.uint(); if (count + imported > SCRIPT_ABI.maxFunctions) throw new Error('Function cap'); for (let i = 0; i < count; i++) functions.push(s.uint()); }
110
+ else if (id === 6) {
111
+ const globals = s.uint(); if (globals > SCRIPT_ABI.maxGlobals) throw new Error('Global cap');
112
+ for (let i = 0; i < globals; i++) { numeric(s); const mut = s.byte(); if (mut === 1) mutable.push(i); const op = s.byte(); if (op === 0x41) s.signed(); else if (op === 0x42) s.signed(10); else if (op === 0x43 || op === 0x44) { const b = s.take(op === 0x43 ? 4 : 8), view = new DataView(b.buffer, b.byteOffset, b.byteLength); if (!Number.isFinite(op === 0x43 ? view.getFloat32(0, true) : view.getFloat64(0, true))) throw new Error('Non-finite global initializer'); } else throw new Error('Global initializer'); if (s.byte() !== 0x0b) throw new Error('Global initializer'); }
113
+ } else if (id === 7) { const n = s.uint(); for (let i = 0; i < n; i++) exports.set(s.name(), { kind: s.byte(), index: s.uint() }); }
114
+ else if (id === 10) {
115
+ const count = s.uint();
116
+ for (let i = 0; i < count; i++) { const b = new Reader(s.take(s.uint())), size = b.bytes.length, groups = b.uint(); let locals = 0; for (let j = 0; j < groups; j++) { locals += b.uint(); numeric(b); } if (locals > SCRIPT_ABI.maxLocals) throw new Error('Local cap'); bodies.push({ code: instructions(b), bytes: size, locals }); }
117
+ } else if (id === 11) {
118
+ const n = s.uint(); dataCount = n; for (let i = 0; i < n; i++) { if (s.uint() !== 0 || s.byte() !== 0x41) throw new Error('Only active memory data'); const offset = s.signed(); if (s.byte() !== 0x0b || offset < 0) throw new Error('Data offset'); const len = s.uint(); if (offset + len > initialPages * 65536) throw new Error('Data cap'); s.take(len); }
119
+ } else if (id === 12) declaredDataCount = s.uint();
120
+ else throw new Error('Banned section (start, table, memory, tags or passive data)');
121
+ if (!s.done()) throw new Error('Trailing section bytes');
122
+ }
123
+ const enter = imports.get('enter'), leave = imports.get('leave'), fuel = imports.get('fuel');
124
+ if (declaredDataCount !== undefined && declaredDataCount !== dataCount) throw new Error('Wrong data count');
125
+ if (enter === undefined || leave === undefined || fuel === undefined || initialPages === 0) throw new Error('Missing instrumentation');
126
+ const wrappers = new Set<number>(), implementations = new Set<number>();
127
+ for (let i = 0; i < bodies.length; i++) {
128
+ const body = bodies[i]; if (!body) throw new Error('Missing body'); const type = types[functions[i + imported] ?? -1]; if (!type) throw new Error('Missing signature');
129
+ if (!isCall(body.code[0], enter)) continue;
130
+ const expected: Instruction[] = [{ op: 0x10, arg: enter }, ...type.params.map((_, arg) => ({ op: 0x20, arg }))];
131
+ const target = body.code[expected.length]?.arg;
132
+ if (target === undefined || target < imported || !equal(signature(type), signature(types[functions[target] ?? -1] ?? { params: [], result: undefined }))) throw new Error('Invalid depth wrapper target');
133
+ expected.push({ op: 0x10, arg: target });
134
+ if (type.result !== undefined) expected.push({ op: 0x21, arg: type.params.length });
135
+ expected.push({ op: 0x10, arg: leave });
136
+ if (type.result !== undefined) expected.push({ op: 0x20, arg: type.params.length });
137
+ expected.push({ op: 0x0b, arg: undefined });
138
+ if (body.locals !== (type.result === undefined ? 0 : 1) || body.code.length !== expected.length || body.code.some((v, j) => { const e = expected[j]; return !e || v.op !== e.op || v.arg !== e.arg; })) throw new Error('Invalid depth wrapper');
139
+ wrappers.add(i + imported); implementations.add(target);
140
+ }
141
+ for (let i = 0; i < bodies.length; i++) {
142
+ const body = bodies[i]; if (!body) throw new Error('Missing body'); const index = i + imported;
143
+ if (wrappers.has(index)) continue;
144
+ if (!implementations.has(index) || !charge(body.code, 0, fuel, body.bytes)) throw new Error('Missing function fuel instrumentation');
145
+ for (let j = 0; j < body.code.length; j++) {
146
+ const instr = body.code[j]; if (!instr) throw new Error('Missing instruction');
147
+ if (abi === 1 && instr.op === 0x40) throw new Error('Decision memory.grow is forbidden');
148
+ if (instr.op === 0x03 && !charge(body.code, j + 1, fuel, body.bytes)) throw new Error('Missing loop fuel instrumentation');
149
+ if (isCall(instr, fuel) && !charge(body.code, j - 1, fuel, body.bytes)) throw new Error('Invalid fuel charge');
150
+ const float32 = instr.op === 0x2a || instr.op === 0x43 || (instr.op >= 0x8b && instr.op <= 0x98) || (instr.op >= 0xb2 && instr.op <= 0xb6) || instr.op === 0xbe;
151
+ const float64 = instr.op === 0x2b || instr.op === 0x44 || (instr.op >= 0x99 && instr.op <= 0xa6) || (instr.op >= 0xb7 && instr.op <= 0xbb) || instr.op === 0xbf;
152
+ if (float32 || float64) { const check = imports.get(float32 ? 'finite32' : 'finite64'); if (check === undefined || !isCall(body.code[j + 1], check)) throw new Error('Missing finite float instrumentation'); }
153
+ if (instr.op === 0x10 && (instr.arg === enter || instr.arg === leave || ((instr.arg ?? -1) >= imported && !wrappers.has(instr.arg ?? -1)))) throw new Error('Bypassed depth instrumentation');
154
+ }
155
+ }
156
+ if (wrappers.size === 0 || bodies.length !== functions.length - imported) throw new Error('Missing instrumented functions');
157
+ for (const [name, contract] of Object.entries(required)) {
158
+ const exp = exports.get(name), type = types[functions[exp?.index ?? -1] ?? -1];
159
+ const expected = contract.length === 0 ? [0] : contract;
160
+ if (exp?.kind !== 0 || !wrappers.has(exp.index) || !type || !equal(signature(type), expected)) throw new Error(`Missing or wrong ABI export: ${name}`);
161
+ }
162
+ for (const exp of exports.values()) if (exp.kind === 0 && !wrappers.has(exp.index)) throw new Error('Unwrapped function export');
163
+ const stateNames = mutable.map((index) => { const name = `__state_${index}`, exp = exports.get(name); if (exp?.kind !== 3 || exp.index !== index) throw new Error('Missing mutable-global snapshot export'); return name; });
164
+ return { initialPages, maximumPages, globals: stateNames, functions: wrappers.size };
165
+ }
@@ -0,0 +1,126 @@
1
+ /** ABI v2 executable intake: validate actual bytes before any guest code runs.
2
+ * Kept separate from scriptAdmission so shipped v0/v1 contracts stay unchanged. */
3
+ import type { V2Body,V2Instruction,V2Signature } from './scriptModuleV2.ts';
4
+ import { inspectV2Fuel,type V2Lane } from './scriptFuelV2.ts';
5
+ import * as v from 'valibot';
6
+
7
+ /** H13 selects these versioned implementations explicitly. They describe the
8
+ * v2 toolchain only; the shipped v0/v1 compiler and admission remain separate. */
9
+ export const SCRIPT_V2_REVISIONS: Readonly<{abi:2;minor:0;compiler:1;admission:1}> = Object.freeze({ abi: 2,minor: 0,compiler: 1,admission: 1 } as const);
10
+ export const ScriptArtifactV2Schema: v.StrictObjectSchema<{ readonly abi: v.GenericSchema<ScriptArtifactV2RowsInput['abi'], ScriptArtifactV2Rows['abi']>; readonly minor: v.GenericSchema<ScriptArtifactV2RowsInput['minor'], ScriptArtifactV2Rows['minor']>; readonly compilerRevision: v.GenericSchema<ScriptArtifactV2RowsInput['compilerRevision'], ScriptArtifactV2Rows['compilerRevision']>; readonly admissionRevision: v.GenericSchema<ScriptArtifactV2RowsInput['admissionRevision'], ScriptArtifactV2Rows['admissionRevision']>; readonly hash: v.GenericSchema<ScriptArtifactV2RowsInput['hash'], ScriptArtifactV2Rows['hash']>; readonly lane: v.GenericSchema<ScriptArtifactV2RowsInput['lane'], ScriptArtifactV2Rows['lane']>; readonly pages: v.GenericSchema<ScriptArtifactV2RowsInput['pages'], ScriptArtifactV2Rows['pages']>; readonly ioBytes: v.GenericSchema<ScriptArtifactV2RowsInput['ioBytes'], ScriptArtifactV2Rows['ioBytes']>; }, undefined> = v.strictObject({
11
+ abi: v.literal(SCRIPT_V2_REVISIONS.abi),minor: v.literal(SCRIPT_V2_REVISIONS.minor),
12
+ compilerRevision: v.literal(SCRIPT_V2_REVISIONS.compiler),admissionRevision: v.literal(SCRIPT_V2_REVISIONS.admission),
13
+ hash: v.pipe(v.string(),v.length(64),v.regex(/^[a-f0-9]{64}$/u)),lane: v.picklist(['sim','project','view']),
14
+ pages: v.pipe(v.number(),v.integer(),v.minValue(1),v.maxValue(4)),
15
+ ioBytes: v.pipe(v.number(),v.integer(),v.minValue(656),v.maxValue(4*65536)),
16
+ });
17
+ export type ScriptArtifactV2 = Readonly<v.InferOutput<typeof ScriptArtifactV2Schema>>;
18
+ /** Metadata selection is not executable admission or content-hash verification.
19
+ * The native asset owner verifies the hash before lending bytes to its lane. */
20
+ export function parseScriptArtifactV2(input: unknown): ScriptArtifactV2 {
21
+ const row = v.parse(ScriptArtifactV2Schema,input);
22
+ if (row.ioBytes > row.pages*65536) throw new Error('V2 artifact IO exceeds its pages');
23
+ return Object.freeze(row);
24
+ }
25
+
26
+ interface Control { start: number; end: number; type: number; op: number }
27
+ interface Guard { control: Control; type: number; set: number }
28
+ const f32 = 0x7d, f64 = 0x7c;
29
+ function op(code: readonly V2Instruction[],at: number,operation: number,arg?: number): boolean {
30
+ const value = code[at]; return value?.op === operation && (arg === undefined || value.args[0] === arg);
31
+ }
32
+ function finiteGuards(body: V2Body,type: V2Signature,code: readonly V2Instruction[],floatGlobals: ReadonlyMap<number,number>): void {
33
+ const root: Control = { start: -1,end: code.length-1,type: type.result ?? 0x40,op: 0x02 }, controls = [root], stack = [root];
34
+ const branches: { at: number; targets: Control[] }[] = [];
35
+ for (let i = 0; i < code.length; i++) {
36
+ const value = code[i]; if (value === undefined) throw new Error('Missing v2 finite instruction');
37
+ if (value.op >= 0x02 && value.op <= 0x04) {
38
+ const control = { start: i,end: -1,type: value.args[0] ?? -1,op: value.op }; controls.push(control); stack.push(control);
39
+ } else if (value.op === 0x0b) {
40
+ const control = stack.pop(); if (control === undefined) throw new Error('Unbalanced v2 finite control'); control.end = i;
41
+ } else if (value.op === 0x0c || value.op === 0x0d || value.op === 0x0e) {
42
+ branches.push({ at: i,targets: value.args.map(depth => { const target = stack.at(-1-depth); if (target === undefined) throw new Error('Invalid v2 branch depth'); return target; }) });
43
+ } else if (value.op === 0x0f) branches.push({ at: i,targets: [root] });
44
+ }
45
+ const locals = [...type.params,...body.locals], guards: Guard[] = [];
46
+ for (const control of controls) {
47
+ if (control.op !== 0x02 || (control.type !== f32 && control.type !== f64)) continue;
48
+ const at = control.end-13, local = code[at]?.args[0], narrow = control.type === f32;
49
+ if (local === undefined || locals[local] !== control.type || at <= control.start+1 || !op(code,at,0x21,local)) continue;
50
+ const maximum = code[at+6]?.literal, expected = narrow ? Math.fround(3.4028234663852886e38) : Number.MAX_VALUE;
51
+ if (maximum !== expected) continue;
52
+ const shape: readonly [number,number | undefined][] = [[0x20,local],[0x20,local],[narrow ? 0x5c : 0x62,undefined],[0x20,local],
53
+ [narrow ? 0x8b : 0x99,undefined],[narrow ? 0x43 : 0x44,undefined],[narrow ? 0x5e : 0x64,undefined],[0x72,undefined],[0x04,0x40],[0x00,undefined],[0x0b,undefined],[0x20,local],[0x0b,undefined]];
54
+ if (shape.every(([operation,arg],i) => op(code,at+1+i,operation,arg))) guards.push({ control,type: control.type,set: at });
55
+ }
56
+ const byEnd = new Map(guards.map(guard => [guard.control.end,guard])), checkedReinterpret = new Map(guards.map(guard => [guard.set-1,guard.type]));
57
+ const protectedControls = new Set(guards.map(guard => guard.control));
58
+ for (const branch of branches) if (branch.targets.some(target => protectedControls.has(target))) throw new Error('Branch bypasses a v2 finite guard');
59
+ for (let i = 0; i < code.length; i++) {
60
+ const value = code[i]; if (value === undefined) throw new Error('Missing v2 finite instruction');
61
+ const width = value.op === 0x38 || value.op === 0xbc ? f32 : value.op === 0x39 || value.op === 0xbd ? f64
62
+ : value.op === 0x24 ? floatGlobals.get(value.args[0] ?? -1) : undefined;
63
+ if (width !== undefined) {
64
+ const actual = byEnd.get(i-1)?.type;
65
+ if (actual === undefined || actual !== width) throw new Error('Missing v2 finite input guard');
66
+ }
67
+ if ((value.op === 0xbe && checkedReinterpret.get(i) !== f32) || (value.op === 0xbf && checkedReinterpret.get(i) !== f64)) throw new Error('Missing v2 finite reinterpret guard');
68
+ }
69
+ }
70
+ export interface ScriptAdmissionV2 {
71
+ initialPages: number; maximumPages: number; globals: readonly string[];
72
+ fuel: number; lane: V2Lane; io: number; ioBytes: number; entries: ReadonlyMap<string,number>;
73
+ }
74
+ /** G782: a page admits one module once per exact bytes and options. Nalati's crossing admitted its titan return module
75
+ * three or four times (220 ms of admission on a phone-4x cold crossing). Same bytes, same verdict; a refusal is never
76
+ * kept, and every hit compares the whole byte array. The key is the I/O size alone (T10): a runtime module has exactly
77
+ * one work entry, so a requested lane admits only when it is the admitted one, and the contract (lane 'project'), the
78
+ * projection and its ScriptModuleV2 (no lane) each inspected the same Nalati module again, ~5 ms an owner at phone 4x. */
79
+ const RECENT_ADMISSIONS = 16, recentAdmissions: { readonly key: string; readonly bytes: Uint8Array; readonly admission: ScriptAdmissionV2 }[] = [];
80
+ /** No instantiation, getters or initialization occurs during admission. The
81
+ * runtime must still validate host-owned output regions before publishing. */
82
+ export function admitScriptV2(bytes: Uint8Array,options: { readonly ioBytes?: number; readonly lane?: V2Lane; readonly compilerRevision?: number; readonly admissionRevision?: number } = {}): ScriptAdmissionV2 {
83
+ if ((options.compilerRevision !== undefined && options.compilerRevision !== SCRIPT_V2_REVISIONS.compiler)
84
+ || (options.admissionRevision !== undefined && options.admissionRevision !== SCRIPT_V2_REVISIONS.admission)) throw new Error('Unsupported v2 compiler/admission revision');
85
+ const key = String(options.ioBytes ?? 656), known = recentAdmissions.find(row => row.key === key && sameBytes(row.bytes,bytes));
86
+ if (known !== undefined) {
87
+ if (options.lane !== undefined && options.lane !== known.admission.lane) throw new Error('V2 lane has missing or extra work entries');
88
+ return { ...known.admission };
89
+ }
90
+ const admission = inspectAdmission(bytes,options);
91
+ recentAdmissions.unshift({ key,bytes: bytes.slice(),admission }); recentAdmissions.length = Math.min(recentAdmissions.length,RECENT_ADMISSIONS);
92
+ return { ...admission };
93
+ }
94
+ function sameBytes(a: Uint8Array,b: Uint8Array): boolean {
95
+ if (a.byteLength !== b.byteLength) return false;
96
+ for (let i = 0; i < a.byteLength; i++) if (a[i] !== b[i]) return false;
97
+ return true;
98
+ }
99
+ function inspectAdmission(bytes: Uint8Array,options: { readonly ioBytes?: number; readonly lane?: V2Lane }): ScriptAdmissionV2 {
100
+ const fuel = inspectV2Fuel(bytes,options), image = fuel.image;
101
+ const floats = new Map(image.globals.flatMap((global,index): [number,number][] => global.type === f32 || global.type === f64 ? [[index,global.type]] : []));
102
+ for (let i = 0; i < image.bodies.length; i++) {
103
+ const body = image.bodies[i], type = image.types[image.functions[i] ?? -1], code = fuel.unmetered[i];
104
+ if (body === undefined || type === undefined || code === undefined) throw new Error('Missing v2 finite body'); finiteGuards(body,type,code,floats);
105
+ }
106
+ const index = image.exports.get('ws_io')?.index, io = image.bodies[index ?? -1]?.code[0]?.literal;
107
+ if (typeof io !== 'number') throw new Error('Missing v2 IO constant');
108
+ const ioBytes = options.ioBytes ?? 656;
109
+ if (!Number.isSafeInteger(ioBytes) || ioBytes < 656 || ioBytes > image.pages*65536-io) throw new Error('V2 IO does not fit fixed memory');
110
+ if (image.data.some(row => row.length > 0 && row.offset < io+ioBytes && row.offset+row.length > io)) throw new Error('V2 static data overlaps host IO');
111
+ return { initialPages: fuel.pages,maximumPages: fuel.pages,globals: fuel.globals,fuel: fuel.fuel,lane: fuel.lane,io,ioBytes,entries: fuel.entries };
112
+ }
113
+
114
+ /** Admitted data contracts, independent of validator implementation metadata. */
115
+ export type ScriptArtifactV2RowsInput = ScriptArtifactV2Rows;
116
+ interface ScriptArtifactV2RowsFields {
117
+ abi: (typeof SCRIPT_V2_REVISIONS)['abi'];
118
+ minor: (typeof SCRIPT_V2_REVISIONS)['minor'];
119
+ compilerRevision: (typeof SCRIPT_V2_REVISIONS)['compiler'];
120
+ admissionRevision: (typeof SCRIPT_V2_REVISIONS)['admission'];
121
+ hash: string;
122
+ lane: 'sim' | 'project' | 'view';
123
+ pages: number;
124
+ ioBytes: number;
125
+ }
126
+ export type ScriptArtifactV2Rows = { [Key in keyof ScriptArtifactV2RowsFields]: ScriptArtifactV2RowsFields[Key] };
@@ -0,0 +1,170 @@
1
+ import { isJsonData } from './json.ts';
2
+ import { SpawnScriptsSchema } from './spawnScripts.ts';
3
+ import * as v from 'valibot';
4
+ import { admitScript, type ScriptAdmission } from './scriptAdmission.ts';
5
+ import { admitScriptV2, SCRIPT_V2_REVISIONS, type ScriptAdmissionV2 } from './scriptAdmissionV2.ts';
6
+ import { DecisionScriptsSchema, parseDecisionScripts, type DecisionScripts } from './decisionScripts.ts';
7
+
8
+ /** Fixed ABI2 byte admission metadata, independent of execution or source sniffing. */
9
+ export const ScriptV2ContractSchema: v.StrictObjectSchema<{ readonly abi: v.GenericSchema<ScriptV2ContractRowsInput['abi'], ScriptV2ContractRows['abi']>; readonly lane: v.GenericSchema<ScriptV2ContractRowsInput['lane'], ScriptV2ContractRows['lane']>; readonly pages: v.GenericSchema<ScriptV2ContractRowsInput['pages'], ScriptV2ContractRows['pages']>; readonly ioBytes: v.GenericSchema<ScriptV2ContractRowsInput['ioBytes'], ScriptV2ContractRows['ioBytes']>; readonly compilerRevision: v.GenericSchema<ScriptV2ContractRowsInput['compilerRevision'], ScriptV2ContractRows['compilerRevision']>; readonly admissionRevision: v.GenericSchema<ScriptV2ContractRowsInput['admissionRevision'], ScriptV2ContractRows['admissionRevision']>; }, undefined> = v.strictObject({ abi: v.literal(2), lane: v.picklist(['sim', 'project', 'view']), pages: v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(4)),
10
+ ioBytes: v.pipe(v.number(), v.integer(), v.minValue(656), v.maxValue(4 * 65536)),
11
+ compilerRevision: v.literal(SCRIPT_V2_REVISIONS.compiler), admissionRevision: v.literal(SCRIPT_V2_REVISIONS.admission) });
12
+ /** Explicit byte-admission contract. It is build metadata, never an extra output-index field. */
13
+ export const ScriptContractSchema: v.GenericSchema<ScriptContractInput, ScriptContract> = v.variant('abi', [
14
+ v.strictObject({ abi: v.literal(0) }),
15
+ v.strictObject({ abi: v.literal(1), pages: v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(4)) }),
16
+ ScriptV2ContractSchema,
17
+ ]);
18
+
19
+ /** An explicit view module survives named-file reconstruction, disk and worker transport. */
20
+ export const ViewModuleSchema: v.StrictObjectSchema<{ readonly id: v.GenericSchema<ViewModuleRowInput['id'], ViewModuleRow['id']>; readonly module: v.GenericSchema<ViewModuleRowInput['module'], ViewModuleRow['module']>; readonly side: v.GenericSchema<ViewModuleRowInput['side'], ViewModuleRow['side']>; readonly abi: v.GenericSchema<ViewModuleRowInput['abi'], ViewModuleRow['abi']>; readonly lane: v.GenericSchema<ViewModuleRowInput['lane'], ViewModuleRow['lane']>; readonly pages: v.GenericSchema<ViewModuleRowInput['pages'], ViewModuleRow['pages']>; readonly ioBytes: v.GenericSchema<ViewModuleRowInput['ioBytes'], ViewModuleRow['ioBytes']>; readonly compilerRevision: v.GenericSchema<ViewModuleRowInput['compilerRevision'], ViewModuleRow['compilerRevision']>; readonly admissionRevision: v.GenericSchema<ViewModuleRowInput['admissionRevision'], ViewModuleRow['admissionRevision']>; }, undefined> = v.strictObject({ id: v.pipe(v.string(), v.minLength(1), v.maxLength(128)),
21
+ module: v.pipe(v.string(), v.regex(/^blobs\/wasm\/[a-f0-9]{64}\.wasm$/u)), side: v.literal('view'),
22
+ ...ScriptV2ContractSchema.entries, lane: v.literal('view') });
23
+ export const ViewModulesSchema: v.GenericSchema<ViewModuleRowsInput, ViewModuleRows> = v.pipe(v.array(ViewModuleSchema), v.maxLength(64),
24
+ v.check(rows => new Set(rows.map(row => row.id)).size === rows.length && new Set(rows.map(row => row.module)).size === rows.length, 'Unique view module ids and paths'));
25
+
26
+ const OwnedSimModuleSchema: v.GenericSchema<OwnedSimModuleRowsInput, OwnedSimModuleRows> = v.strictObject({ ...ViewModuleSchema.entries,side: v.literal('sim'),lane: v.literal('sim') });
27
+ /** Stateless project modules use the same persistent inventory as legacy return
28
+ * policies, never view or scheduled spawn declarations. */
29
+ const ProjectModuleSchema = v.strictObject({ ...ViewModuleSchema.entries,side: v.literal('sim'),lane: v.literal('project') });
30
+ const ProjectReturnModulesSchema = v.pipe(v.unknown(),v.check(isJsonData,'plain JSON return modules'),
31
+ v.array(v.union([DecisionScriptsSchema.pipe[2].item,ProjectModuleSchema])),v.maxLength(64),
32
+ v.check(rows=>new Set(rows.map(row=>row.id)).size===rows.length,'unique return module ids'),
33
+ v.check(rows=>new Set(rows.map(row=>row.module)).size<=8,'at most eight return modules'),
34
+ v.check(rows=>rows.reduce((count,row)=>count+(row.abi!==2&&'spawnGroup' in row.binding?Object.keys(row.actors).length:1),0)<=64,'at most 64 logical return bindings'),
35
+ v.check(rows=>rows.some(row=>row.abi===2),'explicit project module required'));
36
+ export const ReturnModulesSchema: v.GenericSchema<ReturnModuleRowsInput, ReturnModuleRows> = v.union([DecisionScriptsSchema,ProjectReturnModulesSchema]);
37
+ export type ReturnModuleRow = v.InferOutput<typeof ReturnModulesSchema>[number];
38
+ const OwnedV2ModulesSchema = v.array(v.union([ViewModuleSchema,OwnedSimModuleSchema,ProjectModuleSchema]));
39
+ export type ScriptAdmissionRows = readonly (DecisionScripts[number] | ViewModuleRow | v.InferOutput<typeof OwnedSimModuleSchema> | ReturnModuleRow)[];
40
+ /** Admit the declared ABI, including instrumentation; v1 and v2 fixed memory must match its row exactly. A v2 module is
41
+ * admitted (admitScriptV2, its declared lane, I/O and revisions) on a copy of its bytes, before anything instantiates it. */
42
+ export function admitScriptContract(bytes: Uint8Array, input: Extract<ScriptContract, { abi: 0 | 1 }>): ScriptAdmission;
43
+ export function admitScriptContract(bytes: Uint8Array, input: Extract<ScriptContract, { abi: 2 }>): ScriptAdmissionV2;
44
+ export function admitScriptContract(bytes: Uint8Array, input: ScriptContract): ScriptAdmission | ScriptAdmissionV2;
45
+ export function admitScriptContract(bytes: Uint8Array, input: ScriptContract): ScriptAdmission | ScriptAdmissionV2 {
46
+ const contract = v.parse(ScriptContractSchema, input);
47
+ if (contract.abi === 2) {
48
+ if (contract.ioBytes > contract.pages * 65536) throw new Error('V2 script I/O exceeds its pages');
49
+ const { lane, ioBytes, compilerRevision, admissionRevision } = contract;
50
+ const admitted = admitScriptV2(Uint8Array.from(bytes), { lane, ioBytes, compilerRevision, admissionRevision });
51
+ if (admitted.initialPages !== contract.pages || admitted.maximumPages !== contract.pages) throw new Error('V2 script fixed pages differ from declaration');
52
+ return admitted;
53
+ }
54
+ const admitted = admitScript(bytes, contract.abi);
55
+ if (contract.abi === 1 && (admitted.initialPages !== contract.pages || admitted.maximumPages !== contract.pages)) throw new Error('Decision script fixed pages differ from declaration');
56
+ return admitted;
57
+ }
58
+ /** Read only the declared platform payload; absent rows retain the separate legacy v0 format. */
59
+ export function decisionScriptsFromSections(sections?: ReadonlyMap<string, unknown>): DecisionScripts {
60
+ return sections?.has('sim/scripts') === true ? parseDecisionScripts(sections.get('sim/scripts')) : [];
61
+ }
62
+ /** Resolve complete module paths against the inventory, never by sniffing bytes or matching a loose filename. */
63
+ export function decisionModuleContracts(input: ScriptAdmissionRows, files: readonly { hash: string; kind: string; path?: string }[]): ReadonlyMap<string, Extract<ScriptContract, { abi: 1 | 2 }>> {
64
+ const decisions = parseDecisionScripts(input.filter(row => row.abi !== 2));
65
+ const views = v.parse(OwnedV2ModulesSchema, input.filter(row => row.abi === 2));
66
+ const rows = [...decisions, ...views], contracts = new Map<string, Extract<ScriptContract, { abi: 1 | 2 }>>(), sides = new Map<string, string>();
67
+ if (new Set(rows.map(row => row.id)).size !== rows.length) throw new Error('Duplicate script admission id');
68
+ for (const row of rows) {
69
+ const file = files.find(value => value.kind === 'wasm' && `blobs/wasm/${value.hash}.wasm` === row.module && (value.path === undefined || value.path === row.module));
70
+ if (file === undefined) throw new Error('Decision script module is not an exact declared Wasm path');
71
+ const contract = row.abi === 2 ? v.parse(ScriptV2ContractSchema, { abi: row.abi, lane: row.lane, pages: row.pages, ioBytes: row.ioBytes,
72
+ compilerRevision: row.compilerRevision, admissionRevision: row.admissionRevision }) : { abi: 1 as const, pages: row.pages };
73
+ const old = contracts.get(file.hash);
74
+ if (old !== undefined && (JSON.stringify(old) !== JSON.stringify(contract) || sides.get(file.hash) !== row.side)) throw new Error('Conflicting decision module contracts');
75
+ contracts.set(file.hash, contract); sides.set(file.hash, row.side);
76
+ }
77
+ return contracts;
78
+ }
79
+
80
+ /** Every explicitly owned v1 module participates in byte, memory and inventory admission. */
81
+ export function scriptAdmissionRows(sections?: ReadonlyMap<string, unknown>): ScriptAdmissionRows {
82
+ const spawn = v.parse(SpawnScriptsSchema, sections?.get('actors/spawn-scripts') ?? []);
83
+ const returns = v.parse(ReturnModulesSchema,sections?.get('actors/return-scripts') ?? []);
84
+ const decisions = parseDecisionScripts([...decisionScriptsFromSections(sections), ...spawn.map(row => row.script),
85
+ ...returns.filter(row=>row.abi!==2)]);
86
+ const owned = spawn.flatMap(row => row.v2 === undefined ? [] : [{ abi: 2 as const,id: `${row.step}:v2`,side: 'sim' as const,lane: 'sim' as const,module: `blobs/wasm/${row.v2.artifact.hash}.wasm`,pages: row.v2.artifact.pages,ioBytes: row.v2.artifact.ioBytes,compilerRevision: row.v2.artifact.compilerRevision,admissionRevision: row.v2.artifact.admissionRevision }]);
87
+ return [...decisions, ...v.parse(ViewModulesSchema, sections?.get('view/modules') ?? []),...owned,...returns.filter(row=>row.abi===2)];
88
+ }
89
+
90
+ /** Fresh v1 memory is consumed only by stateful sim decisions, once per module.
91
+ * Validate the complete inventory first; stateless returns/spawns and v2/view
92
+ * modules retain their existing admission and separate memory ownership. */
93
+ export function decisionMemoryPreparationPages(sections?: ReadonlyMap<string, unknown>): readonly number[] {
94
+ const inventory = scriptAdmissionRows(sections);
95
+ const decisions = new Set(decisionScriptsFromSections(sections).map(row => row.id));
96
+ const modules = new Map<string, number>();
97
+ for (const row of inventory) {
98
+ if (row.abi === 2 || !decisions.has(row.id)) continue;
99
+ const previous = modules.get(row.module);
100
+ if (previous !== undefined && previous !== row.pages) throw new Error('Conflicting decision memory pages');
101
+ modules.set(row.module, row.pages);
102
+ }
103
+ return [...modules.values()];
104
+ }
105
+
106
+ /** Admitted data contracts, independent of validator implementation metadata. */
107
+ export type OwnedSimModuleRowsInput = Omit<ViewModuleRowInput, keyof ({
108
+ side: 'sim';
109
+ lane: 'sim';
110
+ })> & {
111
+ side: 'sim';
112
+ lane: 'sim';
113
+ };
114
+ export type OwnedSimModuleRows = Omit<ViewModuleRow, keyof ({
115
+ side: 'sim';
116
+ lane: 'sim';
117
+ })> & {
118
+ side: 'sim';
119
+ lane: 'sim';
120
+ };
121
+ export type ScriptV2ContractRowsInput = ScriptV2ContractRows;
122
+ interface ScriptV2ContractRowsFields {
123
+ abi: 2;
124
+ lane: 'sim' | 'project' | 'view';
125
+ pages: number;
126
+ ioBytes: number;
127
+ compilerRevision: (typeof SCRIPT_V2_REVISIONS)['compiler'];
128
+ admissionRevision: (typeof SCRIPT_V2_REVISIONS)['admission'];
129
+ }
130
+ export type ScriptV2ContractRows = { [Key in keyof ScriptV2ContractRowsFields]: ScriptV2ContractRowsFields[Key] };
131
+ export type ScriptContractInput = ({
132
+ abi: 0;
133
+ }) | ({
134
+ abi: 1;
135
+ pages: number;
136
+ }) | (ScriptV2ContractRowsInput);
137
+ export type ScriptContract = ({
138
+ abi: 0;
139
+ }) | ({
140
+ abi: 1;
141
+ pages: number;
142
+ }) | (ScriptV2ContractRows);
143
+ export type ViewModuleRowInput = Omit<Omit<{
144
+ id: string;
145
+ module: string;
146
+ side: 'view';
147
+ }, keyof (ScriptV2ContractRowsInput)> & ScriptV2ContractRowsInput, keyof ({
148
+ lane: 'view';
149
+ })> & {
150
+ lane: 'view';
151
+ };
152
+ export type ViewModuleRow = Omit<Omit<{
153
+ id: string;
154
+ module: string;
155
+ side: 'view';
156
+ }, keyof (ScriptV2ContractRows)> & ScriptV2ContractRows, keyof ({
157
+ lane: 'view';
158
+ })> & {
159
+ lane: 'view';
160
+ };
161
+ export type ViewModuleRowsInput = (ViewModuleRowInput)[];
162
+ export type ViewModuleRows = (ViewModuleRow)[];
163
+ export type ReturnModuleRowsInput = unknown;
164
+ export type ReturnModuleRows = (v.InferOutput<typeof DecisionScriptsSchema>) | (((v.InferOutput<(typeof DecisionScriptsSchema)['pipe'][2]['item']>) | (Omit<ViewModuleRow, keyof ({
165
+ side: 'sim';
166
+ lane: 'project';
167
+ })> & {
168
+ side: 'sim';
169
+ lane: 'project';
170
+ }))[]);
@@ -0,0 +1,124 @@
1
+ /** ABI v2 fuel verification. This is one prerequisite of complete admission,
2
+ * not permission to instantiate an image by itself. */
3
+ import { SCRIPT_ABI } from './scriptAbi.ts';
4
+ import { readV2Module,type V2Instruction,type V2Module,type V2Signature } from './scriptModuleV2.ts';
5
+
6
+ export const V2_ENTRY_SIGNATURES: Readonly<Record<string,readonly number[]>> = Object.freeze({
7
+ ws_init: [0x7f,0x7f,0x7f], ws_step: [0x7f,0x7f], ws_project: [0x7f], ws_view: [0x7c,0x7c,0x7f],
8
+ });
9
+ export const V2_WORK_ENTRIES: Readonly<{ sim: "ws_step"; project: "ws_project"; view: "ws_view"; }> = Object.freeze({ sim: 'ws_step',project: 'ws_project',view: 'ws_view' });
10
+ export type V2Lane = keyof typeof V2_WORK_ENTRIES;
11
+ /** Runtime modules have exactly one work entry; build input may select one of
12
+ * several authored exports before the others are removed. */
13
+ export function v2Lane(image: V2Module,requested?: V2Lane,build = false): V2Lane {
14
+ const present = Object.entries(V2_WORK_ENTRIES).filter(([,name]) => image.exports.has(name));
15
+ if (requested !== undefined) {
16
+ if (!Object.hasOwn(V2_WORK_ENTRIES,requested) || !image.exports.has(V2_WORK_ENTRIES[requested]) || (!build && present.length !== 1)) throw new Error('V2 lane has missing or extra work entries'); return requested;
17
+ }
18
+ const lane = present.length === 1 ? present[0]?.[0] : undefined;
19
+ if (lane !== 'sim' && lane !== 'project' && lane !== 'view') throw new Error('Select one explicit v2 lane'); return lane;
20
+ }
21
+ /** H0 measured >15% overhead on tiny blocks. Coalesce each acyclic control
22
+ * region, precharging its scalar instruction count once. Conditional paths
23
+ * may consume fewer instructions than charged; nested loop bodies belong to
24
+ * their own region and are charged again at every loop back-edge. Calls charge
25
+ * their own bodies, while their call opcode belongs to this region. */
26
+ export function v2BlockCosts(code: readonly V2Instruction[],constantCalls: ReadonlyMap<number,number> = new Map()): ReadonlyMap<number,number> {
27
+ const costs = new Map<number,number>([[0,0]]), regions = [0], controls: boolean[] = [];
28
+ for (let i = 0; i < code.length; i++) {
29
+ const op = code[i]?.op, region = regions.at(-1); if (region === undefined) throw new Error('Invalid v2 region');
30
+ costs.set(region,(costs.get(region) ?? 0)+1+(op === 0x10 ? constantCalls.get(code[i]?.args[0] ?? -1) ?? 0 : 0));
31
+ if (op === 0x02 || op === 0x03 || op === 0x04) {
32
+ controls.push(op === 0x03);
33
+ if (op === 0x03) { regions.push(i+1); costs.set(i+1,0); }
34
+ } else if (op === 0x0b && controls.pop() === true) regions.pop();
35
+ }
36
+ return costs;
37
+ }
38
+ function same(a: readonly number[],b: readonly number[]): boolean { return a.length === b.length && a.every((value,i) => value === b[i]); }
39
+ function signature(image: V2Module,index: number): V2Signature {
40
+ const result = image.types[image.functions[index] ?? -1]; if (result === undefined) throw new Error('Missing v2 function signature'); return result;
41
+ }
42
+ function instruction(code: readonly V2Instruction[],at: number,op: number,arg?: number): boolean {
43
+ const value = code[at]; return value?.op === op && (arg === undefined || (op === 0x41 ? value.literal === arg : value.args[0] === arg));
44
+ }
45
+ function chargeAt(code: readonly V2Instruction[],at: number,fuel: number): number | undefined {
46
+ const cost = code[at+1]?.literal;
47
+ if (typeof cost !== 'number' || !Number.isInteger(cost) || cost < 1 || cost > SCRIPT_ABI.maxBytes) return undefined;
48
+ const shape: readonly [number,number | undefined][] = [[0x23,fuel],[0x41,cost],[0x6b,undefined],[0x24,fuel],[0x23,fuel],[0x41,0],[0x48,undefined],[0x04,0x40],[0x00,undefined],[0x0b,undefined]];
49
+ return shape.every(([op,arg],i) => instruction(code,at+i,op,arg)) ? cost : undefined;
50
+ }
51
+ export interface V2FuelInspection {
52
+ /** Same structural parse checked for fuel; finite/IO admission is still required. */
53
+ readonly image: V2Module;
54
+ fuel: number; lane: V2Lane; globals: readonly string[]; pages: number;
55
+ entries: ReadonlyMap<string,number>; unmetered: readonly (readonly V2Instruction[])[];
56
+ }
57
+ /** Verify the actual bytes, including all charge writes and all possible direct
58
+ * calls, without invoking getters, init, start or any other guest function. */
59
+ export function inspectV2Fuel(bytes: Uint8Array,options: { readonly lane?: V2Lane } = {}): V2FuelInspection {
60
+ const image = readV2Module(bytes), lane = v2Lane(image,options.lane), fuel = image.globals.length-1, privateGlobal = image.globals[fuel];
61
+ if (privateGlobal?.type !== 0x7f || !privateGlobal.mutable || privateGlobal.value !== 0) throw new Error('Missing private v2 fuel global');
62
+ const entries = new Map<string,number>(), getters = new Set<number>(), implementations = new Set<number>(), globals: string[] = [];
63
+ for (const name of ['ws_init',V2_WORK_ENTRIES[lane]]) {
64
+ const params = V2_ENTRY_SIGNATURES[name]; if (params === undefined) throw new Error('Missing v2 entry contract');
65
+ const entry = image.exports.get(name); if (entry?.kind !== 0) throw new Error('Missing v2 fueled entry');
66
+ const type = signature(image,entry.index); if (type.result !== 0x7f || !same(type.params,params) || [...entries.values()].includes(entry.index)) throw new Error('Wrong v2 entry signature or alias');
67
+ entries.set(name,entry.index);
68
+ }
69
+ for (const name of ['ws_abi','ws_io']) {
70
+ const exp = image.exports.get(name); if (exp?.kind !== 0) throw new Error('Missing v2 constant getter');
71
+ const type = signature(image,exp.index), code = image.bodies[exp.index]?.code, value = code?.[0]?.literal;
72
+ if (type.params.length > 0 || type.result !== 0x7f || code?.length !== 2 || !instruction(code,0,0x41) || !instruction(code,1,0x0b) || typeof value !== 'number'
73
+ || (name === 'ws_abi' ? value !== 2 : value < 0 || value%8 !== 0 || value > image.pages*65536-656)) throw new Error('Invalid v2 constant getter');
74
+ getters.add(exp.index);
75
+ }
76
+ for (let i = 0; i < image.globals.length; i++) if (i !== fuel && image.globals[i]?.mutable) {
77
+ const name = `__state_${i}`, exp = image.exports.get(name); if (exp?.kind !== 3 || exp.index !== i) throw new Error('Missing v2 mutable-global snapshot'); globals.push(name);
78
+ }
79
+ const allowedFunctions = new Set([...entries.values(),...getters]);
80
+ for (const [name,exp] of image.exports) {
81
+ if (exp.kind === 0 && (!allowedFunctions.has(exp.index) || !(entries.has(name) || name === 'ws_abi' || name === 'ws_io'))) throw new Error('Unexpected v2 function export');
82
+ if (exp.kind === 3 && (exp.index === fuel || name !== `__state_${exp.index}` || !image.globals[exp.index]?.mutable)) throw new Error('V2 fuel exported or noncanonical global alias');
83
+ }
84
+ for (const index of entries.values()) {
85
+ const body = image.bodies[index]; if (body === undefined) throw new Error('Missing v2 entry wrapper');
86
+ if (body.locals.length > 0) throw new Error('Invalid v2 entry wrapper');
87
+ const params = signature(image,index).params, code = body.code, target = code[8+params.length]?.args[0];
88
+ if (target === undefined || allowedFunctions.has(target) || implementations.has(target)) throw new Error('Invalid v2 entry target');
89
+ const type = signature(image,target); if (type.result !== 0x7f || !same(type.params,params)) throw new Error('V2 entry implementation signature');
90
+ const expected: [number,number | undefined][] = [[0x20,params.length-1],[0x24,fuel],[0x23,fuel],[0x41,0],[0x48,undefined],[0x04,0x40],[0x00,undefined],[0x0b,undefined],
91
+ ...params.map((_,i): [number,number] => [0x20,i]),[0x10,target],[0x1a,undefined],[0x23,fuel],[0x0b,undefined]];
92
+ if (code.length !== expected.length || expected.some(([op,arg],i) => !instruction(code,i,op,arg))) throw new Error('Invalid v2 entry fuel setup');
93
+ implementations.add(target);
94
+ }
95
+ const unmetered: V2Instruction[][] = [], calls: number[][] = [];
96
+ for (let index = 0; index < image.bodies.length; index++) {
97
+ const body = image.bodies[index]; if (body === undefined) throw new Error('Missing v2 body');
98
+ if (allowedFunctions.has(index)) { unmetered.push([...body.code]); calls.push(body.code.filter(value => value.op === 0x10).map(value => value.args[0] ?? -1)); continue; }
99
+ const plain: V2Instruction[] = [], charges = new Map<number,number>(), edges: number[] = [];
100
+ for (let at = 0; at < body.code.length;) {
101
+ const cost = chargeAt(body.code,at,fuel);
102
+ if (cost !== undefined) { if (charges.has(plain.length)) throw new Error('Duplicate v2 block charge'); charges.set(plain.length,cost); at += 10; continue; }
103
+ const value = body.code[at++]; if (value === undefined) throw new Error('Missing v2 instruction');
104
+ if (value.op === 0x24 && value.args[0] === fuel) throw new Error('V2 fuel access outside a verified charge');
105
+ if (value.op === 0x10) {
106
+ const target = value.args[0]; if (target === undefined || [...entries.values()].includes(target) || implementations.has(target)) throw new Error('Guest calls a v2 entry or its implementation'); edges.push(target);
107
+ }
108
+ plain.push(value);
109
+ }
110
+ const costs = v2BlockCosts(plain,new Map([...getters].map(target => [target,2])));
111
+ if (costs.size !== charges.size || [...costs].some(([at,cost]) => charges.get(at) !== cost)) throw new Error('Missing or underpriced v2 basic block region');
112
+ unmetered.push(plain); calls.push(edges);
113
+ }
114
+ const depths = new Map<number,number>(), active = new Set<number>();
115
+ const visit = (index: number): number => {
116
+ const previous = depths.get(index); if (previous !== undefined) return previous;
117
+ if (active.has(index)) throw new Error('V2 call graph cycle'); if (active.size >= SCRIPT_ABI.callDepth) throw new Error('V2 call graph depth exceeds 64');
118
+ active.add(index); let depth = 1;
119
+ for (const target of calls[index] ?? []) depth = Math.max(depth,visit(target)+1);
120
+ active.delete(index); if (depth > SCRIPT_ABI.callDepth) throw new Error('V2 call graph depth exceeds 64'); depths.set(index,depth); return depth;
121
+ };
122
+ for (let i = 0; i < image.bodies.length; i++) visit(i);
123
+ return { image,fuel,lane,globals,pages: image.pages,entries,unmetered };
124
+ }