@aephia/atlas-kit 0.6.0-next.13 → 0.6.0-next.131

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 (752) hide show
  1. package/README.md +3 -1
  2. package/dist/cargo/actions/deposit.d.ts +2 -2
  3. package/dist/cargo/actions/deposit.d.ts.map +1 -1
  4. package/dist/cargo/actions/deposit.js +28 -117
  5. package/dist/cargo/actions/deposit.js.map +1 -1
  6. package/dist/cargo/actions/index.d.ts +1 -1
  7. package/dist/cargo/actions/index.d.ts.map +1 -1
  8. package/dist/cargo/actions/index.js +28 -84
  9. package/dist/cargo/actions/index.js.map +1 -1
  10. package/dist/cargo/actions/wallet-context.d.ts +52 -3
  11. package/dist/cargo/actions/wallet-context.d.ts.map +1 -1
  12. package/dist/cargo/actions/wallet-context.js +118 -7
  13. package/dist/cargo/actions/wallet-context.js.map +1 -1
  14. package/dist/cargo/actions/wallet-token.d.ts +1 -6
  15. package/dist/cargo/actions/wallet-token.d.ts.map +1 -1
  16. package/dist/cargo/actions/wallet-token.js +0 -53
  17. package/dist/cargo/actions/wallet-token.js.map +1 -1
  18. package/dist/cargo/actions/withdrawal.d.ts +1 -1
  19. package/dist/cargo/actions/withdrawal.d.ts.map +1 -1
  20. package/dist/cargo/actions/withdrawal.js +39 -164
  21. package/dist/cargo/actions/withdrawal.js.map +1 -1
  22. package/dist/cargo/index.d.ts.map +1 -1
  23. package/dist/cargo/index.js +2 -10
  24. package/dist/cargo/index.js.map +1 -1
  25. package/dist/claim-stakes/actions/index.d.ts +57 -8
  26. package/dist/claim-stakes/actions/index.d.ts.map +1 -1
  27. package/dist/claim-stakes/actions/index.js +541 -675
  28. package/dist/claim-stakes/actions/index.js.map +1 -1
  29. package/dist/claim-stakes/index.d.ts +21 -6
  30. package/dist/claim-stakes/index.d.ts.map +1 -1
  31. package/dist/claim-stakes/index.js +33 -19
  32. package/dist/claim-stakes/index.js.map +1 -1
  33. package/dist/client/context.d.ts.map +1 -1
  34. package/dist/client/context.js +1 -1
  35. package/dist/client/context.js.map +1 -1
  36. package/dist/client/contracts.d.ts +16 -6
  37. package/dist/client/contracts.d.ts.map +1 -1
  38. package/dist/client/errors.d.ts +2 -2
  39. package/dist/client/errors.d.ts.map +1 -1
  40. package/dist/client/errors.js.map +1 -1
  41. package/dist/client/index.d.ts +35 -0
  42. package/dist/client/index.d.ts.map +1 -1
  43. package/dist/client/index.js +35 -0
  44. package/dist/client/index.js.map +1 -1
  45. package/dist/client/rpc-subscription-provider.d.ts +35 -0
  46. package/dist/client/rpc-subscription-provider.d.ts.map +1 -0
  47. package/dist/client/rpc-subscription-provider.js +190 -0
  48. package/dist/client/rpc-subscription-provider.js.map +1 -0
  49. package/dist/combat/actions/index.d.ts +15 -9
  50. package/dist/combat/actions/index.d.ts.map +1 -1
  51. package/dist/combat/actions/index.js +245 -274
  52. package/dist/combat/actions/index.js.map +1 -1
  53. package/dist/combat/index.d.ts +20 -5
  54. package/dist/combat/index.d.ts.map +1 -1
  55. package/dist/combat/index.js +12 -17
  56. package/dist/combat/index.js.map +1 -1
  57. package/dist/crafting/actions/index.d.ts +16 -5
  58. package/dist/crafting/actions/index.d.ts.map +1 -1
  59. package/dist/crafting/actions/index.js +204 -318
  60. package/dist/crafting/actions/index.js.map +1 -1
  61. package/dist/crafting/index.d.ts +33 -3
  62. package/dist/crafting/index.d.ts.map +1 -1
  63. package/dist/crafting/index.js +49 -28
  64. package/dist/crafting/index.js.map +1 -1
  65. package/dist/factions/actions/index.d.ts +2 -1
  66. package/dist/factions/actions/index.d.ts.map +1 -1
  67. package/dist/factions/actions/index.js +6 -4
  68. package/dist/factions/actions/index.js.map +1 -1
  69. package/dist/factions/index.d.ts +6 -1
  70. package/dist/factions/index.d.ts.map +1 -1
  71. package/dist/factions/index.js +16 -18
  72. package/dist/factions/index.js.map +1 -1
  73. package/dist/factions/profile-faction.d.ts +20 -8
  74. package/dist/factions/profile-faction.d.ts.map +1 -1
  75. package/dist/factions/profile-faction.js +20 -8
  76. package/dist/factions/profile-faction.js.map +1 -1
  77. package/dist/fleets/actions/add-ship.d.ts +35 -0
  78. package/dist/fleets/actions/add-ship.d.ts.map +1 -0
  79. package/dist/fleets/actions/add-ship.js +120 -0
  80. package/dist/fleets/actions/add-ship.js.map +1 -0
  81. package/dist/fleets/actions/create-fleet.d.ts +36 -0
  82. package/dist/fleets/actions/create-fleet.d.ts.map +1 -0
  83. package/dist/fleets/actions/create-fleet.js +108 -0
  84. package/dist/fleets/actions/create-fleet.js.map +1 -0
  85. package/dist/fleets/actions/crew-transfer.d.ts +41 -0
  86. package/dist/fleets/actions/crew-transfer.d.ts.map +1 -0
  87. package/dist/fleets/actions/crew-transfer.js +94 -0
  88. package/dist/fleets/actions/crew-transfer.js.map +1 -0
  89. package/dist/fleets/actions/dock-bounds.d.ts +38 -0
  90. package/dist/fleets/actions/dock-bounds.d.ts.map +1 -0
  91. package/dist/fleets/actions/dock-bounds.js +46 -0
  92. package/dist/fleets/actions/dock-bounds.js.map +1 -0
  93. package/dist/fleets/actions/index.d.ts +68 -26
  94. package/dist/fleets/actions/index.d.ts.map +1 -1
  95. package/dist/fleets/actions/index.js +395 -335
  96. package/dist/fleets/actions/index.js.map +1 -1
  97. package/dist/fleets/actions/respawn.d.ts +38 -0
  98. package/dist/fleets/actions/respawn.d.ts.map +1 -0
  99. package/dist/fleets/actions/respawn.js +93 -0
  100. package/dist/fleets/actions/respawn.js.map +1 -0
  101. package/dist/fleets/actions/ship-import.d.ts +1 -1
  102. package/dist/fleets/actions/ship-import.d.ts.map +1 -1
  103. package/dist/fleets/actions/ship-import.js +67 -91
  104. package/dist/fleets/actions/ship-import.js.map +1 -1
  105. package/dist/fleets/cooldown.d.ts +44 -0
  106. package/dist/fleets/cooldown.d.ts.map +1 -0
  107. package/dist/fleets/cooldown.js +43 -0
  108. package/dist/fleets/cooldown.js.map +1 -0
  109. package/dist/fleets/coordinate-warp-estimate.d.ts +70 -0
  110. package/dist/fleets/coordinate-warp-estimate.d.ts.map +1 -0
  111. package/dist/fleets/coordinate-warp-estimate.js +46 -0
  112. package/dist/fleets/coordinate-warp-estimate.js.map +1 -0
  113. package/dist/fleets/index.d.ts +35 -0
  114. package/dist/fleets/index.d.ts.map +1 -1
  115. package/dist/fleets/index.js +54 -12
  116. package/dist/fleets/index.js.map +1 -1
  117. package/dist/fleets/movement-arithmetic.d.ts +21 -0
  118. package/dist/fleets/movement-arithmetic.d.ts.map +1 -0
  119. package/dist/fleets/movement-arithmetic.js +41 -0
  120. package/dist/fleets/movement-arithmetic.js.map +1 -0
  121. package/dist/fleets/subwarp-estimate.d.ts +70 -0
  122. package/dist/fleets/subwarp-estimate.d.ts.map +1 -0
  123. package/dist/fleets/subwarp-estimate.js +38 -0
  124. package/dist/fleets/subwarp-estimate.js.map +1 -0
  125. package/dist/fleets/travel-profile.d.ts +102 -0
  126. package/dist/fleets/travel-profile.d.ts.map +1 -0
  127. package/dist/fleets/travel-profile.js +120 -0
  128. package/dist/fleets/travel-profile.js.map +1 -0
  129. package/dist/fleets/warp-lane-estimate.d.ts +59 -0
  130. package/dist/fleets/warp-lane-estimate.d.ts.map +1 -0
  131. package/dist/fleets/warp-lane-estimate.js +36 -0
  132. package/dist/fleets/warp-lane-estimate.js.map +1 -0
  133. package/dist/fleets/warp-lane-policy.d.ts +68 -0
  134. package/dist/fleets/warp-lane-policy.d.ts.map +1 -0
  135. package/dist/fleets/warp-lane-policy.js +91 -0
  136. package/dist/fleets/warp-lane-policy.js.map +1 -0
  137. package/dist/fleets/warp-lane-toll.d.ts +55 -0
  138. package/dist/fleets/warp-lane-toll.d.ts.map +1 -0
  139. package/dist/fleets/warp-lane-toll.js +79 -0
  140. package/dist/fleets/warp-lane-toll.js.map +1 -0
  141. package/dist/identity/actions/create-profile.d.ts +1 -1
  142. package/dist/identity/actions/create-profile.d.ts.map +1 -1
  143. package/dist/identity/actions/create-profile.js +2 -2
  144. package/dist/identity/actions/create-profile.js.map +1 -1
  145. package/dist/identity/actions/index.d.ts +5 -4
  146. package/dist/identity/actions/index.d.ts.map +1 -1
  147. package/dist/identity/actions/index.js +52 -29
  148. package/dist/identity/actions/index.js.map +1 -1
  149. package/dist/identity/actions/research-unlock.d.ts +52 -0
  150. package/dist/identity/actions/research-unlock.d.ts.map +1 -0
  151. package/dist/identity/actions/research-unlock.js +155 -0
  152. package/dist/identity/actions/research-unlock.js.map +1 -0
  153. package/dist/identity/index.d.ts +5 -2
  154. package/dist/identity/index.d.ts.map +1 -1
  155. package/dist/identity/index.js +6 -12
  156. package/dist/identity/index.js.map +1 -1
  157. package/dist/identity/research-state.d.ts +60 -0
  158. package/dist/identity/research-state.d.ts.map +1 -0
  159. package/dist/identity/research-state.js +68 -0
  160. package/dist/identity/research-state.js.map +1 -0
  161. package/dist/index.d.ts +26 -1
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +24 -7
  164. package/dist/index.js.map +1 -1
  165. package/dist/internal/c4/account-decoding.d.ts +49 -0
  166. package/dist/internal/c4/account-decoding.d.ts.map +1 -0
  167. package/dist/internal/c4/account-decoding.js +74 -0
  168. package/dist/internal/c4/account-decoding.js.map +1 -0
  169. package/dist/internal/c4/cargo-bytes-config.d.ts +7 -0
  170. package/dist/internal/c4/cargo-bytes-config.d.ts.map +1 -0
  171. package/dist/internal/c4/cargo-bytes-config.js +19 -0
  172. package/dist/internal/c4/cargo-bytes-config.js.map +1 -0
  173. package/dist/internal/c4/cargo-pod.d.ts +15 -0
  174. package/dist/internal/c4/cargo-pod.d.ts.map +1 -0
  175. package/dist/internal/c4/cargo-pod.js +13 -0
  176. package/dist/internal/c4/cargo-pod.js.map +1 -0
  177. package/dist/internal/c4/character-modifier.d.ts +1 -1
  178. package/dist/internal/c4/character-modifier.d.ts.map +1 -1
  179. package/dist/internal/c4/character-registration.d.ts +2 -0
  180. package/dist/internal/c4/character-registration.d.ts.map +1 -1
  181. package/dist/internal/c4/character-registration.js +2 -0
  182. package/dist/internal/c4/character-registration.js.map +1 -1
  183. package/dist/internal/c4/character.d.ts +157 -0
  184. package/dist/internal/c4/character.d.ts.map +1 -0
  185. package/dist/internal/c4/character.js +64 -0
  186. package/dist/internal/c4/character.js.map +1 -0
  187. package/dist/internal/c4/claim-stake-building-definitions.d.ts.map +1 -1
  188. package/dist/internal/c4/claim-stake-building-definitions.js +2 -1
  189. package/dist/internal/c4/claim-stake-building-definitions.js.map +1 -1
  190. package/dist/internal/c4/claim-stake-configuration.d.ts.map +1 -1
  191. package/dist/internal/c4/claim-stake-configuration.js +5 -36
  192. package/dist/internal/c4/claim-stake-configuration.js.map +1 -1
  193. package/dist/internal/c4/claim-stake-definitions.d.ts +4 -4
  194. package/dist/internal/c4/claim-stake-definitions.d.ts.map +1 -1
  195. package/dist/internal/c4/claim-stake-definitions.js +2 -1
  196. package/dist/internal/c4/claim-stake-definitions.js.map +1 -1
  197. package/dist/internal/c4/claim-stake-plots.d.ts +17 -0
  198. package/dist/internal/c4/claim-stake-plots.d.ts.map +1 -0
  199. package/dist/internal/c4/claim-stake-plots.js +29 -0
  200. package/dist/internal/c4/claim-stake-plots.js.map +1 -0
  201. package/dist/internal/c4/claim-stake.d.ts +13 -33
  202. package/dist/internal/c4/claim-stake.d.ts.map +1 -1
  203. package/dist/internal/c4/claim-stake.js +49 -94
  204. package/dist/internal/c4/claim-stake.js.map +1 -1
  205. package/dist/internal/c4/combat.d.ts +1 -82
  206. package/dist/internal/c4/combat.d.ts.map +1 -1
  207. package/dist/internal/c4/combat.js +16 -213
  208. package/dist/internal/c4/combat.js.map +1 -1
  209. package/dist/internal/c4/crafting-process-codec.d.ts +13 -0
  210. package/dist/internal/c4/crafting-process-codec.d.ts.map +1 -0
  211. package/dist/internal/c4/crafting-process-codec.js +34 -0
  212. package/dist/internal/c4/crafting-process-codec.js.map +1 -0
  213. package/dist/internal/c4/crafting.d.ts +27 -33
  214. package/dist/internal/c4/crafting.d.ts.map +1 -1
  215. package/dist/internal/c4/crafting.js +76 -127
  216. package/dist/internal/c4/crafting.js.map +1 -1
  217. package/dist/internal/c4/currency-cache.d.ts +6 -0
  218. package/dist/internal/c4/currency-cache.d.ts.map +1 -0
  219. package/dist/internal/c4/currency-cache.js +27 -0
  220. package/dist/internal/c4/currency-cache.js.map +1 -0
  221. package/dist/internal/c4/discriminators.d.ts +85 -0
  222. package/dist/internal/c4/discriminators.d.ts.map +1 -0
  223. package/dist/internal/c4/discriminators.js +174 -0
  224. package/dist/internal/c4/discriminators.js.map +1 -0
  225. package/dist/internal/c4/docking-funding.d.ts +4 -0
  226. package/dist/internal/c4/docking-funding.d.ts.map +1 -0
  227. package/dist/internal/c4/docking-funding.js +11 -0
  228. package/dist/internal/c4/docking-funding.js.map +1 -0
  229. package/dist/internal/c4/faction-epoch-meter.d.ts +10 -0
  230. package/dist/internal/c4/faction-epoch-meter.d.ts.map +1 -0
  231. package/dist/internal/c4/faction-epoch-meter.js +26 -0
  232. package/dist/internal/c4/faction-epoch-meter.js.map +1 -0
  233. package/dist/internal/c4/faction-treasury.d.ts +23 -0
  234. package/dist/internal/c4/faction-treasury.d.ts.map +1 -0
  235. package/dist/internal/c4/faction-treasury.js +41 -0
  236. package/dist/internal/c4/faction-treasury.js.map +1 -0
  237. package/dist/internal/c4/faction.d.ts +21 -0
  238. package/dist/internal/c4/faction.d.ts.map +1 -0
  239. package/dist/internal/c4/faction.js +23 -0
  240. package/dist/internal/c4/faction.js.map +1 -0
  241. package/dist/internal/c4/factions.d.ts +15 -57
  242. package/dist/internal/c4/factions.d.ts.map +1 -1
  243. package/dist/internal/c4/factions.js +80 -223
  244. package/dist/internal/c4/factions.js.map +1 -1
  245. package/dist/internal/c4/fleet-arrival.d.ts +28 -0
  246. package/dist/internal/c4/fleet-arrival.d.ts.map +1 -0
  247. package/dist/internal/c4/fleet-arrival.js +42 -0
  248. package/dist/internal/c4/fleet-arrival.js.map +1 -0
  249. package/dist/internal/c4/fleet-creation.d.ts +7 -0
  250. package/dist/internal/c4/fleet-creation.d.ts.map +1 -0
  251. package/dist/internal/c4/fleet-creation.js +171 -0
  252. package/dist/internal/c4/fleet-creation.js.map +1 -0
  253. package/dist/internal/c4/fleet-crew-binding.d.ts +9 -0
  254. package/dist/internal/c4/fleet-crew-binding.d.ts.map +1 -1
  255. package/dist/internal/c4/fleet-crew-binding.js +31 -44
  256. package/dist/internal/c4/fleet-crew-binding.js.map +1 -1
  257. package/dist/internal/c4/fleet-respawn.d.ts +17 -0
  258. package/dist/internal/c4/fleet-respawn.d.ts.map +1 -0
  259. package/dist/internal/c4/fleet-respawn.js +62 -0
  260. package/dist/internal/c4/fleet-respawn.js.map +1 -0
  261. package/dist/internal/c4/fleet-ship-assembly.d.ts +11 -0
  262. package/dist/internal/c4/fleet-ship-assembly.d.ts.map +1 -0
  263. package/dist/internal/c4/fleet-ship-assembly.js +44 -0
  264. package/dist/internal/c4/fleet-ship-assembly.js.map +1 -0
  265. package/dist/internal/c4/fleet.d.ts +48 -19
  266. package/dist/internal/c4/fleet.d.ts.map +1 -1
  267. package/dist/internal/c4/fleet.js +50 -87
  268. package/dist/internal/c4/fleet.js.map +1 -1
  269. package/dist/internal/c4/game-definition-layout.d.ts +2 -0
  270. package/dist/internal/c4/game-definition-layout.d.ts.map +1 -1
  271. package/dist/internal/c4/game-definition-layout.js +4 -0
  272. package/dist/internal/c4/game-definition-layout.js.map +1 -1
  273. package/dist/internal/c4/game.d.ts +101 -30
  274. package/dist/internal/c4/game.d.ts.map +1 -1
  275. package/dist/internal/c4/game.js +203 -124
  276. package/dist/internal/c4/game.js.map +1 -1
  277. package/dist/internal/c4/identity.d.ts +3 -152
  278. package/dist/internal/c4/identity.d.ts.map +1 -1
  279. package/dist/internal/c4/identity.js +19 -126
  280. package/dist/internal/c4/identity.js.map +1 -1
  281. package/dist/internal/c4/local-market-order.d.ts +29 -0
  282. package/dist/internal/c4/local-market-order.d.ts.map +1 -0
  283. package/dist/internal/c4/local-market-order.js +46 -0
  284. package/dist/internal/c4/local-market-order.js.map +1 -0
  285. package/dist/internal/c4/loot-layout.js +1 -1
  286. package/dist/internal/c4/loot-layout.js.map +1 -1
  287. package/dist/internal/c4/loot.d.ts +89 -0
  288. package/dist/internal/c4/loot.d.ts.map +1 -0
  289. package/dist/internal/c4/loot.js +109 -0
  290. package/dist/internal/c4/loot.js.map +1 -0
  291. package/dist/internal/c4/loyalty.d.ts +0 -27
  292. package/dist/internal/c4/loyalty.d.ts.map +1 -1
  293. package/dist/internal/c4/loyalty.js +32 -160
  294. package/dist/internal/c4/loyalty.js.map +1 -1
  295. package/dist/internal/c4/market.d.ts +2 -38
  296. package/dist/internal/c4/market.d.ts.map +1 -1
  297. package/dist/internal/c4/market.js +26 -120
  298. package/dist/internal/c4/market.js.map +1 -1
  299. package/dist/internal/c4/mining-instructions.d.ts +2 -0
  300. package/dist/internal/c4/mining-instructions.d.ts.map +1 -0
  301. package/dist/internal/c4/mining-instructions.js +3 -0
  302. package/dist/internal/c4/mining-instructions.js.map +1 -0
  303. package/dist/internal/c4/open-signal.d.ts +8 -0
  304. package/dist/internal/c4/open-signal.d.ts.map +1 -0
  305. package/dist/internal/c4/open-signal.js +37 -0
  306. package/dist/internal/c4/open-signal.js.map +1 -0
  307. package/dist/internal/c4/pda.d.ts +43 -0
  308. package/dist/internal/c4/pda.d.ts.map +1 -1
  309. package/dist/internal/c4/pda.js +83 -17
  310. package/dist/internal/c4/pda.js.map +1 -1
  311. package/dist/internal/c4/profile-faction.d.ts +2 -1
  312. package/dist/internal/c4/profile-faction.d.ts.map +1 -1
  313. package/dist/internal/c4/profile-faction.js +36 -72
  314. package/dist/internal/c4/profile-faction.js.map +1 -1
  315. package/dist/internal/c4/profile-permissions.d.ts +1 -1
  316. package/dist/internal/c4/profile-permissions.d.ts.map +1 -1
  317. package/dist/internal/c4/profile-permissions.js +4 -1
  318. package/dist/internal/c4/profile-permissions.js.map +1 -1
  319. package/dist/internal/c4/region-geometry.d.ts +8 -0
  320. package/dist/internal/c4/region-geometry.d.ts.map +1 -0
  321. package/dist/internal/c4/region-geometry.js +43 -0
  322. package/dist/internal/c4/region-geometry.js.map +1 -0
  323. package/dist/internal/c4/rewards.d.ts +1 -61
  324. package/dist/internal/c4/rewards.d.ts.map +1 -1
  325. package/dist/internal/c4/rewards.js +23 -203
  326. package/dist/internal/c4/rewards.js.map +1 -1
  327. package/dist/internal/c4/runtime-bindings.d.ts +4 -0
  328. package/dist/internal/c4/runtime-bindings.d.ts.map +1 -0
  329. package/dist/internal/c4/runtime-bindings.js +4 -0
  330. package/dist/internal/c4/runtime-bindings.js.map +1 -0
  331. package/dist/internal/c4/scan-detection-codecs.d.ts +3 -0
  332. package/dist/internal/c4/scan-detection-codecs.d.ts.map +1 -0
  333. package/dist/internal/c4/scan-detection-codecs.js +3 -0
  334. package/dist/internal/c4/scan-detection-codecs.js.map +1 -0
  335. package/dist/internal/c4/scan-lifecycle.d.ts +306 -0
  336. package/dist/internal/c4/scan-lifecycle.d.ts.map +1 -0
  337. package/dist/internal/c4/scan-lifecycle.js +235 -0
  338. package/dist/internal/c4/scan-lifecycle.js.map +1 -0
  339. package/dist/internal/c4/scanning.d.ts +4 -41
  340. package/dist/internal/c4/scanning.d.ts.map +1 -1
  341. package/dist/internal/c4/scanning.js +27 -108
  342. package/dist/internal/c4/scanning.js.map +1 -1
  343. package/dist/internal/c4/ship-import.d.ts +4 -0
  344. package/dist/internal/c4/ship-import.d.ts.map +1 -0
  345. package/dist/internal/c4/ship-import.js +13 -0
  346. package/dist/internal/c4/ship-import.js.map +1 -0
  347. package/dist/internal/c4/ship-stats.d.ts.map +1 -1
  348. package/dist/internal/c4/ship-stats.js +45 -43
  349. package/dist/internal/c4/ship-stats.js.map +1 -1
  350. package/dist/internal/c4/starbase.d.ts +0 -32
  351. package/dist/internal/c4/starbase.d.ts.map +1 -1
  352. package/dist/internal/c4/starbase.js +26 -136
  353. package/dist/internal/c4/starbase.js.map +1 -1
  354. package/dist/internal/c4/wallet-cargo-cache.js +2 -1
  355. package/dist/internal/c4/wallet-cargo-cache.js.map +1 -1
  356. package/dist/internal/c4/world.d.ts +37 -7
  357. package/dist/internal/c4/world.d.ts.map +1 -1
  358. package/dist/internal/c4/world.js +87 -129
  359. package/dist/internal/c4/world.js.map +1 -1
  360. package/dist/internal/cargo.d.ts +2 -0
  361. package/dist/internal/cargo.d.ts.map +1 -1
  362. package/dist/internal/cargo.js +8 -0
  363. package/dist/internal/cargo.js.map +1 -1
  364. package/dist/internal/fleet.d.ts +1 -0
  365. package/dist/internal/fleet.d.ts.map +1 -1
  366. package/dist/internal/fleet.js +3 -1
  367. package/dist/internal/fleet.js.map +1 -1
  368. package/dist/internal/loyalty-atlas-bank-state.d.ts +16 -0
  369. package/dist/internal/loyalty-atlas-bank-state.d.ts.map +1 -0
  370. package/dist/internal/loyalty-atlas-bank-state.js +10 -0
  371. package/dist/internal/loyalty-atlas-bank-state.js.map +1 -0
  372. package/dist/internal/planning/account-state.d.ts +6 -0
  373. package/dist/internal/planning/account-state.d.ts.map +1 -1
  374. package/dist/internal/planning/account-state.js +13 -0
  375. package/dist/internal/planning/account-state.js.map +1 -1
  376. package/dist/internal/planning/action-runtime.d.ts +38 -0
  377. package/dist/internal/planning/action-runtime.d.ts.map +1 -0
  378. package/dist/internal/planning/action-runtime.js +63 -0
  379. package/dist/internal/planning/action-runtime.js.map +1 -0
  380. package/dist/internal/planning/arrival-guards.d.ts +19 -0
  381. package/dist/internal/planning/arrival-guards.d.ts.map +1 -0
  382. package/dist/internal/planning/arrival-guards.js +172 -0
  383. package/dist/internal/planning/arrival-guards.js.map +1 -0
  384. package/dist/internal/planning/authorization-adapter.d.ts +55 -37
  385. package/dist/internal/planning/authorization-adapter.d.ts.map +1 -1
  386. package/dist/internal/planning/authorization-adapter.js +231 -81
  387. package/dist/internal/planning/authorization-adapter.js.map +1 -1
  388. package/dist/internal/planning/character-registration-guard.d.ts +4 -0
  389. package/dist/internal/planning/character-registration-guard.d.ts.map +1 -0
  390. package/dist/internal/planning/character-registration-guard.js +59 -0
  391. package/dist/internal/planning/character-registration-guard.js.map +1 -0
  392. package/dist/internal/planning/character-registration.d.ts +23 -0
  393. package/dist/internal/planning/character-registration.d.ts.map +1 -0
  394. package/dist/internal/planning/character-registration.js +87 -0
  395. package/dist/internal/planning/character-registration.js.map +1 -0
  396. package/dist/internal/planning/currency-cache-guard.d.ts +4 -0
  397. package/dist/internal/planning/currency-cache-guard.d.ts.map +1 -0
  398. package/dist/internal/planning/currency-cache-guard.js +34 -0
  399. package/dist/internal/planning/currency-cache-guard.js.map +1 -0
  400. package/dist/internal/planning/democracy-history.d.ts +50 -0
  401. package/dist/internal/planning/democracy-history.d.ts.map +1 -0
  402. package/dist/internal/planning/democracy-history.js +189 -0
  403. package/dist/internal/planning/democracy-history.js.map +1 -0
  404. package/dist/internal/planning/direct-options.d.ts +17 -0
  405. package/dist/internal/planning/direct-options.d.ts.map +1 -0
  406. package/dist/internal/planning/direct-options.js +43 -0
  407. package/dist/internal/planning/direct-options.js.map +1 -0
  408. package/dist/internal/planning/faction-enrollment.d.ts +0 -4
  409. package/dist/internal/planning/faction-enrollment.d.ts.map +1 -1
  410. package/dist/internal/planning/faction-enrollment.js +1 -31
  411. package/dist/internal/planning/faction-enrollment.js.map +1 -1
  412. package/dist/internal/planning/faction-trade-guards.d.ts +30 -0
  413. package/dist/internal/planning/faction-trade-guards.d.ts.map +1 -0
  414. package/dist/internal/planning/faction-trade-guards.js +15 -0
  415. package/dist/internal/planning/faction-trade-guards.js.map +1 -0
  416. package/dist/internal/planning/faction-trade-state.d.ts +16 -0
  417. package/dist/internal/planning/faction-trade-state.d.ts.map +1 -0
  418. package/dist/internal/planning/faction-trade-state.js +43 -0
  419. package/dist/internal/planning/faction-trade-state.js.map +1 -0
  420. package/dist/internal/planning/fleet-arrival.d.ts +40 -0
  421. package/dist/internal/planning/fleet-arrival.d.ts.map +1 -0
  422. package/dist/internal/planning/fleet-arrival.js +107 -0
  423. package/dist/internal/planning/fleet-arrival.js.map +1 -0
  424. package/dist/internal/planning/fleet-attack-xp.d.ts +20 -0
  425. package/dist/internal/planning/fleet-attack-xp.d.ts.map +1 -0
  426. package/dist/internal/planning/fleet-attack-xp.js +104 -0
  427. package/dist/internal/planning/fleet-attack-xp.js.map +1 -0
  428. package/dist/internal/planning/fleet-creation.d.ts +30 -0
  429. package/dist/internal/planning/fleet-creation.d.ts.map +1 -0
  430. package/dist/internal/planning/fleet-creation.js +89 -0
  431. package/dist/internal/planning/fleet-creation.js.map +1 -0
  432. package/dist/internal/planning/fleet-crew-guard.d.ts +28 -0
  433. package/dist/internal/planning/fleet-crew-guard.d.ts.map +1 -0
  434. package/dist/internal/planning/fleet-crew-guard.js +48 -0
  435. package/dist/internal/planning/fleet-crew-guard.js.map +1 -0
  436. package/dist/internal/planning/fleet-crew-transfer.d.ts +7 -0
  437. package/dist/internal/planning/fleet-crew-transfer.d.ts.map +1 -0
  438. package/dist/internal/planning/fleet-crew-transfer.js +123 -0
  439. package/dist/internal/planning/fleet-crew-transfer.js.map +1 -0
  440. package/dist/internal/planning/fleet-dock-funding-guard.d.ts +42 -0
  441. package/dist/internal/planning/fleet-dock-funding-guard.d.ts.map +1 -0
  442. package/dist/internal/planning/fleet-dock-funding-guard.js +209 -0
  443. package/dist/internal/planning/fleet-dock-funding-guard.js.map +1 -0
  444. package/dist/internal/planning/fleet-dock-funding.d.ts +9 -0
  445. package/dist/internal/planning/fleet-dock-funding.d.ts.map +1 -0
  446. package/dist/internal/planning/fleet-dock-funding.js +154 -0
  447. package/dist/internal/planning/fleet-dock-funding.js.map +1 -0
  448. package/dist/internal/planning/fleet-docking-guard.d.ts +4 -0
  449. package/dist/internal/planning/fleet-docking-guard.d.ts.map +1 -0
  450. package/dist/internal/planning/fleet-docking-guard.js +43 -0
  451. package/dist/internal/planning/fleet-docking-guard.js.map +1 -0
  452. package/dist/internal/planning/fleet-docking.d.ts +10 -0
  453. package/dist/internal/planning/fleet-docking.d.ts.map +1 -0
  454. package/dist/internal/planning/fleet-docking.js +71 -0
  455. package/dist/internal/planning/fleet-docking.js.map +1 -0
  456. package/dist/internal/planning/fleet-respawn.d.ts +28 -0
  457. package/dist/internal/planning/fleet-respawn.d.ts.map +1 -0
  458. package/dist/internal/planning/fleet-respawn.js +164 -0
  459. package/dist/internal/planning/fleet-respawn.js.map +1 -0
  460. package/dist/internal/planning/fleet-ship-assembly.d.ts +36 -0
  461. package/dist/internal/planning/fleet-ship-assembly.d.ts.map +1 -0
  462. package/dist/internal/planning/fleet-ship-assembly.js +118 -0
  463. package/dist/internal/planning/fleet-ship-assembly.js.map +1 -0
  464. package/dist/internal/planning/fleet-state.d.ts +25 -0
  465. package/dist/internal/planning/fleet-state.d.ts.map +1 -0
  466. package/dist/internal/planning/fleet-state.js +28 -0
  467. package/dist/internal/planning/fleet-state.js.map +1 -0
  468. package/dist/internal/planning/governance-fees.d.ts +64 -0
  469. package/dist/internal/planning/governance-fees.d.ts.map +1 -0
  470. package/dist/internal/planning/governance-fees.js +231 -0
  471. package/dist/internal/planning/governance-fees.js.map +1 -0
  472. package/dist/internal/planning/local-market-order-funding.d.ts +8 -0
  473. package/dist/internal/planning/local-market-order-funding.d.ts.map +1 -0
  474. package/dist/internal/planning/local-market-order-funding.js +128 -0
  475. package/dist/internal/planning/local-market-order-funding.js.map +1 -0
  476. package/dist/internal/planning/local-market-order.d.ts +40 -0
  477. package/dist/internal/planning/local-market-order.d.ts.map +1 -0
  478. package/dist/internal/planning/local-market-order.js +139 -0
  479. package/dist/internal/planning/local-market-order.js.map +1 -0
  480. package/dist/internal/planning/mining-stop.d.ts +14 -0
  481. package/dist/internal/planning/mining-stop.d.ts.map +1 -0
  482. package/dist/internal/planning/mining-stop.js +42 -0
  483. package/dist/internal/planning/mining-stop.js.map +1 -0
  484. package/dist/internal/planning/movement-character.d.ts +7 -0
  485. package/dist/internal/planning/movement-character.d.ts.map +1 -0
  486. package/dist/internal/planning/movement-character.js +41 -0
  487. package/dist/internal/planning/movement-character.js.map +1 -0
  488. package/dist/internal/planning/movement-xp-guard.d.ts +4 -0
  489. package/dist/internal/planning/movement-xp-guard.d.ts.map +1 -0
  490. package/dist/internal/planning/movement-xp-guard.js +104 -0
  491. package/dist/internal/planning/movement-xp-guard.js.map +1 -0
  492. package/dist/internal/planning/open-signal-guard.d.ts +3 -0
  493. package/dist/internal/planning/open-signal-guard.d.ts.map +1 -0
  494. package/dist/internal/planning/open-signal-guard.js +32 -0
  495. package/dist/internal/planning/open-signal-guard.js.map +1 -0
  496. package/dist/internal/planning/open-signal.d.ts +31 -0
  497. package/dist/internal/planning/open-signal.d.ts.map +1 -0
  498. package/dist/internal/planning/open-signal.js +85 -0
  499. package/dist/internal/planning/open-signal.js.map +1 -0
  500. package/dist/internal/planning/original-token.d.ts +40 -0
  501. package/dist/internal/planning/original-token.d.ts.map +1 -0
  502. package/dist/internal/planning/original-token.js +112 -0
  503. package/dist/internal/planning/original-token.js.map +1 -0
  504. package/dist/internal/planning/own-starbase-facts.d.ts +33 -0
  505. package/dist/internal/planning/own-starbase-facts.d.ts.map +1 -0
  506. package/dist/internal/planning/own-starbase-facts.js +49 -0
  507. package/dist/internal/planning/own-starbase-facts.js.map +1 -0
  508. package/dist/internal/planning/plan-fields.d.ts +60 -0
  509. package/dist/internal/planning/plan-fields.d.ts.map +1 -0
  510. package/dist/internal/planning/plan-fields.js +159 -0
  511. package/dist/internal/planning/plan-fields.js.map +1 -0
  512. package/dist/internal/planning/plan-guards.d.ts +4 -0
  513. package/dist/internal/planning/plan-guards.d.ts.map +1 -0
  514. package/dist/internal/planning/plan-guards.js +175 -0
  515. package/dist/internal/planning/plan-guards.js.map +1 -0
  516. package/dist/internal/planning/profile-key.d.ts +13 -0
  517. package/dist/internal/planning/profile-key.d.ts.map +1 -0
  518. package/dist/internal/planning/profile-key.js +20 -0
  519. package/dist/internal/planning/profile-key.js.map +1 -0
  520. package/dist/internal/planning/recipe-state.d.ts +9 -0
  521. package/dist/internal/planning/recipe-state.d.ts.map +1 -0
  522. package/dist/internal/planning/recipe-state.js +23 -0
  523. package/dist/internal/planning/recipe-state.js.map +1 -0
  524. package/dist/internal/planning/rent-catalog.d.ts +37 -0
  525. package/dist/internal/planning/rent-catalog.d.ts.map +1 -0
  526. package/dist/internal/planning/rent-catalog.js +165 -0
  527. package/dist/internal/planning/rent-catalog.js.map +1 -0
  528. package/dist/internal/planning/rent.d.ts +19 -0
  529. package/dist/internal/planning/rent.d.ts.map +1 -0
  530. package/dist/internal/planning/rent.js +35 -0
  531. package/dist/internal/planning/rent.js.map +1 -0
  532. package/dist/internal/planning/research-unlock.d.ts +60 -0
  533. package/dist/internal/planning/research-unlock.d.ts.map +1 -0
  534. package/dist/internal/planning/research-unlock.js +208 -0
  535. package/dist/internal/planning/research-unlock.js.map +1 -0
  536. package/dist/internal/planning/respawn-guards.d.ts +3 -0
  537. package/dist/internal/planning/respawn-guards.d.ts.map +1 -0
  538. package/dist/internal/planning/respawn-guards.js +42 -0
  539. package/dist/internal/planning/respawn-guards.js.map +1 -0
  540. package/dist/internal/planning/runtime-guards.d.ts +41 -0
  541. package/dist/internal/planning/runtime-guards.d.ts.map +1 -0
  542. package/dist/internal/planning/runtime-guards.js +658 -0
  543. package/dist/internal/planning/runtime-guards.js.map +1 -0
  544. package/dist/internal/planning/scan-completion-guard.d.ts +43 -0
  545. package/dist/internal/planning/scan-completion-guard.d.ts.map +1 -0
  546. package/dist/internal/planning/scan-completion-guard.js +95 -0
  547. package/dist/internal/planning/scan-completion-guard.js.map +1 -0
  548. package/dist/internal/planning/scan-completion.d.ts +20 -0
  549. package/dist/internal/planning/scan-completion.d.ts.map +1 -0
  550. package/dist/internal/planning/scan-completion.js +197 -0
  551. package/dist/internal/planning/scan-completion.js.map +1 -0
  552. package/dist/internal/planning/scan-detect-guard.d.ts +34 -0
  553. package/dist/internal/planning/scan-detect-guard.d.ts.map +1 -0
  554. package/dist/internal/planning/scan-detect-guard.js +77 -0
  555. package/dist/internal/planning/scan-detect-guard.js.map +1 -0
  556. package/dist/internal/planning/scan-detect.d.ts +24 -0
  557. package/dist/internal/planning/scan-detect.d.ts.map +1 -0
  558. package/dist/internal/planning/scan-detect.js +245 -0
  559. package/dist/internal/planning/scan-detect.js.map +1 -0
  560. package/dist/internal/planning/scan-input.d.ts +9 -0
  561. package/dist/internal/planning/scan-input.d.ts.map +1 -0
  562. package/dist/internal/planning/scan-input.js +58 -0
  563. package/dist/internal/planning/scan-input.js.map +1 -0
  564. package/dist/internal/planning/ship-import-funding.d.ts +22 -0
  565. package/dist/internal/planning/ship-import-funding.d.ts.map +1 -0
  566. package/dist/internal/planning/ship-import-funding.js +53 -0
  567. package/dist/internal/planning/ship-import-funding.js.map +1 -0
  568. package/dist/internal/planning/ship-token.d.ts +1 -6
  569. package/dist/internal/planning/ship-token.d.ts.map +1 -1
  570. package/dist/internal/planning/ship-token.js +2 -41
  571. package/dist/internal/planning/ship-token.js.map +1 -1
  572. package/dist/internal/planning/starbase-player-owner.d.ts +21 -0
  573. package/dist/internal/planning/starbase-player-owner.d.ts.map +1 -0
  574. package/dist/internal/planning/starbase-player-owner.js +17 -0
  575. package/dist/internal/planning/starbase-player-owner.js.map +1 -0
  576. package/dist/internal/planning/starbase-system-guard.d.ts +6 -0
  577. package/dist/internal/planning/starbase-system-guard.d.ts.map +1 -0
  578. package/dist/internal/planning/starbase-system-guard.js +94 -0
  579. package/dist/internal/planning/starbase-system-guard.js.map +1 -0
  580. package/dist/internal/planning/starbase-system.d.ts +15 -0
  581. package/dist/internal/planning/starbase-system.d.ts.map +1 -0
  582. package/dist/internal/planning/starbase-system.js +25 -0
  583. package/dist/internal/planning/starbase-system.js.map +1 -0
  584. package/dist/internal/planning/token-mint.d.ts +4 -0
  585. package/dist/internal/planning/token-mint.d.ts.map +1 -0
  586. package/dist/internal/planning/token-mint.js +16 -0
  587. package/dist/internal/planning/token-mint.js.map +1 -0
  588. package/dist/internal/planning/trade-faction-market.d.ts +20 -0
  589. package/dist/internal/planning/trade-faction-market.d.ts.map +1 -0
  590. package/dist/internal/planning/trade-faction-market.js +56 -0
  591. package/dist/internal/planning/trade-faction-market.js.map +1 -0
  592. package/dist/internal/planning/wallet-starbase.d.ts +34 -0
  593. package/dist/internal/planning/wallet-starbase.d.ts.map +1 -0
  594. package/dist/internal/planning/wallet-starbase.js +39 -0
  595. package/dist/internal/planning/wallet-starbase.js.map +1 -0
  596. package/dist/internal/planning/xp-runtime.d.ts +36 -0
  597. package/dist/internal/planning/xp-runtime.d.ts.map +1 -0
  598. package/dist/internal/planning/xp-runtime.js +117 -0
  599. package/dist/internal/planning/xp-runtime.js.map +1 -0
  600. package/dist/internal/read-meta.d.ts +12 -0
  601. package/dist/internal/read-meta.d.ts.map +1 -1
  602. package/dist/internal/read-meta.js +10 -0
  603. package/dist/internal/read-meta.js.map +1 -1
  604. package/dist/internal/system-program.d.ts +4 -0
  605. package/dist/internal/system-program.d.ts.map +1 -0
  606. package/dist/internal/system-program.js +3 -0
  607. package/dist/internal/system-program.js.map +1 -0
  608. package/dist/loyalty/actions/index.d.ts +1 -1
  609. package/dist/loyalty/actions/index.d.ts.map +1 -1
  610. package/dist/loyalty/actions/index.js +15 -45
  611. package/dist/loyalty/actions/index.js.map +1 -1
  612. package/dist/loyalty/index.d.ts.map +1 -1
  613. package/dist/loyalty/index.js +6 -18
  614. package/dist/loyalty/index.js.map +1 -1
  615. package/dist/markets/actions/index.d.ts +62 -4
  616. package/dist/markets/actions/index.d.ts.map +1 -1
  617. package/dist/markets/actions/index.js +230 -178
  618. package/dist/markets/actions/index.js.map +1 -1
  619. package/dist/markets/actions/trade-faction-market.d.ts +43 -0
  620. package/dist/markets/actions/trade-faction-market.d.ts.map +1 -0
  621. package/dist/markets/actions/trade-faction-market.js +277 -0
  622. package/dist/markets/actions/trade-faction-market.js.map +1 -0
  623. package/dist/markets/index.d.ts +38 -7
  624. package/dist/markets/index.d.ts.map +1 -1
  625. package/dist/markets/index.js +59 -20
  626. package/dist/markets/index.js.map +1 -1
  627. package/dist/mining/actions/index.d.ts +87 -0
  628. package/dist/mining/actions/index.d.ts.map +1 -0
  629. package/dist/mining/actions/index.js +319 -0
  630. package/dist/mining/actions/index.js.map +1 -0
  631. package/dist/mining/estimate.d.ts +114 -0
  632. package/dist/mining/estimate.d.ts.map +1 -0
  633. package/dist/mining/estimate.js +127 -0
  634. package/dist/mining/estimate.js.map +1 -0
  635. package/dist/mining/index.d.ts +9 -2
  636. package/dist/mining/index.d.ts.map +1 -1
  637. package/dist/mining/index.js +10 -13
  638. package/dist/mining/index.js.map +1 -1
  639. package/dist/mining/profile.d.ts +82 -0
  640. package/dist/mining/profile.d.ts.map +1 -0
  641. package/dist/mining/profile.js +109 -0
  642. package/dist/mining/profile.js.map +1 -0
  643. package/dist/planning/assembly.d.ts +6 -1
  644. package/dist/planning/assembly.d.ts.map +1 -1
  645. package/dist/planning/assembly.js +12 -8
  646. package/dist/planning/assembly.js.map +1 -1
  647. package/dist/planning/execution.d.ts +19 -3
  648. package/dist/planning/execution.d.ts.map +1 -1
  649. package/dist/planning/execution.js +540 -72
  650. package/dist/planning/execution.js.map +1 -1
  651. package/dist/planning/index.d.ts +217 -149
  652. package/dist/planning/index.d.ts.map +1 -1
  653. package/dist/planning/index.js +31 -355
  654. package/dist/planning/index.js.map +1 -1
  655. package/dist/planning/plan-construction.d.ts +25 -0
  656. package/dist/planning/plan-construction.d.ts.map +1 -0
  657. package/dist/planning/plan-construction.js +143 -0
  658. package/dist/planning/plan-construction.js.map +1 -0
  659. package/dist/planning/plan-sequence-checkpoint.d.ts +9 -0
  660. package/dist/planning/plan-sequence-checkpoint.d.ts.map +1 -1
  661. package/dist/planning/plan-sequence-checkpoint.js +16 -7
  662. package/dist/planning/plan-sequence-checkpoint.js.map +1 -1
  663. package/dist/planning/plan-sequence-execution.d.ts +5 -0
  664. package/dist/planning/plan-sequence-execution.d.ts.map +1 -1
  665. package/dist/planning/plan-sequence-execution.js +74 -40
  666. package/dist/planning/plan-sequence-execution.js.map +1 -1
  667. package/dist/planning/plan-sequence.d.ts +2 -1
  668. package/dist/planning/plan-sequence.d.ts.map +1 -1
  669. package/dist/planning/plan-sequence.js +8 -1
  670. package/dist/planning/plan-sequence.js.map +1 -1
  671. package/dist/planning/plan-validation.d.ts +17 -0
  672. package/dist/planning/plan-validation.d.ts.map +1 -0
  673. package/dist/planning/plan-validation.js +135 -0
  674. package/dist/planning/plan-validation.js.map +1 -0
  675. package/dist/planning/simulation.d.ts +25 -1
  676. package/dist/planning/simulation.d.ts.map +1 -1
  677. package/dist/planning/simulation.js +111 -11
  678. package/dist/planning/simulation.js.map +1 -1
  679. package/dist/registry/cargo.d.ts +7 -12
  680. package/dist/registry/cargo.d.ts.map +1 -1
  681. package/dist/registry/cargo.js +20 -20
  682. package/dist/registry/cargo.js.map +1 -1
  683. package/dist/registry/docking.d.ts +10 -0
  684. package/dist/registry/docking.d.ts.map +1 -0
  685. package/dist/registry/docking.js +12 -0
  686. package/dist/registry/docking.js.map +1 -0
  687. package/dist/registry/index.d.ts +4 -0
  688. package/dist/registry/index.d.ts.map +1 -1
  689. package/dist/registry/index.js +190 -224
  690. package/dist/registry/index.js.map +1 -1
  691. package/dist/registry/onboarding.d.ts +10 -2
  692. package/dist/registry/onboarding.d.ts.map +1 -1
  693. package/dist/registry/onboarding.js +20 -7
  694. package/dist/registry/onboarding.js.map +1 -1
  695. package/dist/registry/scanning.d.ts +7 -0
  696. package/dist/registry/scanning.d.ts.map +1 -0
  697. package/dist/registry/scanning.js +13 -0
  698. package/dist/registry/scanning.js.map +1 -0
  699. package/dist/registry/ship-stats-snapshot.js +19 -19
  700. package/dist/registry/ship-stats-snapshot.js.map +1 -1
  701. package/dist/registry/ships.d.ts +22 -2
  702. package/dist/registry/ships.d.ts.map +1 -1
  703. package/dist/registry/ships.js +31 -4
  704. package/dist/registry/ships.js.map +1 -1
  705. package/dist/registry/xp-runtime.d.ts +4 -0
  706. package/dist/registry/xp-runtime.d.ts.map +1 -0
  707. package/dist/registry/xp-runtime.js +14 -0
  708. package/dist/registry/xp-runtime.js.map +1 -0
  709. package/dist/rewards/index.d.ts +11 -5
  710. package/dist/rewards/index.d.ts.map +1 -1
  711. package/dist/rewards/index.js +10 -21
  712. package/dist/rewards/index.js.map +1 -1
  713. package/dist/scanning/actions/index.d.ts +116 -0
  714. package/dist/scanning/actions/index.d.ts.map +1 -0
  715. package/dist/scanning/actions/index.js +191 -0
  716. package/dist/scanning/actions/index.js.map +1 -0
  717. package/dist/scanning/index.d.ts +9 -12
  718. package/dist/scanning/index.d.ts.map +1 -1
  719. package/dist/scanning/index.js +18 -22
  720. package/dist/scanning/index.js.map +1 -1
  721. package/dist/scanning/lifecycle.d.ts +77 -0
  722. package/dist/scanning/lifecycle.d.ts.map +1 -0
  723. package/dist/scanning/lifecycle.js +93 -0
  724. package/dist/scanning/lifecycle.js.map +1 -0
  725. package/dist/scanning/odds.d.ts +111 -0
  726. package/dist/scanning/odds.d.ts.map +1 -0
  727. package/dist/scanning/odds.js +294 -0
  728. package/dist/scanning/odds.js.map +1 -0
  729. package/dist/scanning/signals.d.ts +121 -0
  730. package/dist/scanning/signals.d.ts.map +1 -0
  731. package/dist/scanning/signals.js +171 -0
  732. package/dist/scanning/signals.js.map +1 -0
  733. package/dist/starbases/actions/index.d.ts +6 -4
  734. package/dist/starbases/actions/index.d.ts.map +1 -1
  735. package/dist/starbases/actions/index.js +34 -67
  736. package/dist/starbases/actions/index.js.map +1 -1
  737. package/dist/starbases/index.d.ts.map +1 -1
  738. package/dist/starbases/index.js +3 -11
  739. package/dist/starbases/index.js.map +1 -1
  740. package/dist/world/index.d.ts +108 -5
  741. package/dist/world/index.d.ts.map +1 -1
  742. package/dist/world/index.js +110 -15
  743. package/dist/world/index.js.map +1 -1
  744. package/dist/world/planet-claim-stake-plots.d.ts +139 -0
  745. package/dist/world/planet-claim-stake-plots.d.ts.map +1 -0
  746. package/dist/world/planet-claim-stake-plots.js +117 -0
  747. package/dist/world/planet-claim-stake-plots.js.map +1 -0
  748. package/dist/world/starbase-status.d.ts +176 -0
  749. package/dist/world/starbase-status.d.ts.map +1 -0
  750. package/dist/world/starbase-status.js +153 -0
  751. package/dist/world/starbase-status.js.map +1 -0
  752. package/package.json +10 -2
@@ -1,20 +1,26 @@
1
- import { getAddressEncoder, isAddress } from '@solana/kit';
1
+ import { fleetAttackInstructionKey, validateFleetAttackActors, } from '../../internal/planning/fleet-attack-xp.js';
2
+ import { resolveXpRuntime } from '../../internal/planning/xp-runtime.js';
3
+ import { isAddress } from '@solana/kit';
4
+ import { requireDisabledLevelRent } from '../../internal/planning/rent-catalog.js';
5
+ import { resolveActionRuntime } from '../../internal/planning/action-runtime.js';
2
6
  import { InvalidActionInputError, SageSdkError } from '../../client/errors.js';
3
7
  import { readContextRawAccounts } from '../../client/reconciliation.js';
4
- import { sage } from '../../internal/c4/bindings.js';
5
- import { lootAccountDefinition, } from '../../internal/c4/combat.js';
8
+ import { getRetrieveLootInstructionDataEncoder } from '../../internal/c4/runtime-bindings.js';
9
+ import { lootAccountDefinition, } from '../../internal/c4/loot.js';
6
10
  import { deriveFleetAddress, fleetAccountDefinition, } from '../../internal/c4/fleet.js';
7
- import { deriveFleetCrewBindingAddress, fleetCrewBindingAccountDefinition, } from '../../internal/c4/fleet-crew-binding.js';
11
+ import { deriveFleetCrewBindingAddress, fleetCrewBindingAccountDefinition, matchesFleetCrewBindingIdentity, } from '../../internal/c4/fleet-crew-binding.js';
8
12
  import { deriveFactionAccountAddress, deriveFactionEconomicsConfigAddress, deriveFactionOwnershipAddress, deriveFactionRelationTrackerAddress, deriveFactionTreasuryAddress, deriveKingSystemTrackerAddress, deriveRegionTrackerAddress, factionAccountDefinition, factionEconomicsConfigAccountDefinition, factionOwnershipAccountDefinition, factionRelationTrackerAccountDefinition, factionTreasuryAccountDefinition, kingSystemTrackerAccountDefinition, regionTrackerAccountDefinition, } from '../../internal/c4/factions.js';
9
- import { characterAccountDefinition, findCharacterPda, } from '../../internal/c4/identity.js';
13
+ import { factionValue } from '../../internal/c4/faction.js';
14
+ import { characterAccountDefinition, findCharacterPda, } from '../../internal/c4/character.js';
10
15
  import { deriveLoyaltyContributionAddress, deriveLoyaltyEpochAddress, loyaltyContributionAccountDefinition, loyaltyEpochAccountDefinition, } from '../../internal/c4/loyalty.js';
11
16
  import { atlasRewardConfigAccountDefinition, atlasRewardRegistryAccountDefinition, deriveAtlasRewardConfigAddress, deriveAtlasRewardRegistryAddress, } from '../../internal/c4/rewards.js';
12
17
  import { deriveStarSystemAddress, starSystemAccountDefinition, } from '../../internal/c4/world.js';
13
18
  import { requireGameAddress } from '../../internal/game-context.js';
14
- import { adaptApplyCombatStimulantInstruction, adaptAttackFleetInstruction, adaptAttackStarbaseInstruction, adaptRetrieveLootInstruction, validatePlanAuthorization, } from '../../internal/planning/authorization-adapter.js';
15
- import { createPlan, } from '../../planning/index.js';
19
+ import { adaptApplyCombatStimulantInstruction, adaptAttackFleetInstruction, adaptAttackStarbaseInstruction, adaptRetrieveLootInstruction, readPlanAuthorization, } from '../../internal/planning/authorization-adapter.js';
20
+ import { buildPlannerPlan } from '../../planning/plan-construction.js';
16
21
  import { readGameCombatConfiguration } from '../../registry/combat.js';
17
22
  import { resolveCargo, } from '../../registry/index.js';
23
+ import { accountAbsentPrecondition, accountStatePrecondition, } from '../../internal/planning/account-state.js';
18
24
  function invalid(field, value, acceptedRange, remedy) {
19
25
  throw new InvalidActionInputError(field, value, acceptedRange, remedy);
20
26
  }
@@ -35,19 +41,13 @@ function assertKeys(value, field, required, optional = []) {
35
41
  function validateOptions(value) {
36
42
  const options = readRecord(value, 'options');
37
43
  assertKeys(options, 'options', ['authorization']);
38
- const authorizationRecord = readRecord(options.authorization, 'authorization');
39
- assertKeys(authorizationRecord, 'authorization', ['profile', 'authority', 'keyIndex'], ['certificate']);
40
- const authorization = authorizationRecord;
41
- validatePlanAuthorization(authorization);
44
+ const authorization = readPlanAuthorization(options.authorization);
42
45
  return { authorization };
43
46
  }
44
47
  function validateAttackOptions(value) {
45
48
  const options = readRecord(value, 'options');
46
49
  assertKeys(options, 'options', ['authorization', 'loot']);
47
- const authorizationRecord = readRecord(options.authorization, 'authorization');
48
- assertKeys(authorizationRecord, 'authorization', ['profile', 'authority', 'keyIndex'], ['certificate']);
49
- const authorization = authorizationRecord;
50
- validatePlanAuthorization(authorization);
50
+ const authorization = readPlanAuthorization(options.authorization);
51
51
  if (typeof options.loot !== 'string' || !isAddress(options.loot)) {
52
52
  invalid('options.loot', options.loot, 'one valid new Loot account address', 'Generate a new address-only Loot signer and provide its public address before retrying.');
53
53
  }
@@ -66,10 +66,7 @@ function validateAttackStance(value) {
66
66
  function validateRetrieveOptions(value) {
67
67
  const options = readRecord(value, 'options');
68
68
  assertKeys(options, 'options', ['authorization', 'atUnixSeconds']);
69
- const authorizationRecord = readRecord(options.authorization, 'authorization');
70
- assertKeys(authorizationRecord, 'authorization', ['profile', 'authority', 'keyIndex'], ['certificate']);
71
- const authorization = authorizationRecord;
72
- validatePlanAuthorization(authorization);
69
+ const authorization = readPlanAuthorization(options.authorization);
73
70
  if (typeof options.atUnixSeconds !== 'bigint' || options.atUnixSeconds < 0n) {
74
71
  invalid('options.atUnixSeconds', options.atUnixSeconds, 'a non-negative bigint Unix timestamp', 'Provide the explicit current Unix timestamp used to evaluate Loot exclusivity before retrying.');
75
72
  }
@@ -119,13 +116,21 @@ function validateLootSelection(value, loot, fleet, retrievingProfile, atUnixSeco
119
116
  if (item === undefined) {
120
117
  invalid(`${field}.itemIndex`, itemIndex, `an available Loot item index below ${String(loot.items.length)}`, 'Refresh the Loot snapshot and select an existing item before retrying.');
121
118
  }
122
- if (item.destroyer.address !== fleet.address &&
123
- atUnixSeconds < item.exclusivityUnlockAtUnixSeconds) {
124
- fail(`Loot item ${String(itemIndex)} is exclusive to Fleet ${item.destroyer.address}, not Fleet ${fleet.address}. Use the destroying Fleet or wait for chain-authoritative exclusivity resolution before retrying.`, loot.address);
119
+ // The retriever is the Fleet's controlling Profile. Reward cargo stays
120
+ // locked to the destroying Profile until it expires and is swept; ordinary
121
+ // cargo is exclusive to the destroying Profile only until the unlock time.
122
+ const destroyer = item.destroyer?.address;
123
+ if (item.rewardReclaimAtUnixSeconds > 0n) {
124
+ if (destroyer !== retrievingProfile) {
125
+ fail(`Loot item ${String(itemIndex)} is reward cargo locked to ${destroyer === undefined ? 'no destroying Profile' : `destroying Profile ${destroyer}`}, not Profile ${retrievingProfile}. Reward cargo never opens to other Profiles; it is swept after ${String(item.rewardReclaimAtUnixSeconds)} Unix seconds. Choose another item or use the destroying Profile's Fleet before retrying.`, loot.address);
126
+ }
127
+ if (atUnixSeconds > item.rewardReclaimAtUnixSeconds) {
128
+ fail(`Loot item ${String(itemIndex)} reward cargo expired at ${String(item.rewardReclaimAtUnixSeconds)} Unix seconds and is swept to the reward treasury, not retrievable at ${String(atUnixSeconds)}. Choose another item or refresh the Loot before retrying.`, loot.address);
129
+ }
125
130
  }
126
- if (loot.profile.address !== retrievingProfile &&
127
- atUnixSeconds < item.rewardReclaimAtUnixSeconds) {
128
- fail(`Loot item ${String(itemIndex)} reward cargo is exclusive to Profile ${loot.profile.address}, not Profile ${retrievingProfile}, until ${String(item.rewardReclaimAtUnixSeconds)} Unix seconds. Use the reward-owning Profile or wait for chain-authoritative reward reclaim resolution before retrying.`, loot.address);
131
+ else if (atUnixSeconds < item.exclusivityUnlockAtUnixSeconds &&
132
+ destroyer !== retrievingProfile) {
133
+ fail(`Loot item ${String(itemIndex)} is exclusive to ${destroyer === undefined ? 'no Profile (a Starbase kill)' : `destroying Profile ${destroyer}`} until ${String(item.exclusivityUnlockAtUnixSeconds)} Unix seconds, not Profile ${retrievingProfile}. Use the destroying Profile's Fleet or wait for the exclusivity window to pass before retrying.`, loot.address);
129
134
  }
130
135
  const cargoRequests = denseArray(target.cargo, `${field}.cargo`);
131
136
  if (cargoRequests.length === 0 || cargoRequests.length > 65_536) {
@@ -162,9 +167,7 @@ function validateLootSelection(value, loot, fleet, retrievingProfile, atUnixSeco
162
167
  }
163
168
  generated.push([itemIndex, encoded]);
164
169
  }
165
- const instructionDataLength = sage
166
- .getRetrieveLootInstructionDataEncoder()
167
- .encode({
170
+ const instructionDataLength = getRetrieveLootInstructionDataEncoder().encode({
168
171
  keyIndex: 0,
169
172
  want: generated.map(([itemIndex, cargo]) => [
170
173
  itemIndex,
@@ -209,29 +212,6 @@ function rawCargoFingerprint(fleet) {
209
212
  .join(',');
210
213
  return [fleet.cargoHold.seqId, fleet.cargoHold.storageCost, items].join('|');
211
214
  }
212
- async function hashAccountState(account) {
213
- const owner = getAddressEncoder().encode(account.owner);
214
- const canonical = new Uint8Array(owner.length + account.data.length);
215
- canonical.set(owner);
216
- canonical.set(account.data, owner.length);
217
- const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', canonical));
218
- return [...digest].map((byte) => byte.toString(16).padStart(2, '0')).join('');
219
- }
220
- async function precondition(account, describes) {
221
- return Object.freeze({
222
- address: account.address,
223
- dataHash: await hashAccountState(account),
224
- describes,
225
- kind: 'account-state',
226
- });
227
- }
228
- function absentPrecondition(address, describes) {
229
- return Object.freeze({
230
- address,
231
- describes,
232
- kind: 'account-absent',
233
- });
234
- }
235
215
  /** Plans application of one configured combat stimulant without predicting its effects.
236
216
  *
237
217
  * The planner validates Fleet ownership and Game membership, current catalog
@@ -311,10 +291,10 @@ export async function planFleetApplyCombatStimulant(ctx, fleet, stimulant, input
311
291
  fail(`Fleet ${fleet.name} (${fleet.address}) has no crew and cannot apply a combat stimulant. Crew the Fleet, refresh it through this context, and retry.`, fleet.address);
312
292
  }
313
293
  const description = `Apply one ${catalogued.cargo.name} combat stimulant from Fleet ${fleet.name} (${fleet.address}); permission, stacking, charge application, and combat outcomes remain chain-authoritative.`;
314
- return createPlan({
294
+ return buildPlannerPlan({
315
295
  kind: 'combat.apply-stimulant',
316
296
  preconditions: [
317
- await precondition(account, `Fleet ${fleet.name} retains its configured Game, owning Profile, supported crewed state, and known ${catalogued.cargo.name} cargo balance.`),
297
+ await accountStatePrecondition(account, `Fleet ${fleet.name} retains its configured Game, owning Profile, supported crewed state, and known ${catalogued.cargo.name} cargo balance.`),
318
298
  ],
319
299
  steps: [
320
300
  {
@@ -331,20 +311,6 @@ export async function planFleetApplyCombatStimulant(ctx, fleet, stimulant, input
331
311
  summary: description,
332
312
  });
333
313
  }
334
- function factionId(fleet) {
335
- if (fleet.npcFactionId > 0)
336
- return fleet.npcFactionId;
337
- switch (fleet.faction) {
338
- case 'mud':
339
- return 1;
340
- case 'oni':
341
- return 2;
342
- case 'ustur':
343
- return 3;
344
- case 'unaligned':
345
- return 0;
346
- }
347
- }
348
314
  function shipFingerprint(fleet) {
349
315
  return fleet.ships
350
316
  .map(({ id, quantity }) => `${String(id)}:${String(quantity)}`)
@@ -404,14 +370,13 @@ async function optionalCrewBinding(ctx, fleet) {
404
370
  const address = await deriveFleetCrewBindingAddress(fleet.address);
405
371
  const [envelope] = await ctx.data.readMany(fleetCrewBindingAccountDefinition, [address]);
406
372
  if (envelope !== undefined &&
407
- (envelope.data.fleet !== fleet.address ||
408
- envelope.data.ownerProfile !== fleet.ownerProfile.address)) {
373
+ !matchesFleetCrewBindingIdentity(envelope.data, fleet.address, fleet.ownerProfile.address)) {
409
374
  fail(`FleetCrewBinding ${address} does not belong to Fleet ${fleet.address} and Profile ${fleet.ownerProfile.address}. Refresh the Fleet crew relationship and retry.`, address);
410
375
  }
411
376
  return envelope?.address;
412
377
  }
413
378
  async function resolveRewardAccounts(ctx, fleet, registry, config, epochIndex) {
414
- const resolvedFaction = factionId(fleet);
379
+ const resolvedFaction = fleet.npcFactionId > 0 ? fleet.npcFactionId : factionValue(fleet.faction);
415
380
  if (resolvedFaction === 0)
416
381
  return { config, registry };
417
382
  const [epochAddress, contributionAddress] = await Promise.all([
@@ -446,33 +411,82 @@ async function resolveRewardAccounts(ctx, fleet, registry, config, epochIndex) {
446
411
  registry,
447
412
  };
448
413
  }
449
- async function resolveNpcAccounts(ctx, fleet, requireFactionAccount) {
414
+ /** Reads and requires an NPC Fleet's canonical FactionOwnership and, when
415
+ * `withFaction`, its Faction account; a player Fleet has neither. */
416
+ async function resolveNpcAccounts(ctx, fleet, withFaction) {
450
417
  if (fleet.npcFactionId === 0)
451
418
  return {};
452
- const ownershipAddress = await deriveFactionOwnershipAddress(fleet.game, 'fleet', fleet.address);
453
- const [ownership] = await ctx.data.readMany(factionOwnershipAccountDefinition, [ownershipAddress]);
419
+ const addresses = await Promise.all([
420
+ deriveFactionOwnershipAddress(fleet.game, 'fleet', fleet.address),
421
+ ...(withFaction
422
+ ? [deriveFactionAccountAddress(fleet.game, fleet.npcFactionId)]
423
+ : []),
424
+ ]);
425
+ const [ownership, faction] = await readContextRawAccounts(ctx, addresses);
426
+ const ownershipData = ownership && factionOwnershipAccountDefinition.decode(ownership);
454
427
  if (ownership === undefined ||
455
- ownership.data.game !== fleet.game ||
456
- ownership.data.asset.kind !== 'fleet' ||
457
- ownership.data.asset.fleet !== fleet.address ||
458
- ownership.data.controllingFactionId !== fleet.npcFactionId) {
459
- fail(`NPC Fleet ${fleet.address} has no matching canonical FactionOwnership for faction ${String(fleet.npcFactionId)}. Refresh the Fleet and faction ownership relationship before retrying.`, ownershipAddress);
460
- }
461
- if (!requireFactionAccount)
462
- return { ownership: ownership.address };
463
- const factionAddress = await deriveFactionAccountAddress(fleet.game, fleet.npcFactionId);
464
- const faction = await ctx.data.read(factionAccountDefinition, factionAddress);
465
- if (faction.data.game !== fleet.game ||
466
- faction.data.factionId !== fleet.npcFactionId) {
467
- fail(`Faction ${factionAddress} does not match NPC Fleet ${fleet.address}'s Game and faction id. Refresh the faction registry relationship before retrying.`, factionAddress);
468
- }
469
- return { factionAccount: faction.address, ownership: ownership.address };
428
+ ownershipData?.game !== fleet.game ||
429
+ ownershipData.asset.kind !== 'fleet' ||
430
+ ownershipData.asset.fleet !== fleet.address ||
431
+ ownershipData.controllingFactionId !== fleet.npcFactionId) {
432
+ fail(`NPC Fleet ${fleet.address} has no matching canonical FactionOwnership for faction ${String(fleet.npcFactionId)}. Refresh the Fleet and faction ownership relationship before retrying.`, addresses[0]);
433
+ }
434
+ if (!withFaction)
435
+ return { ownership };
436
+ const factionData = faction && factionAccountDefinition.decode(faction);
437
+ if (faction === undefined ||
438
+ factionData?.game !== fleet.game ||
439
+ factionData.factionId !== fleet.npcFactionId) {
440
+ fail(`Faction ${addresses[1]} is missing or does not match NPC Fleet ${fleet.address}'s Game and faction id. Refresh the faction registry relationship before retrying.`, addresses[1]);
441
+ }
442
+ return { faction, ownership };
470
443
  }
471
444
  function generatedStance(stance) {
472
445
  return {
473
446
  ammoUsage: stance.ammoUsage === 'none' ? 0 : stance.ammoUsage === 'light' ? 1 : 2,
474
447
  };
475
448
  }
449
+ /** Requires a live Fleet snapshot of the configured Game with known AP, crew
450
+ * and ship composition; an attacking Fleet also needs AP available. */
451
+ function validateAttackFleet(fleet, role, game) {
452
+ const label = `The ${role} Fleet ${fleet.name} (${fleet.address})`;
453
+ if (fleet.game !== game) {
454
+ fail(`${label} belongs to Game ${fleet.game}, not configured Game ${game}. Refresh the Fleet through this context and retry.`, fleet.address);
455
+ }
456
+ if (fleet.state.kind === 'destroyed') {
457
+ fail(`${label} is destroyed and cannot participate in this attack. Refresh the Fleet after respawn and retry.`, fleet.address);
458
+ }
459
+ if (!Number.isSafeInteger(fleet.ap) ||
460
+ fleet.ap < 0 ||
461
+ !Number.isSafeInteger(fleet.crewCount) ||
462
+ fleet.crewCount <= 0) {
463
+ fail(`${label} has unknown or invalid AP or crew state. Refresh the Fleet through this context and retry.`, fleet.address);
464
+ }
465
+ if (fleet.ships.length === 0 ||
466
+ fleet.ships.some(({ quantity }) => quantity <= 0n)) {
467
+ fail(`${label} has no valid known ship composition. Refresh Fleet composition and retry.`, fleet.address);
468
+ }
469
+ if (role === 'attacking' && fleet.ap === 0) {
470
+ fail(`${label} has no known AP available. Wait for AP reload, refresh the Fleet, and retry.`, fleet.address);
471
+ }
472
+ }
473
+ /** Validates the inputs every attack shares: the stance, an attacking Fleet
474
+ * owned by the authorization Profile that can attack, and a new Loot address
475
+ * distinct from the authorization signers. */
476
+ function validateAttack(ctx, attacker, inputStance, inputOptions) {
477
+ const options = validateAttackOptions(inputOptions);
478
+ const stance = validateAttackStance(inputStance);
479
+ const game = requireGameAddress(ctx);
480
+ if (attacker.ownerProfile.address !== options.authorization.profile) {
481
+ fail(`Attacking Fleet ${attacker.address} does not belong to authorization Profile ${options.authorization.profile}. Choose an owned Fleet and retry.`, attacker.address);
482
+ }
483
+ if (options.loot === options.authorization.authority ||
484
+ options.loot === options.authorization.profile) {
485
+ fail(`The new Loot address ${options.loot} must be distinct from the authorization authority and Profile. Generate a separate Loot signer address and retry.`, options.loot);
486
+ }
487
+ validateAttackFleet(attacker, 'attacking', game);
488
+ return { game, options, stance };
489
+ }
476
490
  /** Plans one singleton Fleet-on-Fleet attack without predicting its outcome.
477
491
  *
478
492
  * Range, randomness, recent slot hashes, final combat arithmetic, and chain
@@ -497,43 +511,11 @@ function generatedStance(stance) {
497
511
  * ```
498
512
  */
499
513
  export async function planFleetAttackFleet(ctx, attacker, defender, inputStance, inputOptions) {
500
- const options = validateAttackOptions(inputOptions);
501
- const stance = validateAttackStance(inputStance);
502
- const game = requireGameAddress(ctx);
514
+ const { game, options, stance } = validateAttack(ctx, attacker, inputStance, inputOptions);
503
515
  if (attacker.address === defender.address) {
504
516
  fail(`Fleet ${attacker.address} cannot attack itself. Choose a distinct defending Fleet and retry.`, attacker.address);
505
517
  }
506
- if (attacker.ownerProfile.address !== options.authorization.profile) {
507
- fail(`Attacking Fleet ${attacker.address} does not belong to authorization Profile ${options.authorization.profile}. Choose an owned Fleet and retry.`, attacker.address);
508
- }
509
- if (options.loot === options.authorization.authority ||
510
- options.loot === options.authorization.profile) {
511
- fail(`The new Loot address ${options.loot} must be distinct from the authorization authority and Profile. Generate a separate Loot signer address and retry.`, options.loot);
512
- }
513
- for (const [role, fleet] of [
514
- ['attacking', attacker],
515
- ['defending', defender],
516
- ]) {
517
- if (fleet.game !== game) {
518
- fail(`The ${role} Fleet ${fleet.address} belongs to Game ${fleet.game}, not configured Game ${game}. Refresh both Fleets through this context and retry.`, fleet.address);
519
- }
520
- if (fleet.state.kind === 'destroyed') {
521
- fail(`The ${role} Fleet ${fleet.name} (${fleet.address}) is destroyed and cannot participate in this attack. Refresh the Fleet after respawn and retry.`, fleet.address);
522
- }
523
- if (!Number.isSafeInteger(fleet.ap) ||
524
- fleet.ap < 0 ||
525
- !Number.isSafeInteger(fleet.crewCount) ||
526
- fleet.crewCount <= 0) {
527
- fail(`The ${role} Fleet ${fleet.name} (${fleet.address}) has unknown or invalid AP or crew state. Refresh the Fleet through this context and retry.`, fleet.address);
528
- }
529
- if (fleet.ships.length === 0 ||
530
- fleet.ships.some(({ quantity }) => quantity <= 0n)) {
531
- fail(`The ${role} Fleet ${fleet.name} (${fleet.address}) has no valid known ship composition. Refresh Fleet composition and retry.`, fleet.address);
532
- }
533
- }
534
- if (attacker.ap === 0) {
535
- fail(`Attacking Fleet ${attacker.name} (${attacker.address}) has no known AP available. Wait for AP reload, refresh the Fleet, and retry.`, attacker.address);
536
- }
518
+ validateAttackFleet(defender, 'defending', game);
537
519
  const currentAccounts = await readContextRawAccounts(ctx, [
538
520
  attacker.address,
539
521
  defender.address,
@@ -565,58 +547,93 @@ export async function planFleetAttackFleet(ctx, attacker, defender, inputStance,
565
547
  deriveRegionTrackerAddress(game),
566
548
  deriveFactionRelationTrackerAddress(game),
567
549
  ]);
550
+ const actorIntent = {
551
+ address: attacker.address,
552
+ defender: defender.address,
553
+ game,
554
+ profile: attacker.ownerProfile.address,
555
+ defenderProfile: defender.ownerProfile.address,
556
+ };
557
+ await validateFleetAttackActors(ctx, actorIntent);
558
+ const versions = new Map();
559
+ const attackerXp = await resolveXpRuntime(ctx, { game, character, profile: attacker.ownerProfile.address }, versions);
560
+ const defenderXp = character === defenderCharacter
561
+ ? attackerXp
562
+ : await resolveXpRuntime(ctx, {
563
+ game,
564
+ character: defenderCharacter,
565
+ profile: defender.ownerProfile.address,
566
+ }, versions);
567
+ const xpGuards = [...new Set([attackerXp, defenderXp])].map((xp) => ({
568
+ kind: 'xp-runtime',
569
+ address: game,
570
+ intent: xp.intent,
571
+ accounts: xp.accounts,
572
+ describes: 'Both operator XP budgets remain canonical and reconciled; earned XP and bank balances may change.',
573
+ }));
574
+ const instruction = adaptAttackFleetInstruction({
575
+ ...(attackerNpc.faction === undefined
576
+ ? {}
577
+ : { attackerFactionAccount: attackerNpc.faction.address }),
578
+ ...(attackerNpc.ownership === undefined
579
+ ? {}
580
+ : { attackerFleetOwnership: attackerNpc.ownership.address }),
581
+ attackerRewardsConfig: attackerRewards.config,
582
+ ...(attackerRewards.contribution === undefined
583
+ ? {}
584
+ : { attackerRewardsContribution: attackerRewards.contribution }),
585
+ ...(attackerRewards.epoch === undefined
586
+ ? {}
587
+ : { attackerRewardsEpoch: attackerRewards.epoch }),
588
+ attackerRewardsRegistry: attackerRewards.registry,
589
+ ...(defender.state.kind === 'mining'
590
+ ? { asteroid: defender.state.asteroid.address }
591
+ : {}),
592
+ authorization: options.authorization,
593
+ attackerXpBudget: attackerXp.accounts.xpBudget,
594
+ defenderXpBudget: defenderXp.accounts.xpBudget,
595
+ xpBudgetConfig: attackerXp.accounts.xpBudgetConfig,
596
+ character,
597
+ ...(crewBinding === undefined ? {} : { crewBinding }),
598
+ defenderCharacter,
599
+ ...(defenderNpc.ownership === undefined
600
+ ? {}
601
+ : { defenderFleetOwnership: defenderNpc.ownership.address }),
602
+ defenderRewardsConfig: defenderRewards.config,
603
+ ...(defenderRewards.contribution === undefined
604
+ ? {}
605
+ : { defenderRewardsContribution: defenderRewards.contribution }),
606
+ ...(defenderRewards.epoch === undefined
607
+ ? {}
608
+ : { defenderRewardsEpoch: defenderRewards.epoch }),
609
+ defenderRewardsRegistry: defenderRewards.registry,
610
+ defendingFleet: defender.address,
611
+ factionRelationTracker,
612
+ fleet: attacker.address,
613
+ game,
614
+ loot: options.loot,
615
+ recentSlothashes: 'SysvarS1otHashes111111111111111111111111111',
616
+ regionTracker,
617
+ stance: generatedStance(stance),
618
+ });
568
619
  const description = `Attack Fleet ${defender.name} (${defender.address}) with Fleet ${attacker.name} (${attacker.address}) using ${stance.ammoUsage} ammunition; range, randomness, rewards, Loot, damage, and final combat arithmetic remain chain-authoritative.`;
569
- return createPlan({
620
+ return buildPlannerPlan({
570
621
  kind: 'combat.attack-fleet',
571
622
  preconditions: [
572
- await precondition(attackerAccount, `Attacking Fleet ${attacker.name} retains its owner, Game, live state, crew, AP, faction, and ship composition.`),
573
- await precondition(defenderAccount, `Defending Fleet ${defender.name} retains its owner, Game, live state, crew, faction, and ship composition.`),
623
+ {
624
+ kind: 'fleet-attack',
625
+ ...actorIntent,
626
+ instructionKey: fleetAttackInstructionKey(instruction),
627
+ describes: 'The exact attack instruction and both canonical operators remain bound.',
628
+ },
629
+ ...xpGuards,
630
+ await accountStatePrecondition(attackerAccount, `Attacking Fleet ${attacker.name} retains its owner, Game, live state, crew, AP, faction, and ship composition.`),
631
+ await accountStatePrecondition(defenderAccount, `Defending Fleet ${defender.name} retains its owner, Game, live state, crew, faction, and ship composition.`),
574
632
  ],
575
633
  steps: [
576
634
  {
577
635
  describes: description,
578
- instruction: adaptAttackFleetInstruction({
579
- ...(attackerNpc.factionAccount === undefined
580
- ? {}
581
- : { attackerFactionAccount: attackerNpc.factionAccount }),
582
- ...(attackerNpc.ownership === undefined
583
- ? {}
584
- : { attackerFleetOwnership: attackerNpc.ownership }),
585
- attackerRewardsConfig: attackerRewards.config,
586
- ...(attackerRewards.contribution === undefined
587
- ? {}
588
- : { attackerRewardsContribution: attackerRewards.contribution }),
589
- ...(attackerRewards.epoch === undefined
590
- ? {}
591
- : { attackerRewardsEpoch: attackerRewards.epoch }),
592
- attackerRewardsRegistry: attackerRewards.registry,
593
- ...(defender.state.kind === 'mining'
594
- ? { asteroid: defender.state.asteroid.address }
595
- : {}),
596
- authorization: options.authorization,
597
- character,
598
- ...(crewBinding === undefined ? {} : { crewBinding }),
599
- defenderCharacter,
600
- ...(defenderNpc.ownership === undefined
601
- ? {}
602
- : { defenderFleetOwnership: defenderNpc.ownership }),
603
- defenderRewardsConfig: defenderRewards.config,
604
- ...(defenderRewards.contribution === undefined
605
- ? {}
606
- : { defenderRewardsContribution: defenderRewards.contribution }),
607
- ...(defenderRewards.epoch === undefined
608
- ? {}
609
- : { defenderRewardsEpoch: defenderRewards.epoch }),
610
- defenderRewardsRegistry: defenderRewards.registry,
611
- defendingFleet: defender.address,
612
- factionRelationTracker,
613
- fleet: attacker.address,
614
- game,
615
- loot: options.loot,
616
- recentSlothashes: 'SysvarS1otHashes111111111111111111111111111',
617
- regionTracker,
618
- stance: generatedStance(stance),
619
- }),
636
+ instruction,
620
637
  semantics: [{ kind: 'exclusive', scope: 'transaction' }],
621
638
  signers: [options.authorization.authority, options.loot],
622
639
  },
@@ -639,18 +656,6 @@ function systemFingerprint(system) {
639
656
  version: system.version,
640
657
  }, (_key, value) => typeof value === 'bigint' ? value.toString() : value);
641
658
  }
642
- function starbaseFactionId(owner) {
643
- switch (owner) {
644
- case 'mud':
645
- return 1;
646
- case 'oni':
647
- return 2;
648
- case 'ustur':
649
- return 3;
650
- case 'unaligned':
651
- return null;
652
- }
653
- }
654
659
  /** Plans one singleton Fleet-on-Starbase attack without predicting its outcome.
655
660
  *
656
661
  * The planner validates the owned attacking Fleet, canonical target System and
@@ -659,6 +664,10 @@ function starbaseFactionId(owner) {
659
664
  * capture-cost debit outcome, randomness, damage, rewards, and final
660
665
  * admissibility remain chain-authoritative.
661
666
  *
667
+ * Requires Disabled rent: the Game's rent catalog and the target System's
668
+ * Starbase-level rent history must not exist, and both stay guarded absent until
669
+ * signing.
670
+ *
662
671
  * @example
663
672
  * ```ts
664
673
  * declare const ctx: SageContext;
@@ -676,32 +685,7 @@ function starbaseFactionId(owner) {
676
685
  * ```
677
686
  */
678
687
  export async function planFleetAttackStarbase(ctx, attacker, target, inputStance, inputOptions) {
679
- const options = validateAttackOptions(inputOptions);
680
- const stance = validateAttackStance(inputStance);
681
- const game = requireGameAddress(ctx);
682
- if (attacker.ownerProfile.address !== options.authorization.profile) {
683
- fail(`Attacking Fleet ${attacker.address} does not belong to authorization Profile ${options.authorization.profile}. Choose an owned Fleet and retry.`, attacker.address);
684
- }
685
- if (options.loot === options.authorization.authority ||
686
- options.loot === options.authorization.profile) {
687
- fail(`The new Loot address ${options.loot} must be distinct from the authorization authority and Profile. Generate a separate Loot signer address and retry.`, options.loot);
688
- }
689
- if (attacker.game !== game) {
690
- fail(`Attacking Fleet ${attacker.address} belongs to Game ${attacker.game}, not configured Game ${game}. Refresh the Fleet through this context and retry.`, attacker.address);
691
- }
692
- if (attacker.state.kind === 'destroyed') {
693
- fail(`Attacking Fleet ${attacker.name} (${attacker.address}) is destroyed and cannot attack a Starbase. Refresh the Fleet after respawn and retry.`, attacker.address);
694
- }
695
- if (!Number.isSafeInteger(attacker.ap) ||
696
- attacker.ap <= 0 ||
697
- !Number.isSafeInteger(attacker.crewCount) ||
698
- attacker.crewCount <= 0) {
699
- fail(`Attacking Fleet ${attacker.name} (${attacker.address}) has no known positive AP or valid crew state. Wait for AP reload, refresh the Fleet, and retry.`, attacker.address);
700
- }
701
- if (attacker.ships.length === 0 ||
702
- attacker.ships.some(({ quantity }) => quantity <= 0n)) {
703
- fail(`Attacking Fleet ${attacker.name} (${attacker.address}) has no valid known ship composition. Refresh Fleet composition and retry.`, attacker.address);
704
- }
688
+ const { game, options, stance } = validateAttack(ctx, attacker, inputStance, inputOptions);
705
689
  if (target.game !== game) {
706
690
  fail(`Target Star System ${target.address} belongs to Game ${target.game}, not configured Game ${game}. Refresh the target through this context and retry.`, target.address);
707
691
  }
@@ -720,9 +704,10 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
720
704
  deriveRegionTrackerAddress(game),
721
705
  deriveFleetCrewBindingAddress(attacker.address),
722
706
  ]);
723
- const [probeRelationsAccount, probeRegistryAccount] = await readContextRawAccounts(ctx, [
724
- relationTrackerAddress,
725
- registryAddress,
707
+ const [[probeRelationsAccount, probeRegistryAccount], attackerNpc, rent] = await Promise.all([
708
+ readContextRawAccounts(ctx, [relationTrackerAddress, registryAddress]),
709
+ resolveNpcAccounts(ctx, attacker, true),
710
+ requireDisabledLevelRent(ctx, game, target, 'the Starbase attack'),
726
711
  ]);
727
712
  const probeRelations = factionRelationTrackerAccountDefinition.decode(requireAccount(probeRelationsAccount, relationTrackerAddress, `FactionRelationTracker ${relationTrackerAddress} is missing. Refresh faction relationships and retry.`));
728
713
  const probeRegistry = atlasRewardRegistryAccountDefinition.decode(requireAccount(probeRegistryAccount, registryAddress, `AtlasRewardRegistry ${registryAddress} is missing. Refresh reward configuration and retry.`));
@@ -733,12 +718,6 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
733
718
  fail(`AtlasRewardRegistry ${registryAddress} belongs to another Game. Refresh the configured reward registry and retry.`, registryAddress);
734
719
  }
735
720
  const rewardConfigAddress = await deriveAtlasRewardConfigAddress(game, probeRegistry.activeConfigVersion);
736
- const attackerOwnership = attacker.npcFactionId === 0
737
- ? undefined
738
- : await deriveFactionOwnershipAddress(game, 'fleet', attacker.address);
739
- const attackerFaction = attacker.npcFactionId === 0
740
- ? undefined
741
- : await deriveFactionAccountAddress(game, attacker.npcFactionId);
742
721
  const requiresNpcEconomy = attacker.npcFactionId > 0 &&
743
722
  probeRelations.dynamicCaptureEnabled &&
744
723
  probeRelations.nemesisActive;
@@ -762,8 +741,6 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
762
741
  character,
763
742
  regionTracker,
764
743
  crewBindingAddress,
765
- ...(attackerOwnership === undefined ? [] : [attackerOwnership]),
766
- ...(attackerFaction === undefined ? [] : [attackerFaction]),
767
744
  ...(factionEconomicsConfig === undefined ? [] : [factionEconomicsConfig]),
768
745
  ...(captorTreasury === undefined ? [] : [captorTreasury]),
769
746
  ];
@@ -799,7 +776,8 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
799
776
  if (ownership === undefined && relations.dynamicCaptureEnabled) {
800
777
  fail(`Target Starbase ${target.address} requires canonical FactionOwnership while dynamic capture is enabled. Refresh Starbase ownership and retry.`, ownershipAddress);
801
778
  }
802
- const legacyOwner = starbaseFactionId(target.starbase.owner);
779
+ // KingSystemTracker records an unaligned owner as null.
780
+ const legacyOwner = factionValue(target.starbase.owner) || null;
803
781
  if (ownership !== undefined &&
804
782
  (ownership.game !== game ||
805
783
  ownership.asset.kind !== 'starbase' ||
@@ -844,32 +822,10 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
844
822
  const crewBinding = crewBindingAccount === undefined ? undefined : crewBindingAddress;
845
823
  if (crewBindingAccount !== undefined) {
846
824
  const data = fleetCrewBindingAccountDefinition.decode(crewBindingAccount);
847
- if (data.fleet !== attacker.address ||
848
- data.ownerProfile !== attacker.ownerProfile.address) {
825
+ if (!matchesFleetCrewBindingIdentity(data, attacker.address, attacker.ownerProfile.address)) {
849
826
  fail(`FleetCrewBinding ${crewBindingAddress} does not belong to Fleet ${attacker.address} and Profile ${attacker.ownerProfile.address}. Refresh the Fleet crew relationship and retry.`, crewBindingAddress);
850
827
  }
851
828
  }
852
- const attackerNpc = {};
853
- let attackerOwnershipAccount;
854
- let attackerFactionAccount;
855
- if (attackerOwnership !== undefined && attackerFaction !== undefined) {
856
- attackerOwnershipAccount = requireAccount(current.get(attackerOwnership), attackerOwnership, `NPC Fleet ${attacker.address} has no canonical FactionOwnership. Refresh the Fleet faction relationship and retry.`);
857
- const npcOwnership = factionOwnershipAccountDefinition.decode(attackerOwnershipAccount);
858
- if (npcOwnership.game !== game ||
859
- npcOwnership.asset.kind !== 'fleet' ||
860
- npcOwnership.asset.fleet !== attacker.address ||
861
- npcOwnership.controllingFactionId !== attacker.npcFactionId) {
862
- fail(`NPC Fleet ${attacker.address} has no matching canonical FactionOwnership for faction ${String(attacker.npcFactionId)}. Refresh the Fleet and faction ownership relationship before retrying.`, attackerOwnership);
863
- }
864
- attackerFactionAccount = requireAccount(current.get(attackerFaction), attackerFaction, `Faction ${attackerFaction} is missing for NPC Fleet ${attacker.address}. Refresh the faction registry relationship and retry.`);
865
- const npcFaction = factionAccountDefinition.decode(attackerFactionAccount);
866
- if (npcFaction.game !== game ||
867
- npcFaction.factionId !== attacker.npcFactionId) {
868
- fail(`Faction ${attackerFaction} does not match NPC Fleet ${attacker.address}'s Game and faction id. Refresh the faction registry relationship before retrying.`, attackerFaction);
869
- }
870
- attackerNpc.ownership = attackerOwnership;
871
- attackerNpc.factionAccount = attackerFaction;
872
- }
873
829
  let economicsAccount;
874
830
  let treasuryAccount;
875
831
  if (factionEconomicsConfig !== undefined && captorTreasury !== undefined) {
@@ -928,21 +884,13 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
928
884
  'The optional Fleet crew binding remains unchanged.',
929
885
  ],
930
886
  ]),
931
- ...(attackerOwnershipAccount === undefined
887
+ ...(attackerNpc.ownership === undefined
932
888
  ? []
933
- : [
934
- [
935
- attackerOwnershipAccount,
936
- 'NPC Fleet ownership remains unchanged.',
937
- ],
938
- ]),
939
- ...(attackerFactionAccount === undefined
889
+ : [[attackerNpc.ownership, 'NPC Fleet ownership remains unchanged.']]),
890
+ ...(attackerNpc.faction === undefined
940
891
  ? []
941
892
  : [
942
- [
943
- attackerFactionAccount,
944
- 'The NPC faction account remains unchanged.',
945
- ],
893
+ [attackerNpc.faction, 'The NPC faction account remains unchanged.'],
946
894
  ]),
947
895
  ...(economicsAccount === undefined
948
896
  ? []
@@ -960,29 +908,42 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
960
908
  'The dynamic-capture treasury remains unchanged.',
961
909
  ],
962
910
  ]),
963
- ].map(([account, describes]) => precondition(account, describes)));
911
+ ].map(([account, describes]) => accountStatePrecondition(account, describes)));
964
912
  const absencePreconditions = [
965
- absentPrecondition(options.loot, `Loot account ${options.loot} remains absent until execution.`),
913
+ accountAbsentPrecondition(options.loot, `Loot account ${options.loot} remains absent until execution.`),
966
914
  ...(crewBindingAccount === undefined
967
915
  ? [
968
- absentPrecondition(crewBindingAddress, 'Optional Fleet crew binding remains absent.'),
916
+ accountAbsentPrecondition(crewBindingAddress, 'Optional Fleet crew binding remains absent.'),
969
917
  ]
970
918
  : []),
971
919
  ];
920
+ const runtime = await resolveActionRuntime(ctx, {
921
+ mode: 'starbase-attack',
922
+ game,
923
+ system: target.address,
924
+ starbaseSeqId: starSystemAccountDefinition.decode(systemAccount).sequenceId,
925
+ character,
926
+ });
972
927
  const description = `Attack with Fleet ${attacker.name} (${attacker.address}) against the shared Starbase at ${target.name} (${target.address}) using ${stance.ammoUsage} ammunition; range, capture-cost debit outcome, randomness, rewards, Loot, damage, and final admissibility remain chain-authoritative.`;
973
- return createPlan({
928
+ return buildPlannerPlan({
974
929
  kind: 'combat.attack-starbase',
975
- preconditions: [...statePreconditions, ...absencePreconditions],
930
+ preconditions: [
931
+ ...statePreconditions,
932
+ ...absencePreconditions,
933
+ ...rent.guards,
934
+ ...runtime.guards,
935
+ ],
976
936
  steps: [
977
937
  {
978
- describes: description,
938
+ describes: `${description} ${runtime.description}`,
979
939
  instruction: adaptAttackStarbaseInstruction({
980
- ...(attackerNpc.factionAccount === undefined
940
+ ...runtime.accounts,
941
+ ...(attackerNpc.faction === undefined
981
942
  ? {}
982
- : { attackerFactionAccount: attackerNpc.factionAccount }),
943
+ : { attackerFactionAccount: attackerNpc.faction.address }),
983
944
  ...(attackerNpc.ownership === undefined
984
945
  ? {}
985
- : { attackerFleetOwnership: attackerNpc.ownership }),
946
+ : { attackerFleetOwnership: attackerNpc.ownership.address }),
986
947
  authorization: options.authorization,
987
948
  ...(captorTreasury === undefined ? {} : { captorTreasury }),
988
949
  character,
@@ -1000,6 +961,7 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
1000
961
  loot: options.loot,
1001
962
  recentSlothashes: 'SysvarS1otHashes111111111111111111111111111',
1002
963
  regionTracker,
964
+ ...rent.accounts,
1003
965
  rewardConfig: rewardConfigAddress,
1004
966
  rewardRegistry: registryAddress,
1005
967
  stance: generatedStance(stance),
@@ -1009,7 +971,7 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
1009
971
  signers: [options.authorization.authority, options.loot],
1010
972
  },
1011
973
  ],
1012
- summary: description,
974
+ summary: `${description} ${runtime.description}`,
1013
975
  });
1014
976
  }
1015
977
  function lootSnapshotFingerprint(loot) {
@@ -1021,11 +983,11 @@ function lootSnapshotFingerprint(loot) {
1021
983
  loot.coordinates.x,
1022
984
  loot.coordinates.y,
1023
985
  ...loot.items.map((item) => [
1024
- item.destroyer.address,
986
+ item.destroyer?.address ?? '',
1025
987
  item.exclusivityUnlockAtUnixSeconds,
1026
988
  item.rewardReclaimAtUnixSeconds,
1027
989
  item.inventory.sequenceId,
1028
- item.inventory.storageCostRaw,
990
+ item.inventory.usedStorageUnitsRaw,
1029
991
  ...item.inventory.items
1030
992
  .map(({ cargo, quantityRaw }) => `${String(cargo.id)}:${String(quantityRaw)}`)
1031
993
  .sort(),
@@ -1041,11 +1003,11 @@ function rawLootFingerprint(address, loot) {
1041
1003
  loot.coordinates.x,
1042
1004
  loot.coordinates.y,
1043
1005
  ...loot.items.map((item) => [
1044
- item.destroyer,
1006
+ item.destroyer ?? '',
1045
1007
  item.exclusivityUnlockAtUnixSeconds,
1046
1008
  item.rewardReclaimAtUnixSeconds,
1047
1009
  item.inventory.sequenceId,
1048
- item.inventory.storageCostRaw,
1010
+ item.inventory.usedStorageUnitsRaw,
1049
1011
  ...item.inventory.amounts
1050
1012
  .map(({ amount, cargoId }) => `${String(cargoId)}:${String(amount)}`)
1051
1013
  .sort(),
@@ -1054,10 +1016,12 @@ function rawLootFingerprint(address, loot) {
1054
1016
  }
1055
1017
  /** Plans one transaction-exclusive retrieval from a loaded Loot snapshot.
1056
1018
  *
1057
- * The planner validates the owned idle Fleet, Loot identity, destroyer
1058
- * exclusivity, and every requested known quantity. Range, recent-slot inputs,
1059
- * destination capacity, intervening races, and final acquired quantities
1060
- * remain chain-authoritative.
1019
+ * The planner validates the owned idle Fleet, its normalized crew and usable
1020
+ * ability power at `atUnixSeconds`, Loot identity, destroyer exclusivity and
1021
+ * reward locks against the authorization Profile, and every requested known
1022
+ * quantity. Retrieval spends the Fleet's whole ability power pool. Range,
1023
+ * recent-slot inputs, destination capacity, intervening races, and final
1024
+ * acquired quantities remain chain-authoritative.
1061
1025
  *
1062
1026
  * @example
1063
1027
  * ```ts
@@ -1105,6 +1069,13 @@ export async function planFleetRetrieveLoot(ctx, fleet, loot, inputWant, inputOp
1105
1069
  currentFleet.crewCount !== fleet.crewCount) {
1106
1070
  fail(`Fleet ${fleet.name} (${fleet.address}) changed or no longer matches its canonical Game, owner, label, idle state, or crew. Refresh the Fleet and retry.`, fleet.address);
1107
1071
  }
1072
+ if (currentFleet.crewCount < currentFleet.stats.misc.requiredCrew) {
1073
+ fail(`Fleet ${fleet.name} (${fleet.address}) has ${String(currentFleet.crewCount)} crew but needs ${String(currentFleet.stats.misc.requiredCrew)} to retrieve Loot. Load crew, refresh the Fleet, and retry.`, fleet.address);
1074
+ }
1075
+ if (currentFleet.ap <= 0 ||
1076
+ options.atUnixSeconds < currentFleet.apReloadExpiresAt) {
1077
+ fail(`Fleet ${fleet.name} (${fleet.address}) has no usable ability power at ${String(options.atUnixSeconds)} Unix seconds: stored AP ${String(currentFleet.ap)} with reload completing at ${String(currentFleet.apReloadExpiresAt)}. Retrieving Loot spends the whole AP pool; wait for the reload, refresh the Fleet, and retry.`, fleet.address);
1078
+ }
1108
1079
  const lootAccount = requireAccount(lootAccountValue, loot.address, `Loot ${loot.address} is no longer available. Refresh Loot discovery and choose an available account before retrying.`);
1109
1080
  const currentLoot = lootAccountDefinition.decode(lootAccount);
1110
1081
  if (rawLootFingerprint(lootAccount.address, currentLoot) !==
@@ -1114,12 +1085,12 @@ export async function planFleetRetrieveLoot(ctx, fleet, loot, inputWant, inputOp
1114
1085
  const lootCreator = loot.profile.address === options.authorization.profile
1115
1086
  ? undefined
1116
1087
  : loot.profile.address;
1117
- const description = `Request ${selection.summary} from Loot ${loot.address} with Fleet ${fleet.name} (${fleet.address}); range, recent-slot randomness, cargo capacity, availability races, and final transfer quantities remain chain-authoritative.`;
1118
- return createPlan({
1088
+ const description = `Request ${selection.summary} from Loot ${loot.address} with Fleet ${fleet.name} (${fleet.address}); this spends the Fleet's whole ability power pool. Range, recent-slot randomness, cargo capacity, availability races, and final transfer quantities remain chain-authoritative.`;
1089
+ return buildPlannerPlan({
1119
1090
  kind: 'combat.retrieve-loot',
1120
1091
  preconditions: [
1121
- await precondition(fleetAccount, `Fleet ${fleet.name} retains its configured Game, owning Profile, idle state, and normalized crew.`),
1122
- await precondition(lootAccount, `Loot ${loot.address} retains its identity, creator, destroyer exclusivity, and requested known quantities.`),
1092
+ await accountStatePrecondition(fleetAccount, `Fleet ${fleet.name} retains its configured Game, owning Profile, idle state, and normalized crew.`),
1093
+ await accountStatePrecondition(lootAccount, `Loot ${loot.address} retains its identity, creator, destroyer exclusivity, and requested known quantities.`),
1123
1094
  ],
1124
1095
  steps: [
1125
1096
  {