@wildshard/shard-format 0.0.1 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (748) 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 +508 -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 +295 -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/issue-codes.ts +262 -0
  507. package/src/format/items.ts +229 -0
  508. package/src/format/json.ts +143 -0
  509. package/src/format/keyedSky.ts +314 -0
  510. package/src/format/kitFigure.ts +68 -0
  511. package/src/format/ktx2Cost.ts +47 -0
  512. package/src/format/ledger.ts +56 -0
  513. package/src/format/liftApproach.ts +75 -0
  514. package/src/format/liftRider.ts +10 -0
  515. package/src/format/lightEmitters.ts +105 -0
  516. package/src/format/lights.ts +135 -0
  517. package/src/format/limbCollision.ts +136 -0
  518. package/src/format/limbPopulation.ts +33 -0
  519. package/src/format/limbRig.ts +202 -0
  520. package/src/format/loadout.ts +156 -0
  521. package/src/format/look-light.ts +153 -0
  522. package/src/format/lootBag.ts +145 -0
  523. package/src/format/lootEconomy.ts +235 -0
  524. package/src/format/materialFamilies.ts +565 -0
  525. package/src/format/materialGraph.ts +1220 -0
  526. package/src/format/materials.ts +449 -0
  527. package/src/format/memoryAdmission.ts +84 -0
  528. package/src/format/memoryGates.json +7 -0
  529. package/src/format/meshCollision.ts +56 -0
  530. package/src/format/meshCollisionAssets.ts +19 -0
  531. package/src/format/meshCollisionBytes.ts +102 -0
  532. package/src/format/meshEntryways.ts +54 -0
  533. package/src/format/meshopt-decoder.wasm +0 -0
  534. package/src/format/meshopt-module.ts +177 -0
  535. package/src/format/meshopt-static.mjs +11 -0
  536. package/src/format/meshopt-wasm.ts +61 -0
  537. package/src/format/migrations.ts +209 -0
  538. package/src/format/minimap.ts +1052 -0
  539. package/src/format/mixedPopulation.ts +222 -0
  540. package/src/format/modes.ts +304 -0
  541. package/src/format/mountedSpecimenRows.ts +64 -0
  542. package/src/format/moverLifecycle.ts +34 -0
  543. package/src/format/moverMotion.ts +271 -0
  544. package/src/format/movers.ts +224 -0
  545. package/src/format/namedJsonContracts.ts +423 -0
  546. package/src/format/nativeActors.ts +45 -0
  547. package/src/format/nativeAssembly.ts +141 -0
  548. package/src/format/nativeGround.ts +37 -0
  549. package/src/format/nativeGroundAssets.ts +35 -0
  550. package/src/format/nativeItems.ts +184 -0
  551. package/src/format/nativePhysics.ts +140 -0
  552. package/src/format/nativeQuestComposition.ts +398 -0
  553. package/src/format/nativeRiding.ts +103 -0
  554. package/src/format/nativeRuntimePlan.ts +89 -0
  555. package/src/format/navigation.ts +99 -0
  556. package/src/format/navigationBytes.ts +111 -0
  557. package/src/format/nearPlaceholder.ts +111 -0
  558. package/src/format/nearPlaceholderAssets.ts +23 -0
  559. package/src/format/netCommand.ts +11 -0
  560. package/src/format/npcs.ts +546 -0
  561. package/src/format/outputAddress.ts +11 -0
  562. package/src/format/outputDownload.ts +34 -0
  563. package/src/format/outputFields.ts +123 -0
  564. package/src/format/outputIndex.ts +352 -0
  565. package/src/format/overdraw.ts +41 -0
  566. package/src/format/pageLife.ts +303 -0
  567. package/src/format/pagePreparation.ts +60 -0
  568. package/src/format/paintedLook.ts +55 -0
  569. package/src/format/paintedResources.ts +158 -0
  570. package/src/format/panelTemplate.ts +139 -0
  571. package/src/format/placeholderSource.ts +209 -0
  572. package/src/format/platformDataSections.ts +146 -0
  573. package/src/format/platformFileFamilies.ts +299 -0
  574. package/src/format/plumbing.ts +165 -0
  575. package/src/format/populationEnvironment.ts +210 -0
  576. package/src/format/populationKeeper.ts +163 -0
  577. package/src/format/populationProjection.ts +496 -0
  578. package/src/format/populationRespawn.ts +48 -0
  579. package/src/format/populationRoster.ts +158 -0
  580. package/src/format/portalFloor.ts +56 -0
  581. package/src/format/portalLink.ts +112 -0
  582. package/src/format/portalLinkAssets.ts +42 -0
  583. package/src/format/portalRide.ts +22 -0
  584. package/src/format/postGraphDocument.ts +36 -0
  585. package/src/format/postGraphLook.ts +477 -0
  586. package/src/format/postStack.ts +114 -0
  587. package/src/format/practiceCourseRows.ts +466 -0
  588. package/src/format/preflight.ts +155 -0
  589. package/src/format/presentation.ts +33 -0
  590. package/src/format/product-audio.ts +76 -0
  591. package/src/format/product-reads.ts +178 -0
  592. package/src/format/product-stream-admit.ts +114 -0
  593. package/src/format/product-stream-assets.ts +511 -0
  594. package/src/format/product-stream-facts.ts +208 -0
  595. package/src/format/product-stream-miss.ts +15 -0
  596. package/src/format/product-stream-node.ts +47 -0
  597. package/src/format/product-stream-packs.ts +247 -0
  598. package/src/format/product-stream-rows.ts +234 -0
  599. package/src/format/product-stream-tar.ts +204 -0
  600. package/src/format/product-stream.ts +297 -0
  601. package/src/format/product.ts +366 -0
  602. package/src/format/productValidation.ts +236 -0
  603. package/src/format/propMaterials.ts +254 -0
  604. package/src/format/props.ts +137 -0
  605. package/src/format/questContinuation.ts +42 -0
  606. package/src/format/questFigures.ts +227 -0
  607. package/src/format/questGraph.ts +30 -0
  608. package/src/format/questHost.ts +314 -0
  609. package/src/format/questInteractionSource.ts +57 -0
  610. package/src/format/questInteractions.ts +642 -0
  611. package/src/format/questPageComposition.ts +92 -0
  612. package/src/format/questPageFacets.ts +121 -0
  613. package/src/format/questRuntime.ts +118 -0
  614. package/src/format/questSteps.ts +182 -0
  615. package/src/format/questStory.ts +512 -0
  616. package/src/format/questStoryBindings.ts +43 -0
  617. package/src/format/questWorld.ts +36 -0
  618. package/src/format/quests.ts +333 -0
  619. package/src/format/rainPresentation.ts +131 -0
  620. package/src/format/rangedPage.ts +117 -0
  621. package/src/format/receipt-cost.ts +71 -0
  622. package/src/format/registeredJson.ts +530 -0
  623. package/src/format/returnProgramDocument.ts +40 -0
  624. package/src/format/returnProjectionV2.ts +84 -0
  625. package/src/format/riding.ts +377 -0
  626. package/src/format/riggedHulls.ts +160 -0
  627. package/src/format/roamingBossProjection.ts +178 -0
  628. package/src/format/roamingCombat.ts +22 -0
  629. package/src/format/ropeDeckSite.ts +148 -0
  630. package/src/format/rows.ts +86 -0
  631. package/src/format/runtime.ts +38 -0
  632. package/src/format/runtimeBinds.ts +49 -0
  633. package/src/format/runtimeCost.ts +80 -0
  634. package/src/format/runtimeSpawns.ts +73 -0
  635. package/src/format/scalarChannel.ts +38 -0
  636. package/src/format/scaledPost.ts +27 -0
  637. package/src/format/scaledPostContract.ts +51 -0
  638. package/src/format/sceneBuffers.ts +122 -0
  639. package/src/format/sceneDraws.ts +89 -0
  640. package/src/format/sceneDressing.ts +247 -0
  641. package/src/format/sceneInstances.ts +192 -0
  642. package/src/format/sceneMotion.ts +122 -0
  643. package/src/format/sceneRefs.ts +71 -0
  644. package/src/format/sceneSources.ts +730 -0
  645. package/src/format/script-side-grandfather.ts +62 -0
  646. package/src/format/script-sides.ts +289 -0
  647. package/src/format/scriptAbi.ts +14 -0
  648. package/src/format/scriptAbiV1.ts +56 -0
  649. package/src/format/scriptActionsV2.ts +101 -0
  650. package/src/format/scriptAdmission.ts +165 -0
  651. package/src/format/scriptAdmissionV2.ts +126 -0
  652. package/src/format/scriptContract.ts +170 -0
  653. package/src/format/scriptFuelV2.ts +124 -0
  654. package/src/format/scriptGroupBankV2.ts +54 -0
  655. package/src/format/scriptGroupStepV2.ts +165 -0
  656. package/src/format/scriptInputStateV2.ts +52 -0
  657. package/src/format/scriptLimits.ts +5 -0
  658. package/src/format/scriptMemoryV2.ts +17 -0
  659. package/src/format/scriptModuleV2.ts +116 -0
  660. package/src/format/scriptObservationColumnsV2.ts +226 -0
  661. package/src/format/scriptQueriesV2.ts +164 -0
  662. package/src/format/scriptQueryStateV2.ts +40 -0
  663. package/src/format/scriptRngV2.ts +52 -0
  664. package/src/format/scriptWireV2.ts +106 -0
  665. package/src/format/scripts.ts +31 -0
  666. package/src/format/sections.ts +140 -0
  667. package/src/format/shardSchema.ts +632 -0
  668. package/src/format/shardSections.ts +383 -0
  669. package/src/format/sketch.ts +79 -0
  670. package/src/format/skin-materials.ts +172 -0
  671. package/src/format/skinAssets.ts +107 -0
  672. package/src/format/skinData.ts +110 -0
  673. package/src/format/skinLayers.ts +90 -0
  674. package/src/format/skins.ts +37 -0
  675. package/src/format/socketLift.ts +58 -0
  676. package/src/format/socketLiftAssets.ts +81 -0
  677. package/src/format/socketRigCreature.ts +66 -0
  678. package/src/format/sourceResidency.ts +16 -0
  679. package/src/format/spawnCombat.ts +26 -0
  680. package/src/format/spawnScriptV2.ts +145 -0
  681. package/src/format/spawnScripts.ts +229 -0
  682. package/src/format/spawnTables.ts +46 -0
  683. package/src/format/spawnView.ts +26 -0
  684. package/src/format/speciesActorsFile.ts +86 -0
  685. package/src/format/speciesBookRows.ts +84 -0
  686. package/src/format/speciesBrain.ts +96 -0
  687. package/src/format/speciesLooks.ts +1021 -0
  688. package/src/format/speciesPrograms.ts +97 -0
  689. package/src/format/speciesScripts.ts +45 -0
  690. package/src/format/specimenCatalogue.ts +94 -0
  691. package/src/format/splatTerrain.ts +192 -0
  692. package/src/format/standalone-catalogue.ts +144 -0
  693. package/src/format/standaloneControl.ts +44 -0
  694. package/src/format/state.ts +61 -0
  695. package/src/format/stateLineage.ts +71 -0
  696. package/src/format/stealth.ts +106 -0
  697. package/src/format/stillImage.ts +135 -0
  698. package/src/format/streamedCover.ts +105 -0
  699. package/src/format/surfaceLooks.ts +50 -0
  700. package/src/format/tar-fields.ts +54 -0
  701. package/src/format/tar-paths.ts +104 -0
  702. package/src/format/tar-source.ts +13 -0
  703. package/src/format/tar-write.ts +152 -0
  704. package/src/format/tar.ts +204 -0
  705. package/src/format/targets.ts +217 -0
  706. package/src/format/terrain.ts +241 -0
  707. package/src/format/terrainTileBytes.ts +104 -0
  708. package/src/format/tierSelection.ts +195 -0
  709. package/src/format/toonLighting.ts +32 -0
  710. package/src/format/toonLook.ts +332 -0
  711. package/src/format/trail.ts +17 -0
  712. package/src/format/traversal.ts +13 -0
  713. package/src/format/treeSetRows.ts +93 -0
  714. package/src/format/ui.ts +90 -0
  715. package/src/format/uiStrings.ts +17 -0
  716. package/src/format/uniformRows.ts +31 -0
  717. package/src/format/upload-wire.ts +184 -0
  718. package/src/format/validationReceipt.ts +142 -0
  719. package/src/format/version.ts +9 -0
  720. package/src/format/vertexWear.ts +45 -0
  721. package/src/format/viewProgram.ts +329 -0
  722. package/src/format/voicePatches.ts +47 -0
  723. package/src/format/water.ts +247 -0
  724. package/src/format/waterWaves.ts +7 -0
  725. package/src/format/waterWorld.ts +34 -0
  726. package/src/format/weaponProfiles.ts +1315 -0
  727. package/src/format/weatherBundle.ts +36 -0
  728. package/src/format/weatherEffects.ts +78 -0
  729. package/src/format/weatherProgram.ts +422 -0
  730. package/src/format/wildlifePopulation.ts +210 -0
  731. package/src/format/wireLimits.ts +9 -0
  732. package/src/format/worldAssembly.ts +104 -0
  733. package/src/format/worldEntry.ts +151 -0
  734. package/src/format/worldPhysics.ts +292 -0
  735. package/src/format/worldSceneBatch.ts +106 -0
  736. package/src/format/worldSceneModels.ts +79 -0
  737. package/src/format/worldScenePages.ts +89 -0
  738. package/src/format/worldScenePlacement.ts +191 -0
  739. package/src/format/worldSceneSlabs.ts +43 -0
  740. package/src/format/worldSceneSurface.ts +113 -0
  741. package/src/format/worldSceneWeld.ts +702 -0
  742. package/src/format/worldScenes.ts +184 -0
  743. package/src/format/worldTargets.ts +111 -0
  744. package/src/format/worldUpdates.ts +229 -0
  745. package/src/hook/format-hook.d.mts +2 -0
  746. package/src/hook/format-hook.mjs +47 -0
  747. package/src/tools/runtime-hosts.json +497 -0
  748. package/README.md +0 -8
@@ -0,0 +1,262 @@
1
+ // SHARD-AUTHORING SA41 (SA21's follow-up, J317 Q19): every issue shard-format reports carries a stable `code`, so a
2
+ // consumer (sharddev's refusal table, api-server) matches the code instead of the message's words. This is the one
3
+ // table; docs/VALIDATION-CODES.md is generated from it (`node src/tools/validation-codes.ts write`) and a test fails when
4
+ // the page drifts. A code is stable: rename one only with a release note, since consumers match it. Messages are not
5
+ // part of the contract and keep their words.
6
+ //
7
+ // Where the code is:
8
+ // - a validator refusal (`validateShardfileProduct`, `validateShardfileStream`, `readTar`): `error.code` on the thrown
9
+ // Error, its message unchanged. The validators tag by the check that refused; a more specific code set nearer the
10
+ // throw wins. A code that is not the table's (Node's `ENOENT` from a host's file port,
11
+ // `ERR_ENCODING_INVALID_ENCODED_DATA` from bad UTF-8) is replaced: such codes differ by host, and the message keeps
12
+ // its words.
13
+ // - a performance report issue: `PerformanceIssue.code`.
14
+ // - an audio finding: `AudioFinding.code`; `assertAudioAdmission`'s refusal: `error.code`.
15
+
16
+ // Validate: both validators, the same code for the same refusal.
17
+ const VALIDATE_CODES = {
18
+ 'archive-invalid':
19
+ 'The tarball is not strict ustar (a bad header, path, padding or end, a truncated entry, too many entries), or the stored object does not decode.',
20
+ 'index-invalid':
21
+ '`shard.json` is missing, too large, not canonical JSON, or fails the index schema.',
22
+ 'file-mismatch':
23
+ 'A listed file is missing, unreadable (a symlink, not a regular file), larger than declared, or its hash or size differs.',
24
+ 'section-invalid':
25
+ 'A section is not canonical JSON, fails its section schema, or is a `client/plan` kind with no declared side.',
26
+ 'script-side':
27
+ 'A script runs on a side its declaration does not allow (SERVER-PARITY SS7).',
28
+ 'script-admission':
29
+ 'The script admission rows the sections declare are invalid.',
30
+ 'blob-invalid':
31
+ "A blob's bytes contradict its listing: kind or extension, registered named JSON and its schema, or costs understated.",
32
+ 'server-file-invalid':
33
+ 'A server file (J91) is unregistered named JSON or its bytes differ from its declared kind.',
34
+ 'ktx2-costs':
35
+ 'The declared KTX2 device costs differ from the verified bytes.',
36
+ 'pack-invalid':
37
+ "A pack is missing a member, or a member or the pack's hash differs.",
38
+ 'cook-invalid':
39
+ 'The cook file, its preparation, or a mount (path or bytes) is invalid (C0, J137).',
40
+ 'runtime-files':
41
+ 'Copied runtime files are present without a runtime import checker, or fail it.',
42
+ 'unlisted-file': 'A file in the product is not listed in `shard.json`.',
43
+ 'shard-schema':
44
+ 'The shardfile assembled from the sections fails the shardfile schema.',
45
+ 'declared-costs':
46
+ 'The declared costs fail preflight: a budget or memory admission over its limit.',
47
+ 'performance-targets':
48
+ 'A declared performance target over its limit refuses (the `REFUSAL:` lines).',
49
+ 'asset-admission':
50
+ "An asset's bytes fail admission: parse, hash or wire size, costs, bounds or script contract.",
51
+ 'world-targets':
52
+ '`world/targets` names an item or quest the shardfile does not declare.',
53
+ 'source-hash': 'The sections differ from the declared `build.sourceHash`.',
54
+ } as const
55
+
56
+ // Stream: the streaming validator's own refusals, beside the validate codes it shares.
57
+ const STREAM_CODES = {
58
+ 'stream-cap':
59
+ 'A member, pack or the placed assets are over the streaming cap.',
60
+ 'stream-miss': 'A check asked for bytes the stream did not hold (AC6a2).',
61
+ 'stream-changed': 'The stored object changed between its reads.',
62
+ } as const
63
+
64
+ // Performance: `PerformanceIssue.code`.
65
+ const PERFORMANCE_CODES = {
66
+ 'perf-memory-target':
67
+ 'A resident memory target (tradeable) is over; always a warning.',
68
+ 'perf-library-download-budget':
69
+ 'The declared library download budget is over the allowance.',
70
+ 'perf-critical-download-budget':
71
+ 'The declared critical (sim) download budget is over its limit.',
72
+ 'perf-library-download':
73
+ "The library closure's download bytes are over the allowance.",
74
+ 'perf-critical-download':
75
+ "The critical closure's download bytes are over the limit.",
76
+ 'perf-tile-download':
77
+ "A tile's download bytes are over its LOD cap (provisional: a warning).",
78
+ 'perf-tile-draws':
79
+ "A tile's draws are over its LOD cap (provisional: a warning).",
80
+ 'perf-tile-triangles':
81
+ "A tile's triangles are over its LOD cap (provisional: a warning).",
82
+ 'perf-far-download': "The far view's download bytes are over the limit.",
83
+ 'perf-far-draws': "The far view's draws are over the limit.",
84
+ 'perf-far-triangles': "The far view's triangles are over the limit.",
85
+ 'perf-native-view-unmeasured':
86
+ 'Native view and download measurement is required and missing.',
87
+ 'perf-native-resident-unmeasured':
88
+ 'The native runtime declares no measured resident cost.',
89
+ 'perf-playing-memory':
90
+ 'The worst playing total bytes are over the limit (report-only under G433: a warning).',
91
+ 'perf-loading-memory':
92
+ 'The worst loading total bytes are over the limit (report-only under G433: a warning).',
93
+ 'perf-script-sample-invalid':
94
+ 'A measured script or fuel figure is not a finite, non-negative number.',
95
+ 'perf-script-cpu': 'Script CPU p95 per tick is over the limit.',
96
+ 'perf-script-fuel': 'Script fuel per tick is over the limit.',
97
+ 'perf-script-samples-missing': 'Fewer than 60 measured script or fuel ticks.',
98
+ } as const
99
+
100
+ // Audio (AUDIO AU5): `AudioFinding.code`, and the admission refusal.
101
+ const AUDIO_CODES = {
102
+ 'audio-unreadable':
103
+ 'A recording is not readable as AAC-LC 48 kHz mono or stereo (red).',
104
+ 'audio-strict-index':
105
+ 'A recording is AAC outside the strict playback index (amber).',
106
+ 'audio-wav': 'A recording is PCM WAV; ship AAC-LC 48 kHz (amber).',
107
+ 'audio-sample-rate':
108
+ 'A recording is AAC at a sample rate other than 48 kHz (amber).',
109
+ 'audio-duration': 'A recording runs over the maximum seconds (red).',
110
+ 'audio-bitrate':
111
+ "A recording's bitrate is over its role and channel cap plus slack (amber).",
112
+ 'audio-budget-amber':
113
+ "The shard's own audio bytes are over the amber line (amber).",
114
+ 'audio-budget-red':
115
+ "The shard's own audio bytes are over the red line, with no waiver that holds (red).",
116
+ 'audio-budget-waived': 'Over the red line, but a dated waiver holds (amber).',
117
+ 'audio-waiver-invalid':
118
+ 'The waiver names another shard, has expired, or covers fewer bytes (amber; the red budget finding follows).',
119
+ 'audio-refused':
120
+ '`assertAudioAdmission` refuses a report with a red finding.',
121
+ } as const
122
+
123
+ /** Which report a code appears in. */
124
+ type IssueFamily = 'validate' | 'stream' | 'performance' | 'audio'
125
+
126
+ /** Every family's codes and what each means, in table order. */
127
+ const ISSUE_FAMILIES: {
128
+ readonly validate: typeof VALIDATE_CODES
129
+ readonly stream: typeof STREAM_CODES
130
+ readonly performance: typeof PERFORMANCE_CODES
131
+ readonly audio: typeof AUDIO_CODES
132
+ } = {
133
+ validate: VALIDATE_CODES,
134
+ stream: STREAM_CODES,
135
+ performance: PERFORMANCE_CODES,
136
+ audio: AUDIO_CODES,
137
+ }
138
+
139
+ /** The codes of one family. */
140
+ type IssueCodeOf<Family extends IssueFamily> = Family extends IssueFamily
141
+ ? keyof (typeof ISSUE_FAMILIES)[Family]
142
+ : never
143
+ /** A stable issue code. */
144
+ type IssueCode = IssueCodeOf<IssueFamily>
145
+
146
+ /** One row of the table. */
147
+ interface IssueCodeRow {
148
+ readonly code: IssueCode
149
+ readonly family: IssueFamily
150
+ readonly meaning: string
151
+ }
152
+
153
+ /** A key of a family's own table, as the code it is. */
154
+ // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- only ever given the keys of ISSUE_FAMILIES' tables
155
+ const asCode = (code: string): IssueCode => code as IssueCode
156
+
157
+ const FAMILY_ORDER: readonly IssueFamily[] = [
158
+ 'validate',
159
+ 'stream',
160
+ 'performance',
161
+ 'audio',
162
+ ]
163
+ const ROWS: readonly IssueCodeRow[] = FAMILY_ORDER.flatMap(
164
+ (family: IssueFamily): IssueCodeRow[] => {
165
+ const table: Readonly<Record<string, string>> = ISSUE_FAMILIES[family]
166
+ return Object.entries(table).map(
167
+ ([code, meaning]: readonly [string, string]): IssueCodeRow => ({
168
+ code: asCode(code),
169
+ family,
170
+ meaning,
171
+ }),
172
+ )
173
+ },
174
+ )
175
+ const KNOWN: ReadonlySet<string> = new Set(
176
+ ROWS.map((row: IssueCodeRow): string => row.code),
177
+ )
178
+
179
+ /** Every code, in table order. */
180
+ function issueCodeRows(): readonly IssueCodeRow[] {
181
+ return ROWS
182
+ }
183
+
184
+ /** Whether a string is one of the table's codes. */
185
+ function isIssueCode(value: unknown): value is IssueCode {
186
+ return typeof value === 'string' && KNOWN.has(value)
187
+ }
188
+
189
+ /** The issue code an error carries, if it is one of the table's. */
190
+ function issueCodeOf(error: unknown): IssueCode | undefined {
191
+ const code: unknown =
192
+ typeof error === 'object' && error !== null && 'code' in error
193
+ ? error.code
194
+ : undefined
195
+ return isIssueCode(code) ? code : undefined
196
+ }
197
+
198
+ /** Give `error` this code unless it already carries one of the table's (a nearer tag); returns it. An own property, so a
199
+ * read-only `code` getter (a DOMException's) is shadowed rather than thrown on; an error that refuses even that (frozen)
200
+ * is returned untouched, never replaced. */
201
+ function tagIssue(error: unknown, code: IssueCode): unknown {
202
+ if (error instanceof Error && issueCodeOf(error) === undefined) {
203
+ try {
204
+ Object.defineProperty(error, 'code', {
205
+ value: code,
206
+ writable: true,
207
+ enumerable: true,
208
+ configurable: true,
209
+ })
210
+ } catch {
211
+ // A frozen error keeps its own shape; the refusal still surfaces with its words.
212
+ }
213
+ }
214
+ return error
215
+ }
216
+
217
+ /** A new Error with this message and code. */
218
+ function issueError(
219
+ code: IssueCode,
220
+ message: string,
221
+ ): Error & { readonly code: IssueCode } {
222
+ return Object.assign(new Error(message), { code })
223
+ }
224
+
225
+ /** A tarball framing refusal (`tar: ...`): `archive-invalid`. */
226
+ function archiveError(message: string): Error & { readonly code: IssueCode } {
227
+ return issueError('archive-invalid', message)
228
+ }
229
+
230
+ /** Run one check; a refusal it throws carries `code` unless it already has one of the table's. */
231
+ function withIssueCode<Result>(code: IssueCode, run: () => Result): Result {
232
+ try {
233
+ return run()
234
+ } catch (error) {
235
+ throw tagIssue(error, code)
236
+ }
237
+ }
238
+
239
+ /** `withIssueCode` for an async check. */
240
+ async function withIssueCodeAsync<Result>(
241
+ code: IssueCode,
242
+ run: () => Promise<Result>,
243
+ ): Promise<Result> {
244
+ try {
245
+ return await run()
246
+ } catch (error) {
247
+ throw tagIssue(error, code)
248
+ }
249
+ }
250
+
251
+ export type { IssueCode, IssueCodeOf, IssueCodeRow, IssueFamily }
252
+ export {
253
+ ISSUE_FAMILIES,
254
+ archiveError,
255
+ isIssueCode,
256
+ issueCodeOf,
257
+ issueCodeRows,
258
+ issueError,
259
+ tagIssue,
260
+ withIssueCode,
261
+ withIssueCodeAsync,
262
+ }
@@ -0,0 +1,229 @@
1
+ import { InputExtraSchema, inputExtraRules } from './inputDeclarations.ts';
2
+ import { BodyLaunchSchema, NativeLoadoutRowSchema, NativeRangedRowSchema } from './nativeItems.ts';
3
+ import { ClaimedPickupSchema, LootEconomySchema } from './lootEconomy.ts';
4
+ import * as v from 'valibot';
5
+ import { MeleeContactsSchema, NativeMeleeRowSchema, WeaponProfileSchema, type MeleeContactRow } from './weaponProfiles.ts';
6
+ import { isJsonData } from './json.ts';
7
+
8
+ /** The bounded authored family/context name, also checked by the trusted family installer. */
9
+ export const ItemFamilyNameSchema: v.GenericSchema<ItemFamilyNameRowsInput, ItemFamilyNameRows> = v.pipe(v.string(), v.regex(/^[a-z][a-zA-Z0-9.-]*$/u), v.maxLength(128));
10
+ const name = ItemFamilyNameSchema;
11
+ const weaponId: v.GenericSchema<`weapon.${string}`> = v.custom<`weapon.${string}`>((value) => typeof value === 'string' && /^weapon\.[a-z][a-zA-Z0-9.-]*$/u.test(value) && value.length <= 128);
12
+ const toolId = v.custom<`tool.${string}`>((value) => typeof value === 'string' && /^tool\.[a-z][a-zA-Z0-9.-]*$/u.test(value) && value.length <= 128);
13
+ const slot = v.custom<`declared.weapon.${string}`>((value) => typeof value === 'string' && /^declared\.weapon\.[a-z][a-zA-Z0-9.-]*$/u.test(value) && value.length <= 128);
14
+ const text = v.pipe(v.string(), v.maxLength(4096));
15
+ const finite = v.pipe(v.number(), v.finite());
16
+ const duration = v.pipe(finite, v.minValue(0.001), v.maxValue(86400));
17
+ const vector = v.tuple([v.pipe(finite, v.minValue(-10), v.maxValue(10)), v.pipe(finite, v.minValue(-10), v.maxValue(10)), v.pipe(finite, v.minValue(-10), v.maxValue(10))]);
18
+ const tag: v.GenericSchema<`${string}.${string}`> = v.custom<`${string}.${string}`>((value) => typeof value === 'string' && /^[a-z][a-zA-Z0-9.-]*\.[a-zA-Z0-9.-]+$/u.test(value) && value.length <= 128);
19
+ const effect = v.custom<`effect.${string}`>((value) => typeof value === 'string' && /^effect\.[a-z][a-zA-Z0-9.-]*$/u.test(value));
20
+ const hook = v.nullable(v.strictObject({ module: v.pipe(v.string(), v.regex(/^(?:commons:)?[a-f0-9]{64}$/u)), entity: v.pipe(finite, v.integer(), v.minValue(1), v.maxValue(0x7fffffff)), event: v.pipe(finite, v.integer(), v.minValue(1), v.maxValue(0x7fffffff)) }));
21
+ const view = v.strictObject({ asset: v.exactOptional(v.pipe(v.string(), v.regex(/^(?:commons:)?[a-f0-9]{64}$/u))), recipe: name, colour: v.pipe(v.string(), v.regex(/^#[a-fA-F0-9]{6}$/u)), position: vector, rotation: vector });
22
+ const ui = v.strictObject({ name: text, icon: name, swapIcon: v.pipe(text, v.maxLength(512)), blurb: text });
23
+ const attack: v.StrictObjectSchema<{ readonly id: v.GenericSchema<ItemAttackRowsInput['id'], ItemAttackRows['id']>; readonly damage: v.GenericSchema<ItemAttackRowsInput['damage'], ItemAttackRows['damage']>; readonly cooldown: v.GenericSchema<ItemAttackRowsInput['cooldown'], ItemAttackRows['cooldown']>; readonly range: v.GenericSchema<ItemAttackRowsInput['range'], ItemAttackRows['range']>; readonly width: v.GenericSchema<ItemAttackRowsInput['width'], ItemAttackRows['width']>; readonly tags: v.SchemaWithPipe<readonly [v.ArraySchema<v.GenericSchema<ItemAttackRowsInput['tags'][number], ItemAttackRows['tags'][number]>, undefined>, v.MaxLengthAction<ItemAttackRows['tags'], 32, undefined>]>; readonly effect: v.NullableSchema<v.GenericSchema<Exclude<ItemAttackRowsInput['effect'], null>, Exclude<ItemAttackRows['effect'], null>>, undefined>; }, undefined> = v.strictObject({ id: name, damage: v.pipe(finite, v.minValue(0), v.maxValue(10000)), cooldown: duration,
24
+ range: v.pipe(finite, v.minValue(0.01), v.maxValue(20)), width: v.pipe(finite, v.minValue(0.01), v.maxValue(20)), tags: v.pipe(v.array(tag), v.maxLength(32)), effect: v.nullable(effect) });
25
+ const secondary = v.strictObject({ action: name, code: v.exactOptional(v.picklist([3, 4])), move: v.pipe(finite, v.integer(), v.minValue(0), v.maxValue(15)) });
26
+ /** Portable equipment presentation. World pickups remain owned by their existing service. */
27
+ /** Shared catalogue glyph ids; content supplies names, never executable icon hooks. */
28
+ export const CatalogueIconSchema: v.GenericSchema<CatalogueIconNameInput, CatalogueIconName> = v.picklist(['lock', 'check', 'poi', 'you', 'map', 'pack', 'star', 'book', 'heart', 'pin', 'laurel',
29
+ 'sword', 'deer', 'elk', 'boar', 'bear', 'ghost', 'ironhide', 'meat', 'hide', 'tusk', 'antlers', 'bolt', 'claw', 'shell', 'coconut', 'coin', 'seaglass', 'rope', 'whetstone', 'chart', 'bearclaw', 'boartusk', 'crossbow', 'rifle', 'lever', 'longbow', 'hat', 'cape', 'charm', 'necklace', 'glyph', 'purse', 'talon', 'leopard', 'wolf', 'eagle', 'rider', 'horse', 'grapple']);
30
+ const equipmentNumber = v.pipe(finite, v.minValue(0), v.maxValue(10000));
31
+ const cue = v.pipe(v.string(), v.regex(/^cue\.[a-z][a-zA-Z0-9.-]*$/u), v.maxLength(128));
32
+ const equipment: v.StrictObjectSchema<{ readonly id: v.GenericSchema<ItemEquipmentRowsInput['id'], ItemEquipmentRows['id']>; readonly legacySlot: v.ExactOptionalSchema<v.GenericSchema<Exclude<ItemEquipmentRowsInput['legacySlot'], undefined>, Exclude<ItemEquipmentRows['legacySlot'], undefined>>, undefined>; readonly ui: v.GenericSchema<ItemEquipmentRowsInput['ui'], ItemEquipmentRows['ui']>; readonly meta: v.StrictObjectSchema<{ readonly name: v.GenericSchema<ItemEquipmentRowsInput['meta']['name'], ItemEquipmentRows['meta']['name']>; readonly icon: v.GenericSchema<ItemEquipmentRowsInput['meta']['icon'], ItemEquipmentRows['meta']['icon']>; readonly blurb: v.GenericSchema<ItemEquipmentRowsInput['meta']['blurb'], ItemEquipmentRows['meta']['blurb']>; readonly category: v.GenericSchema<ItemEquipmentRowsInput['meta']['category'], ItemEquipmentRows['meta']['category']>; }, undefined>; readonly cues: v.ExactOptionalSchema<v.GenericSchema<Exclude<ItemEquipmentRowsInput['cues'], undefined>, Exclude<ItemEquipmentRows['cues'], undefined>>, undefined>; readonly hitStop: v.ExactOptionalSchema<v.GenericSchema<Exclude<ItemEquipmentRowsInput['hitStop'], undefined>, Exclude<ItemEquipmentRows['hitStop'], undefined>>, undefined>; readonly rangedFeel: v.ExactOptionalSchema<v.GenericSchema<Exclude<ItemEquipmentRowsInput['rangedFeel'], undefined>, Exclude<ItemEquipmentRows['rangedFeel'], undefined>>, undefined>; readonly tags: v.ExactOptionalSchema<v.GenericSchema<Exclude<ItemEquipmentRowsInput['tags'], undefined>, Exclude<ItemEquipmentRows['tags'], undefined>>, undefined>; }, undefined> = v.strictObject({ id: v.pipe(v.string(), v.regex(/^weapon\.[a-z][a-zA-Z0-9.-]*$/u), v.maxLength(128)),
33
+ legacySlot: v.exactOptional(v.picklist(['crossbow', 'sword', 'rifle', 'sword-iron', 'bow', 'sabre', 'spear', 'empty'])),
34
+ ui: v.strictObject({ name: text, icon: CatalogueIconSchema, swapIcon: v.pipe(text, v.maxLength(512)),
35
+ touch: v.picklist(['melee', 'bow', 'ranged', 'throwing']), lockOn: v.boolean(), melee: v.boolean(), tracers: v.boolean(),
36
+ inputContext: v.exactOptional(name), swapName: v.exactOptional(text), huntersEye: v.exactOptional(v.boolean()),
37
+ ammo: v.exactOptional(v.strictObject({ label: text, segments: v.pipe(finite, v.integer(), v.minValue(1), v.maxValue(1024)),
38
+ magazine: v.exactOptional(v.boolean()), bagLabel: v.exactOptional(text), bagLabelFor: v.exactOptional(text) })) }),
39
+ meta: v.strictObject({ name: text, icon: CatalogueIconSchema, blurb: text, category: name }),
40
+ cues: v.exactOptional(v.strictObject({ fire: cue, reload: cue, impact: cue, dry: v.exactOptional(cue), hit: v.exactOptional(cue),
41
+ heavy: v.exactOptional(cue), charge: v.exactOptional(v.record(name, cue)) })),
42
+ hitStop: v.exactOptional(v.strictObject({ body: equipmentNumber, head: equipmentNumber, kill: equipmentNumber })),
43
+ rangedFeel: v.exactOptional(v.strictObject({ kick: v.strictObject({ body: equipmentNumber, head: equipmentNumber, kill: equipmentNumber, side: equipmentNumber, killSide: equipmentNumber }),
44
+ trauma: v.strictObject({ kill: equipmentNumber, head: equipmentNumber, killKinds: v.pipe(v.array(name), v.maxLength(64)), headKinds: v.pipe(v.array(name), v.maxLength(64)) }) })),
45
+ tags: v.exactOptional(v.pipe(v.array(tag), v.maxLength(32))),
46
+ });
47
+ /** The existing native equipment descriptor, also used by complete scene sources. */
48
+ export const ItemEquipmentSchema: v.GenericSchema<ItemEquipmentRowsInput, ItemEquipmentRows> = equipment;
49
+ const weapon: v.StrictObjectSchema<{ readonly id: v.GenericSchema<WeaponItemRowsInput['id'], WeaponItemRows['id']>; readonly kind: v.GenericSchema<WeaponItemRowsInput['kind'], WeaponItemRows['kind']>; readonly family: v.GenericSchema<WeaponItemRowsInput['family'], WeaponItemRows['family']>; readonly slot: v.GenericSchema<WeaponItemRowsInput['slot'], WeaponItemRows['slot']>; readonly context: v.GenericSchema<WeaponItemRowsInput['context'], WeaponItemRows['context']>; readonly ui: v.GenericSchema<WeaponItemRowsInput['ui'], WeaponItemRows['ui']>; readonly view: v.GenericSchema<WeaponItemRowsInput['view'], WeaponItemRows['view']>; readonly hook: v.GenericSchema<WeaponItemRowsInput['hook'], WeaponItemRows['hook']>; readonly equipment: v.ExactOptionalSchema<v.GenericSchema<Exclude<WeaponItemRowsInput['equipment'], undefined>, Exclude<WeaponItemRows['equipment'], undefined>>, undefined>; readonly profile: v.ExactOptionalSchema<v.GenericSchema<Exclude<WeaponItemRowsInput['profile'], undefined>, Exclude<WeaponItemRows['profile'], undefined>>, undefined>; readonly ranged: v.ExactOptionalSchema<v.GenericSchema<Exclude<WeaponItemRowsInput['ranged'], undefined>, Exclude<WeaponItemRows['ranged'], undefined>>, undefined>; readonly contacts: v.ExactOptionalSchema<v.GenericSchema<Exclude<WeaponItemRowsInput['contacts'], undefined>, Exclude<WeaponItemRows['contacts'], undefined>>, undefined>; readonly secondary: v.ExactOptionalSchema<v.GenericSchema<Exclude<WeaponItemRowsInput['secondary'], undefined>, Exclude<WeaponItemRows['secondary'], undefined>>, undefined>; readonly native: v.ExactOptionalSchema<v.GenericSchema<Exclude<WeaponItemRowsInput['native'], undefined>, Exclude<WeaponItemRows['native'], undefined>>, undefined>; readonly light: typeof attack; readonly heavy: v.GenericSchema<WeaponItemRowsInput['heavy'], WeaponItemRows['heavy']>; readonly charge: v.GenericSchema<WeaponItemRowsInput['charge'], WeaponItemRows['charge']>; }, undefined> = v.strictObject({ id: weaponId, kind: v.literal('weapon'), family: name, slot, context: name, ui, view, hook,
50
+ equipment: v.exactOptional(equipment),
51
+ profile: v.exactOptional(WeaponProfileSchema), ranged: v.exactOptional(NativeRangedRowSchema), contacts: v.exactOptional(MeleeContactsSchema),
52
+ secondary: v.exactOptional(secondary), native: v.exactOptional(NativeMeleeRowSchema),
53
+ light: attack, heavy: attack, charge: v.pipe(duration, v.maxValue(5)) });
54
+ const tool: v.StrictObjectSchema<{ readonly id: v.GenericSchema<ToolItemRowsInput['id'], ToolItemRows['id']>; readonly kind: v.GenericSchema<ToolItemRowsInput['kind'], ToolItemRows['kind']>; readonly family: v.GenericSchema<ToolItemRowsInput['family'], ToolItemRows['family']>; readonly ui: v.GenericSchema<ToolItemRowsInput['ui'], ToolItemRows['ui']>; readonly view: v.GenericSchema<ToolItemRowsInput['view'], ToolItemRows['view']>; readonly hook: v.GenericSchema<ToolItemRowsInput['hook'], ToolItemRows['hook']>; readonly equipment: v.ExactOptionalSchema<v.GenericSchema<Exclude<ToolItemRowsInput['equipment'], undefined>, Exclude<ToolItemRows['equipment'], undefined>>, undefined>; readonly action: v.NullableSchema<v.GenericSchema<Exclude<ToolItemRowsInput['action'], null>, Exclude<ToolItemRows['action'], null>>, undefined>; readonly fuelSeconds: v.GenericSchema<ToolItemRowsInput['fuelSeconds'], ToolItemRows['fuelSeconds']>; readonly intensity: v.GenericSchema<ToolItemRowsInput['intensity'], ToolItemRows['intensity']>; }, undefined> = v.strictObject({ id: toolId, kind: v.literal('tool'), family: name, ui, view, hook,
55
+ equipment: v.exactOptional(v.strictObject({ ...equipment.entries, id: toolId,
56
+ meta: v.strictObject({ ...equipment.entries.meta.entries, category: text }) })), action: v.nullable(v.custom<`${string}.${string}`>((value) => typeof value === 'string' && /^[a-z][a-zA-Z0-9.-]*\.[a-zA-Z0-9.-]+$/u.test(value))),
57
+ fuelSeconds: duration, intensity: v.pipe(finite, v.minValue(0), v.maxValue(10)) });
58
+ /** The closed baseline weapon context with optional declared controls. */
59
+ export const ItemContextSchema: v.GenericSchema<ItemContextRowsInput, ItemContextRows> = v.variant('keysFrom', [
60
+ v.strictObject({ id: name, keysFrom: v.literal('weapon.melee'), actions: v.tuple([v.literal('attack'), v.literal('heavy'), v.literal('lock')]), touch: v.literal('melee'), lockable: v.boolean(), extra: v.exactOptional(InputExtraSchema) }),
61
+ v.strictObject({ id: name, keysFrom: v.literal('weapon.ranged'), actions: v.tuple([v.literal('attack'), v.literal('aim'), v.literal('reload')]), touch: v.literal('ranged'), lockable: v.boolean(), extra: v.exactOptional(InputExtraSchema) }),
62
+ v.strictObject({ id: name, keysFrom: v.literal('weapon.bow'), actions: v.tuple([v.literal('attack'), v.literal('aim')]), touch: v.literal('bow'), lockable: v.boolean(), extra: v.exactOptional(InputExtraSchema) }),
63
+ v.strictObject({ id: name, keysFrom: v.literal('weapon.spear'), actions: v.tuple([v.literal('attack'), v.literal('aim')]), touch: v.literal('throwing'), lockable: v.boolean(), extra: v.exactOptional(InputExtraSchema) }),
64
+ ]);
65
+ const baselineContexts = new Set(['weapon.melee', 'weapon.ranged', 'weapon.bow', 'weapon.spear']);
66
+ /** Saved inventory policy consumed unchanged by the existing native stacking/trade owner. */
67
+ const inventory = v.pipe(v.strictObject({ kinds: v.pipe(v.array(name), v.minLength(1), v.maxLength(256)),
68
+ slots: v.pipe(finite, v.integer(), v.minValue(1), v.maxValue(256)),
69
+ counts: v.strictObject({ min: finite, max: finite, integer: v.boolean(), complete: v.boolean() }),
70
+ quantity: v.picklist(['unchecked', 'positive-safe-integer']), snapshot: v.picklist(['order', 'roster']),
71
+ stackLimit: v.exactOptional(v.pipe(finite, v.minValue(0), v.maxValue(Number.MAX_SAFE_INTEGER))), restoreError: text }),
72
+ v.check(row => new Set(row.kinds).size === row.kinds.length && row.counts.min <= row.counts.max, 'Unique inventory kinds and ordered count bounds'));
73
+ const catalogue = v.pipe(v.array(v.strictObject({ id: name, label: text, icon: CatalogueIconSchema, travels: v.boolean() })), v.maxLength(256));
74
+ const raw: v.StrictObjectSchema<{ readonly version: v.GenericSchema<ShardItemsInput['version'], ShardItems['version']>; readonly catalogue: v.ExactOptionalSchema<v.GenericSchema<Exclude<ShardItemsInput['catalogue'], undefined>, Exclude<ShardItems['catalogue'], undefined>>, undefined>; readonly rows: v.SchemaWithPipe<readonly [v.ArraySchema<v.VariantSchema<'kind', readonly [typeof weapon, typeof tool], undefined>, undefined>, v.MaxLengthAction<(WeaponItemRows | ToolItemRows)[], 64, undefined>]>; readonly launches: v.ExactOptionalSchema<v.GenericSchema<Exclude<ShardItemsInput['launches'], undefined>, Exclude<ShardItems['launches'], undefined>>, undefined>; readonly pickups: v.ExactOptionalSchema<v.GenericSchema<Exclude<ShardItemsInput['pickups'], undefined>, Exclude<ShardItems['pickups'], undefined>>, undefined>; readonly contexts: v.GenericSchema<ShardItemsInput['contexts'], ShardItems['contexts']>; readonly runtimeContexts: v.ExactOptionalSchema<v.GenericSchema<Exclude<ShardItemsInput['runtimeContexts'], undefined>, Exclude<ShardItems['runtimeContexts'], undefined>>, undefined>; readonly loadout: v.GenericSchema<ShardItemsInput['loadout'], ShardItems['loadout']>; }, undefined> = v.strictObject({ version: v.literal(1), catalogue: v.exactOptional(catalogue), rows: v.pipe(v.array(v.variant('kind', [weapon, tool])), v.maxLength(64)),
75
+ launches: v.exactOptional(v.pipe(v.record(name, BodyLaunchSchema), v.maxEntries(64))),
76
+ pickups: v.exactOptional(v.pipe(v.record(name, ClaimedPickupSchema), v.maxEntries(128))),
77
+ contexts: v.pipe(v.array(ItemContextSchema), v.maxLength(64)),
78
+ runtimeContexts: v.exactOptional(v.pipe(v.array(name), v.maxLength(64))),
79
+ loadout: v.strictObject({ effects: v.exactOptional(v.strictObject({
80
+ statuses: v.boolean(), player: LootEconomySchema.entries.grants.entries.player, worn: LootEconomySchema.entries.grants.entries.worn,
81
+ weapons: v.pipe(v.array(v.strictObject({ items: v.pipe(v.array(weaponId), v.minLength(1), v.maxLength(64)), grants: LootEconomySchema.entries.grants.entries.weapons })), v.maxLength(64)),
82
+ hitCap: v.exactOptional(effect),
83
+ })), runtime: v.exactOptional(v.strictObject({
84
+ pause: v.boolean(), sliceMs: v.exactOptional(v.pipe(finite, v.minValue(1), v.maxValue(1000))),
85
+ owners: v.pipe(v.array(v.strictObject({ item: weaponId, slot: v.picklist(['primary', 'rifle', 'secondary', 'extra']),
86
+ row: v.picklist(['native', 'declared']), presentation: v.exactOptional(v.boolean()) })), v.minLength(1), v.maxLength(16)),
87
+ })), native: v.exactOptional(NativeLoadoutRowSchema), inventory: v.exactOptional(inventory), primary: v.nullable(weaponId), secondary: v.nullable(weaponId), tools: v.pipe(v.array(toolId), v.maxLength(16)) }) });
88
+ /** Admit an item's JSON-only contacts without copying its original event-lifetime tag arrays. */
89
+ export function parseMeleeContacts(input: unknown): readonly MeleeContactRow[] {
90
+ v.assert(v.custom(isJsonData, 'JSON-only melee contacts'), input);
91
+ v.assert(MeleeContactsSchema, input);
92
+ return input;
93
+ }
94
+ /** Admit a native owner together with its contacts, preserving event-lifetime arrays.
95
+ * JSON-only policies must resolve every action to the correct contact phase and lane. */
96
+ export function parseNativeMeleeBinding(input: unknown, contactsInput: unknown): {
97
+ native: v.InferOutput<typeof NativeMeleeRowSchema>; contacts: readonly MeleeContactRow[];
98
+ } {
99
+ v.assert(v.custom(isJsonData, 'JSON-only native melee policy'), input);
100
+ const native = v.parse(NativeMeleeRowSchema, input), contacts = parseMeleeContacts(contactsInput);
101
+ if (native.actions.some(action => {
102
+ const contact = contacts[action.move];
103
+ return contact === undefined || (native.mode === 'timed') !== (contact.lands.length > 0)
104
+ || action.hook !== null && contact.lane !== 'secondary';
105
+ })) throw new TypeError('Native melee action does not match its admitted contact');
106
+ if(native.held!==undefined){
107
+ const action=native.actions.find(row=>row.action===native.held?.action),contact=action===undefined?undefined:contacts[action.move];
108
+ if(action?.hook!==null||contact?.lane!=='primary'||!contact.heavy)throw new TypeError('Held release requires an admitted primary heavy contact');
109
+ }
110
+ return { native, contacts };
111
+ }
112
+ /** Declared swept phases share the existing melee owner; no new actor or physics authority. */
113
+ const sweptCoefficient = v.pipe(finite, v.minValue(-10000), v.maxValue(10000));
114
+ const sweptPolicy: v.GenericSchema<NativeSweptPolicyRowsInput, NativeSweptPolicyRows> = v.strictObject({ kind: v.literal('swept'), step: name, selection: v.exactOptional(NativeLoadoutRowSchema),
115
+ eye: v.pipe(finite, v.minValue(0), v.maxValue(20)), initial: v.pipe(finite, v.integer(), v.minValue(0), v.maxValue(15)),
116
+ source: v.picklist(['env', 'owner']),
117
+ slots: v.pipe(v.array(v.strictObject({ item: weaponId, weapon: weaponId, tags: v.pipe(v.array(tag), v.maxLength(32)),
118
+ combo: v.pipe(v.array(name), v.minLength(1), v.maxLength(16)), heavy: name })), v.minLength(1), v.maxLength(16)),
119
+ contact: v.strictObject({ slack: v.pipe(finite, v.minValue(0), v.maxValue(2)), direction: v.tuple([sweptCoefficient, sweptCoefficient, sweptCoefficient]),
120
+ push: v.tuple([sweptCoefficient, sweptCoefficient]), running: v.pipe(finite, v.minValue(0), v.maxValue(100)) }),
121
+ lunge: v.strictObject({ maxHeight: v.pipe(finite, v.minValue(0), v.maxValue(20)), minDistance: v.pipe(finite, v.minValue(0.000001), v.maxValue(10)),
122
+ minRadius: v.pipe(finite, v.minValue(0), v.maxValue(20)), lengthScale: v.pipe(finite, v.minValue(0), v.maxValue(10)) }),
123
+ });
124
+ /** Admit a bounded swept kit against real item profiles before installing clocks or contacts. */
125
+ interface NativeSweptMove extends Omit<Extract<v.InferOutput<typeof WeaponProfileSchema>, {family: 'melee'}>['moves']['heavy'], 'stagger' | 'sweep'> {
126
+ id: string; stagger: number; sweep: number;
127
+ }
128
+ interface NativeSweptProfile extends Omit<Extract<v.InferOutput<typeof WeaponProfileSchema>, {family: 'melee'}>, 'moves'> {
129
+ weapon: v.InferOutput<typeof weaponId>; tags: v.InferOutput<typeof tag>[]; moves: {combo: NativeSweptMove[]; heavy: NativeSweptMove};
130
+ }
131
+ /** Admitted numeric phases and item profiles, detached from renderer or actor authority. */
132
+ export interface NativeSweptMeleeBinding { row: v.InferOutput<typeof sweptPolicy>; profiles: NativeSweptProfile[] }
133
+ /** Parse a complete swept kit before any clocks, callbacks or native state are installed. */
134
+ export function parseNativeSweptMeleeBinding(input: unknown, itemsInput: unknown): NativeSweptMeleeBinding {
135
+ v.assert(v.custom(isJsonData, 'JSON-only swept melee policy'), input);
136
+ const row = v.parse(sweptPolicy, input), items = v.parse(v.pipe(v.array(v.union([weapon, tool])), v.maxLength(512)), itemsInput);
137
+ if (row.initial >= row.slots.length || new Set(row.slots.map(entry => entry.item)).size !== row.slots.length) throw new Error('Invalid swept melee slots');
138
+ if (row.selection !== undefined && (row.selection.initial !== row.initial || row.selection.slots.length !== row.slots.length
139
+ || row.selection.slots.some((value, index) => value !== index) || row.selection.lower !== 0 || row.selection.raise !== 0
140
+ || row.selection.ownership?.some(flag => flag !== null) === true || row.selection.input !== undefined)) throw new Error('Invalid swept selection policy');
141
+ const profiles = row.slots.map(entry => {
142
+ const item = items.find(candidate => candidate.id === entry.item);
143
+ if (item?.kind !== 'weapon' || item.profile?.family !== 'melee' || item.profile.moves.combo.length !== entry.combo.length) throw new Error('Swept melee requires matching admitted item moves');
144
+ const profile = item.profile;
145
+ if (new Set([...entry.combo, entry.heavy]).size !== entry.combo.length + 1) throw new Error('Unique swept move ids required');
146
+ const move = (numbers: typeof profile.moves.heavy, id: string) => {
147
+ if (numbers.stagger === undefined || numbers.sweep === undefined) throw new Error('Swept melee requires explicit stagger and sweep');
148
+ return { ...numbers, stagger: numbers.stagger, sweep: numbers.sweep, id };
149
+ };
150
+ return { ...profile, weapon: entry.weapon, tags: entry.tags,
151
+ moves: { combo: profile.moves.combo.map((numbers, index) => { const id = entry.combo[index]; if (id === undefined) throw new Error('Missing swept move id'); return move(numbers, id); }), heavy: move(profile.moves.heavy, entry.heavy) } };
152
+ });
153
+ return { row, profiles };
154
+ }
155
+ /** Declared item families, numeric contacts, input contexts, script hooks and initial loadout. */
156
+
157
+ /** Local references plus optional script catalogue checks; global format composition supplies admitted module ids. */
158
+ export function itemRules(items: ShardItems, modules?: readonly string[]): string[] {
159
+ const errors: string[] = [];
160
+ if (new Set(items.catalogue?.map(row => row.id)).size !== (items.catalogue?.length ?? 0)) errors.push('unique catalogue item ids');
161
+ const ids = items.rows.map((r) => r.id), weapons = items.rows.filter((r) => r.kind === 'weapon');
162
+ const runtimeContexts = items.runtimeContexts ?? [];
163
+ if (items.loadout.effects?.weapons.some(binding => new Set(binding.items).size !== binding.items.length
164
+ || binding.items.some(id => !weapons.some(entry => entry.id === id && entry.equipment?.legacySlot !== undefined))) === true)
165
+ errors.push('item effect targets need unique native equipment ids');
166
+ if (weapons.some(row => row.profile !== undefined && !row.family.includes('.') && row.family !== row.profile.family && !(row.family === 'swept' && row.profile.family === 'melee'))) errors.push('weapon profile matches declared family');
167
+ if (weapons.some(row => row.profile?.family === 'cone' && (row.light.range !== row.heavy.range
168
+ || row.light.width !== row.heavy.width || row.light.width > Math.PI || row.light.effect !== null || row.heavy.effect !== null
169
+ || row.light.tags.length !== row.heavy.tags.length || row.light.tags.some((value, index) => value !== row.heavy.tags[index]))))
170
+ errors.push('cone slashes require one shared contact shape and tags');
171
+ if (weapons.some(row => row.secondary !== undefined && ((row.secondary.code === undefined) !== (row.hook === null)
172
+ || row.contacts?.[row.secondary.move]?.lane !== 'secondary'))) errors.push('secondary references its declared action mode and secondary contact');
173
+ if (weapons.some(row => row.native !== undefined && (row.contacts === undefined || row.native.actions.some(action => {
174
+ const contact = row.contacts?.[action.move];
175
+ return contact === undefined || (row.native?.mode === 'timed') !== (contact.lands.length > 0)
176
+ || action.hook !== null && (row.hook === null || row.secondary?.code !== action.hook || row.secondary.move !== action.move);
177
+ })))) errors.push('native melee actions resolve admitted contacts and script hooks');
178
+ const nativeSteps = weapons.flatMap(row => [...(row.native === undefined ? [] : [row.native.step]), ...(row.ranged === undefined ? [] : [row.ranged.step])]);
179
+ if (weapons.some(row => row.ranged !== undefined && (row.native !== undefined || (row.profile?.family !== 'bow' && row.profile?.family !== 'firearm')))) errors.push('native ranged requires its admitted weapon profile');
180
+ if (new Set(nativeSteps).size !== nativeSteps.length) errors.push('unique native melee steps');
181
+ if (items.rows.some((row) => row.kind === 'tool' && row.action === null && row.hook !== null)) errors.push('native tools have no script hook');
182
+ for (const ctx of items.contexts) errors.push(...inputExtraRules(ctx.extra, ctx.actions, ctx.id.split('.')[0] ?? ctx.id));
183
+ if (items.contexts.some((ctx) => baselineContexts.has(ctx.id))) errors.push('baseline context is referenced rather than redeclared');
184
+ if (new Set(runtimeContexts).size !== runtimeContexts.length || runtimeContexts.some((id) => items.contexts.some((ctx) => ctx.id === id))) errors.push('unique runtime context references separate from declared contexts');
185
+ if (new Set(ids).size !== ids.length || new Set(weapons.map((r) => r.slot)).size !== weapons.length
186
+ || new Set(items.contexts.map((r) => r.id)).size !== items.contexts.length) errors.push('unique item ids slots and contexts');
187
+ if (weapons.some((r) => r.slot !== `declared.${r.id}`)) errors.push('stable weapon slot');
188
+ if (weapons.some((r) => r.context !== 'weapon.melee' && !runtimeContexts.includes(r.context) && !items.contexts.some((c) => c.id === r.context))) errors.push('declared weapon context');
189
+ const owners = items.loadout.runtime?.owners;
190
+ if (owners !== undefined && (owners[0]?.slot !== 'primary' || owners[0].item !== items.loadout.primary
191
+ || owners.length !== weapons.length || new Set(owners.map(owner => owner.item)).size !== owners.length
192
+ || owners.some(owner => !weapons.some(row => row.id === owner.item))
193
+ || ['primary', 'rifle', 'secondary'].some(place => owners.filter(owner => owner.slot === place).length > 1)
194
+ || (owners.find(owner => owner.slot === 'secondary')?.item ?? null) !== items.loadout.secondary)) errors.push('runtime equipment owners');
195
+ for (const id of [items.loadout.primary, items.loadout.secondary]) if (id !== null && !weapons.some((r) => r.id === id)) errors.push('weapon loadout reference');
196
+ if (items.rows.length > 0 && items.loadout.primary === null) errors.push('primary weapon required');
197
+ if (items.loadout.primary !== null && items.loadout.primary === items.loadout.secondary) errors.push('distinct loadout weapons');
198
+ if (new Set(items.loadout.tools).size !== items.loadout.tools.length || items.loadout.tools.some((id) => !items.rows.some((r) => r.kind === 'tool' && r.id === id))) errors.push('tool loadout reference');
199
+ const handles = items.rows.flatMap((r) => r.hook === null ? [] : [r.hook.entity]);
200
+ if (new Set(handles).size !== handles.length) errors.push('unique item script handles');
201
+ if (modules !== undefined && items.rows.some((r) => r.hook !== null && !modules.includes(r.hook.module))) errors.push('item script module declared');
202
+ return [...new Set(errors)];
203
+ }
204
+ const items: v.SchemaWithPipe<readonly [v.UnknownSchema, v.CheckAction<unknown, 'JSON-only items'>, typeof raw, v.CheckAction<ShardItems, 'valid item references'>]> = v.pipe(v.unknown(), v.check(isJsonData, 'JSON-only items'), raw, v.check((data) => itemRules(data).length === 0, 'valid item references'));
205
+ /** JSON-only admission rejects closures before serialisation and checks all item/loadout references.
206
+ * The named output bounds root-schema inference; pipe identities remain available to the JSON Schema bridge. */
207
+ export const ItemsSchema: v.GenericSchema<unknown, ShardItems> & Pick<typeof items, 'pipe'> = items;
208
+ /** Validate authored item rows at both SDK and browser boundaries. */
209
+ export function parseItems(input: unknown): ShardItems { return v.parse(ItemsSchema, input); }
210
+
211
+ /** Admitted item data independent of validator implementation metadata. */
212
+ export type ItemFamilyNameRowsInput = ItemFamilyNameRows;
213
+ export type ItemFamilyNameRows = string;
214
+ export type CatalogueIconNameInput = CatalogueIconName;
215
+ export type CatalogueIconName = 'lock' | 'check' | 'poi' | 'you' | 'map' | 'pack' | 'star' | 'book' | 'heart' | 'pin' | 'laurel' | 'sword' | 'deer' | 'elk' | 'boar' | 'bear' | 'ghost' | 'ironhide' | 'meat' | 'hide' | 'tusk' | 'antlers' | 'bolt' | 'claw' | 'shell' | 'coconut' | 'coin' | 'seaglass' | 'rope' | 'whetstone' | 'chart' | 'bearclaw' | 'boartusk' | 'crossbow' | 'rifle' | 'lever' | 'longbow' | 'hat' | 'cape' | 'charm' | 'necklace' | 'glyph' | 'purse' | 'talon' | 'leopard' | 'wolf' | 'eagle' | 'rider' | 'horse' | 'grapple';
216
+ export type ItemContextRowsInput = ({ id: ItemFamilyNameRowsInput; keysFrom: 'weapon.melee'; actions: ['attack', 'heavy', 'lock']; touch: 'melee'; lockable: boolean; extra?: v.InferInput<typeof InputExtraSchema>; }) | ({ id: ItemFamilyNameRowsInput; keysFrom: 'weapon.ranged'; actions: ['attack', 'aim', 'reload']; touch: 'ranged'; lockable: boolean; extra?: v.InferInput<typeof InputExtraSchema>; }) | ({ id: ItemFamilyNameRowsInput; keysFrom: 'weapon.bow'; actions: ['attack', 'aim']; touch: 'bow'; lockable: boolean; extra?: v.InferInput<typeof InputExtraSchema>; }) | ({ id: ItemFamilyNameRowsInput; keysFrom: 'weapon.spear'; actions: ['attack', 'aim']; touch: 'throwing'; lockable: boolean; extra?: v.InferInput<typeof InputExtraSchema>; });
217
+ export type ItemContextRows = ({ id: ItemFamilyNameRows; keysFrom: 'weapon.melee'; actions: ['attack', 'heavy', 'lock']; touch: 'melee'; lockable: boolean; extra?: v.InferOutput<typeof InputExtraSchema>; }) | ({ id: ItemFamilyNameRows; keysFrom: 'weapon.ranged'; actions: ['attack', 'aim', 'reload']; touch: 'ranged'; lockable: boolean; extra?: v.InferOutput<typeof InputExtraSchema>; }) | ({ id: ItemFamilyNameRows; keysFrom: 'weapon.bow'; actions: ['attack', 'aim']; touch: 'bow'; lockable: boolean; extra?: v.InferOutput<typeof InputExtraSchema>; }) | ({ id: ItemFamilyNameRows; keysFrom: 'weapon.spear'; actions: ['attack', 'aim']; touch: 'throwing'; lockable: boolean; extra?: v.InferOutput<typeof InputExtraSchema>; });
218
+ export interface WeaponItemRowsInput { id: `weapon.${string}`; kind: 'weapon'; family: ItemFamilyNameRowsInput; slot: `declared.weapon.${string}`; context: ItemFamilyNameRowsInput; ui: { name: string; icon: ItemFamilyNameRowsInput; swapIcon: string; blurb: string; }; view: { asset?: string; recipe: ItemFamilyNameRowsInput; colour: string; position: [number, number, number]; rotation: [number, number, number]; }; hook: ({ module: string; entity: number; event: number; }) | null; equipment?: ItemEquipmentRowsInput; profile?: v.InferInput<typeof WeaponProfileSchema>; ranged?: v.InferInput<typeof NativeRangedRowSchema>; contacts?: v.InferInput<typeof MeleeContactsSchema>; secondary?: { action: ItemFamilyNameRowsInput; code?: 3 | 4; move: number; }; native?: v.InferInput<typeof NativeMeleeRowSchema>; light: ItemAttackRowsInput; heavy: ItemAttackRowsInput; charge: number; }
219
+ export interface WeaponItemRows { id: `weapon.${string}`; kind: 'weapon'; family: ItemFamilyNameRows; slot: `declared.weapon.${string}`; context: ItemFamilyNameRows; ui: { name: string; icon: ItemFamilyNameRows; swapIcon: string; blurb: string; }; view: { asset?: string; recipe: ItemFamilyNameRows; colour: string; position: [number, number, number]; rotation: [number, number, number]; }; hook: ({ module: string; entity: number; event: number; }) | null; equipment?: ItemEquipmentRows; profile?: v.InferOutput<typeof WeaponProfileSchema>; ranged?: v.InferOutput<typeof NativeRangedRowSchema>; contacts?: v.InferOutput<typeof MeleeContactsSchema>; secondary?: { action: ItemFamilyNameRows; code?: 3 | 4; move: number; }; native?: v.InferOutput<typeof NativeMeleeRowSchema>; light: ItemAttackRows; heavy: ItemAttackRows; charge: number; }
220
+ export interface ToolItemRowsInput { id: `tool.${string}`; kind: 'tool'; family: ItemFamilyNameRowsInput; ui: { name: string; icon: ItemFamilyNameRowsInput; swapIcon: string; blurb: string; }; view: { asset?: string; recipe: ItemFamilyNameRowsInput; colour: string; position: [number, number, number]; rotation: [number, number, number]; }; hook: ({ module: string; entity: number; event: number; }) | null; equipment?: { id: `tool.${string}`; meta: { category: string; } & Omit<v.InferInput<typeof equipment.entries.meta>, "category">; } & Omit<ItemEquipmentRowsInput, "id" | "meta">; action: (`${string}.${string}`) | null; fuelSeconds: number; intensity: number; }
221
+ export interface ToolItemRows { id: `tool.${string}`; kind: 'tool'; family: ItemFamilyNameRows; ui: { name: string; icon: ItemFamilyNameRows; swapIcon: string; blurb: string; }; view: { asset?: string; recipe: ItemFamilyNameRows; colour: string; position: [number, number, number]; rotation: [number, number, number]; }; hook: ({ module: string; entity: number; event: number; }) | null; equipment?: { id: `tool.${string}`; meta: { category: string; } & Omit<v.InferOutput<typeof equipment.entries.meta>, "category">; } & Omit<ItemEquipmentRows, "id" | "meta">; action: (`${string}.${string}`) | null; fuelSeconds: number; intensity: number; }
222
+ export interface ItemAttackRowsInput { id: ItemFamilyNameRowsInput; damage: number; cooldown: number; range: number; width: number; tags: (`${string}.${string}`)[]; effect: (`effect.${string}`) | null; }
223
+ export interface ItemAttackRows { id: ItemFamilyNameRows; damage: number; cooldown: number; range: number; width: number; tags: (`${string}.${string}`)[]; effect: (`effect.${string}`) | null; }
224
+ export interface ShardItemsInput { version: 1; catalogue?: ({ id: ItemFamilyNameRowsInput; label: string; icon: CatalogueIconNameInput; travels: boolean; })[]; rows: ((WeaponItemRowsInput) | (ToolItemRowsInput))[]; launches?: Record<string, v.InferInput<typeof BodyLaunchSchema>>; pickups?: Record<string, v.InferInput<typeof ClaimedPickupSchema>>; contexts: (ItemContextRowsInput)[]; runtimeContexts?: (ItemFamilyNameRowsInput)[]; loadout: { effects?: { statuses: boolean; player: v.InferInput<typeof LootEconomySchema.entries.grants.entries.player>; worn: v.InferInput<typeof LootEconomySchema.entries.grants.entries.worn>; weapons: ({ items: (`weapon.${string}`)[]; grants: v.InferInput<typeof LootEconomySchema.entries.grants.entries.weapons>; })[]; hitCap?: `effect.${string}`; }; runtime?: { pause: boolean; sliceMs?: number; owners: ({ item: `weapon.${string}`; slot: 'primary' | 'rifle' | 'secondary' | 'extra'; row: 'native' | 'declared'; presentation?: boolean; })[]; }; native?: v.InferInput<typeof NativeLoadoutRowSchema>; inventory?: { kinds: (ItemFamilyNameRowsInput)[]; slots: number; counts: { min: number; max: number; integer: boolean; complete: boolean; }; quantity: 'unchecked' | 'positive-safe-integer'; snapshot: 'order' | 'roster'; stackLimit?: number; restoreError: string; }; primary: (`weapon.${string}`) | null; secondary: (`weapon.${string}`) | null; tools: (`tool.${string}`)[]; }; }
225
+ export interface ShardItems { version: 1; catalogue?: ({ id: ItemFamilyNameRows; label: string; icon: CatalogueIconName; travels: boolean; })[]; rows: ((WeaponItemRows) | (ToolItemRows))[]; launches?: Record<string, v.InferOutput<typeof BodyLaunchSchema>>; pickups?: Record<string, v.InferOutput<typeof ClaimedPickupSchema>>; contexts: (ItemContextRows)[]; runtimeContexts?: (ItemFamilyNameRows)[]; loadout: { effects?: { statuses: boolean; player: v.InferOutput<typeof LootEconomySchema.entries.grants.entries.player>; worn: v.InferOutput<typeof LootEconomySchema.entries.grants.entries.worn>; weapons: ({ items: (`weapon.${string}`)[]; grants: v.InferOutput<typeof LootEconomySchema.entries.grants.entries.weapons>; })[]; hitCap?: `effect.${string}`; }; runtime?: { pause: boolean; sliceMs?: number; owners: ({ item: `weapon.${string}`; slot: 'primary' | 'rifle' | 'secondary' | 'extra'; row: 'native' | 'declared'; presentation?: boolean; })[]; }; native?: v.InferOutput<typeof NativeLoadoutRowSchema>; inventory?: { kinds: (ItemFamilyNameRows)[]; slots: number; counts: { min: number; max: number; integer: boolean; complete: boolean; }; quantity: 'unchecked' | 'positive-safe-integer'; snapshot: 'order' | 'roster'; stackLimit?: number; restoreError: string; }; primary: (`weapon.${string}`) | null; secondary: (`weapon.${string}`) | null; tools: (`tool.${string}`)[]; }; }
226
+ export interface NativeSweptPolicyRowsInput { kind: 'swept'; step: ItemFamilyNameRowsInput; selection?: v.InferInput<typeof NativeLoadoutRowSchema>; eye: number; initial: number; source: 'env' | 'owner'; slots: ({ item: `weapon.${string}`; weapon: `weapon.${string}`; tags: (`${string}.${string}`)[]; combo: (ItemFamilyNameRowsInput)[]; heavy: ItemFamilyNameRowsInput; })[]; contact: { slack: number; direction: [number, number, number]; push: [number, number]; running: number; }; lunge: { maxHeight: number; minDistance: number; minRadius: number; lengthScale: number; }; }
227
+ export interface NativeSweptPolicyRows { kind: 'swept'; step: ItemFamilyNameRows; selection?: v.InferOutput<typeof NativeLoadoutRowSchema>; eye: number; initial: number; source: 'env' | 'owner'; slots: ({ item: `weapon.${string}`; weapon: `weapon.${string}`; tags: (`${string}.${string}`)[]; combo: (ItemFamilyNameRows)[]; heavy: ItemFamilyNameRows; })[]; contact: { slack: number; direction: [number, number, number]; push: [number, number]; running: number; }; lunge: { maxHeight: number; minDistance: number; minRadius: number; lengthScale: number; }; }
228
+ export interface ItemEquipmentRowsInput { id: string; legacySlot?: 'crossbow' | 'sword' | 'rifle' | 'sword-iron' | 'bow' | 'sabre' | 'spear' | 'empty'; ui: { name: string; icon: CatalogueIconNameInput; swapIcon: string; touch: 'melee' | 'bow' | 'ranged' | 'throwing'; lockOn: boolean; melee: boolean; tracers: boolean; inputContext?: ItemFamilyNameRowsInput; swapName?: string; huntersEye?: boolean; ammo?: { label: string; segments: number; magazine?: boolean; bagLabel?: string; bagLabelFor?: string; }; }; meta: { name: string; icon: CatalogueIconNameInput; blurb: string; category: ItemFamilyNameRowsInput; }; cues?: { fire: string; reload: string; impact: string; dry?: string; hit?: string; heavy?: string; charge?: Record<string, string>; }; hitStop?: { body: number; head: number; kill: number; }; rangedFeel?: { kick: { body: number; head: number; kill: number; side: number; killSide: number; }; trauma: { kill: number; head: number; killKinds: (ItemFamilyNameRowsInput)[]; headKinds: (ItemFamilyNameRowsInput)[]; }; }; tags?: (`${string}.${string}`)[]; }
229
+ export interface ItemEquipmentRows { id: string; legacySlot?: 'crossbow' | 'sword' | 'rifle' | 'sword-iron' | 'bow' | 'sabre' | 'spear' | 'empty'; ui: { name: string; icon: CatalogueIconName; swapIcon: string; touch: 'melee' | 'bow' | 'ranged' | 'throwing'; lockOn: boolean; melee: boolean; tracers: boolean; inputContext?: ItemFamilyNameRows; swapName?: string; huntersEye?: boolean; ammo?: { label: string; segments: number; magazine?: boolean; bagLabel?: string; bagLabelFor?: string; }; }; meta: { name: string; icon: CatalogueIconName; blurb: string; category: ItemFamilyNameRows; }; cues?: { fire: string; reload: string; impact: string; dry?: string; hit?: string; heavy?: string; charge?: Record<string, string>; }; hitStop?: { body: number; head: number; kill: number; }; rangedFeel?: { kick: { body: number; head: number; kill: number; side: number; killSide: number; }; trauma: { kill: number; head: number; killKinds: (ItemFamilyNameRows)[]; headKinds: (ItemFamilyNameRows)[]; }; }; tags?: (`${string}.${string}`)[]; }