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

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 (448) 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-detect-guard.d.ts +34 -0
  336. package/dist/internal/planning/scan-detect-guard.d.ts.map +1 -0
  337. package/dist/internal/planning/scan-detect-guard.js +77 -0
  338. package/dist/internal/planning/scan-detect-guard.js.map +1 -0
  339. package/dist/internal/planning/scan-detect.d.ts +24 -0
  340. package/dist/internal/planning/scan-detect.d.ts.map +1 -0
  341. package/dist/internal/planning/scan-detect.js +244 -0
  342. package/dist/internal/planning/scan-detect.js.map +1 -0
  343. package/dist/internal/planning/ship-import-funding.d.ts +22 -0
  344. package/dist/internal/planning/ship-import-funding.d.ts.map +1 -0
  345. package/dist/internal/planning/ship-import-funding.js +52 -0
  346. package/dist/internal/planning/ship-import-funding.js.map +1 -0
  347. package/dist/internal/planning/ship-token.d.ts +10 -0
  348. package/dist/internal/planning/ship-token.d.ts.map +1 -0
  349. package/dist/internal/planning/ship-token.js +47 -0
  350. package/dist/internal/planning/ship-token.js.map +1 -0
  351. package/dist/internal/planning/starbase-system-guard.d.ts +6 -0
  352. package/dist/internal/planning/starbase-system-guard.d.ts.map +1 -0
  353. package/dist/internal/planning/starbase-system-guard.js +93 -0
  354. package/dist/internal/planning/starbase-system-guard.js.map +1 -0
  355. package/dist/internal/planning/starbase-system.d.ts +12 -0
  356. package/dist/internal/planning/starbase-system.d.ts.map +1 -0
  357. package/dist/internal/planning/starbase-system.js +22 -0
  358. package/dist/internal/planning/starbase-system.js.map +1 -0
  359. package/dist/internal/planning/token-mint.d.ts +4 -0
  360. package/dist/internal/planning/token-mint.d.ts.map +1 -0
  361. package/dist/internal/planning/token-mint.js +15 -0
  362. package/dist/internal/planning/token-mint.js.map +1 -0
  363. package/dist/internal/planning/trade-faction-market.d.ts +20 -0
  364. package/dist/internal/planning/trade-faction-market.d.ts.map +1 -0
  365. package/dist/internal/planning/trade-faction-market.js +56 -0
  366. package/dist/internal/planning/trade-faction-market.js.map +1 -0
  367. package/dist/internal/planning/xp-runtime.d.ts +36 -0
  368. package/dist/internal/planning/xp-runtime.d.ts.map +1 -0
  369. package/dist/internal/planning/xp-runtime.js +124 -0
  370. package/dist/internal/planning/xp-runtime.js.map +1 -0
  371. package/dist/loyalty/actions/index.d.ts.map +1 -1
  372. package/dist/loyalty/actions/index.js +4 -3
  373. package/dist/loyalty/actions/index.js.map +1 -1
  374. package/dist/loyalty/index.d.ts.map +1 -1
  375. package/dist/loyalty/index.js +2 -6
  376. package/dist/loyalty/index.js.map +1 -1
  377. package/dist/markets/actions/index.d.ts +1 -0
  378. package/dist/markets/actions/index.d.ts.map +1 -1
  379. package/dist/markets/actions/index.js +40 -16
  380. package/dist/markets/actions/index.js.map +1 -1
  381. package/dist/markets/actions/trade-faction-market.d.ts +43 -0
  382. package/dist/markets/actions/trade-faction-market.d.ts.map +1 -0
  383. package/dist/markets/actions/trade-faction-market.js +291 -0
  384. package/dist/markets/actions/trade-faction-market.js.map +1 -0
  385. package/dist/mining/actions/index.d.ts +84 -0
  386. package/dist/mining/actions/index.d.ts.map +1 -0
  387. package/dist/mining/actions/index.js +328 -0
  388. package/dist/mining/actions/index.js.map +1 -0
  389. package/dist/mining/index.d.ts +7 -2
  390. package/dist/mining/index.d.ts.map +1 -1
  391. package/dist/mining/index.js +5 -2
  392. package/dist/mining/index.js.map +1 -1
  393. package/dist/planning/assembly.d.ts.map +1 -1
  394. package/dist/planning/assembly.js +18 -0
  395. package/dist/planning/assembly.js.map +1 -1
  396. package/dist/planning/execution.d.ts.map +1 -1
  397. package/dist/planning/execution.js +370 -18
  398. package/dist/planning/execution.js.map +1 -1
  399. package/dist/planning/index.d.ts +184 -117
  400. package/dist/planning/index.d.ts.map +1 -1
  401. package/dist/planning/index.js +740 -87
  402. package/dist/planning/index.js.map +1 -1
  403. package/dist/planning/simulation.d.ts +25 -1
  404. package/dist/planning/simulation.d.ts.map +1 -1
  405. package/dist/planning/simulation.js +111 -11
  406. package/dist/planning/simulation.js.map +1 -1
  407. package/dist/registry/cargo.d.ts +6 -11
  408. package/dist/registry/cargo.d.ts.map +1 -1
  409. package/dist/registry/cargo.js +19 -19
  410. package/dist/registry/cargo.js.map +1 -1
  411. package/dist/registry/index.d.ts +4 -0
  412. package/dist/registry/index.d.ts.map +1 -1
  413. package/dist/registry/index.js.map +1 -1
  414. package/dist/registry/onboarding.d.ts +10 -1
  415. package/dist/registry/onboarding.d.ts.map +1 -1
  416. package/dist/registry/onboarding.js +26 -8
  417. package/dist/registry/onboarding.js.map +1 -1
  418. package/dist/registry/scanning.d.ts +7 -0
  419. package/dist/registry/scanning.d.ts.map +1 -0
  420. package/dist/registry/scanning.js +13 -0
  421. package/dist/registry/scanning.js.map +1 -0
  422. package/dist/registry/ship-stats-snapshot.js +19 -19
  423. package/dist/registry/ship-stats-snapshot.js.map +1 -1
  424. package/dist/registry/ships.d.ts +28 -0
  425. package/dist/registry/ships.d.ts.map +1 -0
  426. package/dist/registry/ships.js +51 -0
  427. package/dist/registry/ships.js.map +1 -0
  428. package/dist/registry/xp-runtime.d.ts +4 -0
  429. package/dist/registry/xp-runtime.d.ts.map +1 -0
  430. package/dist/registry/xp-runtime.js +14 -0
  431. package/dist/registry/xp-runtime.js.map +1 -0
  432. package/dist/scanning/actions/index.d.ts +52 -0
  433. package/dist/scanning/actions/index.d.ts.map +1 -0
  434. package/dist/scanning/actions/index.js +117 -0
  435. package/dist/scanning/actions/index.js.map +1 -0
  436. package/dist/scanning/index.d.ts +3 -1
  437. package/dist/scanning/index.d.ts.map +1 -1
  438. package/dist/scanning/index.js +4 -2
  439. package/dist/scanning/index.js.map +1 -1
  440. package/dist/scanning/lifecycle.d.ts +77 -0
  441. package/dist/scanning/lifecycle.d.ts.map +1 -0
  442. package/dist/scanning/lifecycle.js +93 -0
  443. package/dist/scanning/lifecycle.js.map +1 -0
  444. package/dist/scanning/signals.d.ts +121 -0
  445. package/dist/scanning/signals.d.ts.map +1 -0
  446. package/dist/scanning/signals.js +171 -0
  447. package/dist/scanning/signals.js.map +1 -0
  448. package/package.json +10 -2
@@ -1,6 +1,17 @@
1
+ import { validateOpenSignalInstructions } from '../internal/planning/open-signal-guard.js';
2
+ import { validateDetectInstructions, } from '../internal/planning/scan-detect-guard.js';
3
+ import { validateRespawnInstructions } from '../internal/planning/respawn-guards.js';
4
+ import { validateFleetAttackInstructions, } from '../internal/planning/fleet-attack-xp.js';
5
+ import { validateMovementXpInstructions } from '../internal/planning/movement-xp-guard.js';
6
+ import { validateStarbaseSystemInstructions, validateStarbaseSystemGuards, } from '../internal/planning/starbase-system-guard.js';
7
+ import { validateCharacterRegistrationInstructions } from '../internal/planning/character-registration-guard.js';
8
+ import { normalizeArrivalGuard, arrivalGuardToJSON, validateArrivalInstructions, } from '../internal/planning/arrival-guards.js';
9
+ import { isRuntimeGuard, normalizeRuntimeGuard, runtimeGuardToJSON, validateRuntimeInstructions, } from '../internal/planning/runtime-guards.js';
10
+ import { isTradeBuyGuard, isTradeSellGuard, isTradeMeterGuard, isFactionTradeGuard, } from '../internal/planning/faction-trade-guards.js';
1
11
  import { AccountRole, getBase64Decoder, getBase64Encoder, isAddress, isWritableRole, } from '@solana/kit';
2
- import { InvalidActionInputError } from '../client/errors.js';
12
+ import { InvalidActionInputError, SageSdkError } from '../client/errors.js';
3
13
  import { deepFreeze } from '../internal/immutable-tree.js';
14
+ import { validateMiningStopInstructions } from '../internal/planning/mining-stop.js';
4
15
  import { validatePlanComposition } from './composition.js';
5
16
  import { isPlanInstance, registerPlanInstance } from './plan-instances.js';
6
17
  const PLAN_BRAND = Symbol('AephiaSagePlan');
@@ -159,10 +170,511 @@ function normalizeSemanticFact(value, field) {
159
170
  }
160
171
  return invalid(`${field}.kind`, semantic.kind, 'one of exclusive, requires, invalidates, or transition');
161
172
  }
162
- function normalizePrecondition(value, field, version = 4) {
173
+ function normalizePrecondition(value, field) {
163
174
  const precondition = readRecord(value, field);
164
- if (version === 4 &&
165
- ['token-account', 'game-cargo-config', 'cargo-cache'].includes(String(precondition.kind))) {
175
+ if (precondition.kind === 'fleet-arrival')
176
+ return normalizeArrivalGuard(precondition, field);
177
+ if (isRuntimeGuard(precondition))
178
+ return normalizeRuntimeGuard(precondition, field);
179
+ if (precondition.kind === 'character-registration') {
180
+ assertKeys(precondition, field, [
181
+ 'kind',
182
+ 'address',
183
+ 'game',
184
+ 'profile',
185
+ 'profileDataHash',
186
+ 'funder',
187
+ 'xpBudget',
188
+ 'xpBudgetConfig',
189
+ 'maximumFunderDebit',
190
+ 'characterSize',
191
+ 'initializationHash',
192
+ 'characterLamports',
193
+ 'budgetLamports',
194
+ 'describes',
195
+ ]);
196
+ if (typeof precondition.characterSize !== 'number' ||
197
+ !Number.isSafeInteger(precondition.characterSize) ||
198
+ precondition.characterSize < 423)
199
+ invalid(`${field}.characterSize`, precondition.characterSize, 'a qualified Character allocation of at least 423 bytes');
200
+ for (const key of ['characterLamports', 'budgetLamports'])
201
+ if (typeof precondition[key] !== 'bigint' || precondition[key] < 0n)
202
+ invalid(`${field}.${key}`, precondition[key], 'a nonnegative bigint');
203
+ const maximumFunderDebit = precondition.maximumFunderDebit;
204
+ if (typeof maximumFunderDebit !== 'bigint' || maximumFunderDebit < 0n)
205
+ invalid(`${field}.maximumFunderDebit`, maximumFunderDebit, 'a nonnegative bigint');
206
+ return Object.freeze({
207
+ kind: 'character-registration',
208
+ address: readAddress(precondition.address, `${field}.address`),
209
+ game: readAddress(precondition.game, `${field}.game`),
210
+ profile: readAddress(precondition.profile, `${field}.profile`),
211
+ profileDataHash: readDataHash(precondition.profileDataHash, `${field}.profileDataHash`),
212
+ funder: readAddress(precondition.funder, `${field}.funder`),
213
+ xpBudget: readAddress(precondition.xpBudget, `${field}.xpBudget`),
214
+ xpBudgetConfig: readAddress(precondition.xpBudgetConfig, `${field}.xpBudgetConfig`),
215
+ maximumFunderDebit,
216
+ characterLamports: precondition.characterLamports,
217
+ budgetLamports: precondition.budgetLamports,
218
+ characterSize: precondition.characterSize,
219
+ initializationHash: readDataHash(precondition.initializationHash, `${field}.initializationHash`),
220
+ describes: readString(precondition.describes, `${field}.describes`),
221
+ });
222
+ }
223
+ if (precondition.kind === 'ship-import-funding') {
224
+ assertKeys(precondition, field, [
225
+ 'kind',
226
+ 'address',
227
+ 'game',
228
+ 'profile',
229
+ 'system',
230
+ 'shipId',
231
+ 'maximumProfileDebit',
232
+ 'describes',
233
+ ]);
234
+ const shipId = precondition.shipId;
235
+ if (typeof shipId !== 'number' ||
236
+ !Number.isInteger(shipId) ||
237
+ shipId < 0 ||
238
+ shipId > 65535)
239
+ invalid(`${field}.shipId`, shipId, 'an unsigned u16 ship configuration ID');
240
+ const maximumProfileDebit = precondition.maximumProfileDebit;
241
+ if (typeof maximumProfileDebit !== 'bigint' || maximumProfileDebit < 0n)
242
+ invalid(`${field}.maximumProfileDebit`, maximumProfileDebit, 'a nonnegative bigint');
243
+ return Object.freeze({
244
+ kind: 'ship-import-funding',
245
+ address: readAddress(precondition.address, `${field}.address`),
246
+ game: readAddress(precondition.game, `${field}.game`),
247
+ profile: readAddress(precondition.profile, `${field}.profile`),
248
+ system: readAddress(precondition.system, `${field}.system`),
249
+ shipId,
250
+ maximumProfileDebit,
251
+ describes: readString(precondition.describes, `${field}.describes`),
252
+ });
253
+ }
254
+ if (precondition.kind === 'fleet-attack') {
255
+ assertKeys(precondition, field, [
256
+ 'kind',
257
+ 'address',
258
+ 'defender',
259
+ 'game',
260
+ 'profile',
261
+ 'defenderProfile',
262
+ 'instructionKey',
263
+ 'describes',
264
+ ]);
265
+ return Object.freeze({
266
+ kind: 'fleet-attack',
267
+ address: readAddress(precondition.address, `${field}.address`),
268
+ defender: readAddress(precondition.defender, `${field}.defender`),
269
+ game: readAddress(precondition.game, `${field}.game`),
270
+ profile: readAddress(precondition.profile, `${field}.profile`),
271
+ defenderProfile: readAddress(precondition.defenderProfile, `${field}.defenderProfile`),
272
+ instructionKey: readString(precondition.instructionKey, `${field}.instructionKey`),
273
+ describes: readString(precondition.describes, `${field}.describes`),
274
+ });
275
+ }
276
+ if (precondition.kind === 'movement-character') {
277
+ assertKeys(precondition, field, [
278
+ 'kind',
279
+ 'address',
280
+ 'game',
281
+ 'profile',
282
+ 'stateHash',
283
+ 'describes',
284
+ ]);
285
+ return Object.freeze({
286
+ kind: 'movement-character',
287
+ address: readAddress(precondition.address, `${field}.address`),
288
+ game: readAddress(precondition.game, `${field}.game`),
289
+ profile: readAddress(precondition.profile, `${field}.profile`),
290
+ stateHash: readDataHash(precondition.stateHash, `${field}.stateHash`),
291
+ describes: readString(precondition.describes, `${field}.describes`),
292
+ });
293
+ }
294
+ if (precondition.kind === 'starbase-system') {
295
+ assertKeys(precondition, field, ['kind', 'address', 'game', 'starbaseSequenceId', 'describes'], ['requireCss']);
296
+ if (precondition.requireCss !== undefined &&
297
+ precondition.requireCss !== true)
298
+ invalid(`${field}.requireCss`, precondition.requireCss, 'true when CSS access is required, otherwise omitted');
299
+ const sequence = precondition.starbaseSequenceId;
300
+ if (typeof sequence !== 'bigint' ||
301
+ sequence < 0n ||
302
+ sequence > 18446744073709551615n)
303
+ invalid(`${field}.starbaseSequenceId`, sequence, 'an unsigned u64 Starbase sequence');
304
+ return Object.freeze({
305
+ kind: 'starbase-system',
306
+ address: readAddress(precondition.address, `${field}.address`),
307
+ game: readAddress(precondition.game, `${field}.game`),
308
+ starbaseSequenceId: sequence,
309
+ ...(precondition.requireCss === undefined
310
+ ? {}
311
+ : { requireCss: true }),
312
+ describes: readString(precondition.describes, `${field}.describes`),
313
+ });
314
+ }
315
+ if (precondition.kind === 'fleet-mining') {
316
+ assertKeys(precondition, field, [
317
+ 'kind',
318
+ 'address',
319
+ 'game',
320
+ 'profile',
321
+ 'asteroid',
322
+ 'describes',
323
+ ]);
324
+ return Object.freeze({
325
+ kind: 'fleet-mining',
326
+ address: readAddress(precondition.address, `${field}.address`),
327
+ game: readAddress(precondition.game, `${field}.game`),
328
+ profile: readAddress(precondition.profile, `${field}.profile`),
329
+ asteroid: readAddress(precondition.asteroid, `${field}.asteroid`),
330
+ describes: readString(precondition.describes, `${field}.describes`),
331
+ });
332
+ }
333
+ if (isFactionTradeGuard(precondition)) {
334
+ const kind = precondition.kind;
335
+ assertKeys(precondition, field, [
336
+ 'kind',
337
+ 'address',
338
+ 'game',
339
+ 'factionId',
340
+ 'describes',
341
+ 'schemaVersion',
342
+ ...(isTradeBuyGuard(precondition)
343
+ ? ['cargoId', 'floorRaw']
344
+ : isTradeSellGuard(precondition)
345
+ ? ['atlasOutCapPerEpochRaw', 'epochLengthSeconds']
346
+ : []),
347
+ ]);
348
+ const unsigned = (key, max = 65535) => {
349
+ const n = precondition[key];
350
+ if (typeof n !== 'number' || !Number.isInteger(n) || n < 0 || n > max)
351
+ invalid(`${field}.${key}`, n, `an unsigned ${max === 255 ? 'u8' : 'u16'} integer`);
352
+ return n;
353
+ };
354
+ const integer = (key, signed = false) => {
355
+ const n = precondition[key];
356
+ const min = signed ? -(1n << 63n) : 0n;
357
+ const max = signed ? (1n << 63n) - 1n : (1n << 64n) - 1n;
358
+ if (typeof n !== 'bigint' || n < min || n > max)
359
+ invalid(`${field}.${key}`, n, signed ? 'an i64 bigint' : 'a u64 bigint');
360
+ return n;
361
+ };
362
+ const common = {
363
+ address: readAddress(precondition.address, `${field}.address`),
364
+ game: readAddress(precondition.game, `${field}.game`),
365
+ factionId: unsigned('factionId'),
366
+ schemaVersion: unsigned('schemaVersion', 255),
367
+ describes: readString(precondition.describes, `${field}.describes`),
368
+ };
369
+ if (isTradeBuyGuard(precondition))
370
+ return Object.freeze({
371
+ kind,
372
+ ...common,
373
+ cargoId: unsigned('cargoId'),
374
+ floorRaw: integer('floorRaw'),
375
+ });
376
+ if (isTradeSellGuard(precondition))
377
+ return Object.freeze({
378
+ kind,
379
+ ...common,
380
+ atlasOutCapPerEpochRaw: integer('atlasOutCapPerEpochRaw'),
381
+ epochLengthSeconds: integer('epochLengthSeconds', true),
382
+ });
383
+ return Object.freeze({ kind, ...common });
384
+ }
385
+ if (precondition.kind === 'fleet-add-ship') {
386
+ assertKeys(precondition, field, [
387
+ 'kind',
388
+ 'address',
389
+ 'game',
390
+ 'profile',
391
+ 'authority',
392
+ 'system',
393
+ 'shipId',
394
+ 'amount',
395
+ 'keyIndex',
396
+ 'configHash',
397
+ 'maximumProfileDebit',
398
+ 'describes',
399
+ ]);
400
+ const keyIndex = precondition.keyIndex;
401
+ if (typeof keyIndex !== 'number' ||
402
+ !Number.isInteger(keyIndex) ||
403
+ keyIndex < 0 ||
404
+ keyIndex > 65535)
405
+ invalid(`${field}.keyIndex`, keyIndex, 'an integer from 0 through 65535');
406
+ const shipId = precondition.shipId;
407
+ if (typeof shipId !== 'number' ||
408
+ !Number.isInteger(shipId) ||
409
+ shipId < 0 ||
410
+ shipId > 65535)
411
+ invalid(`${field}.shipId`, shipId, 'a u16 ship configuration ID');
412
+ const amount = precondition.amount;
413
+ if (typeof amount !== 'bigint' || amount < 1n || amount > 255n)
414
+ invalid(`${field}.amount`, amount, 'a whole ship quantity from 1n through 255n');
415
+ const maximumProfileDebit = precondition.maximumProfileDebit;
416
+ if (typeof maximumProfileDebit !== 'bigint' || maximumProfileDebit < 0n)
417
+ invalid(`${field}.maximumProfileDebit`, maximumProfileDebit, 'a nonnegative bigint');
418
+ return Object.freeze({
419
+ kind: 'fleet-add-ship',
420
+ address: readAddress(precondition.address, `${field}.address`),
421
+ game: readAddress(precondition.game, `${field}.game`),
422
+ profile: readAddress(precondition.profile, `${field}.profile`),
423
+ authority: readAddress(precondition.authority, `${field}.authority`),
424
+ system: readAddress(precondition.system, `${field}.system`),
425
+ keyIndex,
426
+ shipId,
427
+ amount,
428
+ maximumProfileDebit,
429
+ configHash: readDataHash(precondition.configHash, `${field}.configHash`),
430
+ describes: readString(precondition.describes, `${field}.describes`),
431
+ });
432
+ }
433
+ if (precondition.kind === 'scan-detect') {
434
+ assertKeys(precondition, field, [
435
+ 'kind',
436
+ 'address',
437
+ 'game',
438
+ 'profile',
439
+ 'authority',
440
+ 'character',
441
+ 'signal',
442
+ 'pattern',
443
+ 'policy',
444
+ 'loot',
445
+ 'tracker',
446
+ 'keyIndex',
447
+ 'patternId',
448
+ 'focus',
449
+ 'expectedSequence',
450
+ 'policyRevision',
451
+ 'profileRevision',
452
+ 'configHash',
453
+ 'describes',
454
+ ]);
455
+ const numbers = {};
456
+ for (const [key, max] of [
457
+ ['keyIndex', 65535],
458
+ ['patternId', 65535],
459
+ ['focus', 4],
460
+ ['policyRevision', 4294967295],
461
+ ['profileRevision', 4294967295],
462
+ ]) {
463
+ const value = precondition[key];
464
+ if (typeof value !== 'number' ||
465
+ !Number.isInteger(value) ||
466
+ value < 0 ||
467
+ value > max)
468
+ invalid(`${field}.${key}`, value, `an integer from zero through ${max}`);
469
+ numbers[key] = value;
470
+ }
471
+ const sequence = precondition.expectedSequence;
472
+ if (typeof sequence !== 'bigint' ||
473
+ sequence < 0n ||
474
+ sequence > 18446744073709551615n)
475
+ invalid(`${field}.expectedSequence`, sequence, 'a u64 bigint');
476
+ return Object.freeze({
477
+ kind: 'scan-detect',
478
+ address: readAddress(precondition.address, field),
479
+ game: readAddress(precondition.game, field),
480
+ profile: readAddress(precondition.profile, field),
481
+ authority: readAddress(precondition.authority, field),
482
+ character: readAddress(precondition.character, field),
483
+ signal: readAddress(precondition.signal, field),
484
+ pattern: readAddress(precondition.pattern, field),
485
+ policy: readAddress(precondition.policy, field),
486
+ loot: readAddress(precondition.loot, field),
487
+ tracker: readAddress(precondition.tracker, field),
488
+ keyIndex: numbers.keyIndex,
489
+ patternId: numbers.patternId,
490
+ focus: numbers.focus,
491
+ policyRevision: numbers.policyRevision,
492
+ profileRevision: numbers.profileRevision,
493
+ expectedSequence: sequence,
494
+ configHash: readDataHash(precondition.configHash, field),
495
+ describes: readString(precondition.describes, field),
496
+ });
497
+ }
498
+ if (precondition.kind === 'fleet-respawn') {
499
+ assertKeys(precondition, field, [
500
+ 'kind',
501
+ 'address',
502
+ 'game',
503
+ 'profile',
504
+ 'authority',
505
+ 'system',
506
+ 'keyIndex',
507
+ 'phase',
508
+ 'fleetHash',
509
+ 'maximumRecoveryFee',
510
+ 'maximumProfileDebit',
511
+ 'describes',
512
+ ]);
513
+ const keyIndex = precondition.keyIndex;
514
+ if (typeof keyIndex !== 'number' ||
515
+ !Number.isInteger(keyIndex) ||
516
+ keyIndex < 0 ||
517
+ keyIndex > 65535)
518
+ invalid(`${field}.keyIndex`, keyIndex, 'a u16 key index');
519
+ const phase = precondition.phase;
520
+ if (phase !== 'start' && phase !== 'complete')
521
+ invalid(`${field}.phase`, phase, 'start or complete');
522
+ const maximumRecoveryFee = precondition.maximumRecoveryFee, maximumProfileDebit = precondition.maximumProfileDebit;
523
+ for (const value of [maximumRecoveryFee, maximumProfileDebit])
524
+ if (typeof value !== 'bigint' || value < 0n || value > (1n << 64n) - 1n)
525
+ invalid(field, value, 'a nonnegative u64 funding ceiling');
526
+ return Object.freeze({
527
+ kind: 'fleet-respawn',
528
+ address: readAddress(precondition.address, field),
529
+ game: readAddress(precondition.game, field),
530
+ profile: readAddress(precondition.profile, field),
531
+ authority: readAddress(precondition.authority, field),
532
+ system: readAddress(precondition.system, field),
533
+ keyIndex,
534
+ phase,
535
+ fleetHash: readDataHash(precondition.fleetHash, field),
536
+ maximumRecoveryFee: maximumRecoveryFee,
537
+ maximumProfileDebit: maximumProfileDebit,
538
+ describes: readString(precondition.describes, field),
539
+ });
540
+ }
541
+ if (precondition.kind === 'scan-signal-open') {
542
+ assertKeys(precondition, field, [
543
+ 'kind',
544
+ 'address',
545
+ 'game',
546
+ 'fleet',
547
+ 'profile',
548
+ 'authority',
549
+ 'character',
550
+ 'keyIndex',
551
+ 'authorityHash',
552
+ 'maximumProfileDebit',
553
+ 'describes',
554
+ ]);
555
+ const keyIndex = precondition.keyIndex;
556
+ if (typeof keyIndex !== 'number' ||
557
+ !Number.isInteger(keyIndex) ||
558
+ keyIndex < 0 ||
559
+ keyIndex > 65535)
560
+ invalid(field, keyIndex, 'a u16 key index');
561
+ const maximumProfileDebit = precondition.maximumProfileDebit;
562
+ if (typeof maximumProfileDebit !== 'bigint' ||
563
+ maximumProfileDebit < 0n ||
564
+ maximumProfileDebit > 0xffffffffffffffffn)
565
+ invalid(field, maximumProfileDebit, 'a nonnegative u64 funding ceiling');
566
+ return Object.freeze({
567
+ kind: 'scan-signal-open',
568
+ authorityHash: readDataHash(precondition.authorityHash, field),
569
+ address: readAddress(precondition.address, field),
570
+ game: readAddress(precondition.game, field),
571
+ fleet: readAddress(precondition.fleet, field),
572
+ profile: readAddress(precondition.profile, field),
573
+ authority: readAddress(precondition.authority, field),
574
+ character: readAddress(precondition.character, field),
575
+ keyIndex,
576
+ maximumProfileDebit,
577
+ describes: readString(precondition.describes, field),
578
+ });
579
+ }
580
+ if (precondition.kind === 'fleet-create') {
581
+ assertKeys(precondition, field, [
582
+ 'kind',
583
+ 'address',
584
+ 'game',
585
+ 'profile',
586
+ 'authority',
587
+ 'system',
588
+ 'keyIndex',
589
+ 'label',
590
+ 'maximumProfileDebit',
591
+ 'describes',
592
+ ]);
593
+ const keyIndex = precondition.keyIndex;
594
+ if (typeof keyIndex !== 'number' ||
595
+ !Number.isSafeInteger(keyIndex) ||
596
+ keyIndex < 0 ||
597
+ keyIndex > 65_535)
598
+ invalid(`${field}.keyIndex`, keyIndex, 'an integer from 0 through 65535');
599
+ const label = readString(precondition.label, `${field}.label`);
600
+ const bytes = new TextEncoder().encode(label);
601
+ if (label.trim().length === 0 ||
602
+ label.includes('\0') ||
603
+ bytes.length > 64 ||
604
+ new TextDecoder('utf-8', { ignoreBOM: true }).decode(bytes) !== label)
605
+ invalid(`${field}.label`, label, 'a nonblank, NUL-free Unicode label of at most 64 UTF-8 bytes');
606
+ const maximumProfileDebit = precondition.maximumProfileDebit;
607
+ if (typeof maximumProfileDebit !== 'bigint' || maximumProfileDebit < 0n)
608
+ invalid(`${field}.maximumProfileDebit`, maximumProfileDebit, 'a nonnegative bigint');
609
+ return Object.freeze({
610
+ kind: 'fleet-create',
611
+ address: readAddress(precondition.address, `${field}.address`),
612
+ game: readAddress(precondition.game, `${field}.game`),
613
+ profile: readAddress(precondition.profile, `${field}.profile`),
614
+ authority: readAddress(precondition.authority, `${field}.authority`),
615
+ system: readAddress(precondition.system, `${field}.system`),
616
+ keyIndex,
617
+ label,
618
+ maximumProfileDebit,
619
+ describes: readString(precondition.describes, `${field}.describes`),
620
+ });
621
+ }
622
+ if (precondition.kind === 'system-account-or-absent') {
623
+ assertKeys(precondition, field, ['kind', 'address', 'describes']);
624
+ return Object.freeze({
625
+ kind: 'system-account-or-absent',
626
+ address: readAddress(precondition.address, `${field}.address`),
627
+ describes: readString(precondition.describes, `${field}.describes`),
628
+ });
629
+ }
630
+ if (precondition.kind === 'token-mint') {
631
+ assertKeys(precondition, field, [
632
+ 'kind',
633
+ 'address',
634
+ 'decimals',
635
+ 'describes',
636
+ ]);
637
+ const decimals = precondition.decimals;
638
+ if (typeof decimals !== 'number' ||
639
+ !Number.isInteger(decimals) ||
640
+ decimals < 0 ||
641
+ decimals > 255)
642
+ invalid(`${field}.decimals`, decimals, 'an unsigned u8 mint decimals value');
643
+ return Object.freeze({
644
+ kind: 'token-mint',
645
+ address: readAddress(precondition.address, `${field}.address`),
646
+ decimals,
647
+ describes: readString(precondition.describes, `${field}.describes`),
648
+ });
649
+ }
650
+ if (precondition.kind === 'game-ship-config') {
651
+ assertKeys(precondition, field, [
652
+ 'kind',
653
+ 'address',
654
+ 'shipId',
655
+ 'configHash',
656
+ 'describes',
657
+ ]);
658
+ const id = precondition.shipId;
659
+ if (typeof id !== 'number' || !Number.isInteger(id) || id < 0 || id > 65535)
660
+ invalid(`${field}.shipId`, id, 'a u16 ship configuration ID');
661
+ return Object.freeze({
662
+ kind: 'game-ship-config',
663
+ address: readAddress(precondition.address, `${field}.address`),
664
+ shipId: id,
665
+ configHash: readDataHash(precondition.configHash, `${field}.configHash`),
666
+ describes: readString(precondition.describes, `${field}.describes`),
667
+ });
668
+ }
669
+ if (precondition.kind === 'game-account') {
670
+ assertKeys(precondition, field, ['kind', 'address', 'describes']);
671
+ return Object.freeze({
672
+ kind: 'game-account',
673
+ address: readAddress(precondition.address, `${field}.address`),
674
+ describes: readString(precondition.describes, `${field}.describes`),
675
+ });
676
+ }
677
+ if (['game-cargo-bytes-config', 'token-account', 'cargo-cache'].includes(String(precondition.kind))) {
166
678
  const base = {
167
679
  address: readAddress(precondition.address, `${field}.address`),
168
680
  describes: readString(precondition.describes, `${field}.describes`),
@@ -189,7 +701,7 @@ function normalizePrecondition(value, field, version = 4) {
189
701
  minimumBalance: amount,
190
702
  });
191
703
  }
192
- if (precondition.kind === 'game-cargo-config') {
704
+ if (precondition.kind === 'game-cargo-bytes-config') {
193
705
  assertKeys(precondition, field, [
194
706
  'kind',
195
707
  'address',
@@ -205,7 +717,7 @@ function normalizePrecondition(value, field, version = 4) {
205
717
  invalid(`${field}.cargoId`, id, 'a u16 cargo ID');
206
718
  return Object.freeze({
207
719
  ...base,
208
- kind: 'game-cargo-config',
720
+ kind: precondition.kind,
209
721
  cargoId: id,
210
722
  configHash: readDataHash(precondition.configHash, `${field}.configHash`),
211
723
  });
@@ -230,7 +742,7 @@ function normalizePrecondition(value, field, version = 4) {
230
742
  bump,
231
743
  });
232
744
  }
233
- if (precondition.kind === 'token-account-or-absent' && version >= 3) {
745
+ if (precondition.kind === 'token-account-or-absent') {
234
746
  assertKeys(precondition, field, [
235
747
  'kind',
236
748
  'address',
@@ -246,7 +758,7 @@ function normalizePrecondition(value, field, version = 4) {
246
758
  describes: readString(precondition.describes, `${field}.describes`),
247
759
  });
248
760
  }
249
- if (precondition.kind === 'account-absent' && version !== 1) {
761
+ if (precondition.kind === 'account-absent') {
250
762
  assertKeys(precondition, field, ['kind', 'address', 'describes']);
251
763
  return Object.freeze({
252
764
  kind: 'account-absent',
@@ -255,13 +767,7 @@ function normalizePrecondition(value, field, version = 4) {
255
767
  });
256
768
  }
257
769
  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');
770
+ invalid(`${field}.kind`, precondition.kind, 'a supported current Plan guard; recreate the Plan using the current capability planner');
265
771
  }
266
772
  assertKeys(precondition, field, ['kind', 'address', 'dataHash', 'describes']);
267
773
  return Object.freeze({
@@ -297,64 +803,70 @@ function instructionToJSON(instruction) {
297
803
  return deepFreeze(value);
298
804
  }
299
805
  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 = {
806
+ return deepFreeze({
807
+ v: 22,
303
808
  kind: plan.kind,
304
809
  summary: plan.summary,
305
810
  affected: [...plan.affected],
306
811
  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,
812
+ steps: plan.steps.map((step) => ({
813
+ instruction: instructionToJSON(step.instruction),
814
+ describes: step.describes,
815
+ ...((step.semantics?.length ?? 0) > 0
816
+ ? { semantics: step.semantics.map((semantic) => ({ ...semantic })) }
817
+ : {}),
818
+ signers: [...step.signers],
357
819
  })),
820
+ preconditions: plan.preconditions.map((guard) => {
821
+ if (guard.kind === 'scan-detect')
822
+ return { ...guard, expectedSequence: String(guard.expectedSequence) };
823
+ if (guard.kind === 'fleet-arrival')
824
+ return arrivalGuardToJSON(guard);
825
+ if (guard.kind === 'fleet-respawn')
826
+ return {
827
+ ...guard,
828
+ maximumRecoveryFee: String(guard.maximumRecoveryFee),
829
+ maximumProfileDebit: String(guard.maximumProfileDebit),
830
+ };
831
+ if (isRuntimeGuard(guard))
832
+ return runtimeGuardToJSON(guard);
833
+ if (isTradeBuyGuard(guard))
834
+ return { ...guard, floorRaw: String(guard.floorRaw) };
835
+ if (isTradeSellGuard(guard))
836
+ return {
837
+ ...guard,
838
+ atlasOutCapPerEpochRaw: String(guard.atlasOutCapPerEpochRaw),
839
+ epochLengthSeconds: String(guard.epochLengthSeconds),
840
+ };
841
+ if (guard.kind === 'fleet-add-ship')
842
+ return {
843
+ ...guard,
844
+ amount: String(guard.amount),
845
+ maximumProfileDebit: String(guard.maximumProfileDebit),
846
+ };
847
+ if (guard.kind === 'character-registration')
848
+ return {
849
+ ...guard,
850
+ maximumFunderDebit: String(guard.maximumFunderDebit),
851
+ characterLamports: String(guard.characterLamports),
852
+ budgetLamports: String(guard.budgetLamports),
853
+ };
854
+ if (guard.kind === 'scan-signal-open' ||
855
+ guard.kind === 'fleet-create' ||
856
+ guard.kind === 'ship-import-funding')
857
+ return {
858
+ ...guard,
859
+ maximumProfileDebit: String(guard.maximumProfileDebit),
860
+ };
861
+ if (guard.kind === 'starbase-system')
862
+ return {
863
+ ...guard,
864
+ starbaseSequenceId: String(guard.starbaseSequenceId),
865
+ };
866
+ if (guard.kind === 'token-account')
867
+ return { ...guard, minimumBalance: String(guard.minimumBalance) };
868
+ return { ...guard };
869
+ }),
358
870
  });
359
871
  }
360
872
  /** Creates an inert branded Plan while deriving every aggregate field.
@@ -376,6 +888,11 @@ export function createPlan(input) {
376
888
  assertKeys(value, 'plan', ['kind', 'summary', 'steps', 'preconditions']);
377
889
  const steps = Object.freeze(readArray(value.steps, 'plan.steps').map((step, index) => normalizeStep(step, `plan.steps[${String(index)}]`)));
378
890
  const preconditions = Object.freeze(readArray(value.preconditions, 'plan.preconditions').map((precondition, index) => normalizePrecondition(precondition, `plan.preconditions[${String(index)}]`)));
891
+ validateShipImportFundingComposition(preconditions);
892
+ validateStarbaseSystemGuards(steps, preconditions);
893
+ validateDetectInstructions(steps, preconditions);
894
+ validateRespawnInstructions(steps, preconditions);
895
+ validateOpenSignalInstructions(steps, preconditions);
379
896
  const descriptions = Object.freeze(steps.map((step) => step.describes));
380
897
  const plan = {
381
898
  kind: readString(value.kind, 'plan.kind'),
@@ -422,7 +939,7 @@ function sameAddresses(actual, encoded) {
422
939
  *
423
940
  * @example
424
941
  * ```ts
425
- * declare const wire: PlanJsonV1 | PlanJsonV2 | PlanJsonV3 | PlanJsonV4;
942
+ * declare const wire: PlanJson;
426
943
  * const plan = planFromJSON(wire);
427
944
  * console.log(plan.describe());
428
945
  * ```
@@ -438,29 +955,106 @@ export function planFromJSON(json) {
438
955
  'affected',
439
956
  'requiredSigners',
440
957
  ]);
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
- });
958
+ if (value.v !== 22) {
959
+ throw new InvalidActionInputError('planJson.v', value.v, 'the current Plan wire version 22', 'Recreate the Plan using the current capability planner; do not change its saved version or migrate its guards.');
455
960
  }
961
+ value.preconditions = readArray(value.preconditions, 'planJson.preconditions').map((entry) => {
962
+ const guard = readRecord(entry, 'precondition');
963
+ if (guard.kind === 'scan-detect') {
964
+ if (typeof guard.expectedSequence !== 'string' ||
965
+ !/^(0|[1-9][0-9]*)$/.test(guard.expectedSequence))
966
+ invalid('expectedSequence', guard.expectedSequence, 'a canonical unsigned decimal string');
967
+ return { ...guard, expectedSequence: BigInt(guard.expectedSequence) };
968
+ }
969
+ if (guard.kind === 'fleet-arrival')
970
+ return normalizeArrivalGuard(guard, 'precondition', true);
971
+ if (isRuntimeGuard(guard))
972
+ return normalizeRuntimeGuard(guard, 'precondition', true);
973
+ if (isTradeBuyGuard(guard) || isTradeSellGuard(guard)) {
974
+ const keys = isTradeBuyGuard(guard)
975
+ ? ['floorRaw']
976
+ : ['atlasOutCapPerEpochRaw', 'epochLengthSeconds'];
977
+ const decoded = { ...guard };
978
+ for (const key of keys) {
979
+ const raw = guard[key];
980
+ const pattern = key === 'epochLengthSeconds'
981
+ ? /^(0|[1-9][0-9]*|-[1-9][0-9]*)$/
982
+ : /^(0|[1-9][0-9]*)$/;
983
+ if (typeof raw !== 'string' || !pattern.test(raw))
984
+ invalid(key, raw, 'a canonical decimal string');
985
+ decoded[key] = BigInt(raw);
986
+ }
987
+ return decoded;
988
+ }
989
+ if (guard.kind === 'fleet-add-ship') {
990
+ for (const field of ['amount', 'maximumProfileDebit'])
991
+ if (typeof guard[field] !== 'string' ||
992
+ !/^(0|[1-9][0-9]*)$/.test(guard[field]))
993
+ invalid(field, guard[field], 'a canonical unsigned decimal string');
994
+ return {
995
+ ...guard,
996
+ amount: BigInt(guard.amount),
997
+ maximumProfileDebit: BigInt(guard.maximumProfileDebit),
998
+ };
999
+ }
1000
+ if (guard.kind === 'character-registration') {
1001
+ for (const key of ['characterLamports', 'budgetLamports'])
1002
+ if (typeof guard[key] !== 'string' ||
1003
+ !/^(0|[1-9][0-9]*)$/.test(guard[key]))
1004
+ invalid(key, guard[key], 'a canonical unsigned decimal string');
1005
+ if (typeof guard.maximumFunderDebit !== 'string' ||
1006
+ !/^(0|[1-9][0-9]*)$/.test(guard.maximumFunderDebit))
1007
+ invalid('maximumFunderDebit', guard.maximumFunderDebit, 'a canonical unsigned decimal string');
1008
+ return {
1009
+ ...guard,
1010
+ maximumFunderDebit: BigInt(guard.maximumFunderDebit),
1011
+ characterLamports: BigInt(guard.characterLamports),
1012
+ budgetLamports: BigInt(guard.budgetLamports),
1013
+ };
1014
+ }
1015
+ if (guard.kind === 'fleet-respawn') {
1016
+ for (const key of ['maximumRecoveryFee', 'maximumProfileDebit'])
1017
+ if (typeof guard[key] !== 'string' ||
1018
+ !/^(0|[1-9][0-9]*)$/.test(guard[key]))
1019
+ invalid(key, guard[key], 'a canonical unsigned decimal string');
1020
+ return {
1021
+ ...guard,
1022
+ maximumRecoveryFee: BigInt(guard.maximumRecoveryFee),
1023
+ maximumProfileDebit: BigInt(guard.maximumProfileDebit),
1024
+ };
1025
+ }
1026
+ if (guard.kind === 'scan-signal-open' ||
1027
+ guard.kind === 'fleet-create' ||
1028
+ guard.kind === 'ship-import-funding') {
1029
+ if (typeof guard.maximumProfileDebit !== 'string' ||
1030
+ !/^(0|[1-9][0-9]*)$/.test(guard.maximumProfileDebit))
1031
+ invalid('maximumProfileDebit', guard.maximumProfileDebit, 'a canonical unsigned decimal string');
1032
+ return {
1033
+ ...guard,
1034
+ maximumProfileDebit: BigInt(guard.maximumProfileDebit),
1035
+ };
1036
+ }
1037
+ if (guard.kind === 'starbase-system') {
1038
+ if (typeof guard.starbaseSequenceId !== 'string' ||
1039
+ !/^(0|[1-9][0-9]*)$/.test(guard.starbaseSequenceId))
1040
+ invalid('starbaseSequenceId', guard.starbaseSequenceId, 'a canonical unsigned decimal string');
1041
+ return { ...guard, starbaseSequenceId: BigInt(guard.starbaseSequenceId) };
1042
+ }
1043
+ if (guard.kind !== 'token-account')
1044
+ return guard;
1045
+ if (typeof guard.minimumBalance !== 'string' ||
1046
+ !/^(0|[1-9][0-9]*)$/.test(guard.minimumBalance))
1047
+ invalid('minimumBalance', guard.minimumBalance, 'a canonical unsigned decimal string');
1048
+ return { ...guard, minimumBalance: BigInt(guard.minimumBalance) };
1049
+ });
456
1050
  const steps = readArray(value.steps, 'planJson.steps').map((candidate, index) => {
457
1051
  const field = `planJson.steps[${String(index)}]`;
458
1052
  const step = readRecord(candidate, field);
459
- assertKeys(step, field, ['instruction', 'describes', 'signers'], version !== 1 ? ['semantics'] : []);
1053
+ assertKeys(step, field, ['instruction', 'describes', 'signers'], ['semantics']);
460
1054
  return {
461
1055
  instruction: readWireInstruction(step.instruction, `${field}.instruction`),
462
1056
  describes: readString(step.describes, `${field}.describes`),
463
- ...(version !== 1 && step.semantics !== undefined
1057
+ ...(step.semantics !== undefined
464
1058
  ? {
465
1059
  semantics: readArray(step.semantics, `${field}.semantics`).map((semantic, semanticIndex) => normalizeSemanticFact(semantic, `${field}.semantics[${String(semanticIndex)}]`)),
466
1060
  }
@@ -468,7 +1062,7 @@ export function planFromJSON(json) {
468
1062
  signers: readArray(step.signers, `${field}.signers`).map((signer, signerIndex) => readAddress(signer, `${field}.signers[${String(signerIndex)}]`)),
469
1063
  };
470
1064
  });
471
- const preconditions = readArray(value.preconditions, 'planJson.preconditions').map((candidate, index) => normalizePrecondition(candidate, `planJson.preconditions[${String(index)}]`, version));
1065
+ const preconditions = readArray(value.preconditions, 'planJson.preconditions').map((candidate, index) => normalizePrecondition(candidate, `planJson.preconditions[${String(index)}]`));
472
1066
  const affected = readArray(value.affected, 'planJson.affected').map((candidate, index) => readAddress(candidate, `planJson.affected[${String(index)}]`));
473
1067
  const requiredSigners = readArray(value.requiredSigners, 'planJson.requiredSigners').map((candidate, index) => readAddress(candidate, `planJson.requiredSigners[${String(index)}]`));
474
1068
  const plan = createPlan({
@@ -477,6 +1071,10 @@ export function planFromJSON(json) {
477
1071
  steps,
478
1072
  preconditions,
479
1073
  });
1074
+ validateStarbaseSystemInstructions(plan.steps, plan.preconditions);
1075
+ validateMovementXpInstructions(plan.steps, plan.preconditions);
1076
+ validateFleetAttackInstructions(plan.steps, plan.preconditions);
1077
+ validateCharacterRegistrationInstructions(plan.steps, plan.preconditions);
480
1078
  if (!sameAddresses(plan.affected, affected)) {
481
1079
  invalid('planJson.affected', value.affected, 'the first-seen union of writable instruction account addresses');
482
1080
  }
@@ -493,6 +1091,49 @@ function assertPlan(value, index) {
493
1091
  function combinedSummary(steps) {
494
1092
  return steps.map((step) => step.describes).join(' ');
495
1093
  }
1094
+ function validateShipImportFundingComposition(guards) {
1095
+ const targets = new Map();
1096
+ for (const guard of guards) {
1097
+ if (guard.kind !== 'ship-import-funding')
1098
+ continue;
1099
+ const identity = `${guard.game}:${guard.profile}:${guard.system}:${String(guard.shipId)}`;
1100
+ const previous = targets.get(guard.address);
1101
+ if (previous !== undefined && previous !== identity)
1102
+ 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.');
1103
+ targets.set(guard.address, identity);
1104
+ }
1105
+ }
1106
+ function validateFactionGuardComposition(guards) {
1107
+ const retained = new Map();
1108
+ for (const guard of guards) {
1109
+ if (!isFactionTradeGuard(guard))
1110
+ continue;
1111
+ const constraints = [
1112
+ [
1113
+ `${isTradeMeterGuard(guard) ? 'meter' : 'treasury'}:${guard.address}:identity`,
1114
+ `${guard.game}:${String(guard.factionId)}`,
1115
+ ],
1116
+ ];
1117
+ if (!isTradeMeterGuard(guard)) {
1118
+ constraints.push(isTradeBuyGuard(guard)
1119
+ ? [
1120
+ `${guard.address}:buy:${String(guard.cargoId)}`,
1121
+ String(guard.floorRaw),
1122
+ ]
1123
+ : [
1124
+ `${guard.address}:sell`,
1125
+ `${String(guard.atlasOutCapPerEpochRaw)}:${String(guard.epochLengthSeconds)}`,
1126
+ ]);
1127
+ }
1128
+ constraints.push([`${guard.address}:schema`, String(guard.schemaVersion)]);
1129
+ for (const [key, value] of constraints) {
1130
+ const previous = retained.get(key);
1131
+ if (previous !== undefined && previous !== value)
1132
+ 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.');
1133
+ retained.set(key, value);
1134
+ }
1135
+ }
1136
+ }
496
1137
  /** Combines one or more Plans with deterministic associative flattening.
497
1138
  *
498
1139
  * Semantic validation is eager. Conflict indices are relative to the flattened
@@ -513,11 +1154,23 @@ export function combinePlans(...plans) {
513
1154
  plans.forEach(assertPlan);
514
1155
  const steps = plans.flatMap((plan) => plan.steps);
515
1156
  validatePlanComposition(steps);
1157
+ const preconditions = plans.flatMap((plan) => plan.preconditions);
1158
+ validateFactionGuardComposition(preconditions);
1159
+ validateMiningStopInstructions(steps, preconditions);
1160
+ validateStarbaseSystemInstructions(steps, preconditions);
1161
+ validateCharacterRegistrationInstructions(steps, preconditions);
1162
+ validateArrivalInstructions(steps, preconditions);
1163
+ validateDetectInstructions(steps, preconditions);
1164
+ validateRespawnInstructions(steps, preconditions);
1165
+ validateOpenSignalInstructions(steps, preconditions);
1166
+ validateRuntimeInstructions(steps, preconditions);
1167
+ validateMovementXpInstructions(steps, preconditions);
1168
+ validateFleetAttackInstructions(steps, preconditions);
516
1169
  return createPlan({
517
1170
  kind: 'combined',
518
1171
  summary: combinedSummary(steps),
519
1172
  steps,
520
- preconditions: plans.flatMap((plan) => plan.preconditions),
1173
+ preconditions,
521
1174
  });
522
1175
  }
523
1176
  export { assemblePlan } from './assembly.js';