@aephia/atlas-kit 0.6.0-next.14 → 0.6.0-next.141

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 (825) hide show
  1. package/README.md +3 -1
  2. package/dist/cargo/actions/deposit.d.ts +5 -2
  3. package/dist/cargo/actions/deposit.d.ts.map +1 -1
  4. package/dist/cargo/actions/deposit.js +60 -129
  5. package/dist/cargo/actions/deposit.js.map +1 -1
  6. package/dist/cargo/actions/index.d.ts +12 -6
  7. package/dist/cargo/actions/index.d.ts.map +1 -1
  8. package/dist/cargo/actions/index.js +97 -94
  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 -45
  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 -168
  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 +69 -14
  26. package/dist/claim-stakes/actions/index.d.ts.map +1 -1
  27. package/dist/claim-stakes/actions/index.js +613 -697
  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 +24 -12
  50. package/dist/combat/actions/index.d.ts.map +1 -1
  51. package/dist/combat/actions/index.js +331 -299
  52. package/dist/combat/actions/index.js.map +1 -1
  53. package/dist/combat/index.d.ts +25 -8
  54. package/dist/combat/index.d.ts.map +1 -1
  55. package/dist/combat/index.js +21 -18
  56. package/dist/combat/index.js.map +1 -1
  57. package/dist/crafting/actions/index.d.ts +28 -18
  58. package/dist/crafting/actions/index.d.ts.map +1 -1
  59. package/dist/crafting/actions/index.js +297 -352
  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 +46 -0
  78. package/dist/fleets/actions/add-ship.d.ts.map +1 -0
  79. package/dist/fleets/actions/add-ship.js +131 -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 +42 -0
  86. package/dist/fleets/actions/crew-transfer.d.ts.map +1 -0
  87. package/dist/fleets/actions/crew-transfer.js +95 -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 +81 -25
  94. package/dist/fleets/actions/index.d.ts.map +1 -1
  95. package/dist/fleets/actions/index.js +483 -353
  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 +61 -90
  104. package/dist/fleets/actions/ship-import.js.map +1 -1
  105. package/dist/fleets/cooldown.d.ts +47 -0
  106. package/dist/fleets/cooldown.d.ts.map +1 -0
  107. package/dist/fleets/cooldown.js +48 -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 +45 -0
  120. package/dist/fleets/movement-arithmetic.js.map +1 -0
  121. package/dist/fleets/subwarp-estimate.d.ts +72 -0
  122. package/dist/fleets/subwarp-estimate.d.ts.map +1 -0
  123. package/dist/fleets/subwarp-estimate.js +40 -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 +74 -0
  134. package/dist/fleets/warp-lane-policy.d.ts.map +1 -0
  135. package/dist/fleets/warp-lane-policy.js +103 -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 +61 -0
  150. package/dist/identity/actions/research-unlock.d.ts.map +1 -0
  151. package/dist/identity/actions/research-unlock.js +166 -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-instructions.d.ts +24 -0
  174. package/dist/internal/c4/cargo-instructions.d.ts.map +1 -0
  175. package/dist/internal/c4/cargo-instructions.js +30 -0
  176. package/dist/internal/c4/cargo-instructions.js.map +1 -0
  177. package/dist/internal/c4/cargo-pod.d.ts +15 -0
  178. package/dist/internal/c4/cargo-pod.d.ts.map +1 -0
  179. package/dist/internal/c4/cargo-pod.js +13 -0
  180. package/dist/internal/c4/cargo-pod.js.map +1 -0
  181. package/dist/internal/c4/character-modifier.d.ts +1 -1
  182. package/dist/internal/c4/character-modifier.d.ts.map +1 -1
  183. package/dist/internal/c4/character-registration.d.ts +2 -0
  184. package/dist/internal/c4/character-registration.d.ts.map +1 -1
  185. package/dist/internal/c4/character-registration.js +2 -0
  186. package/dist/internal/c4/character-registration.js.map +1 -1
  187. package/dist/internal/c4/character.d.ts +157 -0
  188. package/dist/internal/c4/character.d.ts.map +1 -0
  189. package/dist/internal/c4/character.js +64 -0
  190. package/dist/internal/c4/character.js.map +1 -0
  191. package/dist/internal/c4/claim-stake-building-definitions.d.ts.map +1 -1
  192. package/dist/internal/c4/claim-stake-building-definitions.js +2 -1
  193. package/dist/internal/c4/claim-stake-building-definitions.js.map +1 -1
  194. package/dist/internal/c4/claim-stake-configuration.d.ts.map +1 -1
  195. package/dist/internal/c4/claim-stake-configuration.js +5 -36
  196. package/dist/internal/c4/claim-stake-configuration.js.map +1 -1
  197. package/dist/internal/c4/claim-stake-definitions.d.ts +4 -4
  198. package/dist/internal/c4/claim-stake-definitions.d.ts.map +1 -1
  199. package/dist/internal/c4/claim-stake-definitions.js +2 -1
  200. package/dist/internal/c4/claim-stake-definitions.js.map +1 -1
  201. package/dist/internal/c4/claim-stake-plots.d.ts +17 -0
  202. package/dist/internal/c4/claim-stake-plots.d.ts.map +1 -0
  203. package/dist/internal/c4/claim-stake-plots.js +29 -0
  204. package/dist/internal/c4/claim-stake-plots.js.map +1 -0
  205. package/dist/internal/c4/claim-stake.d.ts +13 -33
  206. package/dist/internal/c4/claim-stake.d.ts.map +1 -1
  207. package/dist/internal/c4/claim-stake.js +49 -94
  208. package/dist/internal/c4/claim-stake.js.map +1 -1
  209. package/dist/internal/c4/combat-storage.d.ts +20 -0
  210. package/dist/internal/c4/combat-storage.d.ts.map +1 -0
  211. package/dist/internal/c4/combat-storage.js +43 -0
  212. package/dist/internal/c4/combat-storage.js.map +1 -0
  213. package/dist/internal/c4/combat.d.ts +1 -82
  214. package/dist/internal/c4/combat.d.ts.map +1 -1
  215. package/dist/internal/c4/combat.js +16 -213
  216. package/dist/internal/c4/combat.js.map +1 -1
  217. package/dist/internal/c4/crafting-process-codec.d.ts +13 -0
  218. package/dist/internal/c4/crafting-process-codec.d.ts.map +1 -0
  219. package/dist/internal/c4/crafting-process-codec.js +34 -0
  220. package/dist/internal/c4/crafting-process-codec.js.map +1 -0
  221. package/dist/internal/c4/crafting-storage.d.ts +20 -0
  222. package/dist/internal/c4/crafting-storage.d.ts.map +1 -0
  223. package/dist/internal/c4/crafting-storage.js +54 -0
  224. package/dist/internal/c4/crafting-storage.js.map +1 -0
  225. package/dist/internal/c4/crafting.d.ts +30 -33
  226. package/dist/internal/c4/crafting.d.ts.map +1 -1
  227. package/dist/internal/c4/crafting.js +76 -127
  228. package/dist/internal/c4/crafting.js.map +1 -1
  229. package/dist/internal/c4/currency-cache.d.ts +6 -0
  230. package/dist/internal/c4/currency-cache.d.ts.map +1 -0
  231. package/dist/internal/c4/currency-cache.js +27 -0
  232. package/dist/internal/c4/currency-cache.js.map +1 -0
  233. package/dist/internal/c4/discriminators.d.ts +91 -0
  234. package/dist/internal/c4/discriminators.d.ts.map +1 -0
  235. package/dist/internal/c4/discriminators.js +186 -0
  236. package/dist/internal/c4/discriminators.js.map +1 -0
  237. package/dist/internal/c4/docking-funding.d.ts +4 -0
  238. package/dist/internal/c4/docking-funding.d.ts.map +1 -0
  239. package/dist/internal/c4/docking-funding.js +11 -0
  240. package/dist/internal/c4/docking-funding.js.map +1 -0
  241. package/dist/internal/c4/faction-epoch-meter.d.ts +10 -0
  242. package/dist/internal/c4/faction-epoch-meter.d.ts.map +1 -0
  243. package/dist/internal/c4/faction-epoch-meter.js +26 -0
  244. package/dist/internal/c4/faction-epoch-meter.js.map +1 -0
  245. package/dist/internal/c4/faction-treasury.d.ts +23 -0
  246. package/dist/internal/c4/faction-treasury.d.ts.map +1 -0
  247. package/dist/internal/c4/faction-treasury.js +41 -0
  248. package/dist/internal/c4/faction-treasury.js.map +1 -0
  249. package/dist/internal/c4/faction.d.ts +21 -0
  250. package/dist/internal/c4/faction.d.ts.map +1 -0
  251. package/dist/internal/c4/faction.js +23 -0
  252. package/dist/internal/c4/faction.js.map +1 -0
  253. package/dist/internal/c4/factions.d.ts +15 -57
  254. package/dist/internal/c4/factions.d.ts.map +1 -1
  255. package/dist/internal/c4/factions.js +80 -223
  256. package/dist/internal/c4/factions.js.map +1 -1
  257. package/dist/internal/c4/fleet-arrival.d.ts +28 -0
  258. package/dist/internal/c4/fleet-arrival.d.ts.map +1 -0
  259. package/dist/internal/c4/fleet-arrival.js +42 -0
  260. package/dist/internal/c4/fleet-arrival.js.map +1 -0
  261. package/dist/internal/c4/fleet-creation.d.ts +7 -0
  262. package/dist/internal/c4/fleet-creation.d.ts.map +1 -0
  263. package/dist/internal/c4/fleet-creation.js +171 -0
  264. package/dist/internal/c4/fleet-creation.js.map +1 -0
  265. package/dist/internal/c4/fleet-crew-binding.d.ts +9 -0
  266. package/dist/internal/c4/fleet-crew-binding.d.ts.map +1 -1
  267. package/dist/internal/c4/fleet-crew-binding.js +31 -44
  268. package/dist/internal/c4/fleet-crew-binding.js.map +1 -1
  269. package/dist/internal/c4/fleet-respawn.d.ts +17 -0
  270. package/dist/internal/c4/fleet-respawn.d.ts.map +1 -0
  271. package/dist/internal/c4/fleet-respawn.js +62 -0
  272. package/dist/internal/c4/fleet-respawn.js.map +1 -0
  273. package/dist/internal/c4/fleet-ship-assembly.d.ts +27 -0
  274. package/dist/internal/c4/fleet-ship-assembly.d.ts.map +1 -0
  275. package/dist/internal/c4/fleet-ship-assembly.js +94 -0
  276. package/dist/internal/c4/fleet-ship-assembly.js.map +1 -0
  277. package/dist/internal/c4/fleet-storage.d.ts +44 -0
  278. package/dist/internal/c4/fleet-storage.d.ts.map +1 -0
  279. package/dist/internal/c4/fleet-storage.js +108 -0
  280. package/dist/internal/c4/fleet-storage.js.map +1 -0
  281. package/dist/internal/c4/fleet.d.ts +59 -22
  282. package/dist/internal/c4/fleet.d.ts.map +1 -1
  283. package/dist/internal/c4/fleet.js +50 -87
  284. package/dist/internal/c4/fleet.js.map +1 -1
  285. package/dist/internal/c4/game-definition-layout.d.ts +2 -0
  286. package/dist/internal/c4/game-definition-layout.d.ts.map +1 -1
  287. package/dist/internal/c4/game-definition-layout.js +4 -0
  288. package/dist/internal/c4/game-definition-layout.js.map +1 -1
  289. package/dist/internal/c4/game.d.ts +117 -32
  290. package/dist/internal/c4/game.d.ts.map +1 -1
  291. package/dist/internal/c4/game.js +227 -130
  292. package/dist/internal/c4/game.js.map +1 -1
  293. package/dist/internal/c4/identity.d.ts +3 -152
  294. package/dist/internal/c4/identity.d.ts.map +1 -1
  295. package/dist/internal/c4/identity.js +19 -126
  296. package/dist/internal/c4/identity.js.map +1 -1
  297. package/dist/internal/c4/local-market-order.d.ts +29 -0
  298. package/dist/internal/c4/local-market-order.d.ts.map +1 -0
  299. package/dist/internal/c4/local-market-order.js +46 -0
  300. package/dist/internal/c4/local-market-order.js.map +1 -0
  301. package/dist/internal/c4/loot-layout.js +1 -1
  302. package/dist/internal/c4/loot-layout.js.map +1 -1
  303. package/dist/internal/c4/loot.d.ts +89 -0
  304. package/dist/internal/c4/loot.d.ts.map +1 -0
  305. package/dist/internal/c4/loot.js +109 -0
  306. package/dist/internal/c4/loot.js.map +1 -0
  307. package/dist/internal/c4/loyalty.d.ts +2 -28
  308. package/dist/internal/c4/loyalty.d.ts.map +1 -1
  309. package/dist/internal/c4/loyalty.js +36 -161
  310. package/dist/internal/c4/loyalty.js.map +1 -1
  311. package/dist/internal/c4/market-storage.d.ts +25 -0
  312. package/dist/internal/c4/market-storage.d.ts.map +1 -0
  313. package/dist/internal/c4/market-storage.js +53 -0
  314. package/dist/internal/c4/market-storage.js.map +1 -0
  315. package/dist/internal/c4/market.d.ts +2 -38
  316. package/dist/internal/c4/market.d.ts.map +1 -1
  317. package/dist/internal/c4/market.js +26 -120
  318. package/dist/internal/c4/market.js.map +1 -1
  319. package/dist/internal/c4/mining-instructions.d.ts +2 -0
  320. package/dist/internal/c4/mining-instructions.d.ts.map +1 -0
  321. package/dist/internal/c4/mining-instructions.js +3 -0
  322. package/dist/internal/c4/mining-instructions.js.map +1 -0
  323. package/dist/internal/c4/open-signal.d.ts +8 -0
  324. package/dist/internal/c4/open-signal.d.ts.map +1 -0
  325. package/dist/internal/c4/open-signal.js +37 -0
  326. package/dist/internal/c4/open-signal.js.map +1 -0
  327. package/dist/internal/c4/pda.d.ts +43 -0
  328. package/dist/internal/c4/pda.d.ts.map +1 -1
  329. package/dist/internal/c4/pda.js +83 -17
  330. package/dist/internal/c4/pda.js.map +1 -1
  331. package/dist/internal/c4/profile-faction.d.ts +2 -1
  332. package/dist/internal/c4/profile-faction.d.ts.map +1 -1
  333. package/dist/internal/c4/profile-faction.js +36 -72
  334. package/dist/internal/c4/profile-faction.js.map +1 -1
  335. package/dist/internal/c4/profile-permissions.d.ts +1 -1
  336. package/dist/internal/c4/profile-permissions.d.ts.map +1 -1
  337. package/dist/internal/c4/profile-permissions.js +4 -1
  338. package/dist/internal/c4/profile-permissions.js.map +1 -1
  339. package/dist/internal/c4/region-geometry.d.ts +8 -0
  340. package/dist/internal/c4/region-geometry.d.ts.map +1 -0
  341. package/dist/internal/c4/region-geometry.js +43 -0
  342. package/dist/internal/c4/region-geometry.js.map +1 -0
  343. package/dist/internal/c4/rewards.d.ts +1 -61
  344. package/dist/internal/c4/rewards.d.ts.map +1 -1
  345. package/dist/internal/c4/rewards.js +23 -203
  346. package/dist/internal/c4/rewards.js.map +1 -1
  347. package/dist/internal/c4/runtime-bindings.d.ts +4 -0
  348. package/dist/internal/c4/runtime-bindings.d.ts.map +1 -0
  349. package/dist/internal/c4/runtime-bindings.js +4 -0
  350. package/dist/internal/c4/runtime-bindings.js.map +1 -0
  351. package/dist/internal/c4/scan-detection-codecs.d.ts +3 -0
  352. package/dist/internal/c4/scan-detection-codecs.d.ts.map +1 -0
  353. package/dist/internal/c4/scan-detection-codecs.js +3 -0
  354. package/dist/internal/c4/scan-detection-codecs.js.map +1 -0
  355. package/dist/internal/c4/scan-lifecycle.d.ts +306 -0
  356. package/dist/internal/c4/scan-lifecycle.d.ts.map +1 -0
  357. package/dist/internal/c4/scan-lifecycle.js +235 -0
  358. package/dist/internal/c4/scan-lifecycle.js.map +1 -0
  359. package/dist/internal/c4/scanning.d.ts +4 -41
  360. package/dist/internal/c4/scanning.d.ts.map +1 -1
  361. package/dist/internal/c4/scanning.js +27 -108
  362. package/dist/internal/c4/scanning.js.map +1 -1
  363. package/dist/internal/c4/ship-import.d.ts +4 -0
  364. package/dist/internal/c4/ship-import.d.ts.map +1 -0
  365. package/dist/internal/c4/ship-import.js +13 -0
  366. package/dist/internal/c4/ship-import.js.map +1 -0
  367. package/dist/internal/c4/ship-stats.d.ts.map +1 -1
  368. package/dist/internal/c4/ship-stats.js +46 -44
  369. package/dist/internal/c4/ship-stats.js.map +1 -1
  370. package/dist/internal/c4/starbase.d.ts +0 -32
  371. package/dist/internal/c4/starbase.d.ts.map +1 -1
  372. package/dist/internal/c4/starbase.js +26 -136
  373. package/dist/internal/c4/starbase.js.map +1 -1
  374. package/dist/internal/c4/stimulant.d.ts +26 -0
  375. package/dist/internal/c4/stimulant.d.ts.map +1 -0
  376. package/dist/internal/c4/stimulant.js +36 -0
  377. package/dist/internal/c4/stimulant.js.map +1 -0
  378. package/dist/internal/c4/wallet-cargo-cache.js +2 -1
  379. package/dist/internal/c4/wallet-cargo-cache.js.map +1 -1
  380. package/dist/internal/c4/world.d.ts +37 -7
  381. package/dist/internal/c4/world.d.ts.map +1 -1
  382. package/dist/internal/c4/world.js +87 -129
  383. package/dist/internal/c4/world.js.map +1 -1
  384. package/dist/internal/cargo.d.ts +2 -0
  385. package/dist/internal/cargo.d.ts.map +1 -1
  386. package/dist/internal/cargo.js +8 -0
  387. package/dist/internal/cargo.js.map +1 -1
  388. package/dist/internal/fleet-route.d.ts +12 -0
  389. package/dist/internal/fleet-route.d.ts.map +1 -0
  390. package/dist/internal/fleet-route.js +11 -0
  391. package/dist/internal/fleet-route.js.map +1 -0
  392. package/dist/internal/fleet.d.ts +1 -0
  393. package/dist/internal/fleet.d.ts.map +1 -1
  394. package/dist/internal/fleet.js +3 -1
  395. package/dist/internal/fleet.js.map +1 -1
  396. package/dist/internal/loyalty-atlas-bank-state.d.ts +17 -0
  397. package/dist/internal/loyalty-atlas-bank-state.d.ts.map +1 -0
  398. package/dist/internal/loyalty-atlas-bank-state.js +11 -0
  399. package/dist/internal/loyalty-atlas-bank-state.js.map +1 -0
  400. package/dist/internal/planning/account-state.d.ts +6 -0
  401. package/dist/internal/planning/account-state.d.ts.map +1 -1
  402. package/dist/internal/planning/account-state.js +13 -0
  403. package/dist/internal/planning/account-state.js.map +1 -1
  404. package/dist/internal/planning/action-runtime.d.ts +38 -0
  405. package/dist/internal/planning/action-runtime.d.ts.map +1 -0
  406. package/dist/internal/planning/action-runtime.js +63 -0
  407. package/dist/internal/planning/action-runtime.js.map +1 -0
  408. package/dist/internal/planning/arrival-guards.d.ts +19 -0
  409. package/dist/internal/planning/arrival-guards.d.ts.map +1 -0
  410. package/dist/internal/planning/arrival-guards.js +172 -0
  411. package/dist/internal/planning/arrival-guards.js.map +1 -0
  412. package/dist/internal/planning/authorization-adapter.d.ts +55 -37
  413. package/dist/internal/planning/authorization-adapter.d.ts.map +1 -1
  414. package/dist/internal/planning/authorization-adapter.js +231 -81
  415. package/dist/internal/planning/authorization-adapter.js.map +1 -1
  416. package/dist/internal/planning/cargo-storage-actions.d.ts +8 -0
  417. package/dist/internal/planning/cargo-storage-actions.d.ts.map +1 -0
  418. package/dist/internal/planning/cargo-storage-actions.js +97 -0
  419. package/dist/internal/planning/cargo-storage-actions.js.map +1 -0
  420. package/dist/internal/planning/character-registration-guard.d.ts +4 -0
  421. package/dist/internal/planning/character-registration-guard.d.ts.map +1 -0
  422. package/dist/internal/planning/character-registration-guard.js +59 -0
  423. package/dist/internal/planning/character-registration-guard.js.map +1 -0
  424. package/dist/internal/planning/character-registration.d.ts +23 -0
  425. package/dist/internal/planning/character-registration.d.ts.map +1 -0
  426. package/dist/internal/planning/character-registration.js +87 -0
  427. package/dist/internal/planning/character-registration.js.map +1 -0
  428. package/dist/internal/planning/combat-storage-actions.d.ts +9 -0
  429. package/dist/internal/planning/combat-storage-actions.d.ts.map +1 -0
  430. package/dist/internal/planning/combat-storage-actions.js +55 -0
  431. package/dist/internal/planning/combat-storage-actions.js.map +1 -0
  432. package/dist/internal/planning/crafting-storage-actions.d.ts +7 -0
  433. package/dist/internal/planning/crafting-storage-actions.d.ts.map +1 -0
  434. package/dist/internal/planning/crafting-storage-actions.js +64 -0
  435. package/dist/internal/planning/crafting-storage-actions.js.map +1 -0
  436. package/dist/internal/planning/currency-cache-guard.d.ts +4 -0
  437. package/dist/internal/planning/currency-cache-guard.d.ts.map +1 -0
  438. package/dist/internal/planning/currency-cache-guard.js +34 -0
  439. package/dist/internal/planning/currency-cache-guard.js.map +1 -0
  440. package/dist/internal/planning/democracy-history.d.ts +50 -0
  441. package/dist/internal/planning/democracy-history.d.ts.map +1 -0
  442. package/dist/internal/planning/democracy-history.js +189 -0
  443. package/dist/internal/planning/democracy-history.js.map +1 -0
  444. package/dist/internal/planning/direct-options.d.ts +17 -0
  445. package/dist/internal/planning/direct-options.d.ts.map +1 -0
  446. package/dist/internal/planning/direct-options.js +43 -0
  447. package/dist/internal/planning/direct-options.js.map +1 -0
  448. package/dist/internal/planning/faction-enrollment.d.ts +0 -4
  449. package/dist/internal/planning/faction-enrollment.d.ts.map +1 -1
  450. package/dist/internal/planning/faction-enrollment.js +1 -31
  451. package/dist/internal/planning/faction-enrollment.js.map +1 -1
  452. package/dist/internal/planning/faction-trade-guards.d.ts +30 -0
  453. package/dist/internal/planning/faction-trade-guards.d.ts.map +1 -0
  454. package/dist/internal/planning/faction-trade-guards.js +15 -0
  455. package/dist/internal/planning/faction-trade-guards.js.map +1 -0
  456. package/dist/internal/planning/faction-trade-state.d.ts +16 -0
  457. package/dist/internal/planning/faction-trade-state.d.ts.map +1 -0
  458. package/dist/internal/planning/faction-trade-state.js +43 -0
  459. package/dist/internal/planning/faction-trade-state.js.map +1 -0
  460. package/dist/internal/planning/fleet-arrival.d.ts +40 -0
  461. package/dist/internal/planning/fleet-arrival.d.ts.map +1 -0
  462. package/dist/internal/planning/fleet-arrival.js +107 -0
  463. package/dist/internal/planning/fleet-arrival.js.map +1 -0
  464. package/dist/internal/planning/fleet-attack-xp.d.ts +20 -0
  465. package/dist/internal/planning/fleet-attack-xp.d.ts.map +1 -0
  466. package/dist/internal/planning/fleet-attack-xp.js +104 -0
  467. package/dist/internal/planning/fleet-attack-xp.js.map +1 -0
  468. package/dist/internal/planning/fleet-creation.d.ts +30 -0
  469. package/dist/internal/planning/fleet-creation.d.ts.map +1 -0
  470. package/dist/internal/planning/fleet-creation.js +89 -0
  471. package/dist/internal/planning/fleet-creation.js.map +1 -0
  472. package/dist/internal/planning/fleet-crew-guard.d.ts +28 -0
  473. package/dist/internal/planning/fleet-crew-guard.d.ts.map +1 -0
  474. package/dist/internal/planning/fleet-crew-guard.js +48 -0
  475. package/dist/internal/planning/fleet-crew-guard.js.map +1 -0
  476. package/dist/internal/planning/fleet-crew-transfer.d.ts +7 -0
  477. package/dist/internal/planning/fleet-crew-transfer.d.ts.map +1 -0
  478. package/dist/internal/planning/fleet-crew-transfer.js +129 -0
  479. package/dist/internal/planning/fleet-crew-transfer.js.map +1 -0
  480. package/dist/internal/planning/fleet-dock-funding-guard.d.ts +42 -0
  481. package/dist/internal/planning/fleet-dock-funding-guard.d.ts.map +1 -0
  482. package/dist/internal/planning/fleet-dock-funding-guard.js +209 -0
  483. package/dist/internal/planning/fleet-dock-funding-guard.js.map +1 -0
  484. package/dist/internal/planning/fleet-dock-funding.d.ts +9 -0
  485. package/dist/internal/planning/fleet-dock-funding.d.ts.map +1 -0
  486. package/dist/internal/planning/fleet-dock-funding.js +164 -0
  487. package/dist/internal/planning/fleet-dock-funding.js.map +1 -0
  488. package/dist/internal/planning/fleet-docking-guard.d.ts +4 -0
  489. package/dist/internal/planning/fleet-docking-guard.d.ts.map +1 -0
  490. package/dist/internal/planning/fleet-docking-guard.js +44 -0
  491. package/dist/internal/planning/fleet-docking-guard.js.map +1 -0
  492. package/dist/internal/planning/fleet-docking.d.ts +25 -0
  493. package/dist/internal/planning/fleet-docking.d.ts.map +1 -0
  494. package/dist/internal/planning/fleet-docking.js +106 -0
  495. package/dist/internal/planning/fleet-docking.js.map +1 -0
  496. package/dist/internal/planning/fleet-respawn.d.ts +28 -0
  497. package/dist/internal/planning/fleet-respawn.d.ts.map +1 -0
  498. package/dist/internal/planning/fleet-respawn.js +164 -0
  499. package/dist/internal/planning/fleet-respawn.js.map +1 -0
  500. package/dist/internal/planning/fleet-ship-assembly.d.ts +36 -0
  501. package/dist/internal/planning/fleet-ship-assembly.d.ts.map +1 -0
  502. package/dist/internal/planning/fleet-ship-assembly.js +158 -0
  503. package/dist/internal/planning/fleet-ship-assembly.js.map +1 -0
  504. package/dist/internal/planning/fleet-state.d.ts +25 -0
  505. package/dist/internal/planning/fleet-state.d.ts.map +1 -0
  506. package/dist/internal/planning/fleet-state.js +28 -0
  507. package/dist/internal/planning/fleet-state.js.map +1 -0
  508. package/dist/internal/planning/governance-fees.d.ts +64 -0
  509. package/dist/internal/planning/governance-fees.d.ts.map +1 -0
  510. package/dist/internal/planning/governance-fees.js +231 -0
  511. package/dist/internal/planning/governance-fees.js.map +1 -0
  512. package/dist/internal/planning/local-market-order-funding.d.ts +8 -0
  513. package/dist/internal/planning/local-market-order-funding.d.ts.map +1 -0
  514. package/dist/internal/planning/local-market-order-funding.js +128 -0
  515. package/dist/internal/planning/local-market-order-funding.js.map +1 -0
  516. package/dist/internal/planning/local-market-order.d.ts +40 -0
  517. package/dist/internal/planning/local-market-order.d.ts.map +1 -0
  518. package/dist/internal/planning/local-market-order.js +139 -0
  519. package/dist/internal/planning/local-market-order.js.map +1 -0
  520. package/dist/internal/planning/market-storage-actions.d.ts +7 -0
  521. package/dist/internal/planning/market-storage-actions.d.ts.map +1 -0
  522. package/dist/internal/planning/market-storage-actions.js +71 -0
  523. package/dist/internal/planning/market-storage-actions.js.map +1 -0
  524. package/dist/internal/planning/mining-stop.d.ts +14 -0
  525. package/dist/internal/planning/mining-stop.d.ts.map +1 -0
  526. package/dist/internal/planning/mining-stop.js +42 -0
  527. package/dist/internal/planning/mining-stop.js.map +1 -0
  528. package/dist/internal/planning/mining-storage-actions.d.ts +11 -0
  529. package/dist/internal/planning/mining-storage-actions.d.ts.map +1 -0
  530. package/dist/internal/planning/mining-storage-actions.js +57 -0
  531. package/dist/internal/planning/mining-storage-actions.js.map +1 -0
  532. package/dist/internal/planning/movement-character.d.ts +7 -0
  533. package/dist/internal/planning/movement-character.d.ts.map +1 -0
  534. package/dist/internal/planning/movement-character.js +41 -0
  535. package/dist/internal/planning/movement-character.js.map +1 -0
  536. package/dist/internal/planning/movement-storage-actions.d.ts +7 -0
  537. package/dist/internal/planning/movement-storage-actions.d.ts.map +1 -0
  538. package/dist/internal/planning/movement-storage-actions.js +38 -0
  539. package/dist/internal/planning/movement-storage-actions.js.map +1 -0
  540. package/dist/internal/planning/movement-xp-guard.d.ts +4 -0
  541. package/dist/internal/planning/movement-xp-guard.d.ts.map +1 -0
  542. package/dist/internal/planning/movement-xp-guard.js +104 -0
  543. package/dist/internal/planning/movement-xp-guard.js.map +1 -0
  544. package/dist/internal/planning/open-signal-guard.d.ts +3 -0
  545. package/dist/internal/planning/open-signal-guard.d.ts.map +1 -0
  546. package/dist/internal/planning/open-signal-guard.js +32 -0
  547. package/dist/internal/planning/open-signal-guard.js.map +1 -0
  548. package/dist/internal/planning/open-signal.d.ts +31 -0
  549. package/dist/internal/planning/open-signal.d.ts.map +1 -0
  550. package/dist/internal/planning/open-signal.js +94 -0
  551. package/dist/internal/planning/open-signal.js.map +1 -0
  552. package/dist/internal/planning/original-token.d.ts +40 -0
  553. package/dist/internal/planning/original-token.d.ts.map +1 -0
  554. package/dist/internal/planning/original-token.js +112 -0
  555. package/dist/internal/planning/original-token.js.map +1 -0
  556. package/dist/internal/planning/own-starbase-facts.d.ts +37 -0
  557. package/dist/internal/planning/own-starbase-facts.d.ts.map +1 -0
  558. package/dist/internal/planning/own-starbase-facts.js +52 -0
  559. package/dist/internal/planning/own-starbase-facts.js.map +1 -0
  560. package/dist/internal/planning/plan-fields.d.ts +60 -0
  561. package/dist/internal/planning/plan-fields.d.ts.map +1 -0
  562. package/dist/internal/planning/plan-fields.js +159 -0
  563. package/dist/internal/planning/plan-fields.js.map +1 -0
  564. package/dist/internal/planning/plan-guards.d.ts +4 -0
  565. package/dist/internal/planning/plan-guards.d.ts.map +1 -0
  566. package/dist/internal/planning/plan-guards.js +177 -0
  567. package/dist/internal/planning/plan-guards.js.map +1 -0
  568. package/dist/internal/planning/profile-key.d.ts +13 -0
  569. package/dist/internal/planning/profile-key.d.ts.map +1 -0
  570. package/dist/internal/planning/profile-key.js +20 -0
  571. package/dist/internal/planning/profile-key.js.map +1 -0
  572. package/dist/internal/planning/profile-storage-funding-guard.d.ts +28 -0
  573. package/dist/internal/planning/profile-storage-funding-guard.d.ts.map +1 -0
  574. package/dist/internal/planning/profile-storage-funding-guard.js +75 -0
  575. package/dist/internal/planning/profile-storage-funding-guard.js.map +1 -0
  576. package/dist/internal/planning/profile-storage-funding.d.ts +46 -0
  577. package/dist/internal/planning/profile-storage-funding.d.ts.map +1 -0
  578. package/dist/internal/planning/profile-storage-funding.js +58 -0
  579. package/dist/internal/planning/profile-storage-funding.js.map +1 -0
  580. package/dist/internal/planning/recipe-state.d.ts +9 -0
  581. package/dist/internal/planning/recipe-state.d.ts.map +1 -0
  582. package/dist/internal/planning/recipe-state.js +23 -0
  583. package/dist/internal/planning/recipe-state.js.map +1 -0
  584. package/dist/internal/planning/rent-catalog.d.ts +37 -0
  585. package/dist/internal/planning/rent-catalog.d.ts.map +1 -0
  586. package/dist/internal/planning/rent-catalog.js +165 -0
  587. package/dist/internal/planning/rent-catalog.js.map +1 -0
  588. package/dist/internal/planning/rent.d.ts +19 -0
  589. package/dist/internal/planning/rent.d.ts.map +1 -0
  590. package/dist/internal/planning/rent.js +35 -0
  591. package/dist/internal/planning/rent.js.map +1 -0
  592. package/dist/internal/planning/research-unlock.d.ts +69 -0
  593. package/dist/internal/planning/research-unlock.d.ts.map +1 -0
  594. package/dist/internal/planning/research-unlock.js +287 -0
  595. package/dist/internal/planning/research-unlock.js.map +1 -0
  596. package/dist/internal/planning/respawn-guards.d.ts +3 -0
  597. package/dist/internal/planning/respawn-guards.d.ts.map +1 -0
  598. package/dist/internal/planning/respawn-guards.js +42 -0
  599. package/dist/internal/planning/respawn-guards.js.map +1 -0
  600. package/dist/internal/planning/runtime-guards.d.ts +41 -0
  601. package/dist/internal/planning/runtime-guards.d.ts.map +1 -0
  602. package/dist/internal/planning/runtime-guards.js +658 -0
  603. package/dist/internal/planning/runtime-guards.js.map +1 -0
  604. package/dist/internal/planning/scan-completion-guard.d.ts +43 -0
  605. package/dist/internal/planning/scan-completion-guard.d.ts.map +1 -0
  606. package/dist/internal/planning/scan-completion-guard.js +95 -0
  607. package/dist/internal/planning/scan-completion-guard.js.map +1 -0
  608. package/dist/internal/planning/scan-completion.d.ts +20 -0
  609. package/dist/internal/planning/scan-completion.d.ts.map +1 -0
  610. package/dist/internal/planning/scan-completion.js +198 -0
  611. package/dist/internal/planning/scan-completion.js.map +1 -0
  612. package/dist/internal/planning/scan-detect-guard.d.ts +34 -0
  613. package/dist/internal/planning/scan-detect-guard.d.ts.map +1 -0
  614. package/dist/internal/planning/scan-detect-guard.js +77 -0
  615. package/dist/internal/planning/scan-detect-guard.js.map +1 -0
  616. package/dist/internal/planning/scan-detect.d.ts +24 -0
  617. package/dist/internal/planning/scan-detect.d.ts.map +1 -0
  618. package/dist/internal/planning/scan-detect.js +246 -0
  619. package/dist/internal/planning/scan-detect.js.map +1 -0
  620. package/dist/internal/planning/scan-idle-scope.d.ts +5 -0
  621. package/dist/internal/planning/scan-idle-scope.d.ts.map +1 -0
  622. package/dist/internal/planning/scan-idle-scope.js +5 -0
  623. package/dist/internal/planning/scan-idle-scope.js.map +1 -0
  624. package/dist/internal/planning/scan-input.d.ts +9 -0
  625. package/dist/internal/planning/scan-input.d.ts.map +1 -0
  626. package/dist/internal/planning/scan-input.js +58 -0
  627. package/dist/internal/planning/scan-input.js.map +1 -0
  628. package/dist/internal/planning/ship-import-funding.d.ts +22 -0
  629. package/dist/internal/planning/ship-import-funding.d.ts.map +1 -0
  630. package/dist/internal/planning/ship-import-funding.js +53 -0
  631. package/dist/internal/planning/ship-import-funding.js.map +1 -0
  632. package/dist/internal/planning/ship-token.d.ts +1 -6
  633. package/dist/internal/planning/ship-token.d.ts.map +1 -1
  634. package/dist/internal/planning/ship-token.js +0 -37
  635. package/dist/internal/planning/ship-token.js.map +1 -1
  636. package/dist/internal/planning/starbase-player-owner.d.ts +21 -0
  637. package/dist/internal/planning/starbase-player-owner.d.ts.map +1 -0
  638. package/dist/internal/planning/starbase-player-owner.js +17 -0
  639. package/dist/internal/planning/starbase-player-owner.js.map +1 -0
  640. package/dist/internal/planning/starbase-system-guard.d.ts +6 -0
  641. package/dist/internal/planning/starbase-system-guard.d.ts.map +1 -0
  642. package/dist/internal/planning/starbase-system-guard.js +94 -0
  643. package/dist/internal/planning/starbase-system-guard.js.map +1 -0
  644. package/dist/internal/planning/starbase-system.d.ts +15 -0
  645. package/dist/internal/planning/starbase-system.d.ts.map +1 -0
  646. package/dist/internal/planning/starbase-system.js +25 -0
  647. package/dist/internal/planning/starbase-system.js.map +1 -0
  648. package/dist/internal/planning/storage-action-readers.d.ts +10 -0
  649. package/dist/internal/planning/storage-action-readers.d.ts.map +1 -0
  650. package/dist/internal/planning/storage-action-readers.js +41 -0
  651. package/dist/internal/planning/storage-action-readers.js.map +1 -0
  652. package/dist/internal/planning/storage-actions.d.ts +85 -0
  653. package/dist/internal/planning/storage-actions.d.ts.map +1 -0
  654. package/dist/internal/planning/storage-actions.js +183 -0
  655. package/dist/internal/planning/storage-actions.js.map +1 -0
  656. package/dist/internal/planning/token-mint.d.ts.map +1 -1
  657. package/dist/internal/planning/token-mint.js +2 -1
  658. package/dist/internal/planning/token-mint.js.map +1 -1
  659. package/dist/internal/planning/trade-faction-market.d.ts +20 -0
  660. package/dist/internal/planning/trade-faction-market.d.ts.map +1 -0
  661. package/dist/internal/planning/trade-faction-market.js +56 -0
  662. package/dist/internal/planning/trade-faction-market.js.map +1 -0
  663. package/dist/internal/planning/wallet-starbase.d.ts +34 -0
  664. package/dist/internal/planning/wallet-starbase.d.ts.map +1 -0
  665. package/dist/internal/planning/wallet-starbase.js +39 -0
  666. package/dist/internal/planning/wallet-starbase.js.map +1 -0
  667. package/dist/internal/planning/xp-runtime.d.ts +36 -0
  668. package/dist/internal/planning/xp-runtime.d.ts.map +1 -0
  669. package/dist/internal/planning/xp-runtime.js +122 -0
  670. package/dist/internal/planning/xp-runtime.js.map +1 -0
  671. package/dist/internal/read-meta.d.ts +12 -0
  672. package/dist/internal/read-meta.d.ts.map +1 -1
  673. package/dist/internal/read-meta.js +10 -0
  674. package/dist/internal/read-meta.js.map +1 -1
  675. package/dist/internal/system-program.d.ts +4 -0
  676. package/dist/internal/system-program.d.ts.map +1 -0
  677. package/dist/internal/system-program.js +3 -0
  678. package/dist/internal/system-program.js.map +1 -0
  679. package/dist/loyalty/actions/index.d.ts +1 -1
  680. package/dist/loyalty/actions/index.d.ts.map +1 -1
  681. package/dist/loyalty/actions/index.js +16 -46
  682. package/dist/loyalty/actions/index.js.map +1 -1
  683. package/dist/loyalty/index.d.ts +4 -0
  684. package/dist/loyalty/index.d.ts.map +1 -1
  685. package/dist/loyalty/index.js +21 -33
  686. package/dist/loyalty/index.js.map +1 -1
  687. package/dist/markets/actions/index.d.ts +62 -4
  688. package/dist/markets/actions/index.d.ts.map +1 -1
  689. package/dist/markets/actions/index.js +261 -187
  690. package/dist/markets/actions/index.js.map +1 -1
  691. package/dist/markets/actions/trade-faction-market.d.ts +45 -0
  692. package/dist/markets/actions/trade-faction-market.d.ts.map +1 -0
  693. package/dist/markets/actions/trade-faction-market.js +311 -0
  694. package/dist/markets/actions/trade-faction-market.js.map +1 -0
  695. package/dist/markets/index.d.ts +38 -7
  696. package/dist/markets/index.d.ts.map +1 -1
  697. package/dist/markets/index.js +59 -20
  698. package/dist/markets/index.js.map +1 -1
  699. package/dist/mining/actions/index.d.ts +87 -0
  700. package/dist/mining/actions/index.d.ts.map +1 -0
  701. package/dist/mining/actions/index.js +369 -0
  702. package/dist/mining/actions/index.js.map +1 -0
  703. package/dist/mining/estimate.d.ts +114 -0
  704. package/dist/mining/estimate.d.ts.map +1 -0
  705. package/dist/mining/estimate.js +127 -0
  706. package/dist/mining/estimate.js.map +1 -0
  707. package/dist/mining/index.d.ts +9 -2
  708. package/dist/mining/index.d.ts.map +1 -1
  709. package/dist/mining/index.js +10 -13
  710. package/dist/mining/index.js.map +1 -1
  711. package/dist/mining/profile.d.ts +82 -0
  712. package/dist/mining/profile.d.ts.map +1 -0
  713. package/dist/mining/profile.js +109 -0
  714. package/dist/mining/profile.js.map +1 -0
  715. package/dist/planning/assembly.d.ts +6 -1
  716. package/dist/planning/assembly.d.ts.map +1 -1
  717. package/dist/planning/assembly.js +12 -8
  718. package/dist/planning/assembly.js.map +1 -1
  719. package/dist/planning/execution.d.ts +19 -3
  720. package/dist/planning/execution.d.ts.map +1 -1
  721. package/dist/planning/execution.js +603 -72
  722. package/dist/planning/execution.js.map +1 -1
  723. package/dist/planning/index.d.ts +226 -165
  724. package/dist/planning/index.d.ts.map +1 -1
  725. package/dist/planning/index.js +31 -388
  726. package/dist/planning/index.js.map +1 -1
  727. package/dist/planning/plan-construction.d.ts +25 -0
  728. package/dist/planning/plan-construction.d.ts.map +1 -0
  729. package/dist/planning/plan-construction.js +143 -0
  730. package/dist/planning/plan-construction.js.map +1 -0
  731. package/dist/planning/plan-sequence-checkpoint.d.ts +9 -0
  732. package/dist/planning/plan-sequence-checkpoint.d.ts.map +1 -1
  733. package/dist/planning/plan-sequence-checkpoint.js +16 -7
  734. package/dist/planning/plan-sequence-checkpoint.js.map +1 -1
  735. package/dist/planning/plan-sequence-execution.d.ts +5 -0
  736. package/dist/planning/plan-sequence-execution.d.ts.map +1 -1
  737. package/dist/planning/plan-sequence-execution.js +74 -40
  738. package/dist/planning/plan-sequence-execution.js.map +1 -1
  739. package/dist/planning/plan-sequence.d.ts +2 -1
  740. package/dist/planning/plan-sequence.d.ts.map +1 -1
  741. package/dist/planning/plan-sequence.js +8 -1
  742. package/dist/planning/plan-sequence.js.map +1 -1
  743. package/dist/planning/plan-validation.d.ts +17 -0
  744. package/dist/planning/plan-validation.d.ts.map +1 -0
  745. package/dist/planning/plan-validation.js +139 -0
  746. package/dist/planning/plan-validation.js.map +1 -0
  747. package/dist/planning/simulation.d.ts +25 -1
  748. package/dist/planning/simulation.d.ts.map +1 -1
  749. package/dist/planning/simulation.js +111 -11
  750. package/dist/planning/simulation.js.map +1 -1
  751. package/dist/registry/cargo.d.ts +7 -12
  752. package/dist/registry/cargo.d.ts.map +1 -1
  753. package/dist/registry/cargo.js +19 -20
  754. package/dist/registry/cargo.js.map +1 -1
  755. package/dist/registry/docking.d.ts +10 -0
  756. package/dist/registry/docking.d.ts.map +1 -0
  757. package/dist/registry/docking.js +12 -0
  758. package/dist/registry/docking.js.map +1 -0
  759. package/dist/registry/index.d.ts +4 -0
  760. package/dist/registry/index.d.ts.map +1 -1
  761. package/dist/registry/index.js +190 -224
  762. package/dist/registry/index.js.map +1 -1
  763. package/dist/registry/onboarding.d.ts +10 -2
  764. package/dist/registry/onboarding.d.ts.map +1 -1
  765. package/dist/registry/onboarding.js +22 -7
  766. package/dist/registry/onboarding.js.map +1 -1
  767. package/dist/registry/scanning.d.ts +7 -0
  768. package/dist/registry/scanning.d.ts.map +1 -0
  769. package/dist/registry/scanning.js +13 -0
  770. package/dist/registry/scanning.js.map +1 -0
  771. package/dist/registry/ship-stats-snapshot.d.ts.map +1 -1
  772. package/dist/registry/ship-stats-snapshot.js +38 -24
  773. package/dist/registry/ship-stats-snapshot.js.map +1 -1
  774. package/dist/registry/ships.d.ts +22 -2
  775. package/dist/registry/ships.d.ts.map +1 -1
  776. package/dist/registry/ships.js +31 -4
  777. package/dist/registry/ships.js.map +1 -1
  778. package/dist/registry/xp-runtime.d.ts +4 -0
  779. package/dist/registry/xp-runtime.d.ts.map +1 -0
  780. package/dist/registry/xp-runtime.js +14 -0
  781. package/dist/registry/xp-runtime.js.map +1 -0
  782. package/dist/rewards/index.d.ts +11 -5
  783. package/dist/rewards/index.d.ts.map +1 -1
  784. package/dist/rewards/index.js +10 -21
  785. package/dist/rewards/index.js.map +1 -1
  786. package/dist/scanning/actions/index.d.ts +116 -0
  787. package/dist/scanning/actions/index.d.ts.map +1 -0
  788. package/dist/scanning/actions/index.js +191 -0
  789. package/dist/scanning/actions/index.js.map +1 -0
  790. package/dist/scanning/index.d.ts +10 -12
  791. package/dist/scanning/index.d.ts.map +1 -1
  792. package/dist/scanning/index.js +19 -23
  793. package/dist/scanning/index.js.map +1 -1
  794. package/dist/scanning/lifecycle.d.ts +77 -0
  795. package/dist/scanning/lifecycle.d.ts.map +1 -0
  796. package/dist/scanning/lifecycle.js +93 -0
  797. package/dist/scanning/lifecycle.js.map +1 -0
  798. package/dist/scanning/odds.d.ts +115 -0
  799. package/dist/scanning/odds.d.ts.map +1 -0
  800. package/dist/scanning/odds.js +294 -0
  801. package/dist/scanning/odds.js.map +1 -0
  802. package/dist/scanning/signals.d.ts +121 -0
  803. package/dist/scanning/signals.d.ts.map +1 -0
  804. package/dist/scanning/signals.js +171 -0
  805. package/dist/scanning/signals.js.map +1 -0
  806. package/dist/starbases/actions/index.d.ts +6 -4
  807. package/dist/starbases/actions/index.d.ts.map +1 -1
  808. package/dist/starbases/actions/index.js +34 -67
  809. package/dist/starbases/actions/index.js.map +1 -1
  810. package/dist/starbases/index.d.ts.map +1 -1
  811. package/dist/starbases/index.js +3 -11
  812. package/dist/starbases/index.js.map +1 -1
  813. package/dist/world/index.d.ts +108 -5
  814. package/dist/world/index.d.ts.map +1 -1
  815. package/dist/world/index.js +110 -15
  816. package/dist/world/index.js.map +1 -1
  817. package/dist/world/planet-claim-stake-plots.d.ts +139 -0
  818. package/dist/world/planet-claim-stake-plots.d.ts.map +1 -0
  819. package/dist/world/planet-claim-stake-plots.js +117 -0
  820. package/dist/world/planet-claim-stake-plots.js.map +1 -0
  821. package/dist/world/starbase-status.d.ts +176 -0
  822. package/dist/world/starbase-status.d.ts.map +1 -0
  823. package/dist/world/starbase-status.js +153 -0
  824. package/dist/world/starbase-status.js.map +1 -0
  825. package/package.json +10 -2
@@ -1,20 +1,31 @@
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';
22
+ import { CLOCK_ADDRESS, readClock, } from '../../internal/planning/faction-enrollment.js';
17
23
  import { resolveCargo, } from '../../registry/index.js';
24
+ import { accountAbsentPrecondition, accountStatePrecondition, } from '../../internal/planning/account-state.js';
25
+ import { stimulantStatId } from '../../internal/c4/stimulant.js';
26
+ import { readCombatStorageAction } from '../../internal/planning/combat-storage-actions.js';
27
+ import { RENT_ADDRESS } from '../../internal/planning/rent.js';
28
+ import { planStorageFunding } from '../../internal/planning/storage-actions.js';
18
29
  function invalid(field, value, acceptedRange, remedy) {
19
30
  throw new InvalidActionInputError(field, value, acceptedRange, remedy);
20
31
  }
@@ -35,19 +46,13 @@ function assertKeys(value, field, required, optional = []) {
35
46
  function validateOptions(value) {
36
47
  const options = readRecord(value, 'options');
37
48
  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);
49
+ const authorization = readPlanAuthorization(options.authorization);
42
50
  return { authorization };
43
51
  }
44
52
  function validateAttackOptions(value) {
45
53
  const options = readRecord(value, 'options');
46
54
  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);
55
+ const authorization = readPlanAuthorization(options.authorization);
51
56
  if (typeof options.loot !== 'string' || !isAddress(options.loot)) {
52
57
  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
58
  }
@@ -66,10 +71,7 @@ function validateAttackStance(value) {
66
71
  function validateRetrieveOptions(value) {
67
72
  const options = readRecord(value, 'options');
68
73
  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);
74
+ const authorization = readPlanAuthorization(options.authorization);
73
75
  if (typeof options.atUnixSeconds !== 'bigint' || options.atUnixSeconds < 0n) {
74
76
  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
77
  }
@@ -119,13 +121,21 @@ function validateLootSelection(value, loot, fleet, retrievingProfile, atUnixSeco
119
121
  if (item === undefined) {
120
122
  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
123
  }
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);
124
+ // The retriever is the Fleet's controlling Profile. Reward cargo stays
125
+ // locked to the destroying Profile until it expires and is swept; ordinary
126
+ // cargo is exclusive to the destroying Profile only until the unlock time.
127
+ const destroyer = item.destroyer?.address;
128
+ if (item.rewardReclaimAtUnixSeconds > 0n) {
129
+ if (destroyer !== retrievingProfile) {
130
+ 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);
131
+ }
132
+ if (atUnixSeconds > item.rewardReclaimAtUnixSeconds) {
133
+ 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);
134
+ }
125
135
  }
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);
136
+ else if (atUnixSeconds < item.exclusivityUnlockAtUnixSeconds &&
137
+ destroyer !== retrievingProfile) {
138
+ 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
139
  }
130
140
  const cargoRequests = denseArray(target.cargo, `${field}.cargo`);
131
141
  if (cargoRequests.length === 0 || cargoRequests.length > 65_536) {
@@ -162,9 +172,7 @@ function validateLootSelection(value, loot, fleet, retrievingProfile, atUnixSeco
162
172
  }
163
173
  generated.push([itemIndex, encoded]);
164
174
  }
165
- const instructionDataLength = sage
166
- .getRetrieveLootInstructionDataEncoder()
167
- .encode({
175
+ const instructionDataLength = getRetrieveLootInstructionDataEncoder().encode({
168
176
  keyIndex: 0,
169
177
  want: generated.map(([itemIndex, cargo]) => [
170
178
  itemIndex,
@@ -184,7 +192,7 @@ function requireAccount(account, address, message) {
184
192
  }
185
193
  function stimulantFingerprint(stimulant) {
186
194
  const effects = stimulant.effects
187
- .map(({ charges, deltaBps, stackRuleId, statId }) => `${String(charges)}:${String(deltaBps)}:${String(stackRuleId)}:${String(statId)}`)
195
+ .map(({ charges, deltaBps, stackRule, stat }) => `${String(charges)}:${String(deltaBps)}:${stackRule}:${stat}`)
188
196
  .join(',');
189
197
  return [
190
198
  stimulant.cargo.id,
@@ -209,35 +217,14 @@ function rawCargoFingerprint(fleet) {
209
217
  .join(',');
210
218
  return [fleet.cargoHold.seqId, fleet.cargoHold.storageCost, items].join('|');
211
219
  }
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
220
  /** Plans application of one configured combat stimulant without predicting its effects.
236
221
  *
237
222
  * The planner validates Fleet ownership and Game membership, current catalog
238
- * membership, known cargo balance, crewed non-destroyed state, and fresh
239
- * whole-account Fleet state. Permission, stacking, charge application, and
240
- * combat arithmetic remain chain-authoritative.
223
+ * membership, known cargo balance, a crewed Fleet that is neither destroyed
224
+ * nor respawning, and fresh whole-account Fleet state. Only stimulants whose
225
+ * effects use the `refresh` stack rule are planned, as the game applies no
226
+ * other rule yet. Permission, charge application, and combat arithmetic remain
227
+ * chain-authoritative.
241
228
  *
242
229
  * @example
243
230
  * ```ts
@@ -263,8 +250,13 @@ export async function planFleetApplyCombatStimulant(ctx, fleet, stimulant, input
263
250
  if (fleet.game !== game) {
264
251
  fail(`Fleet ${fleet.address} belongs to Game ${fleet.game}, not configured Game ${game}. Refresh the Fleet through this context and retry.`, fleet.address);
265
252
  }
266
- if (fleet.state.kind === 'destroyed') {
267
- fail(`Fleet ${fleet.name} (${fleet.address}) is destroyed and cannot apply a combat stimulant. Respawn the Fleet, refresh it, and retry.`, fleet.address);
253
+ if (fleet.state.kind === 'destroyed' || fleet.state.kind === 'respawn') {
254
+ fail(`Fleet ${fleet.name} (${fleet.address}) is ${fleet.state.kind} and cannot apply a combat stimulant. Wait until it is back at a Starbase, refresh it, and retry.`, fleet.address);
255
+ }
256
+ // The game applies only refresh-rule effects and refuses the others.
257
+ const unsupported = stimulant.effects.find(({ stackRule }) => stackRule !== 'refresh');
258
+ if (unsupported !== undefined) {
259
+ fail(`Stimulant ${stimulant.cargo.name} has a ${unsupported.stackRule} effect on ${unsupported.stat}; the game applies only refresh effects. Choose another stimulant.`, fleet.address);
268
260
  }
269
261
  const combat = await readGameCombatConfiguration(ctx);
270
262
  const definitions = await Promise.all(combat.data.stimulantDefinitions.definitions.map(async (definition) => ({
@@ -310,41 +302,32 @@ export async function planFleetApplyCombatStimulant(ctx, fleet, stimulant, input
310
302
  if (current.crewCount <= 0) {
311
303
  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
304
  }
313
- 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({
305
+ const instruction = adaptApplyCombatStimulantInstruction({
306
+ authorization: options.authorization,
307
+ fleet: fleet.address,
308
+ game,
309
+ stimCargoId: catalogued.cargo.id,
310
+ });
311
+ // A stimulant for a stat without an entry grows the Fleet; the program funds
312
+ // that from the Profile vault with the signing key.
313
+ const storage = await planFleetStorage(ctx, instruction, [account.address], options.authorization.profile, 'combat stimulant', catalogued.effects.map(({ stat }) => stimulantStatId(stat)));
314
+ 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. ${storage.disclosure}`;
315
+ return buildPlannerPlan({
315
316
  kind: 'combat.apply-stimulant',
316
317
  preconditions: [
317
- await precondition(account, `Fleet ${fleet.name} retains its configured Game, owning Profile, supported crewed state, and known ${catalogued.cargo.name} cargo balance.`),
318
+ await accountStatePrecondition(account, `Fleet ${fleet.name} retains its configured Game, owning Profile, supported crewed state, and known ${catalogued.cargo.name} cargo balance.`),
319
+ storage.guard,
318
320
  ],
319
321
  steps: [
320
322
  {
321
323
  describes: description,
322
- instruction: adaptApplyCombatStimulantInstruction({
323
- authorization: options.authorization,
324
- fleet: fleet.address,
325
- game,
326
- stimCargoId: catalogued.cargo.id,
327
- }),
324
+ instruction,
328
325
  signers: [options.authorization.authority],
329
326
  },
330
327
  ],
331
328
  summary: description,
332
329
  });
333
330
  }
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
331
  function shipFingerprint(fleet) {
349
332
  return fleet.ships
350
333
  .map(({ id, quantity }) => `${String(id)}:${String(quantity)}`)
@@ -400,18 +383,36 @@ async function validateCurrentAttackFleet(fleet, account) {
400
383
  }
401
384
  return currentAccount;
402
385
  }
386
+ /** The program attacks only with an attacker that is Idle or subwarping at
387
+ * chain time (a finished warp counts as Idle), carries its required crew, and
388
+ * has usable AP: stored AP refills right after an attack, but stays unusable
389
+ * until the reload completes. */
390
+ function validateAttackerReadiness(fleet, account, clock) {
391
+ const now = readClock(requireAccount(clock, CLOCK_ADDRESS, 'The Clock sysvar is missing. Refresh chain time and retry the attack.'));
392
+ const current = fleetAccountDefinition.decode(account);
393
+ const label = `Attacking Fleet ${fleet.name} (${fleet.address})`;
394
+ const { state } = current;
395
+ if (state.kind !== 'idle' &&
396
+ state.kind !== 'subwarp' &&
397
+ !(state.kind === 'warp' && now >= state.arrivesAtUnixSeconds))
398
+ fail(`${label} is ${state.kind === 'warp' ? 'still warping' : state.kind}; only an Idle or subwarping Fleet can attack. Wait or move it into space, refresh the Fleet, and retry.`, fleet.address);
399
+ if (current.crewCount < current.stats.misc.requiredCrew)
400
+ fail(`${label} has ${String(current.crewCount)} crew but needs ${String(current.stats.misc.requiredCrew)} to attack. Load crew, refresh the Fleet, and retry.`, fleet.address);
401
+ // Zero stored AP is refused earlier, and the fresh account matches the snapshot.
402
+ if (now < current.apReloadExpiresAt)
403
+ fail(`${label} has no usable ability power at chain time ${String(now)}: stored AP ${String(current.ap)} with reload completing at ${String(current.apReloadExpiresAt)}. Wait for the reload, refresh the Fleet, and retry.`, fleet.address);
404
+ }
403
405
  async function optionalCrewBinding(ctx, fleet) {
404
406
  const address = await deriveFleetCrewBindingAddress(fleet.address);
405
407
  const [envelope] = await ctx.data.readMany(fleetCrewBindingAccountDefinition, [address]);
406
408
  if (envelope !== undefined &&
407
- (envelope.data.fleet !== fleet.address ||
408
- envelope.data.ownerProfile !== fleet.ownerProfile.address)) {
409
+ !matchesFleetCrewBindingIdentity(envelope.data, fleet.address, fleet.ownerProfile.address)) {
409
410
  fail(`FleetCrewBinding ${address} does not belong to Fleet ${fleet.address} and Profile ${fleet.ownerProfile.address}. Refresh the Fleet crew relationship and retry.`, address);
410
411
  }
411
412
  return envelope?.address;
412
413
  }
413
414
  async function resolveRewardAccounts(ctx, fleet, registry, config, epochIndex) {
414
- const resolvedFaction = factionId(fleet);
415
+ const resolvedFaction = fleet.npcFactionId > 0 ? fleet.npcFactionId : factionValue(fleet.faction);
415
416
  if (resolvedFaction === 0)
416
417
  return { config, registry };
417
418
  const [epochAddress, contributionAddress] = await Promise.all([
@@ -446,35 +447,86 @@ async function resolveRewardAccounts(ctx, fleet, registry, config, epochIndex) {
446
447
  registry,
447
448
  };
448
449
  }
449
- async function resolveNpcAccounts(ctx, fleet, requireFactionAccount) {
450
+ /** Reads and requires an NPC Fleet's canonical FactionOwnership and, when
451
+ * `withFaction`, its Faction account; a player Fleet has neither. */
452
+ async function resolveNpcAccounts(ctx, fleet, withFaction) {
450
453
  if (fleet.npcFactionId === 0)
451
454
  return {};
452
- const ownershipAddress = await deriveFactionOwnershipAddress(fleet.game, 'fleet', fleet.address);
453
- const [ownership] = await ctx.data.readMany(factionOwnershipAccountDefinition, [ownershipAddress]);
455
+ const addresses = await Promise.all([
456
+ deriveFactionOwnershipAddress(fleet.game, 'fleet', fleet.address),
457
+ ...(withFaction
458
+ ? [deriveFactionAccountAddress(fleet.game, fleet.npcFactionId)]
459
+ : []),
460
+ ]);
461
+ const [ownership, faction] = await readContextRawAccounts(ctx, addresses);
462
+ const ownershipData = ownership && factionOwnershipAccountDefinition.decode(ownership);
454
463
  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 };
464
+ ownershipData?.game !== fleet.game ||
465
+ ownershipData.asset.kind !== 'fleet' ||
466
+ ownershipData.asset.fleet !== fleet.address ||
467
+ ownershipData.controllingFactionId !== fleet.npcFactionId) {
468
+ 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]);
469
+ }
470
+ if (!withFaction)
471
+ return { ownership };
472
+ const factionData = faction && factionAccountDefinition.decode(faction);
473
+ if (faction === undefined ||
474
+ factionData?.game !== fleet.game ||
475
+ factionData.factionId !== fleet.npcFactionId) {
476
+ 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]);
477
+ }
478
+ return { faction, ownership };
470
479
  }
471
480
  function generatedStance(stance) {
472
481
  return {
473
482
  ammoUsage: stance.ammoUsage === 'none' ? 0 : stance.ammoUsage === 'light' ? 1 : 2,
474
483
  };
475
484
  }
485
+ /** Requires a live Fleet snapshot of the configured Game with known AP, crew
486
+ * and ship composition; an attacking Fleet also needs AP available. */
487
+ function validateAttackFleet(fleet, role, game) {
488
+ const label = `The ${role} Fleet ${fleet.name} (${fleet.address})`;
489
+ if (fleet.game !== game) {
490
+ fail(`${label} belongs to Game ${fleet.game}, not configured Game ${game}. Refresh the Fleet through this context and retry.`, fleet.address);
491
+ }
492
+ if (fleet.state.kind === 'destroyed') {
493
+ fail(`${label} is destroyed and cannot participate in this attack. Refresh the Fleet after respawn and retry.`, fleet.address);
494
+ }
495
+ if (!Number.isSafeInteger(fleet.ap) ||
496
+ fleet.ap < 0 ||
497
+ !Number.isSafeInteger(fleet.crewCount) ||
498
+ fleet.crewCount <= 0) {
499
+ fail(`${label} has unknown or invalid AP or crew state. Refresh the Fleet through this context and retry.`, fleet.address);
500
+ }
501
+ if (fleet.ships.length === 0 ||
502
+ fleet.ships.some(({ quantity }) => quantity <= 0n)) {
503
+ fail(`${label} has no valid known ship composition. Refresh Fleet composition and retry.`, fleet.address);
504
+ }
505
+ if (role === 'attacking' && fleet.ap === 0) {
506
+ fail(`${label} has no known AP available. Wait for AP reload, refresh the Fleet, and retry.`, fleet.address);
507
+ }
508
+ }
509
+ /** Validates the inputs every attack shares: the stance, an attacking Fleet
510
+ * owned by the authorization Profile that can attack, and a new Loot address
511
+ * distinct from the authorization signers. */
512
+ function validateAttack(ctx, attacker, inputStance, inputOptions) {
513
+ const options = validateAttackOptions(inputOptions);
514
+ const stance = validateAttackStance(inputStance);
515
+ const game = requireGameAddress(ctx);
516
+ if (attacker.ownerProfile.address !== options.authorization.profile) {
517
+ fail(`Attacking Fleet ${attacker.address} does not belong to authorization Profile ${options.authorization.profile}. Choose an owned Fleet and retry.`, attacker.address);
518
+ }
519
+ if (options.loot === options.authorization.authority ||
520
+ options.loot === options.authorization.profile) {
521
+ 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);
522
+ }
523
+ validateAttackFleet(attacker, 'attacking', game);
524
+ return { game, options, stance };
525
+ }
476
526
  /** Plans one singleton Fleet-on-Fleet attack without predicting its outcome.
477
527
  *
528
+ * At chain time the attacker must be Idle or subwarping (a finished warp
529
+ * counts as Idle), carry its required crew, and have finished reloading AP.
478
530
  * Range, randomness, recent slot hashes, final combat arithmetic, and chain
479
531
  * races remain authoritative. This Plan cannot be combined with another
480
532
  * gameplay instruction because the generated program contract requires a
@@ -497,47 +549,16 @@ function generatedStance(stance) {
497
549
  * ```
498
550
  */
499
551
  export async function planFleetAttackFleet(ctx, attacker, defender, inputStance, inputOptions) {
500
- const options = validateAttackOptions(inputOptions);
501
- const stance = validateAttackStance(inputStance);
502
- const game = requireGameAddress(ctx);
552
+ const { game, options, stance } = validateAttack(ctx, attacker, inputStance, inputOptions);
503
553
  if (attacker.address === defender.address) {
504
554
  fail(`Fleet ${attacker.address} cannot attack itself. Choose a distinct defending Fleet and retry.`, attacker.address);
505
555
  }
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
- }
556
+ validateAttackFleet(defender, 'defending', game);
537
557
  const currentAccounts = await readContextRawAccounts(ctx, [
538
558
  attacker.address,
539
559
  defender.address,
540
560
  options.loot,
561
+ CLOCK_ADDRESS,
541
562
  ]);
542
563
  if (currentAccounts[2] !== undefined) {
543
564
  fail(`Loot account ${options.loot} already exists. Generate a new unused Loot signer address and retry.`, options.loot);
@@ -546,6 +567,7 @@ export async function planFleetAttackFleet(ctx, attacker, defender, inputStance,
546
567
  validateCurrentAttackFleet(attacker, currentAccounts[0]),
547
568
  validateCurrentAttackFleet(defender, currentAccounts[1]),
548
569
  ]);
570
+ validateAttackerReadiness(attacker, attackerAccount, currentAccounts[3]);
549
571
  const registryAddress = await deriveAtlasRewardRegistryAddress(game);
550
572
  const registry = await ctx.data.read(atlasRewardRegistryAccountDefinition, registryAddress);
551
573
  if (registry.data.game !== game) {
@@ -565,58 +587,93 @@ export async function planFleetAttackFleet(ctx, attacker, defender, inputStance,
565
587
  deriveRegionTrackerAddress(game),
566
588
  deriveFactionRelationTrackerAddress(game),
567
589
  ]);
590
+ const actorIntent = {
591
+ address: attacker.address,
592
+ defender: defender.address,
593
+ game,
594
+ profile: attacker.ownerProfile.address,
595
+ defenderProfile: defender.ownerProfile.address,
596
+ };
597
+ await validateFleetAttackActors(ctx, actorIntent);
598
+ const versions = new Map();
599
+ const attackerXp = await resolveXpRuntime(ctx, { game, character, profile: attacker.ownerProfile.address }, versions);
600
+ const defenderXp = character === defenderCharacter
601
+ ? attackerXp
602
+ : await resolveXpRuntime(ctx, {
603
+ game,
604
+ character: defenderCharacter,
605
+ profile: defender.ownerProfile.address,
606
+ }, versions);
607
+ const xpGuards = [...new Set([attackerXp, defenderXp])].map((xp) => ({
608
+ kind: 'xp-runtime',
609
+ address: game,
610
+ intent: xp.intent,
611
+ accounts: xp.accounts,
612
+ describes: 'Both operator XP budgets remain canonical and reconciled; earned XP and bank balances may change.',
613
+ }));
614
+ const instruction = adaptAttackFleetInstruction({
615
+ ...(attackerNpc.faction === undefined
616
+ ? {}
617
+ : { attackerFactionAccount: attackerNpc.faction.address }),
618
+ ...(attackerNpc.ownership === undefined
619
+ ? {}
620
+ : { attackerFleetOwnership: attackerNpc.ownership.address }),
621
+ attackerRewardsConfig: attackerRewards.config,
622
+ ...(attackerRewards.contribution === undefined
623
+ ? {}
624
+ : { attackerRewardsContribution: attackerRewards.contribution }),
625
+ ...(attackerRewards.epoch === undefined
626
+ ? {}
627
+ : { attackerRewardsEpoch: attackerRewards.epoch }),
628
+ attackerRewardsRegistry: attackerRewards.registry,
629
+ ...(defender.state.kind === 'mining'
630
+ ? { asteroid: defender.state.asteroid.address }
631
+ : {}),
632
+ authorization: options.authorization,
633
+ attackerXpBudget: attackerXp.accounts.xpBudget,
634
+ defenderXpBudget: defenderXp.accounts.xpBudget,
635
+ xpBudgetConfig: attackerXp.accounts.xpBudgetConfig,
636
+ character,
637
+ ...(crewBinding === undefined ? {} : { crewBinding }),
638
+ defenderCharacter,
639
+ ...(defenderNpc.ownership === undefined
640
+ ? {}
641
+ : { defenderFleetOwnership: defenderNpc.ownership.address }),
642
+ defenderRewardsConfig: defenderRewards.config,
643
+ ...(defenderRewards.contribution === undefined
644
+ ? {}
645
+ : { defenderRewardsContribution: defenderRewards.contribution }),
646
+ ...(defenderRewards.epoch === undefined
647
+ ? {}
648
+ : { defenderRewardsEpoch: defenderRewards.epoch }),
649
+ defenderRewardsRegistry: defenderRewards.registry,
650
+ defendingFleet: defender.address,
651
+ factionRelationTracker,
652
+ fleet: attacker.address,
653
+ game,
654
+ loot: options.loot,
655
+ recentSlothashes: 'SysvarS1otHashes111111111111111111111111111',
656
+ regionTracker,
657
+ stance: generatedStance(stance),
658
+ });
568
659
  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({
660
+ return buildPlannerPlan({
570
661
  kind: 'combat.attack-fleet',
571
662
  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.`),
663
+ {
664
+ kind: 'fleet-attack',
665
+ ...actorIntent,
666
+ instructionKey: fleetAttackInstructionKey(instruction),
667
+ describes: 'The exact attack instruction and both canonical operators remain bound.',
668
+ },
669
+ ...xpGuards,
670
+ await accountStatePrecondition(attackerAccount, `Attacking Fleet ${attacker.name} retains its owner, Game, live state, crew, AP, faction, and ship composition.`),
671
+ await accountStatePrecondition(defenderAccount, `Defending Fleet ${defender.name} retains its owner, Game, live state, crew, faction, and ship composition.`),
574
672
  ],
575
673
  steps: [
576
674
  {
577
675
  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
- }),
676
+ instruction,
620
677
  semantics: [{ kind: 'exclusive', scope: 'transaction' }],
621
678
  signers: [options.authorization.authority, options.loot],
622
679
  },
@@ -639,26 +696,20 @@ function systemFingerprint(system) {
639
696
  version: system.version,
640
697
  }, (_key, value) => typeof value === 'bigint' ? value.toString() : value);
641
698
  }
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
699
  /** Plans one singleton Fleet-on-Starbase attack without predicting its outcome.
655
700
  *
701
+ * At chain time the attacker must be Idle or subwarping (a finished warp
702
+ * counts as Idle), carry its required crew, and have finished reloading AP.
656
703
  * The planner validates the owned attacking Fleet, canonical target System and
657
704
  * nested shared Starbase, configured faction ownership mode, reward
658
705
  * configuration, and the optional dynamic-NPC capture economy. Range,
659
706
  * capture-cost debit outcome, randomness, damage, rewards, and final
660
707
  * admissibility remain chain-authoritative.
661
708
  *
709
+ * Requires Disabled rent: the Game's rent catalog and the target System's
710
+ * Starbase-level rent history must not exist, and both stay guarded absent until
711
+ * signing.
712
+ *
662
713
  * @example
663
714
  * ```ts
664
715
  * declare const ctx: SageContext;
@@ -676,32 +727,7 @@ function starbaseFactionId(owner) {
676
727
  * ```
677
728
  */
678
729
  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
- }
730
+ const { game, options, stance } = validateAttack(ctx, attacker, inputStance, inputOptions);
705
731
  if (target.game !== game) {
706
732
  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
733
  }
@@ -720,9 +746,10 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
720
746
  deriveRegionTrackerAddress(game),
721
747
  deriveFleetCrewBindingAddress(attacker.address),
722
748
  ]);
723
- const [probeRelationsAccount, probeRegistryAccount] = await readContextRawAccounts(ctx, [
724
- relationTrackerAddress,
725
- registryAddress,
749
+ const [[probeRelationsAccount, probeRegistryAccount], attackerNpc, rent] = await Promise.all([
750
+ readContextRawAccounts(ctx, [relationTrackerAddress, registryAddress]),
751
+ resolveNpcAccounts(ctx, attacker, true),
752
+ requireDisabledLevelRent(ctx, game, target, 'the Starbase attack'),
726
753
  ]);
727
754
  const probeRelations = factionRelationTrackerAccountDefinition.decode(requireAccount(probeRelationsAccount, relationTrackerAddress, `FactionRelationTracker ${relationTrackerAddress} is missing. Refresh faction relationships and retry.`));
728
755
  const probeRegistry = atlasRewardRegistryAccountDefinition.decode(requireAccount(probeRegistryAccount, registryAddress, `AtlasRewardRegistry ${registryAddress} is missing. Refresh reward configuration and retry.`));
@@ -733,12 +760,6 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
733
760
  fail(`AtlasRewardRegistry ${registryAddress} belongs to another Game. Refresh the configured reward registry and retry.`, registryAddress);
734
761
  }
735
762
  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
763
  const requiresNpcEconomy = attacker.npcFactionId > 0 &&
743
764
  probeRelations.dynamicCaptureEnabled &&
744
765
  probeRelations.nemesisActive;
@@ -762,10 +783,9 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
762
783
  character,
763
784
  regionTracker,
764
785
  crewBindingAddress,
765
- ...(attackerOwnership === undefined ? [] : [attackerOwnership]),
766
- ...(attackerFaction === undefined ? [] : [attackerFaction]),
767
786
  ...(factionEconomicsConfig === undefined ? [] : [factionEconomicsConfig]),
768
787
  ...(captorTreasury === undefined ? [] : [captorTreasury]),
788
+ CLOCK_ADDRESS,
769
789
  ];
770
790
  const dependencyAccounts = await readContextRawAccounts(ctx, dependencyAddresses);
771
791
  const current = new Map(dependencyAddresses.map((address, index) => [
@@ -776,6 +796,7 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
776
796
  fail(`Loot account ${options.loot} already exists. Generate a new unused Loot signer address and retry.`, options.loot);
777
797
  }
778
798
  const attackerAccount = await validateCurrentAttackFleet(attacker, current.get(attacker.address));
799
+ validateAttackerReadiness(attacker, attackerAccount, current.get(CLOCK_ADDRESS));
779
800
  const systemAccount = requireAccount(current.get(target.address), target.address, `Target Star System ${target.name} (${target.address}) is missing. Refresh world state and retry the attack.`);
780
801
  const currentSystem = starSystemAccountDefinition.decode(systemAccount);
781
802
  if ((await deriveStarSystemAddress(currentSystem.game, currentSystem.systemId)) !== target.address ||
@@ -799,7 +820,8 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
799
820
  if (ownership === undefined && relations.dynamicCaptureEnabled) {
800
821
  fail(`Target Starbase ${target.address} requires canonical FactionOwnership while dynamic capture is enabled. Refresh Starbase ownership and retry.`, ownershipAddress);
801
822
  }
802
- const legacyOwner = starbaseFactionId(target.starbase.owner);
823
+ // KingSystemTracker records an unaligned owner as null.
824
+ const legacyOwner = factionValue(target.starbase.owner) || null;
803
825
  if (ownership !== undefined &&
804
826
  (ownership.game !== game ||
805
827
  ownership.asset.kind !== 'starbase' ||
@@ -844,32 +866,10 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
844
866
  const crewBinding = crewBindingAccount === undefined ? undefined : crewBindingAddress;
845
867
  if (crewBindingAccount !== undefined) {
846
868
  const data = fleetCrewBindingAccountDefinition.decode(crewBindingAccount);
847
- if (data.fleet !== attacker.address ||
848
- data.ownerProfile !== attacker.ownerProfile.address) {
869
+ if (!matchesFleetCrewBindingIdentity(data, attacker.address, attacker.ownerProfile.address)) {
849
870
  fail(`FleetCrewBinding ${crewBindingAddress} does not belong to Fleet ${attacker.address} and Profile ${attacker.ownerProfile.address}. Refresh the Fleet crew relationship and retry.`, crewBindingAddress);
850
871
  }
851
872
  }
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
873
  let economicsAccount;
874
874
  let treasuryAccount;
875
875
  if (factionEconomicsConfig !== undefined && captorTreasury !== undefined) {
@@ -928,21 +928,13 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
928
928
  'The optional Fleet crew binding remains unchanged.',
929
929
  ],
930
930
  ]),
931
- ...(attackerOwnershipAccount === undefined
931
+ ...(attackerNpc.ownership === undefined
932
932
  ? []
933
- : [
934
- [
935
- attackerOwnershipAccount,
936
- 'NPC Fleet ownership remains unchanged.',
937
- ],
938
- ]),
939
- ...(attackerFactionAccount === undefined
933
+ : [[attackerNpc.ownership, 'NPC Fleet ownership remains unchanged.']]),
934
+ ...(attackerNpc.faction === undefined
940
935
  ? []
941
936
  : [
942
- [
943
- attackerFactionAccount,
944
- 'The NPC faction account remains unchanged.',
945
- ],
937
+ [attackerNpc.faction, 'The NPC faction account remains unchanged.'],
946
938
  ]),
947
939
  ...(economicsAccount === undefined
948
940
  ? []
@@ -960,29 +952,42 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
960
952
  'The dynamic-capture treasury remains unchanged.',
961
953
  ],
962
954
  ]),
963
- ].map(([account, describes]) => precondition(account, describes)));
955
+ ].map(([account, describes]) => accountStatePrecondition(account, describes)));
964
956
  const absencePreconditions = [
965
- absentPrecondition(options.loot, `Loot account ${options.loot} remains absent until execution.`),
957
+ accountAbsentPrecondition(options.loot, `Loot account ${options.loot} remains absent until execution.`),
966
958
  ...(crewBindingAccount === undefined
967
959
  ? [
968
- absentPrecondition(crewBindingAddress, 'Optional Fleet crew binding remains absent.'),
960
+ accountAbsentPrecondition(crewBindingAddress, 'Optional Fleet crew binding remains absent.'),
969
961
  ]
970
962
  : []),
971
963
  ];
964
+ const runtime = await resolveActionRuntime(ctx, {
965
+ mode: 'starbase-attack',
966
+ game,
967
+ system: target.address,
968
+ starbaseSeqId: starSystemAccountDefinition.decode(systemAccount).sequenceId,
969
+ character,
970
+ });
972
971
  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({
972
+ return buildPlannerPlan({
974
973
  kind: 'combat.attack-starbase',
975
- preconditions: [...statePreconditions, ...absencePreconditions],
974
+ preconditions: [
975
+ ...statePreconditions,
976
+ ...absencePreconditions,
977
+ ...rent.guards,
978
+ ...runtime.guards,
979
+ ],
976
980
  steps: [
977
981
  {
978
- describes: description,
982
+ describes: `${description} ${runtime.description}`,
979
983
  instruction: adaptAttackStarbaseInstruction({
980
- ...(attackerNpc.factionAccount === undefined
984
+ ...runtime.accounts,
985
+ ...(attackerNpc.faction === undefined
981
986
  ? {}
982
- : { attackerFactionAccount: attackerNpc.factionAccount }),
987
+ : { attackerFactionAccount: attackerNpc.faction.address }),
983
988
  ...(attackerNpc.ownership === undefined
984
989
  ? {}
985
- : { attackerFleetOwnership: attackerNpc.ownership }),
990
+ : { attackerFleetOwnership: attackerNpc.ownership.address }),
986
991
  authorization: options.authorization,
987
992
  ...(captorTreasury === undefined ? {} : { captorTreasury }),
988
993
  character,
@@ -1000,6 +1005,7 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
1000
1005
  loot: options.loot,
1001
1006
  recentSlothashes: 'SysvarS1otHashes111111111111111111111111111',
1002
1007
  regionTracker,
1008
+ ...rent.accounts,
1003
1009
  rewardConfig: rewardConfigAddress,
1004
1010
  rewardRegistry: registryAddress,
1005
1011
  stance: generatedStance(stance),
@@ -1009,7 +1015,7 @@ export async function planFleetAttackStarbase(ctx, attacker, target, inputStance
1009
1015
  signers: [options.authorization.authority, options.loot],
1010
1016
  },
1011
1017
  ],
1012
- summary: description,
1018
+ summary: `${description} ${runtime.description}`,
1013
1019
  });
1014
1020
  }
1015
1021
  function lootSnapshotFingerprint(loot) {
@@ -1021,11 +1027,11 @@ function lootSnapshotFingerprint(loot) {
1021
1027
  loot.coordinates.x,
1022
1028
  loot.coordinates.y,
1023
1029
  ...loot.items.map((item) => [
1024
- item.destroyer.address,
1030
+ item.destroyer?.address ?? '',
1025
1031
  item.exclusivityUnlockAtUnixSeconds,
1026
1032
  item.rewardReclaimAtUnixSeconds,
1027
1033
  item.inventory.sequenceId,
1028
- item.inventory.storageCostRaw,
1034
+ item.inventory.usedStorageUnitsRaw,
1029
1035
  ...item.inventory.items
1030
1036
  .map(({ cargo, quantityRaw }) => `${String(cargo.id)}:${String(quantityRaw)}`)
1031
1037
  .sort(),
@@ -1041,11 +1047,11 @@ function rawLootFingerprint(address, loot) {
1041
1047
  loot.coordinates.x,
1042
1048
  loot.coordinates.y,
1043
1049
  ...loot.items.map((item) => [
1044
- item.destroyer,
1050
+ item.destroyer ?? '',
1045
1051
  item.exclusivityUnlockAtUnixSeconds,
1046
1052
  item.rewardReclaimAtUnixSeconds,
1047
1053
  item.inventory.sequenceId,
1048
- item.inventory.storageCostRaw,
1054
+ item.inventory.usedStorageUnitsRaw,
1049
1055
  ...item.inventory.amounts
1050
1056
  .map(({ amount, cargoId }) => `${String(cargoId)}:${String(amount)}`)
1051
1057
  .sort(),
@@ -1054,10 +1060,12 @@ function rawLootFingerprint(address, loot) {
1054
1060
  }
1055
1061
  /** Plans one transaction-exclusive retrieval from a loaded Loot snapshot.
1056
1062
  *
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.
1063
+ * The planner validates the owned idle Fleet, its normalized crew and usable
1064
+ * ability power at `atUnixSeconds`, Loot identity, destroyer exclusivity and
1065
+ * reward locks against the authorization Profile, and every requested known
1066
+ * quantity. Retrieval spends the Fleet's whole ability power pool. Range,
1067
+ * recent-slot inputs, destination capacity, intervening races, and final
1068
+ * acquired quantities remain chain-authoritative.
1061
1069
  *
1062
1070
  * @example
1063
1071
  * ```ts
@@ -1105,6 +1113,13 @@ export async function planFleetRetrieveLoot(ctx, fleet, loot, inputWant, inputOp
1105
1113
  currentFleet.crewCount !== fleet.crewCount) {
1106
1114
  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
1115
  }
1116
+ if (currentFleet.crewCount < currentFleet.stats.misc.requiredCrew) {
1117
+ 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);
1118
+ }
1119
+ if (currentFleet.ap <= 0 ||
1120
+ options.atUnixSeconds < currentFleet.apReloadExpiresAt) {
1121
+ 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);
1122
+ }
1108
1123
  const lootAccount = requireAccount(lootAccountValue, loot.address, `Loot ${loot.address} is no longer available. Refresh Loot discovery and choose an available account before retrying.`);
1109
1124
  const currentLoot = lootAccountDefinition.decode(lootAccount);
1110
1125
  if (rawLootFingerprint(lootAccount.address, currentLoot) !==
@@ -1114,28 +1129,33 @@ export async function planFleetRetrieveLoot(ctx, fleet, loot, inputWant, inputOp
1114
1129
  const lootCreator = loot.profile.address === options.authorization.profile
1115
1130
  ? undefined
1116
1131
  : 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({
1132
+ const instruction = adaptRetrieveLootInstruction({
1133
+ authorization: options.authorization,
1134
+ fleet: fleet.address,
1135
+ game,
1136
+ loot: loot.address,
1137
+ ...(lootCreator === undefined ? {} : { lootCreator }),
1138
+ recentSlothashes: 'SysvarS1otHashes111111111111111111111111111',
1139
+ want: selection.generated.map(([itemIndex, cargo]) => [
1140
+ itemIndex,
1141
+ cargo.map(([cargoId, quantity]) => [cargoId, quantity]),
1142
+ ]),
1143
+ });
1144
+ // Retrieved cargo can open hold lines, which the program funds from the
1145
+ // Profile vault before the emptied Loot refunds its rent.
1146
+ const storage = await planFleetStorage(ctx, instruction, [fleetAccount.address], options.authorization.profile, 'Loot retrieval');
1147
+ 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. ${storage.disclosure}`;
1148
+ return buildPlannerPlan({
1119
1149
  kind: 'combat.retrieve-loot',
1120
1150
  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.`),
1151
+ await accountStatePrecondition(fleetAccount, `Fleet ${fleet.name} retains its configured Game, owning Profile, idle state, and normalized crew.`),
1152
+ await accountStatePrecondition(lootAccount, `Loot ${loot.address} retains its identity, creator, destroyer exclusivity, and requested known quantities.`),
1153
+ storage.guard,
1123
1154
  ],
1124
1155
  steps: [
1125
1156
  {
1126
1157
  describes: description,
1127
- instruction: adaptRetrieveLootInstruction({
1128
- authorization: options.authorization,
1129
- fleet: fleet.address,
1130
- game,
1131
- loot: loot.address,
1132
- ...(lootCreator === undefined ? {} : { lootCreator }),
1133
- recentSlothashes: 'SysvarS1otHashes111111111111111111111111111',
1134
- want: selection.generated.map(([itemIndex, cargo]) => [
1135
- itemIndex,
1136
- cargo.map(([cargoId, quantity]) => [cargoId, quantity]),
1137
- ]),
1138
- }),
1158
+ instruction,
1139
1159
  semantics: [{ kind: 'exclusive', scope: 'transaction' }],
1140
1160
  signers: [options.authorization.authority],
1141
1161
  },
@@ -1143,4 +1163,16 @@ export async function planFleetRetrieveLoot(ctx, fleet, loot, inputWant, inputOp
1143
1163
  summary: description,
1144
1164
  });
1145
1165
  }
1166
+ /** Reads the Profile, Rent and the action's other storage accounts, and plans
1167
+ * its Profile storage funding. */
1168
+ async function planFleetStorage(ctx, instruction, addresses, profile, label, stimulantStats) {
1169
+ const all = [...addresses, profile, RENT_ADDRESS];
1170
+ const rows = await readContextRawAccounts(ctx, all);
1171
+ const accounts = new Map(all.map((address, index) => [address, rows[index]]));
1172
+ return planStorageFunding({
1173
+ action: readCombatStorageAction(instruction, accounts, stimulantStats),
1174
+ accounts,
1175
+ label,
1176
+ });
1177
+ }
1146
1178
  //# sourceMappingURL=index.js.map