@aephia/atlas-kit 0.6.0-next.11 → 0.6.0-next.111

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 (686) hide show
  1. package/README.md +3 -1
  2. package/dist/cargo/actions/deposit.d.ts +1 -1
  3. package/dist/cargo/actions/deposit.d.ts.map +1 -1
  4. package/dist/cargo/actions/deposit.js +26 -115
  5. package/dist/cargo/actions/deposit.js.map +1 -1
  6. package/dist/cargo/actions/index.d.ts.map +1 -1
  7. package/dist/cargo/actions/index.js +20 -61
  8. package/dist/cargo/actions/index.js.map +1 -1
  9. package/dist/cargo/actions/wallet-context.d.ts +51 -2
  10. package/dist/cargo/actions/wallet-context.d.ts.map +1 -1
  11. package/dist/cargo/actions/wallet-context.js +125 -2
  12. package/dist/cargo/actions/wallet-context.js.map +1 -1
  13. package/dist/cargo/actions/wallet-token.d.ts +1 -6
  14. package/dist/cargo/actions/wallet-token.d.ts.map +1 -1
  15. package/dist/cargo/actions/wallet-token.js +0 -53
  16. package/dist/cargo/actions/wallet-token.js.map +1 -1
  17. package/dist/cargo/actions/withdrawal.d.ts.map +1 -1
  18. package/dist/cargo/actions/withdrawal.js +37 -162
  19. package/dist/cargo/actions/withdrawal.js.map +1 -1
  20. package/dist/claim-stakes/actions/index.d.ts +13 -0
  21. package/dist/claim-stakes/actions/index.d.ts.map +1 -1
  22. package/dist/claim-stakes/actions/index.js +373 -544
  23. package/dist/claim-stakes/actions/index.js.map +1 -1
  24. package/dist/claim-stakes/index.d.ts +14 -0
  25. package/dist/claim-stakes/index.d.ts.map +1 -1
  26. package/dist/claim-stakes/index.js +23 -2
  27. package/dist/claim-stakes/index.js.map +1 -1
  28. package/dist/client/context.d.ts.map +1 -1
  29. package/dist/client/context.js +1 -1
  30. package/dist/client/context.js.map +1 -1
  31. package/dist/client/contracts.d.ts +16 -6
  32. package/dist/client/contracts.d.ts.map +1 -1
  33. package/dist/client/errors.d.ts +6 -2
  34. package/dist/client/errors.d.ts.map +1 -1
  35. package/dist/client/errors.js +31 -1
  36. package/dist/client/errors.js.map +1 -1
  37. package/dist/client/index.d.ts +35 -0
  38. package/dist/client/index.d.ts.map +1 -1
  39. package/dist/client/index.js +35 -0
  40. package/dist/client/index.js.map +1 -1
  41. package/dist/client/rpc-subscription-provider.d.ts +35 -0
  42. package/dist/client/rpc-subscription-provider.d.ts.map +1 -0
  43. package/dist/client/rpc-subscription-provider.js +190 -0
  44. package/dist/client/rpc-subscription-provider.js.map +1 -0
  45. package/dist/combat/actions/index.d.ts +2 -2
  46. package/dist/combat/actions/index.d.ts.map +1 -1
  47. package/dist/combat/actions/index.js +192 -224
  48. package/dist/combat/actions/index.js.map +1 -1
  49. package/dist/combat/index.d.ts +4 -3
  50. package/dist/combat/index.d.ts.map +1 -1
  51. package/dist/combat/index.js +3 -2
  52. package/dist/combat/index.js.map +1 -1
  53. package/dist/crafting/actions/index.d.ts +11 -0
  54. package/dist/crafting/actions/index.d.ts.map +1 -1
  55. package/dist/crafting/actions/index.js +175 -283
  56. package/dist/crafting/actions/index.js.map +1 -1
  57. package/dist/crafting/index.d.ts +33 -3
  58. package/dist/crafting/index.d.ts.map +1 -1
  59. package/dist/crafting/index.js +45 -16
  60. package/dist/crafting/index.js.map +1 -1
  61. package/dist/factions/actions/index.d.ts +1 -0
  62. package/dist/factions/actions/index.d.ts.map +1 -1
  63. package/dist/factions/actions/index.js +2 -1
  64. package/dist/factions/actions/index.js.map +1 -1
  65. package/dist/factions/index.d.ts +1 -1
  66. package/dist/factions/index.d.ts.map +1 -1
  67. package/dist/factions/index.js +14 -8
  68. package/dist/factions/index.js.map +1 -1
  69. package/dist/factions/profile-faction.d.ts +20 -8
  70. package/dist/factions/profile-faction.d.ts.map +1 -1
  71. package/dist/factions/profile-faction.js +20 -8
  72. package/dist/factions/profile-faction.js.map +1 -1
  73. package/dist/fleets/actions/add-ship.d.ts +35 -0
  74. package/dist/fleets/actions/add-ship.d.ts.map +1 -0
  75. package/dist/fleets/actions/add-ship.js +149 -0
  76. package/dist/fleets/actions/add-ship.js.map +1 -0
  77. package/dist/fleets/actions/create-fleet.d.ts +36 -0
  78. package/dist/fleets/actions/create-fleet.d.ts.map +1 -0
  79. package/dist/fleets/actions/create-fleet.js +138 -0
  80. package/dist/fleets/actions/create-fleet.js.map +1 -0
  81. package/dist/fleets/actions/crew-transfer.d.ts +41 -0
  82. package/dist/fleets/actions/crew-transfer.d.ts.map +1 -0
  83. package/dist/fleets/actions/crew-transfer.js +114 -0
  84. package/dist/fleets/actions/crew-transfer.js.map +1 -0
  85. package/dist/fleets/actions/dock-bounds.d.ts +38 -0
  86. package/dist/fleets/actions/dock-bounds.d.ts.map +1 -0
  87. package/dist/fleets/actions/dock-bounds.js +46 -0
  88. package/dist/fleets/actions/dock-bounds.js.map +1 -0
  89. package/dist/fleets/actions/index.d.ts +63 -23
  90. package/dist/fleets/actions/index.d.ts.map +1 -1
  91. package/dist/fleets/actions/index.js +370 -304
  92. package/dist/fleets/actions/index.js.map +1 -1
  93. package/dist/fleets/actions/respawn.d.ts +38 -0
  94. package/dist/fleets/actions/respawn.d.ts.map +1 -0
  95. package/dist/fleets/actions/respawn.js +122 -0
  96. package/dist/fleets/actions/respawn.js.map +1 -0
  97. package/dist/fleets/actions/ship-import.d.ts.map +1 -1
  98. package/dist/fleets/actions/ship-import.js +59 -76
  99. package/dist/fleets/actions/ship-import.js.map +1 -1
  100. package/dist/fleets/cooldown.d.ts +44 -0
  101. package/dist/fleets/cooldown.d.ts.map +1 -0
  102. package/dist/fleets/cooldown.js +43 -0
  103. package/dist/fleets/cooldown.js.map +1 -0
  104. package/dist/fleets/coordinate-warp-estimate.d.ts +70 -0
  105. package/dist/fleets/coordinate-warp-estimate.d.ts.map +1 -0
  106. package/dist/fleets/coordinate-warp-estimate.js +46 -0
  107. package/dist/fleets/coordinate-warp-estimate.js.map +1 -0
  108. package/dist/fleets/index.d.ts +35 -0
  109. package/dist/fleets/index.d.ts.map +1 -1
  110. package/dist/fleets/index.js +52 -2
  111. package/dist/fleets/index.js.map +1 -1
  112. package/dist/fleets/movement-arithmetic.d.ts +21 -0
  113. package/dist/fleets/movement-arithmetic.d.ts.map +1 -0
  114. package/dist/fleets/movement-arithmetic.js +41 -0
  115. package/dist/fleets/movement-arithmetic.js.map +1 -0
  116. package/dist/fleets/subwarp-estimate.d.ts +70 -0
  117. package/dist/fleets/subwarp-estimate.d.ts.map +1 -0
  118. package/dist/fleets/subwarp-estimate.js +38 -0
  119. package/dist/fleets/subwarp-estimate.js.map +1 -0
  120. package/dist/fleets/travel-profile.d.ts +102 -0
  121. package/dist/fleets/travel-profile.d.ts.map +1 -0
  122. package/dist/fleets/travel-profile.js +120 -0
  123. package/dist/fleets/travel-profile.js.map +1 -0
  124. package/dist/fleets/warp-lane-estimate.d.ts +59 -0
  125. package/dist/fleets/warp-lane-estimate.d.ts.map +1 -0
  126. package/dist/fleets/warp-lane-estimate.js +36 -0
  127. package/dist/fleets/warp-lane-estimate.js.map +1 -0
  128. package/dist/fleets/warp-lane-policy.d.ts +68 -0
  129. package/dist/fleets/warp-lane-policy.d.ts.map +1 -0
  130. package/dist/fleets/warp-lane-policy.js +91 -0
  131. package/dist/fleets/warp-lane-policy.js.map +1 -0
  132. package/dist/fleets/warp-lane-toll.d.ts +55 -0
  133. package/dist/fleets/warp-lane-toll.d.ts.map +1 -0
  134. package/dist/fleets/warp-lane-toll.js +79 -0
  135. package/dist/fleets/warp-lane-toll.js.map +1 -0
  136. package/dist/identity/actions/index.d.ts +3 -3
  137. package/dist/identity/actions/index.d.ts.map +1 -1
  138. package/dist/identity/actions/index.js +50 -28
  139. package/dist/identity/actions/index.js.map +1 -1
  140. package/dist/identity/index.d.ts +12 -2
  141. package/dist/identity/index.d.ts.map +1 -1
  142. package/dist/identity/index.js +10 -1
  143. package/dist/identity/index.js.map +1 -1
  144. package/dist/identity/permissions.d.ts +11 -2
  145. package/dist/identity/permissions.d.ts.map +1 -1
  146. package/dist/identity/permissions.js +13 -4
  147. package/dist/identity/permissions.js.map +1 -1
  148. package/dist/identity/research-state.d.ts +60 -0
  149. package/dist/identity/research-state.d.ts.map +1 -0
  150. package/dist/identity/research-state.js +68 -0
  151. package/dist/identity/research-state.js.map +1 -0
  152. package/dist/index.d.ts +24 -0
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.js +20 -3
  155. package/dist/index.js.map +1 -1
  156. package/dist/internal/c4/account-decoding.d.ts +12 -0
  157. package/dist/internal/c4/account-decoding.d.ts.map +1 -0
  158. package/dist/internal/c4/account-decoding.js +36 -0
  159. package/dist/internal/c4/account-decoding.js.map +1 -0
  160. package/dist/internal/c4/cargo-bytes-config.d.ts +7 -0
  161. package/dist/internal/c4/cargo-bytes-config.d.ts.map +1 -0
  162. package/dist/internal/c4/cargo-bytes-config.js +19 -0
  163. package/dist/internal/c4/cargo-bytes-config.js.map +1 -0
  164. package/dist/internal/c4/character-modifier.d.ts +1 -1
  165. package/dist/internal/c4/character-modifier.d.ts.map +1 -1
  166. package/dist/internal/c4/character-registration.d.ts +2 -0
  167. package/dist/internal/c4/character-registration.d.ts.map +1 -1
  168. package/dist/internal/c4/character-registration.js +2 -0
  169. package/dist/internal/c4/character-registration.js.map +1 -1
  170. package/dist/internal/c4/character.d.ts +155 -0
  171. package/dist/internal/c4/character.d.ts.map +1 -0
  172. package/dist/internal/c4/character.js +79 -0
  173. package/dist/internal/c4/character.js.map +1 -0
  174. package/dist/internal/c4/claim-stake-configuration.js +4 -2
  175. package/dist/internal/c4/claim-stake-configuration.js.map +1 -1
  176. package/dist/internal/c4/claim-stake-definitions.d.ts +4 -4
  177. package/dist/internal/c4/claim-stake-definitions.d.ts.map +1 -1
  178. package/dist/internal/c4/claim-stake-definitions.js.map +1 -1
  179. package/dist/internal/c4/claim-stake.d.ts +4 -27
  180. package/dist/internal/c4/claim-stake.d.ts.map +1 -1
  181. package/dist/internal/c4/claim-stake.js +30 -41
  182. package/dist/internal/c4/claim-stake.js.map +1 -1
  183. package/dist/internal/c4/combat.d.ts +1 -82
  184. package/dist/internal/c4/combat.d.ts.map +1 -1
  185. package/dist/internal/c4/combat.js +10 -171
  186. package/dist/internal/c4/combat.js.map +1 -1
  187. package/dist/internal/c4/crafting-process-codec.d.ts +13 -0
  188. package/dist/internal/c4/crafting-process-codec.d.ts.map +1 -0
  189. package/dist/internal/c4/crafting-process-codec.js +34 -0
  190. package/dist/internal/c4/crafting-process-codec.js.map +1 -0
  191. package/dist/internal/c4/crafting.d.ts +25 -33
  192. package/dist/internal/c4/crafting.d.ts.map +1 -1
  193. package/dist/internal/c4/crafting.js +61 -49
  194. package/dist/internal/c4/crafting.js.map +1 -1
  195. package/dist/internal/c4/currency-cache.d.ts +6 -0
  196. package/dist/internal/c4/currency-cache.d.ts.map +1 -0
  197. package/dist/internal/c4/currency-cache.js +30 -0
  198. package/dist/internal/c4/currency-cache.js.map +1 -0
  199. package/dist/internal/c4/docking-funding.d.ts +4 -0
  200. package/dist/internal/c4/docking-funding.d.ts.map +1 -0
  201. package/dist/internal/c4/docking-funding.js +11 -0
  202. package/dist/internal/c4/docking-funding.js.map +1 -0
  203. package/dist/internal/c4/faction-adapter.d.ts +12 -0
  204. package/dist/internal/c4/faction-adapter.d.ts.map +1 -0
  205. package/dist/internal/c4/faction-adapter.js +52 -0
  206. package/dist/internal/c4/faction-adapter.js.map +1 -0
  207. package/dist/internal/c4/faction-epoch-meter.d.ts +10 -0
  208. package/dist/internal/c4/faction-epoch-meter.d.ts.map +1 -0
  209. package/dist/internal/c4/faction-epoch-meter.js +31 -0
  210. package/dist/internal/c4/faction-epoch-meter.js.map +1 -0
  211. package/dist/internal/c4/faction-treasury.d.ts +23 -0
  212. package/dist/internal/c4/faction-treasury.d.ts.map +1 -0
  213. package/dist/internal/c4/faction-treasury.js +48 -0
  214. package/dist/internal/c4/faction-treasury.js.map +1 -0
  215. package/dist/internal/c4/faction.d.ts +21 -0
  216. package/dist/internal/c4/faction.d.ts.map +1 -0
  217. package/dist/internal/c4/faction.js +23 -0
  218. package/dist/internal/c4/faction.js.map +1 -0
  219. package/dist/internal/c4/factions.d.ts +9 -57
  220. package/dist/internal/c4/factions.d.ts.map +1 -1
  221. package/dist/internal/c4/factions.js +29 -156
  222. package/dist/internal/c4/factions.js.map +1 -1
  223. package/dist/internal/c4/fleet-arrival.d.ts +28 -0
  224. package/dist/internal/c4/fleet-arrival.d.ts.map +1 -0
  225. package/dist/internal/c4/fleet-arrival.js +42 -0
  226. package/dist/internal/c4/fleet-arrival.js.map +1 -0
  227. package/dist/internal/c4/fleet-creation.d.ts +7 -0
  228. package/dist/internal/c4/fleet-creation.d.ts.map +1 -0
  229. package/dist/internal/c4/fleet-creation.js +180 -0
  230. package/dist/internal/c4/fleet-creation.js.map +1 -0
  231. package/dist/internal/c4/fleet-crew-binding.d.ts +9 -0
  232. package/dist/internal/c4/fleet-crew-binding.d.ts.map +1 -1
  233. package/dist/internal/c4/fleet-crew-binding.js +20 -3
  234. package/dist/internal/c4/fleet-crew-binding.js.map +1 -1
  235. package/dist/internal/c4/fleet-respawn.d.ts +17 -0
  236. package/dist/internal/c4/fleet-respawn.d.ts.map +1 -0
  237. package/dist/internal/c4/fleet-respawn.js +62 -0
  238. package/dist/internal/c4/fleet-respawn.js.map +1 -0
  239. package/dist/internal/c4/fleet-ship-assembly.d.ts +11 -0
  240. package/dist/internal/c4/fleet-ship-assembly.d.ts.map +1 -0
  241. package/dist/internal/c4/fleet-ship-assembly.js +44 -0
  242. package/dist/internal/c4/fleet-ship-assembly.js.map +1 -0
  243. package/dist/internal/c4/fleet.d.ts +45 -19
  244. package/dist/internal/c4/fleet.d.ts.map +1 -1
  245. package/dist/internal/c4/fleet.js +37 -29
  246. package/dist/internal/c4/fleet.js.map +1 -1
  247. package/dist/internal/c4/game-definition-layout.d.ts +2 -0
  248. package/dist/internal/c4/game-definition-layout.d.ts.map +1 -1
  249. package/dist/internal/c4/game-definition-layout.js +4 -0
  250. package/dist/internal/c4/game-definition-layout.js.map +1 -1
  251. package/dist/internal/c4/game.d.ts +47 -12
  252. package/dist/internal/c4/game.d.ts.map +1 -1
  253. package/dist/internal/c4/game.js +110 -21
  254. package/dist/internal/c4/game.js.map +1 -1
  255. package/dist/internal/c4/identity.d.ts +2 -152
  256. package/dist/internal/c4/identity.d.ts.map +1 -1
  257. package/dist/internal/c4/identity.js +6 -110
  258. package/dist/internal/c4/identity.js.map +1 -1
  259. package/dist/internal/c4/local-market-order.d.ts +31 -0
  260. package/dist/internal/c4/local-market-order.d.ts.map +1 -0
  261. package/dist/internal/c4/local-market-order.js +47 -0
  262. package/dist/internal/c4/local-market-order.js.map +1 -0
  263. package/dist/internal/c4/loot-layout.js +1 -1
  264. package/dist/internal/c4/loot-layout.js.map +1 -1
  265. package/dist/internal/c4/loot.d.ts +58 -0
  266. package/dist/internal/c4/loot.d.ts.map +1 -0
  267. package/dist/internal/c4/loot.js +130 -0
  268. package/dist/internal/c4/loot.js.map +1 -0
  269. package/dist/internal/c4/loyalty.d.ts +0 -27
  270. package/dist/internal/c4/loyalty.d.ts.map +1 -1
  271. package/dist/internal/c4/loyalty.js +14 -43
  272. package/dist/internal/c4/loyalty.js.map +1 -1
  273. package/dist/internal/c4/market.d.ts +2 -38
  274. package/dist/internal/c4/market.d.ts.map +1 -1
  275. package/dist/internal/c4/market.js +13 -51
  276. package/dist/internal/c4/market.js.map +1 -1
  277. package/dist/internal/c4/mining-instructions.d.ts +2 -0
  278. package/dist/internal/c4/mining-instructions.d.ts.map +1 -0
  279. package/dist/internal/c4/mining-instructions.js +3 -0
  280. package/dist/internal/c4/mining-instructions.js.map +1 -0
  281. package/dist/internal/c4/open-signal.d.ts +8 -0
  282. package/dist/internal/c4/open-signal.d.ts.map +1 -0
  283. package/dist/internal/c4/open-signal.js +37 -0
  284. package/dist/internal/c4/open-signal.js.map +1 -0
  285. package/dist/internal/c4/pda.js +1 -1
  286. package/dist/internal/c4/pda.js.map +1 -1
  287. package/dist/internal/c4/profile-faction.d.ts.map +1 -1
  288. package/dist/internal/c4/profile-faction.js +11 -21
  289. package/dist/internal/c4/profile-faction.js.map +1 -1
  290. package/dist/internal/c4/profile-permissions.d.ts +5 -3
  291. package/dist/internal/c4/profile-permissions.d.ts.map +1 -1
  292. package/dist/internal/c4/profile-permissions.js +61 -8
  293. package/dist/internal/c4/profile-permissions.js.map +1 -1
  294. package/dist/internal/c4/region-geometry.d.ts +8 -0
  295. package/dist/internal/c4/region-geometry.d.ts.map +1 -0
  296. package/dist/internal/c4/region-geometry.js +43 -0
  297. package/dist/internal/c4/region-geometry.js.map +1 -0
  298. package/dist/internal/c4/rewards.d.ts +1 -61
  299. package/dist/internal/c4/rewards.d.ts.map +1 -1
  300. package/dist/internal/c4/rewards.js +14 -115
  301. package/dist/internal/c4/rewards.js.map +1 -1
  302. package/dist/internal/c4/runtime-bindings.d.ts +4 -0
  303. package/dist/internal/c4/runtime-bindings.d.ts.map +1 -0
  304. package/dist/internal/c4/runtime-bindings.js +4 -0
  305. package/dist/internal/c4/runtime-bindings.js.map +1 -0
  306. package/dist/internal/c4/scan-detection-codecs.d.ts +3 -0
  307. package/dist/internal/c4/scan-detection-codecs.d.ts.map +1 -0
  308. package/dist/internal/c4/scan-detection-codecs.js +3 -0
  309. package/dist/internal/c4/scan-detection-codecs.js.map +1 -0
  310. package/dist/internal/c4/scan-lifecycle.d.ts +306 -0
  311. package/dist/internal/c4/scan-lifecycle.d.ts.map +1 -0
  312. package/dist/internal/c4/scan-lifecycle.js +261 -0
  313. package/dist/internal/c4/scan-lifecycle.js.map +1 -0
  314. package/dist/internal/c4/scanning.d.ts +1 -28
  315. package/dist/internal/c4/scanning.d.ts.map +1 -1
  316. package/dist/internal/c4/scanning.js +7 -36
  317. package/dist/internal/c4/scanning.js.map +1 -1
  318. package/dist/internal/c4/ship-import.d.ts +4 -0
  319. package/dist/internal/c4/ship-import.d.ts.map +1 -0
  320. package/dist/internal/c4/ship-import.js +13 -0
  321. package/dist/internal/c4/ship-import.js.map +1 -0
  322. package/dist/internal/c4/ship-stats.d.ts.map +1 -1
  323. package/dist/internal/c4/ship-stats.js +25 -21
  324. package/dist/internal/c4/ship-stats.js.map +1 -1
  325. package/dist/internal/c4/starbase.d.ts +0 -32
  326. package/dist/internal/c4/starbase.d.ts.map +1 -1
  327. package/dist/internal/c4/starbase.js +12 -62
  328. package/dist/internal/c4/starbase.js.map +1 -1
  329. package/dist/internal/c4/world.d.ts +36 -7
  330. package/dist/internal/c4/world.d.ts.map +1 -1
  331. package/dist/internal/c4/world.js +67 -48
  332. package/dist/internal/c4/world.js.map +1 -1
  333. package/dist/internal/cargo.d.ts +2 -0
  334. package/dist/internal/cargo.d.ts.map +1 -1
  335. package/dist/internal/cargo.js +8 -0
  336. package/dist/internal/cargo.js.map +1 -1
  337. package/dist/internal/fleet.d.ts +1 -0
  338. package/dist/internal/fleet.d.ts.map +1 -1
  339. package/dist/internal/fleet.js +3 -1
  340. package/dist/internal/fleet.js.map +1 -1
  341. package/dist/internal/loyalty-atlas-bank-state.d.ts +16 -0
  342. package/dist/internal/loyalty-atlas-bank-state.d.ts.map +1 -0
  343. package/dist/internal/loyalty-atlas-bank-state.js +10 -0
  344. package/dist/internal/loyalty-atlas-bank-state.js.map +1 -0
  345. package/dist/internal/planning/action-runtime.d.ts +38 -0
  346. package/dist/internal/planning/action-runtime.d.ts.map +1 -0
  347. package/dist/internal/planning/action-runtime.js +63 -0
  348. package/dist/internal/planning/action-runtime.js.map +1 -0
  349. package/dist/internal/planning/arrival-guards.d.ts +19 -0
  350. package/dist/internal/planning/arrival-guards.d.ts.map +1 -0
  351. package/dist/internal/planning/arrival-guards.js +171 -0
  352. package/dist/internal/planning/arrival-guards.js.map +1 -0
  353. package/dist/internal/planning/authorization-adapter.d.ts +45 -37
  354. package/dist/internal/planning/authorization-adapter.d.ts.map +1 -1
  355. package/dist/internal/planning/authorization-adapter.js +165 -76
  356. package/dist/internal/planning/authorization-adapter.js.map +1 -1
  357. package/dist/internal/planning/character-registration-guard.d.ts +4 -0
  358. package/dist/internal/planning/character-registration-guard.d.ts.map +1 -0
  359. package/dist/internal/planning/character-registration-guard.js +58 -0
  360. package/dist/internal/planning/character-registration-guard.js.map +1 -0
  361. package/dist/internal/planning/character-registration.d.ts +23 -0
  362. package/dist/internal/planning/character-registration.d.ts.map +1 -0
  363. package/dist/internal/planning/character-registration.js +87 -0
  364. package/dist/internal/planning/character-registration.js.map +1 -0
  365. package/dist/internal/planning/currency-cache-guard.d.ts +4 -0
  366. package/dist/internal/planning/currency-cache-guard.d.ts.map +1 -0
  367. package/dist/internal/planning/currency-cache-guard.js +32 -0
  368. package/dist/internal/planning/currency-cache-guard.js.map +1 -0
  369. package/dist/internal/planning/democracy-history.d.ts +50 -0
  370. package/dist/internal/planning/democracy-history.d.ts.map +1 -0
  371. package/dist/internal/planning/democracy-history.js +198 -0
  372. package/dist/internal/planning/democracy-history.js.map +1 -0
  373. package/dist/internal/planning/faction-enrollment.d.ts +0 -2
  374. package/dist/internal/planning/faction-enrollment.d.ts.map +1 -1
  375. package/dist/internal/planning/faction-enrollment.js +1 -22
  376. package/dist/internal/planning/faction-enrollment.js.map +1 -1
  377. package/dist/internal/planning/faction-trade-guards.d.ts +30 -0
  378. package/dist/internal/planning/faction-trade-guards.d.ts.map +1 -0
  379. package/dist/internal/planning/faction-trade-guards.js +15 -0
  380. package/dist/internal/planning/faction-trade-guards.js.map +1 -0
  381. package/dist/internal/planning/faction-trade-state.d.ts +16 -0
  382. package/dist/internal/planning/faction-trade-state.d.ts.map +1 -0
  383. package/dist/internal/planning/faction-trade-state.js +43 -0
  384. package/dist/internal/planning/faction-trade-state.js.map +1 -0
  385. package/dist/internal/planning/fleet-arrival.d.ts +40 -0
  386. package/dist/internal/planning/fleet-arrival.d.ts.map +1 -0
  387. package/dist/internal/planning/fleet-arrival.js +106 -0
  388. package/dist/internal/planning/fleet-arrival.js.map +1 -0
  389. package/dist/internal/planning/fleet-attack-xp.d.ts +20 -0
  390. package/dist/internal/planning/fleet-attack-xp.d.ts.map +1 -0
  391. package/dist/internal/planning/fleet-attack-xp.js +110 -0
  392. package/dist/internal/planning/fleet-attack-xp.js.map +1 -0
  393. package/dist/internal/planning/fleet-creation.d.ts +30 -0
  394. package/dist/internal/planning/fleet-creation.d.ts.map +1 -0
  395. package/dist/internal/planning/fleet-creation.js +109 -0
  396. package/dist/internal/planning/fleet-creation.js.map +1 -0
  397. package/dist/internal/planning/fleet-crew-guard.d.ts +28 -0
  398. package/dist/internal/planning/fleet-crew-guard.d.ts.map +1 -0
  399. package/dist/internal/planning/fleet-crew-guard.js +47 -0
  400. package/dist/internal/planning/fleet-crew-guard.js.map +1 -0
  401. package/dist/internal/planning/fleet-crew-transfer.d.ts +7 -0
  402. package/dist/internal/planning/fleet-crew-transfer.d.ts.map +1 -0
  403. package/dist/internal/planning/fleet-crew-transfer.js +132 -0
  404. package/dist/internal/planning/fleet-crew-transfer.js.map +1 -0
  405. package/dist/internal/planning/fleet-dock-funding-guard.d.ts +42 -0
  406. package/dist/internal/planning/fleet-dock-funding-guard.d.ts.map +1 -0
  407. package/dist/internal/planning/fleet-dock-funding-guard.js +208 -0
  408. package/dist/internal/planning/fleet-dock-funding-guard.js.map +1 -0
  409. package/dist/internal/planning/fleet-dock-funding.d.ts +9 -0
  410. package/dist/internal/planning/fleet-dock-funding.d.ts.map +1 -0
  411. package/dist/internal/planning/fleet-dock-funding.js +154 -0
  412. package/dist/internal/planning/fleet-dock-funding.js.map +1 -0
  413. package/dist/internal/planning/fleet-docking-guard.d.ts +4 -0
  414. package/dist/internal/planning/fleet-docking-guard.d.ts.map +1 -0
  415. package/dist/internal/planning/fleet-docking-guard.js +42 -0
  416. package/dist/internal/planning/fleet-docking-guard.js.map +1 -0
  417. package/dist/internal/planning/fleet-docking.d.ts +10 -0
  418. package/dist/internal/planning/fleet-docking.d.ts.map +1 -0
  419. package/dist/internal/planning/fleet-docking.js +85 -0
  420. package/dist/internal/planning/fleet-docking.js.map +1 -0
  421. package/dist/internal/planning/fleet-respawn.d.ts +28 -0
  422. package/dist/internal/planning/fleet-respawn.d.ts.map +1 -0
  423. package/dist/internal/planning/fleet-respawn.js +167 -0
  424. package/dist/internal/planning/fleet-respawn.js.map +1 -0
  425. package/dist/internal/planning/fleet-ship-assembly.d.ts +36 -0
  426. package/dist/internal/planning/fleet-ship-assembly.d.ts.map +1 -0
  427. package/dist/internal/planning/fleet-ship-assembly.js +138 -0
  428. package/dist/internal/planning/fleet-ship-assembly.js.map +1 -0
  429. package/dist/internal/planning/fleet-state.d.ts +25 -0
  430. package/dist/internal/planning/fleet-state.d.ts.map +1 -0
  431. package/dist/internal/planning/fleet-state.js +28 -0
  432. package/dist/internal/planning/fleet-state.js.map +1 -0
  433. package/dist/internal/planning/governance-fees.d.ts +64 -0
  434. package/dist/internal/planning/governance-fees.d.ts.map +1 -0
  435. package/dist/internal/planning/governance-fees.js +239 -0
  436. package/dist/internal/planning/governance-fees.js.map +1 -0
  437. package/dist/internal/planning/local-market-order-funding.d.ts +8 -0
  438. package/dist/internal/planning/local-market-order-funding.d.ts.map +1 -0
  439. package/dist/internal/planning/local-market-order-funding.js +127 -0
  440. package/dist/internal/planning/local-market-order-funding.js.map +1 -0
  441. package/dist/internal/planning/local-market-order.d.ts +40 -0
  442. package/dist/internal/planning/local-market-order.d.ts.map +1 -0
  443. package/dist/internal/planning/local-market-order.js +138 -0
  444. package/dist/internal/planning/local-market-order.js.map +1 -0
  445. package/dist/internal/planning/mining-stop.d.ts +14 -0
  446. package/dist/internal/planning/mining-stop.d.ts.map +1 -0
  447. package/dist/internal/planning/mining-stop.js +41 -0
  448. package/dist/internal/planning/mining-stop.js.map +1 -0
  449. package/dist/internal/planning/movement-character.d.ts +7 -0
  450. package/dist/internal/planning/movement-character.d.ts.map +1 -0
  451. package/dist/internal/planning/movement-character.js +41 -0
  452. package/dist/internal/planning/movement-character.js.map +1 -0
  453. package/dist/internal/planning/movement-xp-guard.d.ts +4 -0
  454. package/dist/internal/planning/movement-xp-guard.d.ts.map +1 -0
  455. package/dist/internal/planning/movement-xp-guard.js +103 -0
  456. package/dist/internal/planning/movement-xp-guard.js.map +1 -0
  457. package/dist/internal/planning/open-signal-guard.d.ts +3 -0
  458. package/dist/internal/planning/open-signal-guard.d.ts.map +1 -0
  459. package/dist/internal/planning/open-signal-guard.js +31 -0
  460. package/dist/internal/planning/open-signal-guard.js.map +1 -0
  461. package/dist/internal/planning/open-signal.d.ts +31 -0
  462. package/dist/internal/planning/open-signal.d.ts.map +1 -0
  463. package/dist/internal/planning/open-signal.js +86 -0
  464. package/dist/internal/planning/open-signal.js.map +1 -0
  465. package/dist/internal/planning/original-token.d.ts +34 -0
  466. package/dist/internal/planning/original-token.d.ts.map +1 -0
  467. package/dist/internal/planning/original-token.js +98 -0
  468. package/dist/internal/planning/original-token.js.map +1 -0
  469. package/dist/internal/planning/plan-fields.d.ts +59 -0
  470. package/dist/internal/planning/plan-fields.d.ts.map +1 -0
  471. package/dist/internal/planning/plan-fields.js +153 -0
  472. package/dist/internal/planning/plan-fields.js.map +1 -0
  473. package/dist/internal/planning/plan-guards.d.ts +4 -0
  474. package/dist/internal/planning/plan-guards.d.ts.map +1 -0
  475. package/dist/internal/planning/plan-guards.js +168 -0
  476. package/dist/internal/planning/plan-guards.js.map +1 -0
  477. package/dist/internal/planning/recipe-state.d.ts +6 -0
  478. package/dist/internal/planning/recipe-state.d.ts.map +1 -0
  479. package/dist/internal/planning/recipe-state.js +20 -0
  480. package/dist/internal/planning/recipe-state.js.map +1 -0
  481. package/dist/internal/planning/rent.d.ts +19 -0
  482. package/dist/internal/planning/rent.d.ts.map +1 -0
  483. package/dist/internal/planning/rent.js +35 -0
  484. package/dist/internal/planning/rent.js.map +1 -0
  485. package/dist/internal/planning/respawn-guards.d.ts +3 -0
  486. package/dist/internal/planning/respawn-guards.d.ts.map +1 -0
  487. package/dist/internal/planning/respawn-guards.js +41 -0
  488. package/dist/internal/planning/respawn-guards.js.map +1 -0
  489. package/dist/internal/planning/runtime-guards.d.ts +41 -0
  490. package/dist/internal/planning/runtime-guards.d.ts.map +1 -0
  491. package/dist/internal/planning/runtime-guards.js +635 -0
  492. package/dist/internal/planning/runtime-guards.js.map +1 -0
  493. package/dist/internal/planning/scan-completion-guard.d.ts +43 -0
  494. package/dist/internal/planning/scan-completion-guard.d.ts.map +1 -0
  495. package/dist/internal/planning/scan-completion-guard.js +94 -0
  496. package/dist/internal/planning/scan-completion-guard.js.map +1 -0
  497. package/dist/internal/planning/scan-completion.d.ts +20 -0
  498. package/dist/internal/planning/scan-completion.d.ts.map +1 -0
  499. package/dist/internal/planning/scan-completion.js +197 -0
  500. package/dist/internal/planning/scan-completion.js.map +1 -0
  501. package/dist/internal/planning/scan-detect-guard.d.ts +34 -0
  502. package/dist/internal/planning/scan-detect-guard.d.ts.map +1 -0
  503. package/dist/internal/planning/scan-detect-guard.js +77 -0
  504. package/dist/internal/planning/scan-detect-guard.js.map +1 -0
  505. package/dist/internal/planning/scan-detect.d.ts +24 -0
  506. package/dist/internal/planning/scan-detect.d.ts.map +1 -0
  507. package/dist/internal/planning/scan-detect.js +245 -0
  508. package/dist/internal/planning/scan-detect.js.map +1 -0
  509. package/dist/internal/planning/scan-input.d.ts +9 -0
  510. package/dist/internal/planning/scan-input.d.ts.map +1 -0
  511. package/dist/internal/planning/scan-input.js +58 -0
  512. package/dist/internal/planning/scan-input.js.map +1 -0
  513. package/dist/internal/planning/ship-import-funding.d.ts +22 -0
  514. package/dist/internal/planning/ship-import-funding.d.ts.map +1 -0
  515. package/dist/internal/planning/ship-import-funding.js +53 -0
  516. package/dist/internal/planning/ship-import-funding.js.map +1 -0
  517. package/dist/internal/planning/ship-token.d.ts +1 -6
  518. package/dist/internal/planning/ship-token.d.ts.map +1 -1
  519. package/dist/internal/planning/ship-token.js +2 -41
  520. package/dist/internal/planning/ship-token.js.map +1 -1
  521. package/dist/internal/planning/starbase-player-owner.d.ts +21 -0
  522. package/dist/internal/planning/starbase-player-owner.d.ts.map +1 -0
  523. package/dist/internal/planning/starbase-player-owner.js +17 -0
  524. package/dist/internal/planning/starbase-player-owner.js.map +1 -0
  525. package/dist/internal/planning/starbase-system-guard.d.ts +6 -0
  526. package/dist/internal/planning/starbase-system-guard.d.ts.map +1 -0
  527. package/dist/internal/planning/starbase-system-guard.js +93 -0
  528. package/dist/internal/planning/starbase-system-guard.js.map +1 -0
  529. package/dist/internal/planning/starbase-system.d.ts +15 -0
  530. package/dist/internal/planning/starbase-system.d.ts.map +1 -0
  531. package/dist/internal/planning/starbase-system.js +25 -0
  532. package/dist/internal/planning/starbase-system.js.map +1 -0
  533. package/dist/internal/planning/token-mint.d.ts +4 -0
  534. package/dist/internal/planning/token-mint.d.ts.map +1 -0
  535. package/dist/internal/planning/token-mint.js +15 -0
  536. package/dist/internal/planning/token-mint.js.map +1 -0
  537. package/dist/internal/planning/trade-faction-market.d.ts +20 -0
  538. package/dist/internal/planning/trade-faction-market.d.ts.map +1 -0
  539. package/dist/internal/planning/trade-faction-market.js +56 -0
  540. package/dist/internal/planning/trade-faction-market.js.map +1 -0
  541. package/dist/internal/planning/wallet-starbase.d.ts +34 -0
  542. package/dist/internal/planning/wallet-starbase.d.ts.map +1 -0
  543. package/dist/internal/planning/wallet-starbase.js +39 -0
  544. package/dist/internal/planning/wallet-starbase.js.map +1 -0
  545. package/dist/internal/planning/xp-runtime.d.ts +36 -0
  546. package/dist/internal/planning/xp-runtime.d.ts.map +1 -0
  547. package/dist/internal/planning/xp-runtime.js +126 -0
  548. package/dist/internal/planning/xp-runtime.js.map +1 -0
  549. package/dist/internal/system-program.d.ts +4 -0
  550. package/dist/internal/system-program.d.ts.map +1 -0
  551. package/dist/internal/system-program.js +3 -0
  552. package/dist/internal/system-program.js.map +1 -0
  553. package/dist/loyalty/actions/index.d.ts.map +1 -1
  554. package/dist/loyalty/actions/index.js +8 -21
  555. package/dist/loyalty/actions/index.js.map +1 -1
  556. package/dist/loyalty/index.d.ts.map +1 -1
  557. package/dist/loyalty/index.js +2 -6
  558. package/dist/loyalty/index.js.map +1 -1
  559. package/dist/markets/actions/index.d.ts +61 -3
  560. package/dist/markets/actions/index.d.ts.map +1 -1
  561. package/dist/markets/actions/index.js +227 -160
  562. package/dist/markets/actions/index.js.map +1 -1
  563. package/dist/markets/actions/trade-faction-market.d.ts +43 -0
  564. package/dist/markets/actions/trade-faction-market.d.ts.map +1 -0
  565. package/dist/markets/actions/trade-faction-market.js +282 -0
  566. package/dist/markets/actions/trade-faction-market.js.map +1 -0
  567. package/dist/markets/index.d.ts +38 -7
  568. package/dist/markets/index.d.ts.map +1 -1
  569. package/dist/markets/index.js +57 -10
  570. package/dist/markets/index.js.map +1 -1
  571. package/dist/mining/actions/index.d.ts +87 -0
  572. package/dist/mining/actions/index.d.ts.map +1 -0
  573. package/dist/mining/actions/index.js +319 -0
  574. package/dist/mining/actions/index.js.map +1 -0
  575. package/dist/mining/estimate.d.ts +114 -0
  576. package/dist/mining/estimate.d.ts.map +1 -0
  577. package/dist/mining/estimate.js +127 -0
  578. package/dist/mining/estimate.js.map +1 -0
  579. package/dist/mining/index.d.ts +9 -2
  580. package/dist/mining/index.d.ts.map +1 -1
  581. package/dist/mining/index.js +7 -2
  582. package/dist/mining/index.js.map +1 -1
  583. package/dist/mining/profile.d.ts +82 -0
  584. package/dist/mining/profile.d.ts.map +1 -0
  585. package/dist/mining/profile.js +109 -0
  586. package/dist/mining/profile.js.map +1 -0
  587. package/dist/planning/assembly.d.ts +5 -0
  588. package/dist/planning/assembly.d.ts.map +1 -1
  589. package/dist/planning/assembly.js +8 -4
  590. package/dist/planning/assembly.js.map +1 -1
  591. package/dist/planning/execution.d.ts +18 -3
  592. package/dist/planning/execution.d.ts.map +1 -1
  593. package/dist/planning/execution.js +492 -40
  594. package/dist/planning/execution.js.map +1 -1
  595. package/dist/planning/index.d.ts +196 -149
  596. package/dist/planning/index.d.ts.map +1 -1
  597. package/dist/planning/index.js +44 -292
  598. package/dist/planning/index.js.map +1 -1
  599. package/dist/planning/plan-sequence-checkpoint.d.ts +9 -0
  600. package/dist/planning/plan-sequence-checkpoint.d.ts.map +1 -1
  601. package/dist/planning/plan-sequence-checkpoint.js +16 -7
  602. package/dist/planning/plan-sequence-checkpoint.js.map +1 -1
  603. package/dist/planning/plan-sequence-execution.d.ts +5 -0
  604. package/dist/planning/plan-sequence-execution.d.ts.map +1 -1
  605. package/dist/planning/plan-sequence-execution.js +74 -30
  606. package/dist/planning/plan-sequence-execution.js.map +1 -1
  607. package/dist/planning/plan-sequence.d.ts +2 -1
  608. package/dist/planning/plan-sequence.d.ts.map +1 -1
  609. package/dist/planning/plan-sequence.js +8 -1
  610. package/dist/planning/plan-sequence.js.map +1 -1
  611. package/dist/planning/plan-validation.d.ts +14 -0
  612. package/dist/planning/plan-validation.d.ts.map +1 -0
  613. package/dist/planning/plan-validation.js +124 -0
  614. package/dist/planning/plan-validation.js.map +1 -0
  615. package/dist/planning/simulation.d.ts +25 -1
  616. package/dist/planning/simulation.d.ts.map +1 -1
  617. package/dist/planning/simulation.js +111 -11
  618. package/dist/planning/simulation.js.map +1 -1
  619. package/dist/registry/cargo.d.ts +7 -12
  620. package/dist/registry/cargo.d.ts.map +1 -1
  621. package/dist/registry/cargo.js +19 -19
  622. package/dist/registry/cargo.js.map +1 -1
  623. package/dist/registry/docking.d.ts +10 -0
  624. package/dist/registry/docking.d.ts.map +1 -0
  625. package/dist/registry/docking.js +12 -0
  626. package/dist/registry/docking.js.map +1 -0
  627. package/dist/registry/index.d.ts +4 -0
  628. package/dist/registry/index.d.ts.map +1 -1
  629. package/dist/registry/index.js.map +1 -1
  630. package/dist/registry/onboarding.d.ts +10 -2
  631. package/dist/registry/onboarding.d.ts.map +1 -1
  632. package/dist/registry/onboarding.js +20 -7
  633. package/dist/registry/onboarding.js.map +1 -1
  634. package/dist/registry/scanning.d.ts +7 -0
  635. package/dist/registry/scanning.d.ts.map +1 -0
  636. package/dist/registry/scanning.js +13 -0
  637. package/dist/registry/scanning.js.map +1 -0
  638. package/dist/registry/ship-stats-snapshot.js +19 -19
  639. package/dist/registry/ship-stats-snapshot.js.map +1 -1
  640. package/dist/registry/ships.d.ts +22 -2
  641. package/dist/registry/ships.d.ts.map +1 -1
  642. package/dist/registry/ships.js +31 -4
  643. package/dist/registry/ships.js.map +1 -1
  644. package/dist/registry/xp-runtime.d.ts +4 -0
  645. package/dist/registry/xp-runtime.d.ts.map +1 -0
  646. package/dist/registry/xp-runtime.js +14 -0
  647. package/dist/registry/xp-runtime.js.map +1 -0
  648. package/dist/rewards/index.d.ts.map +1 -1
  649. package/dist/rewards/index.js +5 -4
  650. package/dist/rewards/index.js.map +1 -1
  651. package/dist/scanning/actions/index.d.ts +116 -0
  652. package/dist/scanning/actions/index.d.ts.map +1 -0
  653. package/dist/scanning/actions/index.js +185 -0
  654. package/dist/scanning/actions/index.js.map +1 -0
  655. package/dist/scanning/index.d.ts +5 -2
  656. package/dist/scanning/index.d.ts.map +1 -1
  657. package/dist/scanning/index.js +13 -9
  658. package/dist/scanning/index.js.map +1 -1
  659. package/dist/scanning/lifecycle.d.ts +77 -0
  660. package/dist/scanning/lifecycle.d.ts.map +1 -0
  661. package/dist/scanning/lifecycle.js +93 -0
  662. package/dist/scanning/lifecycle.js.map +1 -0
  663. package/dist/scanning/odds.d.ts +111 -0
  664. package/dist/scanning/odds.d.ts.map +1 -0
  665. package/dist/scanning/odds.js +294 -0
  666. package/dist/scanning/odds.js.map +1 -0
  667. package/dist/scanning/signals.d.ts +121 -0
  668. package/dist/scanning/signals.d.ts.map +1 -0
  669. package/dist/scanning/signals.js +171 -0
  670. package/dist/scanning/signals.js.map +1 -0
  671. package/dist/starbases/actions/index.d.ts.map +1 -1
  672. package/dist/starbases/actions/index.js +5 -32
  673. package/dist/starbases/actions/index.js.map +1 -1
  674. package/dist/world/index.d.ts +110 -5
  675. package/dist/world/index.d.ts.map +1 -1
  676. package/dist/world/index.js +109 -4
  677. package/dist/world/index.js.map +1 -1
  678. package/dist/world/planet-claim-stake-plots.d.ts +130 -0
  679. package/dist/world/planet-claim-stake-plots.d.ts.map +1 -0
  680. package/dist/world/planet-claim-stake-plots.js +110 -0
  681. package/dist/world/planet-claim-stake-plots.js.map +1 -0
  682. package/dist/world/starbase-status.d.ts +176 -0
  683. package/dist/world/starbase-status.d.ts.map +1 -0
  684. package/dist/world/starbase-status.js +153 -0
  685. package/dist/world/starbase-status.js.map +1 -0
  686. package/package.json +10 -2
@@ -1,16 +1,25 @@
1
- import { getAddressEncoder, getBytesEncoder, getProgramDerivedAddress, isAddress, } from '@solana/kit';
1
+ import { deriveCurrencyCache, validateCurrencyCache, } from '../../internal/c4/currency-cache.js';
2
+ import { resolveDockFunding } from '../../internal/planning/fleet-dock-funding.js';
3
+ import { validateFleetDockingPolicy } from '../../internal/planning/fleet-docking.js';
4
+ import { deriveFactionOwnershipAddress } from '../../internal/c4/factions.js';
5
+ import { regionContainsCoordinate } from '../../internal/c4/region-geometry.js';
6
+ import { hashMovementCharacter } from '../../internal/planning/movement-character.js';
7
+ import { resolveXpRuntime } from '../../internal/planning/xp-runtime.js';
8
+ import { getAddressEncoder, isAddress } from '@solana/kit';
2
9
  import { InvalidActionInputError, SageSdkError } from '../../client/errors.js';
3
10
  import { readContextRawAccounts } from '../../client/reconciliation.js';
4
11
  import { deriveFleetAddress, fleetAccountDefinition, } from '../../internal/c4/fleet.js';
5
- import { deriveFleetCrewBindingAddress, fleetCrewBindingAccountDefinition, } from '../../internal/c4/fleet-crew-binding.js';
12
+ import { deriveFleetCrewBindingAddress, fleetCrewBindingAccountDefinition, matchesFleetCrewBindingIdentity, } from '../../internal/c4/fleet-crew-binding.js';
6
13
  import { deriveFactionRelationTrackerAddress, deriveRegionTrackerAddress, factionRelationTrackerAccountDefinition, regionTrackerAccountDefinition, } from '../../internal/c4/factions.js';
7
- import { sage } from '../../internal/c4/bindings.js';
8
- import { characterAccountDefinition, findCharacterPda, } from '../../internal/c4/identity.js';
14
+ import { FixedPoint, getFleetDecoder, getRegionTrackerDecoder, getStarSystemDecoder, } from '../../internal/c4/runtime-bindings.js';
15
+ import { characterAccountDefinition, findCharacterPda, } from '../../internal/c4/character.js';
9
16
  import { deriveStarbasePlayerAddress, starbasePlayerAccountDefinition, } from '../../internal/c4/starbase.js';
10
17
  import { buildStarSystemDiscoveryFilters, deriveStarSystemAddress, starSystemAccountDefinition, } from '../../internal/c4/world.js';
11
18
  import { requireGameAddress } from '../../internal/game-context.js';
12
- import { adaptDockedToIdleInstruction, adaptFleetSettleArrivalInstruction, adaptIdleToDockedInstruction, adaptStartSubwarpInstruction, adaptStopSubwarpInstruction, adaptWarpLaneInstruction, adaptWarpToCoordinateInstruction, validatePlanAuthorization, } from '../../internal/planning/authorization-adapter.js';
19
+ import { adaptDockedToIdleInstruction, adaptIdleToDockedInstruction, adaptStartSubwarpInstruction, adaptStopSubwarpInstruction, adaptWarpLaneInstruction, adaptWarpToCoordinateInstruction, validatePlanAuthorization, } from '../../internal/planning/authorization-adapter.js';
13
20
  import { createPlan, } from '../../planning/index.js';
21
+ import { resolveFleetArrival } from '../../internal/planning/fleet-arrival.js';
22
+ import { failFleetState, requireActionCoordinate, } from '../../internal/planning/fleet-state.js';
14
23
  const FLEET_STATE_IDLE = 'fleet.state.idle';
15
24
  const FLEET_STATE_MOVEMENT_STARTED = 'fleet.state.movement-started';
16
25
  function movementStartSemantics(fleet) {
@@ -32,50 +41,35 @@ function fail(message, address) {
32
41
  throw new SageSdkError('ACTION_PRECONDITION_FAILED', message, { address });
33
42
  }
34
43
  function validateSettleArrivalOptions(value) {
44
+ const remedy = 'Pass only { authorization: { profile, authority, keyIndex } } for Career XP subwarp. Certificates and delegated sub-Profiles are not supported.';
35
45
  if (value === null || typeof value !== 'object' || Array.isArray(value)) {
36
- throw new InvalidActionInputError('options', value, 'an object containing only funder', 'Pass { funder } with one valid z.ink/Solana address before retrying.');
46
+ throw new InvalidActionInputError('options', value, 'one explicit arrival authorization route', remedy);
37
47
  }
38
48
  const record = value;
39
- if (Object.keys(record).length !== 1 ||
40
- !Object.hasOwn(record, 'funder') ||
41
- typeof record.funder !== 'string' ||
42
- !isAddress(record.funder)) {
43
- throw new InvalidActionInputError('options.funder', record.funder, 'one valid z.ink/Solana account address and no other option fields', 'Set options.funder to the address that will fund Fleet arrival settlement before retrying.');
44
- }
45
- return { funder: record.funder };
46
- }
47
- function requireSettleArrivalState(fleet) {
48
- switch (fleet.state.kind) {
49
- case 'subwarp':
50
- case 'warp':
51
- return fleet.state.kind;
52
- case 'idle':
53
- return fail(`Fleet ${fleet.name} is idle and has no movement arrival to settle. Start a warp or subwarp movement, refresh the Fleet, and retry after or during that movement.`, fleet.address);
54
- case 'docked':
55
- return fail(`Fleet ${fleet.name} is docked and has no movement arrival to settle. Undock the Fleet, start a warp or subwarp movement, refresh it, and retry.`, fleet.address);
56
- case 'mining':
57
- return fail(`Fleet ${fleet.name} is mining, not moving toward an arrival. Stop mining through an appropriate game client, refresh the Fleet, and retry only after starting warp or subwarp movement.`, fleet.address);
58
- case 'respawn':
59
- return fail(`Fleet ${fleet.name} is in respawn, not warp or subwarp movement. Wait for the Fleet to finish respawning or advance it through an appropriate game client, refresh it, and retry only after starting movement.`, fleet.address);
60
- case 'destroyed':
61
- return fail(`Fleet ${fleet.name} is destroyed and cannot have a movement arrival settled. Respawn the Fleet through an appropriate game client, refresh it, and retry only after starting warp or subwarp movement.`, fleet.address);
62
- case 'claimStakeTransfer':
63
- return fail(`Fleet ${fleet.name} is in a claimStakeTransfer state, not movement. Finish the Claim Stake transfer, refresh the Fleet, and retry only after starting warp or subwarp movement.`, fleet.address);
49
+ if (Object.keys(record).length === 1 &&
50
+ Object.hasOwn(record, 'authorization')) {
51
+ const auth = record.authorization;
52
+ if (auth !== null && typeof auth === 'object' && !Array.isArray(auth)) {
53
+ const fields = auth;
54
+ if (Object.keys(fields).length === 3 &&
55
+ Object.hasOwn(fields, 'keyIndex') &&
56
+ Object.hasOwn(fields, 'profile') &&
57
+ Object.hasOwn(fields, 'authority') &&
58
+ typeof fields.profile === 'string' &&
59
+ isAddress(fields.profile) &&
60
+ typeof fields.authority === 'string' &&
61
+ isAddress(fields.authority)) {
62
+ const authorization = {
63
+ profile: fields.profile,
64
+ authority: fields.authority,
65
+ keyIndex: fields.keyIndex,
66
+ };
67
+ validatePlanAuthorization(authorization);
68
+ return { authorization };
69
+ }
70
+ }
64
71
  }
65
- }
66
- const STOP_SUBWARP_REMEDIES = {
67
- claimStakeTransfer: 'Finish the Claim Stake transfer',
68
- destroyed: 'Respawn it',
69
- docked: 'Undock it',
70
- mining: 'Stop mining',
71
- respawn: 'Wait for it to finish respawning',
72
- warp: 'Let warp finish and settle its arrival',
73
- };
74
- function requireStopSubwarpState(fleet) {
75
- const state = fleet.state.kind;
76
- if (state === 'subwarp' || state === 'idle')
77
- return;
78
- fail(`Fleet ${fleet.name} is ${state} and cannot stop subwarp. ${STOP_SUBWARP_REMEDIES[state]}, start subwarp, refresh it, and retry.`, fleet.address);
72
+ throw new InvalidActionInputError('options', value, 'direct Profile authorization', remedy);
79
73
  }
80
74
  function assertFleetOwner(fleet, authorization) {
81
75
  if (fleet.ownerProfile.address !== authorization.profile) {
@@ -88,26 +82,8 @@ function requireDockedState(fleet) {
88
82
  }
89
83
  return fleet.state;
90
84
  }
91
- const REFRESH_TO_IDLE_REMEDIES = {
92
- claimStakeTransfer: 'Wait for or complete the claim-stake transfer, refresh the Fleet, and retry.',
93
- destroyed: 'Respawn the Fleet, refresh it, and retry.',
94
- docked: 'Undock the Fleet, refresh it, and retry.',
95
- mining: 'Stop mining, refresh the Fleet, and retry.',
96
- respawn: 'Wait for the Fleet to recover, refresh it, and retry.',
97
- };
98
85
  function requireRefreshableIdleState(fleet, action) {
99
- if (fleet.state.kind === 'idle')
100
- return fleet.location;
101
- if (fleet.state.kind === 'warp' || fleet.state.kind === 'subwarp') {
102
- return fleet.state.to;
103
- }
104
- const remedy = REFRESH_TO_IDLE_REMEDIES[fleet.state.kind];
105
- const requirement = action === 'dock'
106
- ? 'the Fleet must be idle or in a refreshable warp/subwarp state at a Starbase System coordinate'
107
- : action === 'warp through a lane'
108
- ? 'the Fleet must be idle or in a refreshable warp/subwarp state at a Star System coordinate'
109
- : 'the Fleet must be idle or in a refreshable warp/subwarp state at a coordinate';
110
- fail(`Fleet ${fleet.name} is ${fleet.state.kind}, so it cannot ${action}; ${requirement}. ${remedy} Then retry ${action === 'dock' ? 'docking' : action}.`, fleet.address);
86
+ return requireActionCoordinate(fleet, action, `it must be idle or in a refreshable warp/subwarp state at ${action === 'dock' ? 'a Starbase System coordinate' : action === 'warp through a lane' ? 'a Star System coordinate' : 'a coordinate'}`);
111
87
  }
112
88
  function requireRawAccount(account, message, address) {
113
89
  return account ?? fail(message, address);
@@ -124,20 +100,14 @@ function validateFleetRead(account, fleet, game, system, systemSequenceId) {
124
100
  }
125
101
  return data;
126
102
  }
127
- function validateCharacterRead(account, fleet, profile, game) {
128
- const data = characterAccountDefinition.decode(account);
129
- if (data.playerProfile !== profile || data.game !== game) {
130
- fail(`Fleet ${fleet.name} cannot undock because the canonical Character does not match Profile ${profile} and the configured Game ${game}. Refresh or repair the Character registration for this Profile and Game before retrying.`, account.address);
131
- }
132
- return data;
133
- }
134
- async function validateSystemRead(account, fleet, game, systemSequenceId) {
103
+ /** Requires a Star System of the configured Game at its canonical PDA and,
104
+ * for a docked Fleet, at the docked sequence. */
105
+ async function validateFleetSystemRead(account, fleet, game, action, label = 'Star System', sequenceId) {
135
106
  const data = starSystemAccountDefinition.decode(account);
136
- const canonicalAddress = await deriveStarSystemAddress(game, data.systemId);
137
107
  if (data.game !== game ||
138
- canonicalAddress !== account.address ||
139
- data.sequenceId !== systemSequenceId) {
140
- fail(`Fleet ${fleet.name} cannot undock because Star System ${account.address} does not match its configured Game, PDA, or docked sequence. Refresh the Fleet and System state before retrying.`, account.address);
108
+ (await deriveStarSystemAddress(game, data.systemId)) !== account.address ||
109
+ (sequenceId !== undefined && data.sequenceId !== sequenceId)) {
110
+ fail(`Fleet ${fleet.name} cannot ${action} because ${label} ${account.address} does not match the configured Game${sequenceId === undefined ? ' or its canonical PDA' : ', its canonical PDA or the docked sequence'}. Refresh the Fleet and galaxy, then retry.`, account.address);
141
111
  }
142
112
  return data;
143
113
  }
@@ -151,17 +121,6 @@ function validateStarbasePlayerRead(account, fleet, profile, character, system,
151
121
  }
152
122
  return data;
153
123
  }
154
- async function validateDockSystemRead(account, fleet, game, canonicalAddress, exactLocation) {
155
- const data = starSystemAccountDefinition.decode(account);
156
- const derivedAddress = await deriveStarSystemAddress(game, data.systemId);
157
- if (account.address !== canonicalAddress ||
158
- account.address !== derivedAddress ||
159
- data.game !== game ||
160
- !hasExactSystemLocation(account, exactLocation)) {
161
- fail(`Fleet ${fleet.name} cannot dock because Star System ${canonicalAddress} does not match the configured Game, Fleet coordinate, or canonical PDA. Refresh the Fleet and galaxy before retrying.`, canonicalAddress);
162
- }
163
- return data;
164
- }
165
124
  function failNoDockableStarbase(fleet, location) {
166
125
  return fail(`Fleet ${fleet.name} action coordinate (${String(location.x)}, ${String(location.y)}) has no Starbase to dock at. Move the Fleet to a Starbase system first, refresh the Fleet and galaxy, and retry.`, fleet.address);
167
126
  }
@@ -189,25 +148,73 @@ function validateCoordinateComponent(field, value) {
189
148
  throw new InvalidActionInputError(field, value, 'an I8F56-encodable SAGE coordinate from -128 inclusive to 128 exclusive', `Set ${field} within the pinned movement instruction codec range before retrying.`);
190
149
  }
191
150
  }
192
- function validateDestination(fleet, actionLocation, destination) {
151
+ function validateDisplayDestination(fleet, actionLocation, destination) {
193
152
  validateCoordinateComponent('destination.x', destination.x);
194
153
  validateCoordinateComponent('destination.y', destination.y);
195
154
  if (destination.x === actionLocation.x &&
196
155
  destination.y === actionLocation.y) {
197
- failSameCoordinate(fleet, destination);
156
+ failSameCoordinate(fleet, `destination (${String(destination.x)}, ${String(destination.y)})`);
198
157
  }
199
158
  }
200
159
  function failSameCoordinate(fleet, destination) {
201
- return fail(`Fleet ${fleet.name} destination (${String(destination.x)}, ${String(destination.y)}) is its action coordinate. Choose a different coordinate and retry.`, fleet.address);
160
+ return fail(`Fleet ${fleet.name} ${destination} is its action coordinate. Choose a different coordinate and retry.`, fleet.address);
202
161
  }
203
- function validateCharacterForCoordinateMovement(account, fleet, profile, game, canonicalAddress, action = 'move') {
204
- const data = characterAccountDefinition.decode(account);
205
- if (account.address !== canonicalAddress ||
162
+ const SIGNED_I64_MIN = -(1n << 63n);
163
+ const SIGNED_I64_MAX = (1n << 63n) - 1n;
164
+ function validateRawCoordinateComponent(field, value) {
165
+ if (typeof value !== 'bigint') {
166
+ throw new InvalidActionInputError(field, value, 'a bigint containing the exact raw I8F56 axis', `Set ${field} to the signed 64-bit raw coordinate from the selected game value before retrying.`);
167
+ }
168
+ if (value < SIGNED_I64_MIN || value > SIGNED_I64_MAX) {
169
+ throw new InvalidActionInputError(field, value, `a signed 64-bit raw I8F56 bigint from ${String(SIGNED_I64_MIN)} through ${String(SIGNED_I64_MAX)}`, `Set ${field} within the exact movement instruction range before retrying.`);
170
+ }
171
+ return value;
172
+ }
173
+ function resolveCoordinateDestination(fleet, actionLocation, options) {
174
+ const hasDisplay = Object.hasOwn(options, 'destination');
175
+ const hasRaw = Object.hasOwn(options, 'destinationRaw');
176
+ if (hasDisplay === hasRaw) {
177
+ throw new InvalidActionInputError('destination/destinationRaw', options, 'exactly one of destination or destinationRaw', 'Set destination for caller-selected display rounding or destinationRaw for exact signed-I8F56 intent, omit the other property entirely, then retry.');
178
+ }
179
+ if (hasDisplay) {
180
+ const destination = options.destination;
181
+ if (destination === undefined || destination === null) {
182
+ throw new InvalidActionInputError('destination', destination, 'an object with finite numeric x and y axes', 'Set destination to display coordinates, or replace it with destinationRaw for exact signed-I8F56 intent.');
183
+ }
184
+ validateDisplayDestination(fleet, actionLocation, destination);
185
+ return {
186
+ description: `(${String(destination.x)}, ${String(destination.y)})`,
187
+ exact: exactCoordinate(destination),
188
+ field: 'destination',
189
+ };
190
+ }
191
+ const destinationRaw = options.destinationRaw;
192
+ if (destinationRaw === undefined ||
193
+ destinationRaw === null ||
194
+ typeof destinationRaw !== 'object') {
195
+ throw new InvalidActionInputError('destinationRaw', destinationRaw, 'an object with bigint x and y axes', 'Set destinationRaw to exact signed-I8F56 coordinates, or replace it with destination display coordinates.');
196
+ }
197
+ const exact = {
198
+ x: validateRawCoordinateComponent('destinationRaw.x', destinationRaw.x),
199
+ y: validateRawCoordinateComponent('destinationRaw.y', destinationRaw.y),
200
+ };
201
+ return {
202
+ description: `(${FixedPoint.fromRaw(exact.x, 56).toString()}, ${FixedPoint.fromRaw(exact.y, 56).toString()})`,
203
+ exact,
204
+ field: 'destinationRaw',
205
+ };
206
+ }
207
+ /** Requires the authorization Profile's canonical Character in the
208
+ * configured Game. */
209
+ function requireFleetCharacter(account, fleet, profile, game, address, action) {
210
+ const character = requireRawAccount(account, `Fleet ${fleet.name} cannot ${action} because its Profile has no canonical Character at ${address}. Create the Character for Profile ${profile} in the configured Game, refresh the Fleet, and retry.`, address);
211
+ const data = characterAccountDefinition.decode(character);
212
+ if (character.address !== address ||
206
213
  data.playerProfile !== profile ||
207
214
  data.game !== game) {
208
- fail(`Fleet ${fleet.name} cannot ${action} because the canonical Character does not match Profile ${profile} and the configured Game ${game}. Refresh or repair the Character registration for this Profile and Game before retrying.`, account.address);
215
+ fail(`Fleet ${fleet.name} cannot ${action} because the canonical Character does not match Profile ${profile} and the configured Game ${game}. Refresh or repair the Character registration for this Profile and Game before retrying.`, address);
209
216
  }
210
- return data;
217
+ return character;
211
218
  }
212
219
  async function validateIdleFleetRead(account, fleet, game, actionLocation, planName = 'coordinate movement') {
213
220
  const data = fleetAccountDefinition.decode(account);
@@ -228,7 +235,7 @@ async function validateIdleFleetRead(account, fleet, game, actionLocation, planN
228
235
  stateLocation?.y !== actionLocation.y) {
229
236
  fail(`Fleet ${fleet.name} changed or no longer matches its configured Game, owner, address, PDA, or idle coordinate, movement state, and action coordinate. Refresh the Fleet and create a new ${planName} Plan before retrying.`, fleet.address);
230
237
  }
231
- const exact = sage.getFleetDecoder().decode(account.data);
238
+ const exact = getFleetDecoder().decode(account.data);
232
239
  let exactLocation = exact.location;
233
240
  if (exact.state.__kind === 'MoveWarp') {
234
241
  exactLocation = exact.state.fields[0].to;
@@ -248,71 +255,31 @@ function validateRegionTrackerRead(account, fleet, game, canonicalAddress, actio
248
255
  if (account.address !== canonicalAddress || data.game !== game) {
249
256
  fail(`Fleet ${fleet.name} cannot ${action} because RegionTracker does not match the configured Game or canonical PDA: ${account.address}; refresh the world region data for the configured Game and retry.`, account.address);
250
257
  }
251
- return sage.getRegionTrackerDecoder().decode(account.data);
258
+ return getRegionTrackerDecoder().decode(account.data);
252
259
  }
253
260
  function validateCrewBindingRead(account, fleet, canonicalAddress) {
254
261
  const data = fleetCrewBindingAccountDefinition.decode(account);
255
262
  if (account.address !== canonicalAddress ||
256
- data.fleet !== fleet.address ||
257
- data.ownerProfile !== fleet.ownerProfile.address) {
263
+ !matchesFleetCrewBindingIdentity(data, fleet.address, fleet.ownerProfile.address)) {
258
264
  fail(`FleetCrewBinding does not match Fleet ${fleet.address}, its owner Profile, or its canonical PDA: ${account.address}. Refresh the Fleet crew registration or remove the invalid binding before retrying.`, account.address);
259
265
  }
260
266
  return data;
261
267
  }
262
- function pointIsOnSegment(point, start, end) {
263
- const cross = (point.y - start.y) * (end.x - start.x) -
264
- (point.x - start.x) * (end.y - start.y);
265
- return (cross === 0n &&
266
- point.x >= (start.x < end.x ? start.x : end.x) &&
267
- point.x <= (start.x > end.x ? start.x : end.x) &&
268
- point.y >= (start.y < end.y ? start.y : end.y) &&
269
- point.y <= (start.y > end.y ? start.y : end.y));
270
- }
271
- function regionContainsCoordinate(region, coordinate) {
272
- const boundingBox = {
273
- maxX: region.boundingBox.maxX.raw,
274
- maxY: region.boundingBox.maxY.raw,
275
- minX: region.boundingBox.minX.raw,
276
- minY: region.boundingBox.minY.raw,
277
- };
278
- const border = region.border.map(([x, y]) => ({ x: x.raw, y: y.raw }));
279
- if (border.length < 3 ||
280
- coordinate.x < boundingBox.minX ||
281
- coordinate.x > boundingBox.maxX ||
282
- coordinate.y < boundingBox.minY ||
283
- coordinate.y > boundingBox.maxY) {
284
- return false;
285
- }
286
- let inside = false;
287
- for (let index = 0; index < border.length; index += 1) {
288
- const start = border[index];
289
- const end = border[(index + 1) % border.length];
290
- if (pointIsOnSegment(coordinate, start, end))
291
- return true;
292
- if (start.y > coordinate.y !== end.y > coordinate.y) {
293
- const deltaY = end.y - start.y;
294
- const pointSide = (coordinate.x - start.x) * deltaY;
295
- const edgeSide = (coordinate.y - start.y) * (end.x - start.x);
296
- if ((deltaY > 0n && pointSide < edgeSide) ||
297
- (deltaY < 0n && pointSide > edgeSide)) {
298
- inside = !inside;
299
- }
300
- }
301
- }
302
- return inside;
303
- }
304
- function resolveRegionId(tracker, coordinate, displayCoordinate, label, fleet, trackerAddress) {
268
+ function resolveRegionId(tracker, coordinate, coordinateDescription, label, fleet, trackerAddress) {
305
269
  const region = tracker.regions.unsizedList.find((candidate) => regionContainsCoordinate(candidate, coordinate));
306
270
  if (region === undefined) {
307
- fail(`Fleet ${fleet.name} ${label} coordinate (${String(displayCoordinate.x)}, ${String(displayCoordinate.y)}) cannot be mapped by RegionTracker ${trackerAddress}. Refresh the world region data or choose a coordinate inside a configured Region before retrying.`, trackerAddress);
271
+ const errorDescription = label === 'destinationRaw'
272
+ ? `(${String(coordinate.x)}, ${String(coordinate.y)}) raw I8F56`
273
+ : coordinateDescription;
274
+ fail(`Fleet ${fleet.name} ${label} coordinate ${errorDescription} cannot be mapped by RegionTracker ${trackerAddress}. Refresh the world region data or choose a coordinate inside a configured Region before retrying.`, trackerAddress);
308
275
  }
309
276
  return region.id;
310
277
  }
311
278
  function exactCoordinate(coordinate) {
312
279
  const spec = { fractionalBits: 56, signed: true, totalBits: 64 };
313
280
  return {
314
- x: sage.FixedPoint.fromNumber(coordinate.x, spec).raw,
315
- y: sage.FixedPoint.fromNumber(coordinate.y, spec).raw,
281
+ x: FixedPoint.fromNumber(coordinate.x, spec).raw,
282
+ y: FixedPoint.fromNumber(coordinate.y, spec).raw,
316
283
  };
317
284
  }
318
285
  async function resolveCoordinateMovement(ctx, fleet, authorization, actionLocation, destination) {
@@ -329,15 +296,13 @@ async function resolveCoordinateMovement(ctx, fleet, authorization, actionLocati
329
296
  crewBinding,
330
297
  ]);
331
298
  const fleetAccount = requireRawAccount(fleetCandidate, `Fleet ${fleet.name} is no longer available at ${fleet.address}. Refresh the Fleet and retry planning coordinate movement.`, fleet.address);
332
- const characterAccount = requireRawAccount(characterCandidate, `Fleet ${fleet.name} cannot move because its Profile has no canonical Character at ${character}. Create the Character for Profile ${authorization.profile} in the configured Game, refresh the Fleet, and retry.`, character);
299
+ const characterAccount = requireFleetCharacter(characterCandidate, fleet, authorization.profile, game, character, 'move');
333
300
  const regionTrackerAccount = requireRawAccount(regionCandidate, `Fleet ${fleet.name} cannot move because the canonical RegionTracker ${regionTracker} is missing. Verify the configured Game and cluster, refresh the world region data, and retry.`, regionTracker);
334
301
  const validatedFleet = await validateIdleFleetRead(fleetAccount, fleet, game, actionLocation);
335
- const exactDestination = exactCoordinate(destination);
336
- if (exactDestination.x === validatedFleet.location.x &&
337
- exactDestination.y === validatedFleet.location.y) {
338
- failSameCoordinate(fleet, destination);
302
+ if (destination.exact.x === validatedFleet.location.x &&
303
+ destination.exact.y === validatedFleet.location.y) {
304
+ failSameCoordinate(fleet, `${destination.field} ${destination.description}`);
339
305
  }
340
- validateCharacterForCoordinateMovement(characterAccount, fleet, authorization.profile, game, character);
341
306
  const tracker = validateRegionTrackerRead(regionTrackerAccount, fleet, game, regionTracker);
342
307
  if (crewCandidate !== undefined) {
343
308
  validateCrewBindingRead(crewCandidate, fleet, crewBinding);
@@ -348,21 +313,27 @@ async function resolveCoordinateMovement(ctx, fleet, authorization, actionLocati
348
313
  ...(crewCandidate === undefined
349
314
  ? {}
350
315
  : { crewBinding, crewBindingAccount: crewCandidate }),
351
- destinationRegionId: resolveRegionId(tracker, exactDestination, destination, 'destination', fleet, regionTracker),
316
+ destinationRegionId: resolveRegionId(tracker, destination.exact, destination.description, destination.field, fleet, regionTracker),
352
317
  fleetAccount,
353
318
  regionTracker,
354
319
  regionTrackerAccount,
355
- startRegionId: resolveRegionId(tracker, validatedFleet.location, actionLocation, 'current', fleet, regionTracker),
320
+ startRegionId: resolveRegionId(tracker, validatedFleet.location, `(${String(actionLocation.x)}, ${String(actionLocation.y)})`, 'current', fleet, regionTracker),
356
321
  };
357
322
  }
358
323
  async function planCoordinateMovement(mode, ctx, fleet, options) {
359
324
  validatePlanAuthorization(options.authorization);
360
325
  assertFleetOwner(fleet, options.authorization);
361
326
  const actionLocation = requireRefreshableIdleState(fleet, 'start coordinate movement');
362
- validateDestination(fleet, actionLocation, options.destination);
327
+ const destination = resolveCoordinateDestination(fleet, actionLocation, options);
363
328
  const game = requireGameAddress(ctx);
364
- const resolved = await resolveCoordinateMovement(ctx, fleet, options.authorization, actionLocation, options.destination);
329
+ const resolved = await resolveCoordinateMovement(ctx, fleet, options.authorization, actionLocation, destination);
330
+ const xp = await resolveXpRuntime(ctx, {
331
+ game,
332
+ character: resolved.character,
333
+ profile: options.authorization.profile,
334
+ });
365
335
  const common = {
336
+ ...xp.accounts,
366
337
  authorization: options.authorization,
367
338
  character: resolved.character,
368
339
  ...(resolved.crewBinding === undefined
@@ -377,19 +348,36 @@ async function planCoordinateMovement(mode, ctx, fleet, options) {
377
348
  const instruction = mode === 'subwarp'
378
349
  ? adaptStartSubwarpInstruction({
379
350
  ...common,
380
- toCoordinate: [options.destination.x, options.destination.y],
351
+ toCoordinate: [destination.exact.x, destination.exact.y],
381
352
  })
382
353
  : adaptWarpToCoordinateInstruction({
383
354
  ...common,
384
- destination: [options.destination.x, options.destination.y],
355
+ destination: [destination.exact.x, destination.exact.y],
385
356
  });
386
357
  const verb = mode === 'subwarp' ? 'Subwarp' : 'Warp';
387
- const description = `${verb} fleet ${fleet.name} to coordinate (${String(options.destination.x)}, ${String(options.destination.y)}).`;
358
+ const description = `${verb} fleet ${fleet.name} to coordinate ${destination.description}.`;
388
359
  const accounts = [
360
+ {
361
+ kind: 'xp-runtime',
362
+ address: game,
363
+ intent: xp.intent,
364
+ accounts: xp.accounts,
365
+ describes: 'The configured Game and canonical Character XP accounts remain eligible for movement.',
366
+ },
389
367
  await precondition(resolved.fleetAccount, fleet.state.kind === 'idle'
390
368
  ? `Fleet ${fleet.name} remains idle at coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}).`
391
369
  : `Fleet ${fleet.name} remains ${fleet.state.kind} with action coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}).`),
392
- await precondition(resolved.characterAccount, `The canonical Character remains assigned to Profile ${options.authorization.profile} in the configured Game.`),
370
+ {
371
+ kind: 'movement-character',
372
+ address: resolved.character,
373
+ game,
374
+ profile: options.authorization.profile,
375
+ stateHash: await hashMovementCharacter(resolved.characterAccount, {
376
+ game,
377
+ profile: options.authorization.profile,
378
+ }),
379
+ describes: 'The canonical Character retains its movement modifiers and non-accrual state.',
380
+ },
393
381
  await precondition(resolved.regionTrackerAccount, `The configured RegionTracker continues to map Fleet ${fleet.name}'s current and destination coordinates.`),
394
382
  ...(resolved.crewBindingAccount === undefined
395
383
  ? []
@@ -411,45 +399,35 @@ async function planCoordinateMovement(mode, ctx, fleet, options) {
411
399
  summary: description,
412
400
  });
413
401
  }
414
- async function deriveCurrencyCacheAddress(game) {
415
- const [address] = await getProgramDerivedAddress({
416
- programAddress: sage.SAGE_PROGRAM_ADDRESS,
417
- seeds: [
418
- getBytesEncoder().encode(new TextEncoder().encode('CurrencyConfig')),
419
- getAddressEncoder().encode(game),
420
- ],
421
- });
422
- return address;
423
- }
424
- function validateCurrencyCacheRead(account, fleet, game, canonicalAddress) {
425
- const decoder = sage.getCurrencyConfigCacheDecoder();
426
- const discriminator = sage.CURRENCY_CONFIG_CACHE_DISCRIMINATOR;
427
- const validDiscriminator = discriminator.every((byte, index) => account.data[index] === byte);
428
- if (account.address !== canonicalAddress ||
429
- account.owner !== sage.SAGE_PROGRAM_ADDRESS ||
430
- account.data.length !== decoder.fixedSize ||
431
- !validDiscriminator) {
432
- fail(`Fleet ${fleet.name} cannot use a warp lane because CurrencyCache ${account.address} does not match the configured Game, canonical PDA, owner, or pinned account layout. Refresh the Game currency configuration and retry.`, account.address);
433
- }
434
- const decoded = decoder.decode(account.data);
435
- if (decoded.gameId !== game) {
436
- fail(`Fleet ${fleet.name} cannot use a warp lane because CurrencyCache ${account.address} does not match the configured Game or canonical PDA. Refresh the Game currency configuration and retry.`, account.address);
437
- }
438
- }
439
- async function validateLaneSystemRead(account, fleet, game, label) {
440
- const data = starSystemAccountDefinition.decode(account);
441
- const canonicalAddress = await deriveStarSystemAddress(game, data.systemId);
442
- if (data.game !== game || account.address !== canonicalAddress) {
443
- fail(`Fleet ${fleet.name} cannot use a warp lane because the ${label} Star System ${account.address} does not match the configured Game or canonical PDA. Refresh the galaxy and retry with a Star System from the configured Game.`, account.address);
444
- }
445
- return data;
446
- }
447
402
  function hasExactSystemLocation(account, location) {
448
403
  starSystemAccountDefinition.decode(account);
449
- const exact = sage.getStarSystemDecoder().decode(account.data);
404
+ const exact = getStarSystemDecoder().decode(account.data);
450
405
  return (exact.coordinates[0].raw === location.x &&
451
406
  exact.coordinates[1].raw === location.y);
452
407
  }
408
+ /** The Star Systems of the configured Game discovered at a Fleet's displayed
409
+ * action coordinate. */
410
+ async function discoverSystemsAt(ctx, game, location) {
411
+ const systems = await ctx.data.discover(starSystemAccountDefinition, {
412
+ filters: buildStarSystemDiscoveryFilters(game),
413
+ strategy: 'targeted-program-accounts',
414
+ });
415
+ return systems
416
+ .filter(({ data }) => data.coordinates.x === location.x && data.coordinates.y === location.y)
417
+ .map(({ address }) => address);
418
+ }
419
+ /** Selects the one fresh candidate whose exact coordinate is the Fleet's. */
420
+ function selectSystemAt(fleet, location, exact, candidates, accounts) {
421
+ const matches = accounts.filter((account) => account !== undefined && hasExactSystemLocation(account, exact));
422
+ if (matches.length === 1)
423
+ return matches[0];
424
+ const coordinate = `Fleet ${fleet.name} action coordinate (${String(location.x)}, ${String(location.y)})`;
425
+ if (candidates.length === 1) {
426
+ const [only] = accounts;
427
+ fail(`${coordinate} no longer matches Star System ${only === undefined ? candidates[0] : starSystemAccountDefinition.decode(only).name}. Refresh the Fleet and galaxy, then retry.`, candidates[0]);
428
+ }
429
+ return fail(`${coordinate} matches multiple Star Systems in the configured Game. Refresh the galaxy and repair the contradictory System data before retrying.`, fleet.address);
430
+ }
453
431
  function validateFactionRelationTrackerRead(account, fleet, game, canonicalAddress) {
454
432
  const data = factionRelationTrackerAccountDefinition.decode(account);
455
433
  if (account.address !== canonicalAddress || data.game !== game) {
@@ -458,18 +436,13 @@ function validateFactionRelationTrackerRead(account, fleet, game, canonicalAddre
458
436
  }
459
437
  async function resolveWarpLane(ctx, fleet, actionLocation, options) {
460
438
  const game = requireGameAddress(ctx);
461
- const systems = await ctx.data.discover(starSystemAccountDefinition, {
462
- filters: buildStarSystemDiscoveryFilters(game),
463
- strategy: 'targeted-program-accounts',
464
- });
465
- const sourceCandidates = systems.filter((system) => system.data.coordinates.x === actionLocation.x &&
466
- system.data.coordinates.y === actionLocation.y);
439
+ const sourceCandidates = await discoverSystemsAt(ctx, game, actionLocation);
467
440
  if (sourceCandidates.length === 0) {
468
441
  fail(`Fleet ${fleet.name} action coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}) does not match a Star System in the configured Game. Refresh the galaxy or move the Fleet to a Star System before retrying.`, fleet.address);
469
442
  }
470
443
  const [character, currencyCache, factionRelationTracker, regionTracker] = await Promise.all([
471
444
  findCharacterPda(options.authorization.profile, game),
472
- deriveCurrencyCacheAddress(game),
445
+ deriveCurrencyCache(game).then(([address]) => address),
473
446
  deriveFactionRelationTrackerAddress(game),
474
447
  deriveRegionTrackerAddress(game),
475
448
  ]);
@@ -478,7 +451,7 @@ async function resolveWarpLane(ctx, fleet, actionLocation, options) {
478
451
  const reads = await readContextRawAccounts(ctx, [
479
452
  fleet.address,
480
453
  character,
481
- ...sourceCandidates.map((candidate) => candidate.address),
454
+ ...sourceCandidates,
482
455
  options.destinationSystem,
483
456
  currencyCache,
484
457
  factionRelationTracker,
@@ -491,33 +464,17 @@ async function resolveWarpLane(ctx, fleet, actionLocation, options) {
491
464
  const factionCandidate = reads[destinationOffset + 2];
492
465
  const regionCandidate = reads[destinationOffset + 3];
493
466
  const fleetAccount = requireRawAccount(fleetCandidate, `Fleet ${fleet.name} is no longer available at ${fleet.address}. Refresh the Fleet and retry planning the warp lane.`, fleet.address);
494
- const validatedFleet = await validateIdleFleetRead(fleetAccount, fleet, game, actionLocation);
495
- const exactSourceCandidates = sourceCandidates.flatMap((candidate, index) => {
496
- const account = reads[sourceOffset + index];
497
- return account !== undefined &&
498
- hasExactSystemLocation(account, validatedFleet.location)
499
- ? [{ account, address: candidate.address }]
500
- : [];
501
- });
502
- if (exactSourceCandidates.length !== 1) {
503
- if (sourceCandidates.length === 1) {
504
- const sourceSystem = sourceCandidates[0].address;
505
- const sourceAccount = requireRawAccount(reads[sourceOffset], `Fleet ${fleet.name} cannot use a warp lane because source Star System ${sourceSystem} is missing. Refresh the Fleet and galaxy, then retry.`, sourceSystem);
506
- const source = starSystemAccountDefinition.decode(sourceAccount);
507
- fail(`Fleet ${fleet.name} action coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}) no longer matches source Star System ${source.name}. Refresh the Fleet and galaxy before retrying.`, sourceSystem);
508
- }
509
- fail(`Fleet ${fleet.name} action coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}) matches multiple Star Systems in the configured Game. Refresh the galaxy and repair the contradictory System data before retrying.`, fleet.address);
510
- }
511
- const { account: sourceAccount, address: sourceSystem } = exactSourceCandidates[0];
512
- const characterAccount = requireRawAccount(characterCandidate, `Fleet ${fleet.name} cannot use a warp lane because its Profile has no canonical Character at ${character}. Create the Character for Profile ${options.authorization.profile} in the configured Game, refresh the Fleet, and retry.`, character);
467
+ const validatedFleet = await validateIdleFleetRead(fleetAccount, fleet, game, actionLocation, 'warp lane');
468
+ const sourceAccount = selectSystemAt(fleet, actionLocation, validatedFleet.location, sourceCandidates, reads.slice(sourceOffset, destinationOffset));
469
+ const sourceSystem = sourceAccount.address;
470
+ const characterAccount = requireFleetCharacter(characterCandidate, fleet, options.authorization.profile, game, character, 'use a warp lane');
513
471
  const destinationAccount = requireRawAccount(destinationCandidate, `Fleet ${fleet.name} cannot use a warp lane because destination Star System ${options.destinationSystem} is missing. Choose a Star System in the configured Game, refresh the galaxy, and retry.`, options.destinationSystem);
514
472
  const currencyCacheAccount = requireRawAccount(currencyCandidate, `Fleet ${fleet.name} cannot use a warp lane because canonical CurrencyCache ${currencyCache} is missing. Verify the configured Game and cluster, refresh the Game currency configuration, and retry.`, currencyCache);
515
473
  const factionRelationTrackerAccount = requireRawAccount(factionCandidate, `Fleet ${fleet.name} cannot use a warp lane because canonical FactionRelationTracker ${factionRelationTracker} is missing. Verify the configured Game and cluster, refresh the faction relation data, and retry.`, factionRelationTracker);
516
474
  const regionTrackerAccount = requireRawAccount(regionCandidate, `Fleet ${fleet.name} cannot use a warp lane because canonical RegionTracker ${regionTracker} is missing. Verify the configured Game and cluster, refresh the world region data, and retry.`, regionTracker);
517
- validateCharacterForCoordinateMovement(characterAccount, fleet, options.authorization.profile, game, character);
518
- const source = await validateLaneSystemRead(sourceAccount, fleet, game, 'source');
519
- const destination = await validateLaneSystemRead(destinationAccount, fleet, game, 'destination');
520
- validateCurrencyCacheRead(currencyCacheAccount, fleet, game, currencyCache);
475
+ const source = await validateFleetSystemRead(sourceAccount, fleet, game, 'use a warp lane', 'source Star System');
476
+ const destination = await validateFleetSystemRead(destinationAccount, fleet, game, 'use a warp lane', 'destination Star System');
477
+ await validateCurrencyCache(currencyCacheAccount, game, 'warp lane');
521
478
  validateFactionRelationTrackerRead(factionRelationTrackerAccount, fleet, game, factionRelationTracker);
522
479
  validateRegionTrackerRead(regionTrackerAccount, fleet, game, regionTracker);
523
480
  if (sourceSystem === options.destinationSystem) {
@@ -547,7 +504,15 @@ async function resolveWarpLane(ctx, fleet, actionLocation, options) {
547
504
  *
548
505
  * The planner resolves the source Star System from the Fleet's action coordinate,
549
506
  * proves connectivity from that System's decoded connections, and resolves all
550
- * generated instruction accounts internally.
507
+ * generated instruction accounts internally. CurrencyCache shared accounting may
508
+ * change; canonical identity/layout and the existing toll-input guards remain
509
+ * checked before signing. Refresh and recreate older Plans to use this guard.
510
+ *
511
+ * Connectivity does not guarantee eligibility. The program remains authoritative
512
+ * for faction-relationship and destination-risk checks and any ATLAS toll.
513
+ * Tested current PTR routes succeed with empty Fuel tanks. This planner does
514
+ * not estimate lane costs or treat enabled cross-faction economics as blanket
515
+ * permission.
551
516
  *
552
517
  * @example
553
518
  * ```ts
@@ -567,24 +532,54 @@ export async function planFleetWarpLane(ctx, fleet, options) {
567
532
  const actionLocation = requireRefreshableIdleState(fleet, 'warp through a lane');
568
533
  const game = requireGameAddress(ctx);
569
534
  const resolved = await resolveWarpLane(ctx, fleet, actionLocation, options);
535
+ const xp = await resolveXpRuntime(ctx, {
536
+ game,
537
+ character: resolved.character,
538
+ profile: options.authorization.profile,
539
+ });
570
540
  const description = `Warp fleet ${fleet.name} from Star System ${resolved.source.name} to Star System ${resolved.destination.name} via warp lane.`;
571
541
  return createPlan({
572
542
  kind: 'fleet.warp-lane',
573
- preconditions: await Promise.all([
574
- precondition(resolved.fleetAccount, fleet.state.kind === 'idle'
575
- ? `Fleet ${fleet.name} remains idle at Star System ${resolved.source.name}.`
576
- : `Fleet ${fleet.name} remains ${fleet.state.kind} at action source Star System ${resolved.source.name}.`),
577
- precondition(resolved.characterAccount, `The canonical Character remains assigned to Profile ${options.authorization.profile} in the configured Game.`),
578
- precondition(resolved.sourceAccount, `Source Star System ${resolved.source.name} remains at Fleet ${fleet.name}'s action coordinate with a connection to system id ${String(resolved.destination.systemId)}.`),
579
- precondition(resolved.destinationAccount, `Destination Star System ${resolved.destination.name} remains system id ${String(resolved.destination.systemId)} in the configured Game.`),
580
- precondition(resolved.currencyCacheAccount, 'The canonical CurrencyCache remains assigned to the configured Game.'),
581
- precondition(resolved.factionRelationTrackerAccount, 'The canonical FactionRelationTracker remains assigned to the configured Game.'),
582
- precondition(resolved.regionTrackerAccount, 'The canonical RegionTracker remains assigned to the configured Game.'),
583
- ]),
543
+ preconditions: [
544
+ {
545
+ kind: 'xp-runtime',
546
+ address: game,
547
+ intent: xp.intent,
548
+ accounts: xp.accounts,
549
+ describes: 'The configured Game and canonical Character XP accounts remain eligible for movement.',
550
+ },
551
+ ...(await Promise.all([
552
+ precondition(resolved.fleetAccount, fleet.state.kind === 'idle'
553
+ ? `Fleet ${fleet.name} remains idle at Star System ${resolved.source.name}.`
554
+ : `Fleet ${fleet.name} remains ${fleet.state.kind} at action source Star System ${resolved.source.name}.`),
555
+ hashMovementCharacter(resolved.characterAccount, {
556
+ game,
557
+ profile: options.authorization.profile,
558
+ }).then((stateHash) => ({
559
+ kind: 'movement-character',
560
+ address: resolved.character,
561
+ game,
562
+ profile: options.authorization.profile,
563
+ stateHash,
564
+ describes: 'The canonical Character retains its movement modifiers and non-accrual state.',
565
+ })),
566
+ precondition(resolved.sourceAccount, `Source Star System ${resolved.source.name} remains at Fleet ${fleet.name}'s action coordinate with a connection to system id ${String(resolved.destination.systemId)}.`),
567
+ precondition(resolved.destinationAccount, `Destination Star System ${resolved.destination.name} remains system id ${String(resolved.destination.systemId)} in the configured Game.`),
568
+ Promise.resolve({
569
+ kind: 'currency-cache',
570
+ address: resolved.currencyCacheAccount.address,
571
+ game,
572
+ describes: 'The canonical CurrencyCache retains its supported Game identity and layout; shared accounting may change.',
573
+ }),
574
+ precondition(resolved.factionRelationTrackerAccount, 'The canonical FactionRelationTracker remains assigned to the configured Game.'),
575
+ precondition(resolved.regionTrackerAccount, 'The canonical RegionTracker remains assigned to the configured Game.'),
576
+ ])),
577
+ ],
584
578
  steps: [
585
579
  {
586
580
  describes: description,
587
581
  instruction: adaptWarpLaneInstruction({
582
+ ...xp.accounts,
588
583
  authorization: options.authorization,
589
584
  character: resolved.character,
590
585
  currencyCache: resolved.currencyCache,
@@ -602,7 +597,7 @@ export async function planFleetWarpLane(ctx, fleet, options) {
602
597
  summary: description,
603
598
  });
604
599
  }
605
- /** Plans one explicit Fleet subwarp to a coordinate without movement estimates.
600
+ /** Plans one explicit Fleet subwarp to a display or exact raw coordinate without movement estimates.
606
601
  *
607
602
  * @example
608
603
  * ```ts
@@ -611,14 +606,14 @@ export async function planFleetWarpLane(ctx, fleet, options) {
611
606
  * declare const authorization: PlanAuthorization;
612
607
  * const plan = await planFleetSubwarp(ctx, fleet, {
613
608
  * authorization,
614
- * destination: { x: 12, y: -7 },
609
+ * destinationRaw: { x: 12n << 56n, y: -(7n << 56n) },
615
610
  * });
616
611
  * ```
617
612
  */
618
613
  export function planFleetSubwarp(ctx, fleet, options) {
619
614
  return planCoordinateMovement('subwarp', ctx, fleet, options);
620
615
  }
621
- /** Plans one explicit Fleet coordinate warp without movement estimates.
616
+ /** Plans one explicit Fleet coordinate warp to a display or exact raw coordinate without movement estimates.
622
617
  *
623
618
  * @example
624
619
  * ```ts
@@ -627,54 +622,80 @@ export function planFleetSubwarp(ctx, fleet, options) {
627
622
  * declare const authorization: PlanAuthorization;
628
623
  * const plan = await planFleetWarpToCoordinate(ctx, fleet, {
629
624
  * authorization,
630
- * destination: { x: 12, y: -7 },
625
+ * destinationRaw: { x: 12n << 56n, y: -(7n << 56n) },
631
626
  * });
632
627
  * ```
633
628
  */
634
629
  export function planFleetWarpToCoordinate(ctx, fleet, options) {
635
630
  return planCoordinateMovement('warp', ctx, fleet, options);
636
631
  }
637
- /** Plans settlement of one Fleet warp or subwarp arrival.
632
+ /** Plans settlement after chain time confirms the scheduled Fleet journey duration has elapsed.
633
+ *
634
+ * Game version 2 subwarp requires explicit direct Profile authorization and
635
+ * existing reconciled Career XP accounts. Warp settlement is unsupported.
636
+ * Journeys whose scheduled duration has not elapsed and Idle Fleets fail locally.
637
+ * Planning and execution read fresh accounts; no host clock is used.
638
638
  *
639
- * Settlement is distinct from stopping subwarp early: the program completes an
640
- * elapsed movement, while an in-transit call is a measured safe no-op. Subwarp
641
- * settlement charges the fuel recorded when movement started; warp fuel was
642
- * already charged up front. Settlement does not clear the independent warp
643
- * cooldown, so an arrived Fleet can be idle but still unable to warp again.
639
+ * Settlement does not guarantee reaching the destination: insufficient Fuel can
640
+ * leave the Fleet Idle short of it. Low Fuel produces a planning-time warning,
641
+ * not a rejection. Inspect refreshed state and location after confirmation.
642
+ * Subwarp settles fuel and XP and may refund released storage rent to the
643
+ * Profile. Warp cooldown remains independent. Fresh checks cannot prevent a
644
+ * concurrent transaction from starting another journey before execution; the
645
+ * authorized instruction could stop that new journey. Intentional early
646
+ * stopping remains the separate {@link planFleetStopSubwarp} operation.
644
647
  *
645
648
  * @example
646
649
  * ```ts
647
650
  * declare const ctx: SageContext;
648
651
  * declare const fleet: FleetSnapshot;
649
- * declare const funder: Address;
650
- * const plan = await planFleetSettleArrival(ctx, fleet, { funder });
652
+ * declare const authorization: PlanAuthorization;
653
+ * const plan = await planFleetSettleArrival(ctx, fleet, { authorization });
651
654
  * console.log(plan.describe());
652
655
  * ```
653
656
  */
654
657
  export async function planFleetSettleArrival(ctx, fleet, input) {
655
- const { funder } = validateSettleArrivalOptions(input);
656
- const movement = requireSettleArrivalState(fleet);
657
- const game = requireGameAddress(ctx);
658
- const character = await findCharacterPda(fleet.ownerProfile.address, game);
659
- const description = movement === 'subwarp'
660
- ? `Settle fleet ${fleet.name} after subwarp arrival and charge the fuel recorded when subwarp started.`
661
- : `Settle fleet ${fleet.name} after warp arrival; warp cooldown remains independent.`;
658
+ const options = validateSettleArrivalOptions(input);
659
+ const { intent, character, regionTracker, xp, lowFuel } = await resolveFleetArrival(ctx, fleet.address, options);
660
+ const fuelWarning = lowFuel
661
+ ? ' Fuel is below the recorded journey budget (at planning); may stop short with no Fuel.'
662
+ : '';
663
+ const description = `Settle subwarp: fuel and Career XP; possible rent refund to Profile ${intent.profile}. Settlement does not guarantee reaching the destination.${fuelWarning} Read confirmed state/location. A race could stop a new journey.`;
664
+ const instruction = adaptStopSubwarpInstruction({
665
+ authorization: intent.authorization,
666
+ character,
667
+ fleet: intent.fleet,
668
+ game: intent.game,
669
+ regionTracker,
670
+ ...xp.accounts,
671
+ });
662
672
  return createPlan({
663
673
  kind: 'fleet.settle-arrival',
664
- preconditions: [],
674
+ preconditions: [
675
+ {
676
+ kind: 'fleet-arrival',
677
+ address: intent.fleet,
678
+ intent,
679
+ character,
680
+ regionTracker,
681
+ describes: 'The owned journey must still have elapsed on chain; direct Profile authority must remain valid.',
682
+ },
683
+ {
684
+ kind: 'xp-runtime',
685
+ address: intent.game,
686
+ intent: xp.intent,
687
+ accounts: xp.accounts,
688
+ describes: 'The current Game runtime and required Career XP accounts must remain supported; XP balances may change.',
689
+ },
690
+ ],
665
691
  steps: [
666
692
  {
667
693
  describes: description,
668
- instruction: adaptFleetSettleArrivalInstruction({
669
- character,
670
- fleet: fleet.address,
671
- funder,
672
- game,
673
- }),
674
- signers: [funder],
694
+ instruction,
695
+ signers: [intent.authorization.authority],
675
696
  },
676
697
  ],
677
- summary: `Settle arrival for fleet ${fleet.name}.`,
698
+ summary: `Settle elapsed subwarp for fleet ${fleet.name}.`,
678
699
  });
679
700
  }
680
701
  /** Plans an early Fleet subwarp stop without signing, simulation, or write RPC.
@@ -697,21 +718,36 @@ export async function planFleetSettleArrival(ctx, fleet, input) {
697
718
  export async function planFleetStopSubwarp(ctx, fleet, options) {
698
719
  validatePlanAuthorization(options.authorization);
699
720
  assertFleetOwner(fleet, options.authorization);
700
- requireStopSubwarpState(fleet);
721
+ if (fleet.state.kind !== 'subwarp' && fleet.state.kind !== 'idle')
722
+ failFleetState(fleet, fleet.state.kind, 'stop subwarp', 'it must be subwarping or idle');
701
723
  const game = requireGameAddress(ctx);
702
724
  const character = await findCharacterPda(options.authorization.profile, game);
703
725
  const regionTracker = await deriveRegionTrackerAddress(game);
704
726
  const [regionCandidate] = await readContextRawAccounts(ctx, [regionTracker]);
705
727
  const regionTrackerAccount = requireRawAccount(regionCandidate, `Canonical RegionTracker ${regionTracker} is missing. Verify the configured Game and cluster, refresh world region data, and retry stopping Fleet ${fleet.name}.`, regionTracker);
706
728
  validateRegionTrackerRead(regionTrackerAccount, fleet, game, regionTracker, 'stop subwarp');
729
+ const xp = await resolveXpRuntime(ctx, {
730
+ game,
731
+ character,
732
+ profile: options.authorization.profile,
733
+ });
707
734
  const description = `Stop subwarp early for fleet ${fleet.name}; leave it idle if the trip already completed.`;
708
735
  return createPlan({
709
736
  kind: 'fleet.stop-subwarp',
710
- preconditions: [],
737
+ preconditions: [
738
+ {
739
+ kind: 'xp-runtime',
740
+ address: game,
741
+ intent: xp.intent,
742
+ accounts: xp.accounts,
743
+ describes: 'The configured Game and canonical Character XP accounts remain eligible for movement.',
744
+ },
745
+ ],
711
746
  steps: [
712
747
  {
713
748
  describes: description,
714
749
  instruction: adaptStopSubwarpInstruction({
750
+ ...xp.accounts,
715
751
  authorization: options.authorization,
716
752
  character,
717
753
  fleet: fleet.address,
@@ -753,12 +789,11 @@ export async function planFleetUndock(ctx, fleet, options) {
753
789
  starbasePlayerAddress,
754
790
  ]);
755
791
  const fleetAccount = requireRawAccount(fleetCandidate, `Fleet ${fleet.name} is no longer available at ${fleet.address}. Refresh the Fleet and retry planning the undock action.`, fleet.address);
756
- const characterAccount = requireRawAccount(characterCandidate, `Fleet ${fleet.name} cannot undock because its Profile has no canonical Character at ${characterAddress}. Create the Character for Profile ${options.authorization.profile} in the configured Game, refresh the Fleet, and retry.`, characterAddress);
792
+ const characterAccount = requireFleetCharacter(characterCandidate, fleet, options.authorization.profile, game, characterAddress, 'undock');
757
793
  const systemAccount = requireRawAccount(systemCandidate, `Fleet ${fleet.name} is docked at Star System ${docked.system.address}, but that System account is missing. Verify the configured Game and cluster, refresh the Fleet, and retry.`, docked.system.address);
758
794
  const playerAccount = requireRawAccount(playerCandidate, `Fleet ${fleet.name} cannot undock because its Starbase Player registration is missing at ${starbasePlayerAddress}. Register the Character at this Starbase, refresh the Fleet, and retry.`, starbasePlayerAddress);
759
795
  validateFleetRead(fleetAccount, fleet, game, docked.system.address, docked.systemSeqId);
760
- validateCharacterRead(characterAccount, fleet, options.authorization.profile, game);
761
- const system = await validateSystemRead(systemAccount, fleet, game, docked.systemSeqId);
796
+ const system = await validateFleetSystemRead(systemAccount, fleet, game, 'undock', 'Star System', docked.systemSeqId);
762
797
  validateStarbasePlayerRead(playerAccount, fleet, options.authorization.profile, characterAddress, docked.system.address, starbasePlayerAddress);
763
798
  const instruction = adaptDockedToIdleInstruction({
764
799
  authorization: options.authorization,
@@ -814,34 +849,13 @@ export async function planFleetDock(ctx, fleet, options) {
814
849
  const [characterCandidate] = await readContextRawAccounts(ctx, [
815
850
  characterAddress,
816
851
  ]);
817
- const characterAccount = requireRawAccount(characterCandidate, `Fleet ${fleet.name} cannot dock because its Profile has no canonical Character at ${characterAddress}. Create the Character for Profile ${options.authorization.profile} in the configured Game, refresh the Fleet, and retry.`, characterAddress);
818
- validateCharacterForCoordinateMovement(characterAccount, fleet, options.authorization.profile, game, characterAddress, 'dock');
819
- const discoveredSystems = await ctx.data.discover(starSystemAccountDefinition, {
820
- filters: buildStarSystemDiscoveryFilters(game),
821
- strategy: 'targeted-program-accounts',
822
- });
823
- const matchingSystems = discoveredSystems.filter((system) => system.data.coordinates.x === actionLocation.x &&
824
- system.data.coordinates.y === actionLocation.y);
825
- if (matchingSystems.length === 0)
852
+ const characterAccount = requireFleetCharacter(characterCandidate, fleet, options.authorization.profile, game, characterAddress, 'dock');
853
+ const candidates = await discoverSystemsAt(ctx, game, actionLocation);
854
+ if (candidates.length === 0)
826
855
  failNoDockableStarbase(fleet, actionLocation);
827
- const systemCandidates = await readContextRawAccounts(ctx, matchingSystems.map((candidate) => candidate.address));
828
- const exactSystems = matchingSystems.flatMap((candidate, index) => {
829
- const account = systemCandidates[index];
830
- return account !== undefined &&
831
- hasExactSystemLocation(account, validatedFleet.location)
832
- ? [{ account, address: candidate.address }]
833
- : [];
834
- });
835
- if (exactSystems.length !== 1) {
836
- if (matchingSystems.length === 1) {
837
- const systemAddress = matchingSystems[0].address;
838
- const systemAccount = systemCandidates[0] ?? failNoDockableStarbase(fleet, actionLocation);
839
- await validateDockSystemRead(systemAccount, fleet, game, systemAddress, validatedFleet.location);
840
- }
841
- fail(`Fleet ${fleet.name} action coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}) matches multiple Star Systems in the configured Game, so there is no canonical Starbase to dock at. Refresh the galaxy and repair the contradictory System data before retrying.`, fleet.address);
842
- }
843
- const { account: systemAccount, address: systemAddress } = exactSystems[0];
844
- const system = await validateDockSystemRead(systemAccount, fleet, game, systemAddress, validatedFleet.location);
856
+ const systemAccount = selectSystemAt(fleet, actionLocation, validatedFleet.location, candidates, await readContextRawAccounts(ctx, candidates));
857
+ const systemAddress = systemAccount.address;
858
+ const system = await validateFleetSystemRead(systemAccount, fleet, game, 'dock');
845
859
  if (system.starbase === undefined)
846
860
  failNoDockableStarbase(fleet, actionLocation);
847
861
  const starbasePlayerAddress = await deriveStarbasePlayerAddress(systemAddress, characterAddress);
@@ -850,24 +864,71 @@ export async function planFleetDock(ctx, fleet, options) {
850
864
  ]);
851
865
  const playerAccount = requireRawAccount(playerCandidate, `Fleet ${fleet.name} cannot dock because Character ${characterAddress} is not registered at Starbase ${system.name} in Star System ${systemAddress}. Register the Character at this Starbase before docking, refresh the Fleet, and retry.`, starbasePlayerAddress);
852
866
  validateStarbasePlayerRead(playerAccount, fleet, options.authorization.profile, characterAddress, systemAddress, starbasePlayerAddress, 'dock');
867
+ const [tracker, ownership] = await Promise.all([
868
+ deriveFactionRelationTrackerAddress(game),
869
+ deriveFactionOwnershipAddress(game, 'starbase', systemAddress),
870
+ ]);
871
+ const policy = {
872
+ kind: 'fleet-docking-policy',
873
+ address: tracker,
874
+ game,
875
+ system: systemAddress,
876
+ ownership,
877
+ describes: 'Docking retains qualified default faction gating and legacy System control.',
878
+ };
879
+ const [trackerAccount, ownershipAccount] = await readContextRawAccounts(ctx, [
880
+ tracker,
881
+ ownership,
882
+ ]);
883
+ await validateFleetDockingPolicy(trackerAccount, ownershipAccount, policy);
853
884
  const instruction = adaptIdleToDockedInstruction({
885
+ factionRelationTracker: tracker,
886
+ factionOwnership: ownership,
854
887
  authorization: options.authorization,
855
888
  fleet: fleet.address,
856
889
  game,
857
890
  systemAndStarbasePlayerStarbasePlayer: starbasePlayerAddress,
858
891
  systemAndStarbasePlayerSystem: systemAddress,
859
892
  });
893
+ const fundingIntent = {
894
+ address: fleet.address,
895
+ game,
896
+ profile: options.authorization.profile,
897
+ authority: options.authorization.authority,
898
+ certificate: instruction.accounts[2].address,
899
+ keyIndex: options.authorization.keyIndex,
900
+ character: characterAddress,
901
+ system: systemAddress,
902
+ starbasePlayer: starbasePlayerAddress,
903
+ };
904
+ const amounts = await resolveDockFunding(ctx, fundingIntent, [
905
+ fleetAccount,
906
+ playerAccount,
907
+ systemAccount,
908
+ ]);
909
+ const funding = {
910
+ kind: 'fleet-dock-funding',
911
+ ...fundingIntent,
912
+ ...amounts,
913
+ describes: amounts.status === 'available'
914
+ ? `Maximum gross Profile storage debit: ${String(amounts.maximumProfileDebit)} lamports. No refunds or surplus are credited; transaction fees are separate. Rechecked before signing, not enforced atomically on chain.`
915
+ : `Docking storage debit bounds are unavailable (${amounts.reason}); this does not imply zero Profile debit. Inspect simulation and fund the Profile explicitly if needed; transaction fees are separate.`,
916
+ };
860
917
  const description = `Dock fleet ${fleet.name} at the Starbase in Star System ${system.name}.`;
861
918
  return createPlan({
862
919
  kind: 'fleet.dock',
863
- preconditions: await Promise.all([
864
- precondition(fleetAccount, fleet.state.kind === 'idle'
865
- ? `Fleet ${fleet.name} remains idle at Starbase System ${system.name} coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}).`
866
- : `Fleet ${fleet.name} remains ${fleet.state.kind} at Starbase System ${system.name} action coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}).`),
867
- precondition(characterAccount, `The canonical Character remains assigned to Profile ${options.authorization.profile} in the configured Game.`),
868
- precondition(systemAccount, `Star System ${system.name} remains the Starbase System at Fleet ${fleet.name} coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}).`),
869
- precondition(playerAccount, `The Starbase Player remains registered for Fleet ${fleet.name} at Starbase ${system.name}.`),
870
- ]),
920
+ preconditions: [
921
+ policy,
922
+ ...(await Promise.all([
923
+ precondition(fleetAccount, fleet.state.kind === 'idle'
924
+ ? `Fleet ${fleet.name} remains idle at Starbase System ${system.name} coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}).`
925
+ : `Fleet ${fleet.name} remains ${fleet.state.kind} at Starbase System ${system.name} action coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}).`),
926
+ precondition(characterAccount, `The canonical Character remains assigned to Profile ${options.authorization.profile} in the configured Game.`),
927
+ precondition(systemAccount, `Star System ${system.name} remains the Starbase System at Fleet ${fleet.name} coordinate (${String(actionLocation.x)}, ${String(actionLocation.y)}).`),
928
+ precondition(playerAccount, `The Starbase Player remains registered for Fleet ${fleet.name} at Starbase ${system.name}.`),
929
+ ])),
930
+ funding,
931
+ ],
871
932
  steps: [
872
933
  {
873
934
  describes: description,
@@ -879,4 +940,9 @@ export async function planFleetDock(ctx, fleet, options) {
879
940
  });
880
941
  }
881
942
  export { planDepositShipsToGame, } from './ship-import.js';
943
+ export { planCreateFleet, } from './create-fleet.js';
944
+ export { planAddShipToFleet, } from './add-ship.js';
945
+ export { planFleetStartRespawn, planFleetCompleteRespawn, } from './respawn.js';
946
+ export { planLoadFleetCrew, planUnloadFleetCrew, } from './crew-transfer.js';
947
+ export { getFleetDockDebitBounds, } from './dock-bounds.js';
882
948
  //# sourceMappingURL=index.js.map