@aephia/atlas-kit 0.6.0-next.6 → 0.6.0-next.61

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 (456) hide show
  1. package/README.md +3 -1
  2. package/dist/cargo/actions/deposit.d.ts +1 -1
  3. package/dist/cargo/actions/deposit.d.ts.map +1 -1
  4. package/dist/cargo/actions/deposit.js +25 -12
  5. package/dist/cargo/actions/deposit.js.map +1 -1
  6. package/dist/cargo/actions/index.d.ts.map +1 -1
  7. package/dist/cargo/actions/index.js +3 -2
  8. package/dist/cargo/actions/index.js.map +1 -1
  9. package/dist/cargo/actions/wallet-context.d.ts.map +1 -1
  10. package/dist/cargo/actions/wallet-context.js +3 -9
  11. package/dist/cargo/actions/wallet-context.js.map +1 -1
  12. package/dist/cargo/actions/wallet-token.d.ts +1 -1
  13. package/dist/cargo/actions/wallet-token.d.ts.map +1 -1
  14. package/dist/cargo/actions/wallet-token.js +1 -9
  15. package/dist/cargo/actions/wallet-token.js.map +1 -1
  16. package/dist/cargo/actions/withdrawal.d.ts.map +1 -1
  17. package/dist/cargo/actions/withdrawal.js +22 -10
  18. package/dist/cargo/actions/withdrawal.js.map +1 -1
  19. package/dist/claim-stakes/actions/index.d.ts +13 -0
  20. package/dist/claim-stakes/actions/index.d.ts.map +1 -1
  21. package/dist/claim-stakes/actions/index.js +87 -37
  22. package/dist/claim-stakes/actions/index.js.map +1 -1
  23. package/dist/client/contracts.d.ts +16 -6
  24. package/dist/client/contracts.d.ts.map +1 -1
  25. package/dist/client/errors.d.ts +4 -0
  26. package/dist/client/errors.d.ts.map +1 -1
  27. package/dist/client/errors.js +31 -1
  28. package/dist/client/errors.js.map +1 -1
  29. package/dist/client/index.d.ts +1 -0
  30. package/dist/client/index.d.ts.map +1 -1
  31. package/dist/client/index.js +1 -0
  32. package/dist/client/index.js.map +1 -1
  33. package/dist/client/rpc-subscription-provider.d.ts +35 -0
  34. package/dist/client/rpc-subscription-provider.d.ts.map +1 -0
  35. package/dist/client/rpc-subscription-provider.js +190 -0
  36. package/dist/client/rpc-subscription-provider.js.map +1 -0
  37. package/dist/combat/actions/index.d.ts.map +1 -1
  38. package/dist/combat/actions/index.js +98 -50
  39. package/dist/combat/actions/index.js.map +1 -1
  40. package/dist/crafting/actions/index.d.ts.map +1 -1
  41. package/dist/crafting/actions/index.js +49 -29
  42. package/dist/crafting/actions/index.js.map +1 -1
  43. package/dist/crafting/index.d.ts +24 -2
  44. package/dist/crafting/index.d.ts.map +1 -1
  45. package/dist/crafting/index.js +31 -2
  46. package/dist/crafting/index.js.map +1 -1
  47. package/dist/factions/actions/index.d.ts +3 -0
  48. package/dist/factions/actions/index.d.ts.map +1 -1
  49. package/dist/factions/actions/index.js +19 -4
  50. package/dist/factions/actions/index.js.map +1 -1
  51. package/dist/factions/index.d.ts +1 -1
  52. package/dist/factions/index.d.ts.map +1 -1
  53. package/dist/factions/index.js +1 -1
  54. package/dist/factions/index.js.map +1 -1
  55. package/dist/factions/profile-faction.d.ts +20 -8
  56. package/dist/factions/profile-faction.d.ts.map +1 -1
  57. package/dist/factions/profile-faction.js +20 -8
  58. package/dist/factions/profile-faction.js.map +1 -1
  59. package/dist/fleets/actions/add-ship.d.ts +35 -0
  60. package/dist/fleets/actions/add-ship.d.ts.map +1 -0
  61. package/dist/fleets/actions/add-ship.js +149 -0
  62. package/dist/fleets/actions/add-ship.js.map +1 -0
  63. package/dist/fleets/actions/create-fleet.d.ts +36 -0
  64. package/dist/fleets/actions/create-fleet.d.ts.map +1 -0
  65. package/dist/fleets/actions/create-fleet.js +138 -0
  66. package/dist/fleets/actions/create-fleet.js.map +1 -0
  67. package/dist/fleets/actions/index.d.ts +27 -15
  68. package/dist/fleets/actions/index.d.ts.map +1 -1
  69. package/dist/fleets/actions/index.js +161 -109
  70. package/dist/fleets/actions/index.js.map +1 -1
  71. package/dist/fleets/actions/respawn.d.ts +38 -0
  72. package/dist/fleets/actions/respawn.d.ts.map +1 -0
  73. package/dist/fleets/actions/respawn.js +122 -0
  74. package/dist/fleets/actions/respawn.js.map +1 -0
  75. package/dist/fleets/actions/ship-import.d.ts +48 -0
  76. package/dist/fleets/actions/ship-import.d.ts.map +1 -0
  77. package/dist/fleets/actions/ship-import.js +330 -0
  78. package/dist/fleets/actions/ship-import.js.map +1 -0
  79. package/dist/identity/actions/create-profile.d.ts +56 -0
  80. package/dist/identity/actions/create-profile.d.ts.map +1 -0
  81. package/dist/identity/actions/create-profile.js +139 -0
  82. package/dist/identity/actions/create-profile.js.map +1 -0
  83. package/dist/identity/actions/index.d.ts +4 -1
  84. package/dist/identity/actions/index.d.ts.map +1 -1
  85. package/dist/identity/actions/index.js +50 -28
  86. package/dist/identity/actions/index.js.map +1 -1
  87. package/dist/identity/index.d.ts +15 -0
  88. package/dist/identity/index.d.ts.map +1 -1
  89. package/dist/identity/index.js +15 -0
  90. package/dist/identity/index.js.map +1 -1
  91. package/dist/identity/permissions.d.ts +124 -0
  92. package/dist/identity/permissions.d.ts.map +1 -0
  93. package/dist/identity/permissions.js +171 -0
  94. package/dist/identity/permissions.js.map +1 -0
  95. package/dist/index.d.ts +9 -0
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +4 -1
  98. package/dist/index.js.map +1 -1
  99. package/dist/internal/c4/cargo-bytes-config.d.ts +7 -0
  100. package/dist/internal/c4/cargo-bytes-config.d.ts.map +1 -0
  101. package/dist/internal/c4/cargo-bytes-config.js +19 -0
  102. package/dist/internal/c4/cargo-bytes-config.js.map +1 -0
  103. package/dist/internal/c4/character-registration.d.ts +2 -0
  104. package/dist/internal/c4/character-registration.d.ts.map +1 -1
  105. package/dist/internal/c4/character-registration.js +2 -0
  106. package/dist/internal/c4/character-registration.js.map +1 -1
  107. package/dist/internal/c4/claim-stake.d.ts +0 -27
  108. package/dist/internal/c4/claim-stake.d.ts.map +1 -1
  109. package/dist/internal/c4/claim-stake.js +0 -33
  110. package/dist/internal/c4/claim-stake.js.map +1 -1
  111. package/dist/internal/c4/combat.d.ts +0 -27
  112. package/dist/internal/c4/combat.d.ts.map +1 -1
  113. package/dist/internal/c4/combat.js +0 -33
  114. package/dist/internal/c4/combat.js.map +1 -1
  115. package/dist/internal/c4/crafting-process-codec.d.ts +13 -0
  116. package/dist/internal/c4/crafting-process-codec.d.ts.map +1 -0
  117. package/dist/internal/c4/crafting-process-codec.js +34 -0
  118. package/dist/internal/c4/crafting-process-codec.js.map +1 -0
  119. package/dist/internal/c4/crafting.d.ts +11 -31
  120. package/dist/internal/c4/crafting.d.ts.map +1 -1
  121. package/dist/internal/c4/crafting.js +26 -43
  122. package/dist/internal/c4/crafting.js.map +1 -1
  123. package/dist/internal/c4/faction-adapter.d.ts +12 -0
  124. package/dist/internal/c4/faction-adapter.d.ts.map +1 -0
  125. package/dist/internal/c4/faction-adapter.js +52 -0
  126. package/dist/internal/c4/faction-adapter.js.map +1 -0
  127. package/dist/internal/c4/faction-epoch-meter.d.ts +10 -0
  128. package/dist/internal/c4/faction-epoch-meter.d.ts.map +1 -0
  129. package/dist/internal/c4/faction-epoch-meter.js +31 -0
  130. package/dist/internal/c4/faction-epoch-meter.js.map +1 -0
  131. package/dist/internal/c4/faction-treasury.d.ts +23 -0
  132. package/dist/internal/c4/faction-treasury.d.ts.map +1 -0
  133. package/dist/internal/c4/faction-treasury.js +48 -0
  134. package/dist/internal/c4/faction-treasury.js.map +1 -0
  135. package/dist/internal/c4/factions.d.ts +9 -57
  136. package/dist/internal/c4/factions.d.ts.map +1 -1
  137. package/dist/internal/c4/factions.js +21 -139
  138. package/dist/internal/c4/factions.js.map +1 -1
  139. package/dist/internal/c4/fleet-arrival.d.ts +28 -0
  140. package/dist/internal/c4/fleet-arrival.d.ts.map +1 -0
  141. package/dist/internal/c4/fleet-arrival.js +42 -0
  142. package/dist/internal/c4/fleet-arrival.js.map +1 -0
  143. package/dist/internal/c4/fleet-creation.d.ts +7 -0
  144. package/dist/internal/c4/fleet-creation.d.ts.map +1 -0
  145. package/dist/internal/c4/fleet-creation.js +180 -0
  146. package/dist/internal/c4/fleet-creation.js.map +1 -0
  147. package/dist/internal/c4/fleet-crew-binding.d.ts +9 -0
  148. package/dist/internal/c4/fleet-crew-binding.d.ts.map +1 -1
  149. package/dist/internal/c4/fleet-crew-binding.js +15 -0
  150. package/dist/internal/c4/fleet-crew-binding.js.map +1 -1
  151. package/dist/internal/c4/fleet-respawn.d.ts +19 -0
  152. package/dist/internal/c4/fleet-respawn.d.ts.map +1 -0
  153. package/dist/internal/c4/fleet-respawn.js +91 -0
  154. package/dist/internal/c4/fleet-respawn.js.map +1 -0
  155. package/dist/internal/c4/fleet-ship-assembly.d.ts +11 -0
  156. package/dist/internal/c4/fleet-ship-assembly.d.ts.map +1 -0
  157. package/dist/internal/c4/fleet-ship-assembly.js +44 -0
  158. package/dist/internal/c4/fleet-ship-assembly.js.map +1 -0
  159. package/dist/internal/c4/fleet.d.ts +38 -19
  160. package/dist/internal/c4/fleet.d.ts.map +1 -1
  161. package/dist/internal/c4/fleet.js.map +1 -1
  162. package/dist/internal/c4/game.d.ts +31 -8
  163. package/dist/internal/c4/game.d.ts.map +1 -1
  164. package/dist/internal/c4/game.js +88 -12
  165. package/dist/internal/c4/game.js.map +1 -1
  166. package/dist/internal/c4/identity.d.ts +2 -7
  167. package/dist/internal/c4/identity.d.ts.map +1 -1
  168. package/dist/internal/c4/identity.js +2 -23
  169. package/dist/internal/c4/identity.js.map +1 -1
  170. package/dist/internal/c4/loyalty.d.ts +0 -27
  171. package/dist/internal/c4/loyalty.d.ts.map +1 -1
  172. package/dist/internal/c4/loyalty.js +0 -33
  173. package/dist/internal/c4/loyalty.js.map +1 -1
  174. package/dist/internal/c4/market.d.ts +1 -37
  175. package/dist/internal/c4/market.d.ts.map +1 -1
  176. package/dist/internal/c4/market.js +11 -49
  177. package/dist/internal/c4/market.js.map +1 -1
  178. package/dist/internal/c4/mining-instructions.d.ts +2 -0
  179. package/dist/internal/c4/mining-instructions.d.ts.map +1 -0
  180. package/dist/internal/c4/mining-instructions.js +3 -0
  181. package/dist/internal/c4/mining-instructions.js.map +1 -0
  182. package/dist/internal/c4/open-signal.d.ts +8 -0
  183. package/dist/internal/c4/open-signal.d.ts.map +1 -0
  184. package/dist/internal/c4/open-signal.js +37 -0
  185. package/dist/internal/c4/open-signal.js.map +1 -0
  186. package/dist/internal/c4/profile-creation.d.ts +17 -0
  187. package/dist/internal/c4/profile-creation.d.ts.map +1 -0
  188. package/dist/internal/c4/profile-creation.js +36 -0
  189. package/dist/internal/c4/profile-creation.js.map +1 -0
  190. package/dist/internal/c4/profile-permissions.d.ts +14 -0
  191. package/dist/internal/c4/profile-permissions.d.ts.map +1 -0
  192. package/dist/internal/c4/profile-permissions.js +81 -0
  193. package/dist/internal/c4/profile-permissions.js.map +1 -0
  194. package/dist/internal/c4/region-geometry.d.ts +8 -0
  195. package/dist/internal/c4/region-geometry.d.ts.map +1 -0
  196. package/dist/internal/c4/region-geometry.js +43 -0
  197. package/dist/internal/c4/region-geometry.js.map +1 -0
  198. package/dist/internal/c4/rewards.d.ts +0 -27
  199. package/dist/internal/c4/rewards.d.ts.map +1 -1
  200. package/dist/internal/c4/rewards.js +0 -33
  201. package/dist/internal/c4/rewards.js.map +1 -1
  202. package/dist/internal/c4/runtime-bindings.d.ts +3 -0
  203. package/dist/internal/c4/runtime-bindings.d.ts.map +1 -0
  204. package/dist/internal/c4/runtime-bindings.js +4 -0
  205. package/dist/internal/c4/runtime-bindings.js.map +1 -0
  206. package/dist/internal/c4/scan-detection-codecs.d.ts +3 -0
  207. package/dist/internal/c4/scan-detection-codecs.d.ts.map +1 -0
  208. package/dist/internal/c4/scan-detection-codecs.js +3 -0
  209. package/dist/internal/c4/scan-detection-codecs.js.map +1 -0
  210. package/dist/internal/c4/scan-lifecycle.d.ts +278 -0
  211. package/dist/internal/c4/scan-lifecycle.d.ts.map +1 -0
  212. package/dist/internal/c4/scan-lifecycle.js +236 -0
  213. package/dist/internal/c4/scan-lifecycle.js.map +1 -0
  214. package/dist/internal/c4/scanning.d.ts +1 -28
  215. package/dist/internal/c4/scanning.d.ts.map +1 -1
  216. package/dist/internal/c4/scanning.js +2 -33
  217. package/dist/internal/c4/scanning.js.map +1 -1
  218. package/dist/internal/c4/ship-import.d.ts +4 -0
  219. package/dist/internal/c4/ship-import.d.ts.map +1 -0
  220. package/dist/internal/c4/ship-import.js +13 -0
  221. package/dist/internal/c4/ship-import.js.map +1 -0
  222. package/dist/internal/c4/ship-stats.d.ts.map +1 -1
  223. package/dist/internal/c4/ship-stats.js +25 -21
  224. package/dist/internal/c4/ship-stats.js.map +1 -1
  225. package/dist/internal/c4/starbase.d.ts +0 -32
  226. package/dist/internal/c4/starbase.d.ts.map +1 -1
  227. package/dist/internal/c4/starbase.js +3 -41
  228. package/dist/internal/c4/starbase.js.map +1 -1
  229. package/dist/internal/c4/world.js +2 -1
  230. package/dist/internal/c4/world.js.map +1 -1
  231. package/dist/internal/cargo.d.ts +2 -0
  232. package/dist/internal/cargo.d.ts.map +1 -1
  233. package/dist/internal/cargo.js +8 -0
  234. package/dist/internal/cargo.js.map +1 -1
  235. package/dist/internal/fleet.d.ts +1 -0
  236. package/dist/internal/fleet.d.ts.map +1 -1
  237. package/dist/internal/fleet.js +3 -1
  238. package/dist/internal/fleet.js.map +1 -1
  239. package/dist/internal/loyalty-atlas-bank-state.d.ts +16 -0
  240. package/dist/internal/loyalty-atlas-bank-state.d.ts.map +1 -0
  241. package/dist/internal/loyalty-atlas-bank-state.js +10 -0
  242. package/dist/internal/loyalty-atlas-bank-state.js.map +1 -0
  243. package/dist/internal/planning/account-state.d.ts +4 -0
  244. package/dist/internal/planning/account-state.d.ts.map +1 -0
  245. package/dist/internal/planning/account-state.js +11 -0
  246. package/dist/internal/planning/account-state.js.map +1 -0
  247. package/dist/internal/planning/action-runtime.d.ts +38 -0
  248. package/dist/internal/planning/action-runtime.d.ts.map +1 -0
  249. package/dist/internal/planning/action-runtime.js +63 -0
  250. package/dist/internal/planning/action-runtime.js.map +1 -0
  251. package/dist/internal/planning/arrival-guards.d.ts +20 -0
  252. package/dist/internal/planning/arrival-guards.d.ts.map +1 -0
  253. package/dist/internal/planning/arrival-guards.js +187 -0
  254. package/dist/internal/planning/arrival-guards.js.map +1 -0
  255. package/dist/internal/planning/authorization-adapter.d.ts +19 -6
  256. package/dist/internal/planning/authorization-adapter.d.ts.map +1 -1
  257. package/dist/internal/planning/authorization-adapter.js +102 -16
  258. package/dist/internal/planning/authorization-adapter.js.map +1 -1
  259. package/dist/internal/planning/character-registration-guard.d.ts +4 -0
  260. package/dist/internal/planning/character-registration-guard.d.ts.map +1 -0
  261. package/dist/internal/planning/character-registration-guard.js +58 -0
  262. package/dist/internal/planning/character-registration-guard.js.map +1 -0
  263. package/dist/internal/planning/character-registration.d.ts +23 -0
  264. package/dist/internal/planning/character-registration.d.ts.map +1 -0
  265. package/dist/internal/planning/character-registration.js +86 -0
  266. package/dist/internal/planning/character-registration.js.map +1 -0
  267. package/dist/internal/planning/democracy-history.d.ts +50 -0
  268. package/dist/internal/planning/democracy-history.d.ts.map +1 -0
  269. package/dist/internal/planning/democracy-history.js +198 -0
  270. package/dist/internal/planning/democracy-history.js.map +1 -0
  271. package/dist/internal/planning/faction-enrollment.d.ts +1 -1
  272. package/dist/internal/planning/faction-enrollment.d.ts.map +1 -1
  273. package/dist/internal/planning/faction-enrollment.js +7 -13
  274. package/dist/internal/planning/faction-enrollment.js.map +1 -1
  275. package/dist/internal/planning/faction-trade-guards.d.ts +30 -0
  276. package/dist/internal/planning/faction-trade-guards.d.ts.map +1 -0
  277. package/dist/internal/planning/faction-trade-guards.js +15 -0
  278. package/dist/internal/planning/faction-trade-guards.js.map +1 -0
  279. package/dist/internal/planning/faction-trade-state.d.ts +16 -0
  280. package/dist/internal/planning/faction-trade-state.d.ts.map +1 -0
  281. package/dist/internal/planning/faction-trade-state.js +43 -0
  282. package/dist/internal/planning/faction-trade-state.js.map +1 -0
  283. package/dist/internal/planning/fleet-arrival.d.ts +40 -0
  284. package/dist/internal/planning/fleet-arrival.d.ts.map +1 -0
  285. package/dist/internal/planning/fleet-arrival.js +106 -0
  286. package/dist/internal/planning/fleet-arrival.js.map +1 -0
  287. package/dist/internal/planning/fleet-attack-xp.d.ts +20 -0
  288. package/dist/internal/planning/fleet-attack-xp.d.ts.map +1 -0
  289. package/dist/internal/planning/fleet-attack-xp.js +110 -0
  290. package/dist/internal/planning/fleet-attack-xp.js.map +1 -0
  291. package/dist/internal/planning/fleet-creation.d.ts +30 -0
  292. package/dist/internal/planning/fleet-creation.d.ts.map +1 -0
  293. package/dist/internal/planning/fleet-creation.js +107 -0
  294. package/dist/internal/planning/fleet-creation.js.map +1 -0
  295. package/dist/internal/planning/fleet-respawn.d.ts +28 -0
  296. package/dist/internal/planning/fleet-respawn.d.ts.map +1 -0
  297. package/dist/internal/planning/fleet-respawn.js +164 -0
  298. package/dist/internal/planning/fleet-respawn.js.map +1 -0
  299. package/dist/internal/planning/fleet-ship-assembly.d.ts +36 -0
  300. package/dist/internal/planning/fleet-ship-assembly.d.ts.map +1 -0
  301. package/dist/internal/planning/fleet-ship-assembly.js +136 -0
  302. package/dist/internal/planning/fleet-ship-assembly.js.map +1 -0
  303. package/dist/internal/planning/governance-fees.d.ts +64 -0
  304. package/dist/internal/planning/governance-fees.d.ts.map +1 -0
  305. package/dist/internal/planning/governance-fees.js +239 -0
  306. package/dist/internal/planning/governance-fees.js.map +1 -0
  307. package/dist/internal/planning/mining-stop.d.ts +14 -0
  308. package/dist/internal/planning/mining-stop.d.ts.map +1 -0
  309. package/dist/internal/planning/mining-stop.js +41 -0
  310. package/dist/internal/planning/mining-stop.js.map +1 -0
  311. package/dist/internal/planning/movement-character.d.ts +7 -0
  312. package/dist/internal/planning/movement-character.d.ts.map +1 -0
  313. package/dist/internal/planning/movement-character.js +41 -0
  314. package/dist/internal/planning/movement-character.js.map +1 -0
  315. package/dist/internal/planning/movement-xp-guard.d.ts +4 -0
  316. package/dist/internal/planning/movement-xp-guard.d.ts.map +1 -0
  317. package/dist/internal/planning/movement-xp-guard.js +103 -0
  318. package/dist/internal/planning/movement-xp-guard.js.map +1 -0
  319. package/dist/internal/planning/open-signal-guard.d.ts +3 -0
  320. package/dist/internal/planning/open-signal-guard.d.ts.map +1 -0
  321. package/dist/internal/planning/open-signal-guard.js +31 -0
  322. package/dist/internal/planning/open-signal-guard.js.map +1 -0
  323. package/dist/internal/planning/open-signal.d.ts +31 -0
  324. package/dist/internal/planning/open-signal.d.ts.map +1 -0
  325. package/dist/internal/planning/open-signal.js +84 -0
  326. package/dist/internal/planning/open-signal.js.map +1 -0
  327. package/dist/internal/planning/respawn-guards.d.ts +3 -0
  328. package/dist/internal/planning/respawn-guards.d.ts.map +1 -0
  329. package/dist/internal/planning/respawn-guards.js +41 -0
  330. package/dist/internal/planning/respawn-guards.js.map +1 -0
  331. package/dist/internal/planning/runtime-guards.d.ts +43 -0
  332. package/dist/internal/planning/runtime-guards.d.ts.map +1 -0
  333. package/dist/internal/planning/runtime-guards.js +636 -0
  334. package/dist/internal/planning/runtime-guards.js.map +1 -0
  335. package/dist/internal/planning/scan-completion-guard.d.ts +43 -0
  336. package/dist/internal/planning/scan-completion-guard.d.ts.map +1 -0
  337. package/dist/internal/planning/scan-completion-guard.js +94 -0
  338. package/dist/internal/planning/scan-completion-guard.js.map +1 -0
  339. package/dist/internal/planning/scan-completion.d.ts +20 -0
  340. package/dist/internal/planning/scan-completion.d.ts.map +1 -0
  341. package/dist/internal/planning/scan-completion.js +220 -0
  342. package/dist/internal/planning/scan-completion.js.map +1 -0
  343. package/dist/internal/planning/scan-detect-guard.d.ts +34 -0
  344. package/dist/internal/planning/scan-detect-guard.d.ts.map +1 -0
  345. package/dist/internal/planning/scan-detect-guard.js +77 -0
  346. package/dist/internal/planning/scan-detect-guard.js.map +1 -0
  347. package/dist/internal/planning/scan-detect.d.ts +24 -0
  348. package/dist/internal/planning/scan-detect.d.ts.map +1 -0
  349. package/dist/internal/planning/scan-detect.js +244 -0
  350. package/dist/internal/planning/scan-detect.js.map +1 -0
  351. package/dist/internal/planning/ship-import-funding.d.ts +22 -0
  352. package/dist/internal/planning/ship-import-funding.d.ts.map +1 -0
  353. package/dist/internal/planning/ship-import-funding.js +52 -0
  354. package/dist/internal/planning/ship-import-funding.js.map +1 -0
  355. package/dist/internal/planning/ship-token.d.ts +10 -0
  356. package/dist/internal/planning/ship-token.d.ts.map +1 -0
  357. package/dist/internal/planning/ship-token.js +47 -0
  358. package/dist/internal/planning/ship-token.js.map +1 -0
  359. package/dist/internal/planning/starbase-system-guard.d.ts +6 -0
  360. package/dist/internal/planning/starbase-system-guard.d.ts.map +1 -0
  361. package/dist/internal/planning/starbase-system-guard.js +93 -0
  362. package/dist/internal/planning/starbase-system-guard.js.map +1 -0
  363. package/dist/internal/planning/starbase-system.d.ts +12 -0
  364. package/dist/internal/planning/starbase-system.d.ts.map +1 -0
  365. package/dist/internal/planning/starbase-system.js +22 -0
  366. package/dist/internal/planning/starbase-system.js.map +1 -0
  367. package/dist/internal/planning/token-mint.d.ts +4 -0
  368. package/dist/internal/planning/token-mint.d.ts.map +1 -0
  369. package/dist/internal/planning/token-mint.js +15 -0
  370. package/dist/internal/planning/token-mint.js.map +1 -0
  371. package/dist/internal/planning/trade-faction-market.d.ts +20 -0
  372. package/dist/internal/planning/trade-faction-market.d.ts.map +1 -0
  373. package/dist/internal/planning/trade-faction-market.js +56 -0
  374. package/dist/internal/planning/trade-faction-market.js.map +1 -0
  375. package/dist/internal/planning/xp-runtime.d.ts +36 -0
  376. package/dist/internal/planning/xp-runtime.d.ts.map +1 -0
  377. package/dist/internal/planning/xp-runtime.js +126 -0
  378. package/dist/internal/planning/xp-runtime.js.map +1 -0
  379. package/dist/loyalty/actions/index.d.ts.map +1 -1
  380. package/dist/loyalty/actions/index.js +4 -3
  381. package/dist/loyalty/actions/index.js.map +1 -1
  382. package/dist/loyalty/index.d.ts.map +1 -1
  383. package/dist/loyalty/index.js +2 -6
  384. package/dist/loyalty/index.js.map +1 -1
  385. package/dist/markets/actions/index.d.ts +1 -0
  386. package/dist/markets/actions/index.d.ts.map +1 -1
  387. package/dist/markets/actions/index.js +40 -16
  388. package/dist/markets/actions/index.js.map +1 -1
  389. package/dist/markets/actions/trade-faction-market.d.ts +43 -0
  390. package/dist/markets/actions/trade-faction-market.d.ts.map +1 -0
  391. package/dist/markets/actions/trade-faction-market.js +291 -0
  392. package/dist/markets/actions/trade-faction-market.js.map +1 -0
  393. package/dist/mining/actions/index.d.ts +84 -0
  394. package/dist/mining/actions/index.d.ts.map +1 -0
  395. package/dist/mining/actions/index.js +328 -0
  396. package/dist/mining/actions/index.js.map +1 -0
  397. package/dist/mining/index.d.ts +7 -2
  398. package/dist/mining/index.d.ts.map +1 -1
  399. package/dist/mining/index.js +5 -2
  400. package/dist/mining/index.js.map +1 -1
  401. package/dist/planning/assembly.d.ts.map +1 -1
  402. package/dist/planning/assembly.js +18 -0
  403. package/dist/planning/assembly.js.map +1 -1
  404. package/dist/planning/execution.d.ts.map +1 -1
  405. package/dist/planning/execution.js +374 -18
  406. package/dist/planning/execution.js.map +1 -1
  407. package/dist/planning/index.d.ts +185 -117
  408. package/dist/planning/index.d.ts.map +1 -1
  409. package/dist/planning/index.js +796 -87
  410. package/dist/planning/index.js.map +1 -1
  411. package/dist/planning/simulation.d.ts +25 -1
  412. package/dist/planning/simulation.d.ts.map +1 -1
  413. package/dist/planning/simulation.js +111 -11
  414. package/dist/planning/simulation.js.map +1 -1
  415. package/dist/registry/cargo.d.ts +6 -11
  416. package/dist/registry/cargo.d.ts.map +1 -1
  417. package/dist/registry/cargo.js +19 -19
  418. package/dist/registry/cargo.js.map +1 -1
  419. package/dist/registry/index.d.ts +4 -0
  420. package/dist/registry/index.d.ts.map +1 -1
  421. package/dist/registry/index.js.map +1 -1
  422. package/dist/registry/onboarding.d.ts +10 -1
  423. package/dist/registry/onboarding.d.ts.map +1 -1
  424. package/dist/registry/onboarding.js +26 -8
  425. package/dist/registry/onboarding.js.map +1 -1
  426. package/dist/registry/scanning.d.ts +7 -0
  427. package/dist/registry/scanning.d.ts.map +1 -0
  428. package/dist/registry/scanning.js +13 -0
  429. package/dist/registry/scanning.js.map +1 -0
  430. package/dist/registry/ship-stats-snapshot.js +19 -19
  431. package/dist/registry/ship-stats-snapshot.js.map +1 -1
  432. package/dist/registry/ships.d.ts +28 -0
  433. package/dist/registry/ships.d.ts.map +1 -0
  434. package/dist/registry/ships.js +51 -0
  435. package/dist/registry/ships.js.map +1 -0
  436. package/dist/registry/xp-runtime.d.ts +4 -0
  437. package/dist/registry/xp-runtime.d.ts.map +1 -0
  438. package/dist/registry/xp-runtime.js +14 -0
  439. package/dist/registry/xp-runtime.js.map +1 -0
  440. package/dist/scanning/actions/index.d.ts +116 -0
  441. package/dist/scanning/actions/index.d.ts.map +1 -0
  442. package/dist/scanning/actions/index.js +209 -0
  443. package/dist/scanning/actions/index.js.map +1 -0
  444. package/dist/scanning/index.d.ts +3 -1
  445. package/dist/scanning/index.d.ts.map +1 -1
  446. package/dist/scanning/index.js +4 -2
  447. package/dist/scanning/index.js.map +1 -1
  448. package/dist/scanning/lifecycle.d.ts +77 -0
  449. package/dist/scanning/lifecycle.d.ts.map +1 -0
  450. package/dist/scanning/lifecycle.js +93 -0
  451. package/dist/scanning/lifecycle.js.map +1 -0
  452. package/dist/scanning/signals.d.ts +121 -0
  453. package/dist/scanning/signals.d.ts.map +1 -0
  454. package/dist/scanning/signals.js +171 -0
  455. package/dist/scanning/signals.js.map +1 -0
  456. package/package.json +10 -2
@@ -1,6 +1,18 @@
1
+ import { validateCompletionInstructions, scanCompletionDiscriminators, } from '../internal/planning/scan-completion-guard.js';
2
+ import { validateOpenSignalInstructions } from '../internal/planning/open-signal-guard.js';
3
+ import { validateDetectInstructions, } from '../internal/planning/scan-detect-guard.js';
4
+ import { validateRespawnInstructions } from '../internal/planning/respawn-guards.js';
5
+ import { validateFleetAttackInstructions, } from '../internal/planning/fleet-attack-xp.js';
6
+ import { validateMovementXpInstructions } from '../internal/planning/movement-xp-guard.js';
7
+ import { validateStarbaseSystemInstructions, validateStarbaseSystemGuards, } from '../internal/planning/starbase-system-guard.js';
8
+ import { validateCharacterRegistrationInstructions } from '../internal/planning/character-registration-guard.js';
9
+ import { normalizeArrivalGuard, arrivalGuardToJSON, validateArrivalInstructions, } from '../internal/planning/arrival-guards.js';
10
+ import { isRuntimeGuard, normalizeRuntimeGuard, runtimeGuardToJSON, validateRuntimeInstructions, } from '../internal/planning/runtime-guards.js';
11
+ import { isTradeBuyGuard, isTradeSellGuard, isTradeMeterGuard, isFactionTradeGuard, } from '../internal/planning/faction-trade-guards.js';
1
12
  import { AccountRole, getBase64Decoder, getBase64Encoder, isAddress, isWritableRole, } from '@solana/kit';
2
- import { InvalidActionInputError } from '../client/errors.js';
13
+ import { InvalidActionInputError, SageSdkError } from '../client/errors.js';
3
14
  import { deepFreeze } from '../internal/immutable-tree.js';
15
+ import { validateMiningStopInstructions } from '../internal/planning/mining-stop.js';
4
16
  import { validatePlanComposition } from './composition.js';
5
17
  import { isPlanInstance, registerPlanInstance } from './plan-instances.js';
6
18
  const PLAN_BRAND = Symbol('AephiaSagePlan');
@@ -159,10 +171,564 @@ function normalizeSemanticFact(value, field) {
159
171
  }
160
172
  return invalid(`${field}.kind`, semantic.kind, 'one of exclusive, requires, invalidates, or transition');
161
173
  }
162
- function normalizePrecondition(value, field, version = 4) {
174
+ function normalizePrecondition(value, field) {
163
175
  const precondition = readRecord(value, field);
164
- if (version === 4 &&
165
- ['token-account', 'game-cargo-config', 'cargo-cache'].includes(String(precondition.kind))) {
176
+ if (precondition.kind === 'fleet-arrival')
177
+ return normalizeArrivalGuard(precondition, field);
178
+ if (isRuntimeGuard(precondition))
179
+ return normalizeRuntimeGuard(precondition, field);
180
+ if (precondition.kind === 'character-registration') {
181
+ assertKeys(precondition, field, [
182
+ 'kind',
183
+ 'address',
184
+ 'game',
185
+ 'profile',
186
+ 'profileDataHash',
187
+ 'funder',
188
+ 'xpBudget',
189
+ 'xpBudgetConfig',
190
+ 'maximumFunderDebit',
191
+ 'characterSize',
192
+ 'initializationHash',
193
+ 'characterLamports',
194
+ 'budgetLamports',
195
+ 'describes',
196
+ ]);
197
+ if (typeof precondition.characterSize !== 'number' ||
198
+ !Number.isSafeInteger(precondition.characterSize) ||
199
+ precondition.characterSize < 423)
200
+ invalid(`${field}.characterSize`, precondition.characterSize, 'a qualified Character allocation of at least 423 bytes');
201
+ for (const key of ['characterLamports', 'budgetLamports'])
202
+ if (typeof precondition[key] !== 'bigint' || precondition[key] < 0n)
203
+ invalid(`${field}.${key}`, precondition[key], 'a nonnegative bigint');
204
+ const maximumFunderDebit = precondition.maximumFunderDebit;
205
+ if (typeof maximumFunderDebit !== 'bigint' || maximumFunderDebit < 0n)
206
+ invalid(`${field}.maximumFunderDebit`, maximumFunderDebit, 'a nonnegative bigint');
207
+ return Object.freeze({
208
+ kind: 'character-registration',
209
+ address: readAddress(precondition.address, `${field}.address`),
210
+ game: readAddress(precondition.game, `${field}.game`),
211
+ profile: readAddress(precondition.profile, `${field}.profile`),
212
+ profileDataHash: readDataHash(precondition.profileDataHash, `${field}.profileDataHash`),
213
+ funder: readAddress(precondition.funder, `${field}.funder`),
214
+ xpBudget: readAddress(precondition.xpBudget, `${field}.xpBudget`),
215
+ xpBudgetConfig: readAddress(precondition.xpBudgetConfig, `${field}.xpBudgetConfig`),
216
+ maximumFunderDebit,
217
+ characterLamports: precondition.characterLamports,
218
+ budgetLamports: precondition.budgetLamports,
219
+ characterSize: precondition.characterSize,
220
+ initializationHash: readDataHash(precondition.initializationHash, `${field}.initializationHash`),
221
+ describes: readString(precondition.describes, `${field}.describes`),
222
+ });
223
+ }
224
+ if (precondition.kind === 'ship-import-funding') {
225
+ assertKeys(precondition, field, [
226
+ 'kind',
227
+ 'address',
228
+ 'game',
229
+ 'profile',
230
+ 'system',
231
+ 'shipId',
232
+ 'maximumProfileDebit',
233
+ 'describes',
234
+ ]);
235
+ const shipId = precondition.shipId;
236
+ if (typeof shipId !== 'number' ||
237
+ !Number.isInteger(shipId) ||
238
+ shipId < 0 ||
239
+ shipId > 65535)
240
+ invalid(`${field}.shipId`, shipId, 'an unsigned u16 ship configuration ID');
241
+ const maximumProfileDebit = precondition.maximumProfileDebit;
242
+ if (typeof maximumProfileDebit !== 'bigint' || maximumProfileDebit < 0n)
243
+ invalid(`${field}.maximumProfileDebit`, maximumProfileDebit, 'a nonnegative bigint');
244
+ return Object.freeze({
245
+ kind: 'ship-import-funding',
246
+ address: readAddress(precondition.address, `${field}.address`),
247
+ game: readAddress(precondition.game, `${field}.game`),
248
+ profile: readAddress(precondition.profile, `${field}.profile`),
249
+ system: readAddress(precondition.system, `${field}.system`),
250
+ shipId,
251
+ maximumProfileDebit,
252
+ describes: readString(precondition.describes, `${field}.describes`),
253
+ });
254
+ }
255
+ if (precondition.kind === 'fleet-attack') {
256
+ assertKeys(precondition, field, [
257
+ 'kind',
258
+ 'address',
259
+ 'defender',
260
+ 'game',
261
+ 'profile',
262
+ 'defenderProfile',
263
+ 'instructionKey',
264
+ 'describes',
265
+ ]);
266
+ return Object.freeze({
267
+ kind: 'fleet-attack',
268
+ address: readAddress(precondition.address, `${field}.address`),
269
+ defender: readAddress(precondition.defender, `${field}.defender`),
270
+ game: readAddress(precondition.game, `${field}.game`),
271
+ profile: readAddress(precondition.profile, `${field}.profile`),
272
+ defenderProfile: readAddress(precondition.defenderProfile, `${field}.defenderProfile`),
273
+ instructionKey: readString(precondition.instructionKey, `${field}.instructionKey`),
274
+ describes: readString(precondition.describes, `${field}.describes`),
275
+ });
276
+ }
277
+ if (precondition.kind === 'movement-character') {
278
+ assertKeys(precondition, field, [
279
+ 'kind',
280
+ 'address',
281
+ 'game',
282
+ 'profile',
283
+ 'stateHash',
284
+ 'describes',
285
+ ]);
286
+ return Object.freeze({
287
+ kind: 'movement-character',
288
+ address: readAddress(precondition.address, `${field}.address`),
289
+ game: readAddress(precondition.game, `${field}.game`),
290
+ profile: readAddress(precondition.profile, `${field}.profile`),
291
+ stateHash: readDataHash(precondition.stateHash, `${field}.stateHash`),
292
+ describes: readString(precondition.describes, `${field}.describes`),
293
+ });
294
+ }
295
+ if (precondition.kind === 'starbase-system') {
296
+ assertKeys(precondition, field, ['kind', 'address', 'game', 'starbaseSequenceId', 'describes'], ['requireCss']);
297
+ if (precondition.requireCss !== undefined &&
298
+ precondition.requireCss !== true)
299
+ invalid(`${field}.requireCss`, precondition.requireCss, 'true when CSS access is required, otherwise omitted');
300
+ const sequence = precondition.starbaseSequenceId;
301
+ if (typeof sequence !== 'bigint' ||
302
+ sequence < 0n ||
303
+ sequence > 18446744073709551615n)
304
+ invalid(`${field}.starbaseSequenceId`, sequence, 'an unsigned u64 Starbase sequence');
305
+ return Object.freeze({
306
+ kind: 'starbase-system',
307
+ address: readAddress(precondition.address, `${field}.address`),
308
+ game: readAddress(precondition.game, `${field}.game`),
309
+ starbaseSequenceId: sequence,
310
+ ...(precondition.requireCss === undefined
311
+ ? {}
312
+ : { requireCss: true }),
313
+ describes: readString(precondition.describes, `${field}.describes`),
314
+ });
315
+ }
316
+ if (precondition.kind === 'fleet-mining') {
317
+ assertKeys(precondition, field, [
318
+ 'kind',
319
+ 'address',
320
+ 'game',
321
+ 'profile',
322
+ 'asteroid',
323
+ 'describes',
324
+ ]);
325
+ return Object.freeze({
326
+ kind: 'fleet-mining',
327
+ address: readAddress(precondition.address, `${field}.address`),
328
+ game: readAddress(precondition.game, `${field}.game`),
329
+ profile: readAddress(precondition.profile, `${field}.profile`),
330
+ asteroid: readAddress(precondition.asteroid, `${field}.asteroid`),
331
+ describes: readString(precondition.describes, `${field}.describes`),
332
+ });
333
+ }
334
+ if (isFactionTradeGuard(precondition)) {
335
+ const kind = precondition.kind;
336
+ assertKeys(precondition, field, [
337
+ 'kind',
338
+ 'address',
339
+ 'game',
340
+ 'factionId',
341
+ 'describes',
342
+ 'schemaVersion',
343
+ ...(isTradeBuyGuard(precondition)
344
+ ? ['cargoId', 'floorRaw']
345
+ : isTradeSellGuard(precondition)
346
+ ? ['atlasOutCapPerEpochRaw', 'epochLengthSeconds']
347
+ : []),
348
+ ]);
349
+ const unsigned = (key, max = 65535) => {
350
+ const n = precondition[key];
351
+ if (typeof n !== 'number' || !Number.isInteger(n) || n < 0 || n > max)
352
+ invalid(`${field}.${key}`, n, `an unsigned ${max === 255 ? 'u8' : 'u16'} integer`);
353
+ return n;
354
+ };
355
+ const integer = (key, signed = false) => {
356
+ const n = precondition[key];
357
+ const min = signed ? -(1n << 63n) : 0n;
358
+ const max = signed ? (1n << 63n) - 1n : (1n << 64n) - 1n;
359
+ if (typeof n !== 'bigint' || n < min || n > max)
360
+ invalid(`${field}.${key}`, n, signed ? 'an i64 bigint' : 'a u64 bigint');
361
+ return n;
362
+ };
363
+ const common = {
364
+ address: readAddress(precondition.address, `${field}.address`),
365
+ game: readAddress(precondition.game, `${field}.game`),
366
+ factionId: unsigned('factionId'),
367
+ schemaVersion: unsigned('schemaVersion', 255),
368
+ describes: readString(precondition.describes, `${field}.describes`),
369
+ };
370
+ if (isTradeBuyGuard(precondition))
371
+ return Object.freeze({
372
+ kind,
373
+ ...common,
374
+ cargoId: unsigned('cargoId'),
375
+ floorRaw: integer('floorRaw'),
376
+ });
377
+ if (isTradeSellGuard(precondition))
378
+ return Object.freeze({
379
+ kind,
380
+ ...common,
381
+ atlasOutCapPerEpochRaw: integer('atlasOutCapPerEpochRaw'),
382
+ epochLengthSeconds: integer('epochLengthSeconds', true),
383
+ });
384
+ return Object.freeze({ kind, ...common });
385
+ }
386
+ if (precondition.kind === 'fleet-add-ship') {
387
+ assertKeys(precondition, field, [
388
+ 'kind',
389
+ 'address',
390
+ 'game',
391
+ 'profile',
392
+ 'authority',
393
+ 'system',
394
+ 'shipId',
395
+ 'amount',
396
+ 'keyIndex',
397
+ 'configHash',
398
+ 'maximumProfileDebit',
399
+ 'describes',
400
+ ]);
401
+ const keyIndex = precondition.keyIndex;
402
+ if (typeof keyIndex !== 'number' ||
403
+ !Number.isInteger(keyIndex) ||
404
+ keyIndex < 0 ||
405
+ keyIndex > 65535)
406
+ invalid(`${field}.keyIndex`, keyIndex, 'an integer from 0 through 65535');
407
+ const shipId = precondition.shipId;
408
+ if (typeof shipId !== 'number' ||
409
+ !Number.isInteger(shipId) ||
410
+ shipId < 0 ||
411
+ shipId > 65535)
412
+ invalid(`${field}.shipId`, shipId, 'a u16 ship configuration ID');
413
+ const amount = precondition.amount;
414
+ if (typeof amount !== 'bigint' || amount < 1n || amount > 255n)
415
+ invalid(`${field}.amount`, amount, 'a whole ship quantity from 1n through 255n');
416
+ const maximumProfileDebit = precondition.maximumProfileDebit;
417
+ if (typeof maximumProfileDebit !== 'bigint' || maximumProfileDebit < 0n)
418
+ invalid(`${field}.maximumProfileDebit`, maximumProfileDebit, 'a nonnegative bigint');
419
+ return Object.freeze({
420
+ kind: 'fleet-add-ship',
421
+ address: readAddress(precondition.address, `${field}.address`),
422
+ game: readAddress(precondition.game, `${field}.game`),
423
+ profile: readAddress(precondition.profile, `${field}.profile`),
424
+ authority: readAddress(precondition.authority, `${field}.authority`),
425
+ system: readAddress(precondition.system, `${field}.system`),
426
+ keyIndex,
427
+ shipId,
428
+ amount,
429
+ maximumProfileDebit,
430
+ configHash: readDataHash(precondition.configHash, `${field}.configHash`),
431
+ describes: readString(precondition.describes, `${field}.describes`),
432
+ });
433
+ }
434
+ if (precondition.kind === 'scan-completion') {
435
+ const addresses = [
436
+ 'address',
437
+ 'game',
438
+ 'signal',
439
+ 'profile',
440
+ 'character',
441
+ 'authority',
442
+ 'policy',
443
+ 'loot',
444
+ 'xpBudget',
445
+ 'xpConfig',
446
+ ];
447
+ assertKeys(precondition, field, [
448
+ 'kind',
449
+ 'operation',
450
+ ...addresses,
451
+ 'keyIndex',
452
+ 'status',
453
+ 'expectedSequence',
454
+ 'configHash',
455
+ 'describes',
456
+ ]);
457
+ if (typeof precondition.operation !== 'string' ||
458
+ !Object.hasOwn(scanCompletionDiscriminators, precondition.operation))
459
+ invalid(field, precondition.operation, 'a supported scan lifecycle operation');
460
+ const keyIndex = precondition.keyIndex, status = precondition.status, sequence = precondition.expectedSequence;
461
+ if (typeof keyIndex !== 'number' ||
462
+ !Number.isInteger(keyIndex) ||
463
+ keyIndex < 0 ||
464
+ keyIndex > 65535)
465
+ invalid(field, keyIndex, 'a u16 key index');
466
+ if (typeof status !== 'number' ||
467
+ !Number.isInteger(status) ||
468
+ status < 1 ||
469
+ status > 6)
470
+ invalid(field, status, 'a current nonempty signal state');
471
+ if (typeof sequence !== 'bigint' ||
472
+ sequence < 0n ||
473
+ sequence > 18446744073709551615n)
474
+ invalid(field, sequence, 'a u64 sequence');
475
+ const parsed = Object.fromEntries(addresses.map((k) => [k, readAddress(precondition[k], `${field}.${k}`)]));
476
+ return Object.freeze({
477
+ kind: 'scan-completion',
478
+ operation: precondition.operation,
479
+ ...parsed,
480
+ keyIndex,
481
+ status,
482
+ expectedSequence: sequence,
483
+ configHash: readDataHash(precondition.configHash, field),
484
+ describes: readString(precondition.describes, field),
485
+ });
486
+ }
487
+ if (precondition.kind === 'scan-detect') {
488
+ assertKeys(precondition, field, [
489
+ 'kind',
490
+ 'address',
491
+ 'game',
492
+ 'profile',
493
+ 'authority',
494
+ 'character',
495
+ 'signal',
496
+ 'pattern',
497
+ 'policy',
498
+ 'loot',
499
+ 'tracker',
500
+ 'keyIndex',
501
+ 'patternId',
502
+ 'focus',
503
+ 'expectedSequence',
504
+ 'policyRevision',
505
+ 'profileRevision',
506
+ 'configHash',
507
+ 'describes',
508
+ ]);
509
+ const numbers = {};
510
+ for (const [key, max] of [
511
+ ['keyIndex', 65535],
512
+ ['patternId', 65535],
513
+ ['focus', 4],
514
+ ['policyRevision', 4294967295],
515
+ ['profileRevision', 4294967295],
516
+ ]) {
517
+ const value = precondition[key];
518
+ if (typeof value !== 'number' ||
519
+ !Number.isInteger(value) ||
520
+ value < 0 ||
521
+ value > max)
522
+ invalid(`${field}.${key}`, value, `an integer from zero through ${max}`);
523
+ numbers[key] = value;
524
+ }
525
+ const sequence = precondition.expectedSequence;
526
+ if (typeof sequence !== 'bigint' ||
527
+ sequence < 0n ||
528
+ sequence > 18446744073709551615n)
529
+ invalid(`${field}.expectedSequence`, sequence, 'a u64 bigint');
530
+ return Object.freeze({
531
+ kind: 'scan-detect',
532
+ address: readAddress(precondition.address, field),
533
+ game: readAddress(precondition.game, field),
534
+ profile: readAddress(precondition.profile, field),
535
+ authority: readAddress(precondition.authority, field),
536
+ character: readAddress(precondition.character, field),
537
+ signal: readAddress(precondition.signal, field),
538
+ pattern: readAddress(precondition.pattern, field),
539
+ policy: readAddress(precondition.policy, field),
540
+ loot: readAddress(precondition.loot, field),
541
+ tracker: readAddress(precondition.tracker, field),
542
+ keyIndex: numbers.keyIndex,
543
+ patternId: numbers.patternId,
544
+ focus: numbers.focus,
545
+ policyRevision: numbers.policyRevision,
546
+ profileRevision: numbers.profileRevision,
547
+ expectedSequence: sequence,
548
+ configHash: readDataHash(precondition.configHash, field),
549
+ describes: readString(precondition.describes, field),
550
+ });
551
+ }
552
+ if (precondition.kind === 'fleet-respawn') {
553
+ assertKeys(precondition, field, [
554
+ 'kind',
555
+ 'address',
556
+ 'game',
557
+ 'profile',
558
+ 'authority',
559
+ 'system',
560
+ 'keyIndex',
561
+ 'phase',
562
+ 'fleetHash',
563
+ 'maximumRecoveryFee',
564
+ 'maximumProfileDebit',
565
+ 'describes',
566
+ ]);
567
+ const keyIndex = precondition.keyIndex;
568
+ if (typeof keyIndex !== 'number' ||
569
+ !Number.isInteger(keyIndex) ||
570
+ keyIndex < 0 ||
571
+ keyIndex > 65535)
572
+ invalid(`${field}.keyIndex`, keyIndex, 'a u16 key index');
573
+ const phase = precondition.phase;
574
+ if (phase !== 'start' && phase !== 'complete')
575
+ invalid(`${field}.phase`, phase, 'start or complete');
576
+ const maximumRecoveryFee = precondition.maximumRecoveryFee, maximumProfileDebit = precondition.maximumProfileDebit;
577
+ for (const value of [maximumRecoveryFee, maximumProfileDebit])
578
+ if (typeof value !== 'bigint' || value < 0n || value > (1n << 64n) - 1n)
579
+ invalid(field, value, 'a nonnegative u64 funding ceiling');
580
+ return Object.freeze({
581
+ kind: 'fleet-respawn',
582
+ address: readAddress(precondition.address, field),
583
+ game: readAddress(precondition.game, field),
584
+ profile: readAddress(precondition.profile, field),
585
+ authority: readAddress(precondition.authority, field),
586
+ system: readAddress(precondition.system, field),
587
+ keyIndex,
588
+ phase,
589
+ fleetHash: readDataHash(precondition.fleetHash, field),
590
+ maximumRecoveryFee: maximumRecoveryFee,
591
+ maximumProfileDebit: maximumProfileDebit,
592
+ describes: readString(precondition.describes, field),
593
+ });
594
+ }
595
+ if (precondition.kind === 'scan-signal-open') {
596
+ assertKeys(precondition, field, [
597
+ 'kind',
598
+ 'address',
599
+ 'game',
600
+ 'fleet',
601
+ 'profile',
602
+ 'authority',
603
+ 'character',
604
+ 'keyIndex',
605
+ 'authorityHash',
606
+ 'maximumProfileDebit',
607
+ 'describes',
608
+ ]);
609
+ const keyIndex = precondition.keyIndex;
610
+ if (typeof keyIndex !== 'number' ||
611
+ !Number.isInteger(keyIndex) ||
612
+ keyIndex < 0 ||
613
+ keyIndex > 65535)
614
+ invalid(field, keyIndex, 'a u16 key index');
615
+ const maximumProfileDebit = precondition.maximumProfileDebit;
616
+ if (typeof maximumProfileDebit !== 'bigint' ||
617
+ maximumProfileDebit < 0n ||
618
+ maximumProfileDebit > 0xffffffffffffffffn)
619
+ invalid(field, maximumProfileDebit, 'a nonnegative u64 funding ceiling');
620
+ return Object.freeze({
621
+ kind: 'scan-signal-open',
622
+ authorityHash: readDataHash(precondition.authorityHash, field),
623
+ address: readAddress(precondition.address, field),
624
+ game: readAddress(precondition.game, field),
625
+ fleet: readAddress(precondition.fleet, field),
626
+ profile: readAddress(precondition.profile, field),
627
+ authority: readAddress(precondition.authority, field),
628
+ character: readAddress(precondition.character, field),
629
+ keyIndex,
630
+ maximumProfileDebit,
631
+ describes: readString(precondition.describes, field),
632
+ });
633
+ }
634
+ if (precondition.kind === 'fleet-create') {
635
+ assertKeys(precondition, field, [
636
+ 'kind',
637
+ 'address',
638
+ 'game',
639
+ 'profile',
640
+ 'authority',
641
+ 'system',
642
+ 'keyIndex',
643
+ 'label',
644
+ 'maximumProfileDebit',
645
+ 'describes',
646
+ ]);
647
+ const keyIndex = precondition.keyIndex;
648
+ if (typeof keyIndex !== 'number' ||
649
+ !Number.isSafeInteger(keyIndex) ||
650
+ keyIndex < 0 ||
651
+ keyIndex > 65_535)
652
+ invalid(`${field}.keyIndex`, keyIndex, 'an integer from 0 through 65535');
653
+ const label = readString(precondition.label, `${field}.label`);
654
+ const bytes = new TextEncoder().encode(label);
655
+ if (label.trim().length === 0 ||
656
+ label.includes('\0') ||
657
+ bytes.length > 64 ||
658
+ new TextDecoder('utf-8', { ignoreBOM: true }).decode(bytes) !== label)
659
+ invalid(`${field}.label`, label, 'a nonblank, NUL-free Unicode label of at most 64 UTF-8 bytes');
660
+ const maximumProfileDebit = precondition.maximumProfileDebit;
661
+ if (typeof maximumProfileDebit !== 'bigint' || maximumProfileDebit < 0n)
662
+ invalid(`${field}.maximumProfileDebit`, maximumProfileDebit, 'a nonnegative bigint');
663
+ return Object.freeze({
664
+ kind: 'fleet-create',
665
+ address: readAddress(precondition.address, `${field}.address`),
666
+ game: readAddress(precondition.game, `${field}.game`),
667
+ profile: readAddress(precondition.profile, `${field}.profile`),
668
+ authority: readAddress(precondition.authority, `${field}.authority`),
669
+ system: readAddress(precondition.system, `${field}.system`),
670
+ keyIndex,
671
+ label,
672
+ maximumProfileDebit,
673
+ describes: readString(precondition.describes, `${field}.describes`),
674
+ });
675
+ }
676
+ if (precondition.kind === 'system-account-or-absent') {
677
+ assertKeys(precondition, field, ['kind', 'address', 'describes']);
678
+ return Object.freeze({
679
+ kind: 'system-account-or-absent',
680
+ address: readAddress(precondition.address, `${field}.address`),
681
+ describes: readString(precondition.describes, `${field}.describes`),
682
+ });
683
+ }
684
+ if (precondition.kind === 'token-mint') {
685
+ assertKeys(precondition, field, [
686
+ 'kind',
687
+ 'address',
688
+ 'decimals',
689
+ 'describes',
690
+ ]);
691
+ const decimals = precondition.decimals;
692
+ if (typeof decimals !== 'number' ||
693
+ !Number.isInteger(decimals) ||
694
+ decimals < 0 ||
695
+ decimals > 255)
696
+ invalid(`${field}.decimals`, decimals, 'an unsigned u8 mint decimals value');
697
+ return Object.freeze({
698
+ kind: 'token-mint',
699
+ address: readAddress(precondition.address, `${field}.address`),
700
+ decimals,
701
+ describes: readString(precondition.describes, `${field}.describes`),
702
+ });
703
+ }
704
+ if (precondition.kind === 'game-ship-config') {
705
+ assertKeys(precondition, field, [
706
+ 'kind',
707
+ 'address',
708
+ 'shipId',
709
+ 'configHash',
710
+ 'describes',
711
+ ]);
712
+ const id = precondition.shipId;
713
+ if (typeof id !== 'number' || !Number.isInteger(id) || id < 0 || id > 65535)
714
+ invalid(`${field}.shipId`, id, 'a u16 ship configuration ID');
715
+ return Object.freeze({
716
+ kind: 'game-ship-config',
717
+ address: readAddress(precondition.address, `${field}.address`),
718
+ shipId: id,
719
+ configHash: readDataHash(precondition.configHash, `${field}.configHash`),
720
+ describes: readString(precondition.describes, `${field}.describes`),
721
+ });
722
+ }
723
+ if (precondition.kind === 'game-account') {
724
+ assertKeys(precondition, field, ['kind', 'address', 'describes']);
725
+ return Object.freeze({
726
+ kind: 'game-account',
727
+ address: readAddress(precondition.address, `${field}.address`),
728
+ describes: readString(precondition.describes, `${field}.describes`),
729
+ });
730
+ }
731
+ if (['game-cargo-bytes-config', 'token-account', 'cargo-cache'].includes(String(precondition.kind))) {
166
732
  const base = {
167
733
  address: readAddress(precondition.address, `${field}.address`),
168
734
  describes: readString(precondition.describes, `${field}.describes`),
@@ -189,7 +755,7 @@ function normalizePrecondition(value, field, version = 4) {
189
755
  minimumBalance: amount,
190
756
  });
191
757
  }
192
- if (precondition.kind === 'game-cargo-config') {
758
+ if (precondition.kind === 'game-cargo-bytes-config') {
193
759
  assertKeys(precondition, field, [
194
760
  'kind',
195
761
  'address',
@@ -205,7 +771,7 @@ function normalizePrecondition(value, field, version = 4) {
205
771
  invalid(`${field}.cargoId`, id, 'a u16 cargo ID');
206
772
  return Object.freeze({
207
773
  ...base,
208
- kind: 'game-cargo-config',
774
+ kind: precondition.kind,
209
775
  cargoId: id,
210
776
  configHash: readDataHash(precondition.configHash, `${field}.configHash`),
211
777
  });
@@ -230,7 +796,7 @@ function normalizePrecondition(value, field, version = 4) {
230
796
  bump,
231
797
  });
232
798
  }
233
- if (precondition.kind === 'token-account-or-absent' && version >= 3) {
799
+ if (precondition.kind === 'token-account-or-absent') {
234
800
  assertKeys(precondition, field, [
235
801
  'kind',
236
802
  'address',
@@ -246,7 +812,7 @@ function normalizePrecondition(value, field, version = 4) {
246
812
  describes: readString(precondition.describes, `${field}.describes`),
247
813
  });
248
814
  }
249
- if (precondition.kind === 'account-absent' && version !== 1) {
815
+ if (precondition.kind === 'account-absent') {
250
816
  assertKeys(precondition, field, ['kind', 'address', 'describes']);
251
817
  return Object.freeze({
252
818
  kind: 'account-absent',
@@ -255,13 +821,7 @@ function normalizePrecondition(value, field, version = 4) {
255
821
  });
256
822
  }
257
823
  if (precondition.kind !== 'account-state') {
258
- invalid(`${field}.kind`, precondition.kind, version === 4
259
- ? 'one of account-state, account-absent, token-account-or-absent, token-account, game-cargo-config, or cargo-cache'
260
- : version === 3
261
- ? 'one of account-state, account-absent, or token-account-or-absent'
262
- : version === 2
263
- ? 'one of account-state or account-absent'
264
- : 'the value account-state');
824
+ invalid(`${field}.kind`, precondition.kind, 'a supported current Plan guard; recreate the Plan using the current capability planner');
265
825
  }
266
826
  assertKeys(precondition, field, ['kind', 'address', 'dataHash', 'describes']);
267
827
  return Object.freeze({
@@ -297,64 +857,70 @@ function instructionToJSON(instruction) {
297
857
  return deepFreeze(value);
298
858
  }
299
859
  function planToJSON(plan) {
300
- const hasSemantics = plan.steps.some((step) => (step.semantics?.length ?? 0) > 0);
301
- const hasAbsentPrecondition = plan.preconditions.some(({ kind }) => kind === 'account-absent');
302
- const common = {
860
+ return deepFreeze({
861
+ v: 23,
303
862
  kind: plan.kind,
304
863
  summary: plan.summary,
305
864
  affected: [...plan.affected],
306
865
  requiredSigners: [...plan.requiredSigners],
307
- };
308
- const steps = plan.steps.map((step) => ({
309
- instruction: instructionToJSON(step.instruction),
310
- describes: step.describes,
311
- ...((step.semantics?.length ?? 0) > 0
312
- ? { semantics: step.semantics.map((semantic) => ({ ...semantic })) }
313
- : {}),
314
- signers: [...step.signers],
315
- }));
316
- if (plan.preconditions.some(({ kind }) => kind === 'token-account' ||
317
- kind === 'game-cargo-config' ||
318
- kind === 'cargo-cache')) {
319
- return deepFreeze({
320
- v: 4,
321
- ...common,
322
- steps,
323
- preconditions: plan.preconditions.map((guard) => guard.kind === 'token-account'
324
- ? { ...guard, minimumBalance: String(guard.minimumBalance) }
325
- : { ...guard }),
326
- });
327
- }
328
- if (plan.preconditions.some(({ kind }) => kind === 'token-account-or-absent')) {
329
- return deepFreeze({
330
- v: 3,
331
- ...common,
332
- steps,
333
- preconditions: plan.preconditions.map((guard) => ({
334
- ...guard,
335
- })),
336
- });
337
- }
338
- if (hasSemantics || hasAbsentPrecondition) {
339
- return deepFreeze({
340
- v: 2,
341
- ...common,
342
- steps,
343
- preconditions: plan.preconditions.map((guard) => ({
344
- ...guard,
345
- })),
346
- });
347
- }
348
- return deepFreeze({
349
- v: 1,
350
- ...common,
351
- steps,
352
- preconditions: plan.preconditions.map((precondition) => ({
353
- kind: 'account-state',
354
- address: precondition.address,
355
- dataHash: precondition.dataHash,
356
- describes: precondition.describes,
866
+ steps: plan.steps.map((step) => ({
867
+ instruction: instructionToJSON(step.instruction),
868
+ describes: step.describes,
869
+ ...((step.semantics?.length ?? 0) > 0
870
+ ? { semantics: step.semantics.map((semantic) => ({ ...semantic })) }
871
+ : {}),
872
+ signers: [...step.signers],
357
873
  })),
874
+ preconditions: plan.preconditions.map((guard) => {
875
+ if (guard.kind === 'scan-detect' || guard.kind === 'scan-completion')
876
+ return { ...guard, expectedSequence: String(guard.expectedSequence) };
877
+ if (guard.kind === 'fleet-arrival')
878
+ return arrivalGuardToJSON(guard);
879
+ if (guard.kind === 'fleet-respawn')
880
+ return {
881
+ ...guard,
882
+ maximumRecoveryFee: String(guard.maximumRecoveryFee),
883
+ maximumProfileDebit: String(guard.maximumProfileDebit),
884
+ };
885
+ if (isRuntimeGuard(guard))
886
+ return runtimeGuardToJSON(guard);
887
+ if (isTradeBuyGuard(guard))
888
+ return { ...guard, floorRaw: String(guard.floorRaw) };
889
+ if (isTradeSellGuard(guard))
890
+ return {
891
+ ...guard,
892
+ atlasOutCapPerEpochRaw: String(guard.atlasOutCapPerEpochRaw),
893
+ epochLengthSeconds: String(guard.epochLengthSeconds),
894
+ };
895
+ if (guard.kind === 'fleet-add-ship')
896
+ return {
897
+ ...guard,
898
+ amount: String(guard.amount),
899
+ maximumProfileDebit: String(guard.maximumProfileDebit),
900
+ };
901
+ if (guard.kind === 'character-registration')
902
+ return {
903
+ ...guard,
904
+ maximumFunderDebit: String(guard.maximumFunderDebit),
905
+ characterLamports: String(guard.characterLamports),
906
+ budgetLamports: String(guard.budgetLamports),
907
+ };
908
+ if (guard.kind === 'scan-signal-open' ||
909
+ guard.kind === 'fleet-create' ||
910
+ guard.kind === 'ship-import-funding')
911
+ return {
912
+ ...guard,
913
+ maximumProfileDebit: String(guard.maximumProfileDebit),
914
+ };
915
+ if (guard.kind === 'starbase-system')
916
+ return {
917
+ ...guard,
918
+ starbaseSequenceId: String(guard.starbaseSequenceId),
919
+ };
920
+ if (guard.kind === 'token-account')
921
+ return { ...guard, minimumBalance: String(guard.minimumBalance) };
922
+ return { ...guard };
923
+ }),
358
924
  });
359
925
  }
360
926
  /** Creates an inert branded Plan while deriving every aggregate field.
@@ -376,6 +942,12 @@ export function createPlan(input) {
376
942
  assertKeys(value, 'plan', ['kind', 'summary', 'steps', 'preconditions']);
377
943
  const steps = Object.freeze(readArray(value.steps, 'plan.steps').map((step, index) => normalizeStep(step, `plan.steps[${String(index)}]`)));
378
944
  const preconditions = Object.freeze(readArray(value.preconditions, 'plan.preconditions').map((precondition, index) => normalizePrecondition(precondition, `plan.preconditions[${String(index)}]`)));
945
+ validateShipImportFundingComposition(preconditions);
946
+ validateStarbaseSystemGuards(steps, preconditions);
947
+ validateDetectInstructions(steps, preconditions);
948
+ validateCompletionInstructions(steps, preconditions);
949
+ validateRespawnInstructions(steps, preconditions);
950
+ validateOpenSignalInstructions(steps, preconditions);
379
951
  const descriptions = Object.freeze(steps.map((step) => step.describes));
380
952
  const plan = {
381
953
  kind: readString(value.kind, 'plan.kind'),
@@ -422,7 +994,7 @@ function sameAddresses(actual, encoded) {
422
994
  *
423
995
  * @example
424
996
  * ```ts
425
- * declare const wire: PlanJsonV1 | PlanJsonV2 | PlanJsonV3 | PlanJsonV4;
997
+ * declare const wire: PlanJson;
426
998
  * const plan = planFromJSON(wire);
427
999
  * console.log(plan.describe());
428
1000
  * ```
@@ -438,29 +1010,106 @@ export function planFromJSON(json) {
438
1010
  'affected',
439
1011
  'requiredSigners',
440
1012
  ]);
441
- if (value.v !== 1 && value.v !== 2 && value.v !== 3 && value.v !== 4) {
442
- invalid('planJson.v', value.v, 'the Plan wire version 1, 2, 3, or 4');
443
- }
444
- const version = value.v;
445
- if (version === 4 && Array.isArray(value.preconditions)) {
446
- value.preconditions = value.preconditions.map((entry) => {
447
- const guard = readRecord(entry, 'precondition');
448
- if (guard.kind !== 'token-account')
449
- return guard;
450
- if (typeof guard.minimumBalance !== 'string' ||
451
- !/^(0|[1-9][0-9]*)$/.test(guard.minimumBalance))
452
- invalid('minimumBalance', guard.minimumBalance, 'a canonical unsigned decimal string');
453
- return { ...guard, minimumBalance: BigInt(guard.minimumBalance) };
454
- });
1013
+ if (value.v !== 23) {
1014
+ throw new InvalidActionInputError('planJson.v', value.v, 'the current Plan wire version 23', 'Recreate the Plan using the current capability planner; do not change its saved version or migrate its guards.');
455
1015
  }
1016
+ value.preconditions = readArray(value.preconditions, 'planJson.preconditions').map((entry) => {
1017
+ const guard = readRecord(entry, 'precondition');
1018
+ if (guard.kind === 'scan-detect' || guard.kind === 'scan-completion') {
1019
+ if (typeof guard.expectedSequence !== 'string' ||
1020
+ !/^(0|[1-9][0-9]*)$/.test(guard.expectedSequence))
1021
+ invalid('expectedSequence', guard.expectedSequence, 'a canonical unsigned decimal string');
1022
+ return { ...guard, expectedSequence: BigInt(guard.expectedSequence) };
1023
+ }
1024
+ if (guard.kind === 'fleet-arrival')
1025
+ return normalizeArrivalGuard(guard, 'precondition', true);
1026
+ if (isRuntimeGuard(guard))
1027
+ return normalizeRuntimeGuard(guard, 'precondition', true);
1028
+ if (isTradeBuyGuard(guard) || isTradeSellGuard(guard)) {
1029
+ const keys = isTradeBuyGuard(guard)
1030
+ ? ['floorRaw']
1031
+ : ['atlasOutCapPerEpochRaw', 'epochLengthSeconds'];
1032
+ const decoded = { ...guard };
1033
+ for (const key of keys) {
1034
+ const raw = guard[key];
1035
+ const pattern = key === 'epochLengthSeconds'
1036
+ ? /^(0|[1-9][0-9]*|-[1-9][0-9]*)$/
1037
+ : /^(0|[1-9][0-9]*)$/;
1038
+ if (typeof raw !== 'string' || !pattern.test(raw))
1039
+ invalid(key, raw, 'a canonical decimal string');
1040
+ decoded[key] = BigInt(raw);
1041
+ }
1042
+ return decoded;
1043
+ }
1044
+ if (guard.kind === 'fleet-add-ship') {
1045
+ for (const field of ['amount', 'maximumProfileDebit'])
1046
+ if (typeof guard[field] !== 'string' ||
1047
+ !/^(0|[1-9][0-9]*)$/.test(guard[field]))
1048
+ invalid(field, guard[field], 'a canonical unsigned decimal string');
1049
+ return {
1050
+ ...guard,
1051
+ amount: BigInt(guard.amount),
1052
+ maximumProfileDebit: BigInt(guard.maximumProfileDebit),
1053
+ };
1054
+ }
1055
+ if (guard.kind === 'character-registration') {
1056
+ for (const key of ['characterLamports', 'budgetLamports'])
1057
+ if (typeof guard[key] !== 'string' ||
1058
+ !/^(0|[1-9][0-9]*)$/.test(guard[key]))
1059
+ invalid(key, guard[key], 'a canonical unsigned decimal string');
1060
+ if (typeof guard.maximumFunderDebit !== 'string' ||
1061
+ !/^(0|[1-9][0-9]*)$/.test(guard.maximumFunderDebit))
1062
+ invalid('maximumFunderDebit', guard.maximumFunderDebit, 'a canonical unsigned decimal string');
1063
+ return {
1064
+ ...guard,
1065
+ maximumFunderDebit: BigInt(guard.maximumFunderDebit),
1066
+ characterLamports: BigInt(guard.characterLamports),
1067
+ budgetLamports: BigInt(guard.budgetLamports),
1068
+ };
1069
+ }
1070
+ if (guard.kind === 'fleet-respawn') {
1071
+ for (const key of ['maximumRecoveryFee', 'maximumProfileDebit'])
1072
+ if (typeof guard[key] !== 'string' ||
1073
+ !/^(0|[1-9][0-9]*)$/.test(guard[key]))
1074
+ invalid(key, guard[key], 'a canonical unsigned decimal string');
1075
+ return {
1076
+ ...guard,
1077
+ maximumRecoveryFee: BigInt(guard.maximumRecoveryFee),
1078
+ maximumProfileDebit: BigInt(guard.maximumProfileDebit),
1079
+ };
1080
+ }
1081
+ if (guard.kind === 'scan-signal-open' ||
1082
+ guard.kind === 'fleet-create' ||
1083
+ guard.kind === 'ship-import-funding') {
1084
+ if (typeof guard.maximumProfileDebit !== 'string' ||
1085
+ !/^(0|[1-9][0-9]*)$/.test(guard.maximumProfileDebit))
1086
+ invalid('maximumProfileDebit', guard.maximumProfileDebit, 'a canonical unsigned decimal string');
1087
+ return {
1088
+ ...guard,
1089
+ maximumProfileDebit: BigInt(guard.maximumProfileDebit),
1090
+ };
1091
+ }
1092
+ if (guard.kind === 'starbase-system') {
1093
+ if (typeof guard.starbaseSequenceId !== 'string' ||
1094
+ !/^(0|[1-9][0-9]*)$/.test(guard.starbaseSequenceId))
1095
+ invalid('starbaseSequenceId', guard.starbaseSequenceId, 'a canonical unsigned decimal string');
1096
+ return { ...guard, starbaseSequenceId: BigInt(guard.starbaseSequenceId) };
1097
+ }
1098
+ if (guard.kind !== 'token-account')
1099
+ return guard;
1100
+ if (typeof guard.minimumBalance !== 'string' ||
1101
+ !/^(0|[1-9][0-9]*)$/.test(guard.minimumBalance))
1102
+ invalid('minimumBalance', guard.minimumBalance, 'a canonical unsigned decimal string');
1103
+ return { ...guard, minimumBalance: BigInt(guard.minimumBalance) };
1104
+ });
456
1105
  const steps = readArray(value.steps, 'planJson.steps').map((candidate, index) => {
457
1106
  const field = `planJson.steps[${String(index)}]`;
458
1107
  const step = readRecord(candidate, field);
459
- assertKeys(step, field, ['instruction', 'describes', 'signers'], version !== 1 ? ['semantics'] : []);
1108
+ assertKeys(step, field, ['instruction', 'describes', 'signers'], ['semantics']);
460
1109
  return {
461
1110
  instruction: readWireInstruction(step.instruction, `${field}.instruction`),
462
1111
  describes: readString(step.describes, `${field}.describes`),
463
- ...(version !== 1 && step.semantics !== undefined
1112
+ ...(step.semantics !== undefined
464
1113
  ? {
465
1114
  semantics: readArray(step.semantics, `${field}.semantics`).map((semantic, semanticIndex) => normalizeSemanticFact(semantic, `${field}.semantics[${String(semanticIndex)}]`)),
466
1115
  }
@@ -468,7 +1117,7 @@ export function planFromJSON(json) {
468
1117
  signers: readArray(step.signers, `${field}.signers`).map((signer, signerIndex) => readAddress(signer, `${field}.signers[${String(signerIndex)}]`)),
469
1118
  };
470
1119
  });
471
- const preconditions = readArray(value.preconditions, 'planJson.preconditions').map((candidate, index) => normalizePrecondition(candidate, `planJson.preconditions[${String(index)}]`, version));
1120
+ const preconditions = readArray(value.preconditions, 'planJson.preconditions').map((candidate, index) => normalizePrecondition(candidate, `planJson.preconditions[${String(index)}]`));
472
1121
  const affected = readArray(value.affected, 'planJson.affected').map((candidate, index) => readAddress(candidate, `planJson.affected[${String(index)}]`));
473
1122
  const requiredSigners = readArray(value.requiredSigners, 'planJson.requiredSigners').map((candidate, index) => readAddress(candidate, `planJson.requiredSigners[${String(index)}]`));
474
1123
  const plan = createPlan({
@@ -477,6 +1126,10 @@ export function planFromJSON(json) {
477
1126
  steps,
478
1127
  preconditions,
479
1128
  });
1129
+ validateStarbaseSystemInstructions(plan.steps, plan.preconditions);
1130
+ validateMovementXpInstructions(plan.steps, plan.preconditions);
1131
+ validateFleetAttackInstructions(plan.steps, plan.preconditions);
1132
+ validateCharacterRegistrationInstructions(plan.steps, plan.preconditions);
480
1133
  if (!sameAddresses(plan.affected, affected)) {
481
1134
  invalid('planJson.affected', value.affected, 'the first-seen union of writable instruction account addresses');
482
1135
  }
@@ -493,6 +1146,49 @@ function assertPlan(value, index) {
493
1146
  function combinedSummary(steps) {
494
1147
  return steps.map((step) => step.describes).join(' ');
495
1148
  }
1149
+ function validateShipImportFundingComposition(guards) {
1150
+ const targets = new Map();
1151
+ for (const guard of guards) {
1152
+ if (guard.kind !== 'ship-import-funding')
1153
+ continue;
1154
+ const identity = `${guard.game}:${guard.profile}:${guard.system}:${String(guard.shipId)}`;
1155
+ const previous = targets.get(guard.address);
1156
+ if (previous !== undefined && previous !== identity)
1157
+ throw new SageSdkError('INCOMPATIBLE_PLAN_COMPOSITION', 'Ship imports retain conflicting identities or different configurations for one StarbasePlayer. Use separate confirmed imports, then refresh inventory and replan; prefunding cannot be shared across independently estimated storage growth.');
1158
+ targets.set(guard.address, identity);
1159
+ }
1160
+ }
1161
+ function validateFactionGuardComposition(guards) {
1162
+ const retained = new Map();
1163
+ for (const guard of guards) {
1164
+ if (!isFactionTradeGuard(guard))
1165
+ continue;
1166
+ const constraints = [
1167
+ [
1168
+ `${isTradeMeterGuard(guard) ? 'meter' : 'treasury'}:${guard.address}:identity`,
1169
+ `${guard.game}:${String(guard.factionId)}`,
1170
+ ],
1171
+ ];
1172
+ if (!isTradeMeterGuard(guard)) {
1173
+ constraints.push(isTradeBuyGuard(guard)
1174
+ ? [
1175
+ `${guard.address}:buy:${String(guard.cargoId)}`,
1176
+ String(guard.floorRaw),
1177
+ ]
1178
+ : [
1179
+ `${guard.address}:sell`,
1180
+ `${String(guard.atlasOutCapPerEpochRaw)}:${String(guard.epochLengthSeconds)}`,
1181
+ ]);
1182
+ }
1183
+ constraints.push([`${guard.address}:schema`, String(guard.schemaVersion)]);
1184
+ for (const [key, value] of constraints) {
1185
+ const previous = retained.get(key);
1186
+ if (previous !== undefined && previous !== value)
1187
+ throw new SageSdkError('INCOMPATIBLE_PLAN_COMPOSITION', 'Faction Market Plans retain incompatible Treasury policy or shared account identity. Refresh the affected Markets and prepare compatible Plans, or use separate confirmed transactions.');
1188
+ retained.set(key, value);
1189
+ }
1190
+ }
1191
+ }
496
1192
  /** Combines one or more Plans with deterministic associative flattening.
497
1193
  *
498
1194
  * Semantic validation is eager. Conflict indices are relative to the flattened
@@ -513,11 +1209,24 @@ export function combinePlans(...plans) {
513
1209
  plans.forEach(assertPlan);
514
1210
  const steps = plans.flatMap((plan) => plan.steps);
515
1211
  validatePlanComposition(steps);
1212
+ const preconditions = plans.flatMap((plan) => plan.preconditions);
1213
+ validateFactionGuardComposition(preconditions);
1214
+ validateMiningStopInstructions(steps, preconditions);
1215
+ validateStarbaseSystemInstructions(steps, preconditions);
1216
+ validateCharacterRegistrationInstructions(steps, preconditions);
1217
+ validateArrivalInstructions(steps, preconditions);
1218
+ validateDetectInstructions(steps, preconditions);
1219
+ validateCompletionInstructions(steps, preconditions);
1220
+ validateRespawnInstructions(steps, preconditions);
1221
+ validateOpenSignalInstructions(steps, preconditions);
1222
+ validateRuntimeInstructions(steps, preconditions);
1223
+ validateMovementXpInstructions(steps, preconditions);
1224
+ validateFleetAttackInstructions(steps, preconditions);
516
1225
  return createPlan({
517
1226
  kind: 'combined',
518
1227
  summary: combinedSummary(steps),
519
1228
  steps,
520
- preconditions: plans.flatMap((plan) => plan.preconditions),
1229
+ preconditions,
521
1230
  });
522
1231
  }
523
1232
  export { assemblePlan } from './assembly.js';