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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (752) hide show
  1. package/README.md +3 -1
  2. package/dist/cargo/actions/deposit.d.ts +2 -2
  3. package/dist/cargo/actions/deposit.d.ts.map +1 -1
  4. package/dist/cargo/actions/deposit.js +28 -117
  5. package/dist/cargo/actions/deposit.js.map +1 -1
  6. package/dist/cargo/actions/index.d.ts +1 -1
  7. package/dist/cargo/actions/index.d.ts.map +1 -1
  8. package/dist/cargo/actions/index.js +28 -84
  9. package/dist/cargo/actions/index.js.map +1 -1
  10. package/dist/cargo/actions/wallet-context.d.ts +52 -3
  11. package/dist/cargo/actions/wallet-context.d.ts.map +1 -1
  12. package/dist/cargo/actions/wallet-context.js +118 -7
  13. package/dist/cargo/actions/wallet-context.js.map +1 -1
  14. package/dist/cargo/actions/wallet-token.d.ts +1 -6
  15. package/dist/cargo/actions/wallet-token.d.ts.map +1 -1
  16. package/dist/cargo/actions/wallet-token.js +0 -53
  17. package/dist/cargo/actions/wallet-token.js.map +1 -1
  18. package/dist/cargo/actions/withdrawal.d.ts +1 -1
  19. package/dist/cargo/actions/withdrawal.d.ts.map +1 -1
  20. package/dist/cargo/actions/withdrawal.js +39 -164
  21. package/dist/cargo/actions/withdrawal.js.map +1 -1
  22. package/dist/cargo/index.d.ts.map +1 -1
  23. package/dist/cargo/index.js +2 -10
  24. package/dist/cargo/index.js.map +1 -1
  25. package/dist/claim-stakes/actions/index.d.ts +57 -8
  26. package/dist/claim-stakes/actions/index.d.ts.map +1 -1
  27. package/dist/claim-stakes/actions/index.js +542 -675
  28. package/dist/claim-stakes/actions/index.js.map +1 -1
  29. package/dist/claim-stakes/index.d.ts +14 -0
  30. package/dist/claim-stakes/index.d.ts.map +1 -1
  31. package/dist/claim-stakes/index.js +25 -12
  32. package/dist/claim-stakes/index.js.map +1 -1
  33. package/dist/client/context.d.ts.map +1 -1
  34. package/dist/client/context.js +1 -1
  35. package/dist/client/context.js.map +1 -1
  36. package/dist/client/contracts.d.ts +16 -6
  37. package/dist/client/contracts.d.ts.map +1 -1
  38. package/dist/client/errors.d.ts +2 -2
  39. package/dist/client/errors.d.ts.map +1 -1
  40. package/dist/client/errors.js.map +1 -1
  41. package/dist/client/index.d.ts +35 -0
  42. package/dist/client/index.d.ts.map +1 -1
  43. package/dist/client/index.js +35 -0
  44. package/dist/client/index.js.map +1 -1
  45. package/dist/client/rpc-subscription-provider.d.ts +35 -0
  46. package/dist/client/rpc-subscription-provider.d.ts.map +1 -0
  47. package/dist/client/rpc-subscription-provider.js +190 -0
  48. package/dist/client/rpc-subscription-provider.js.map +1 -0
  49. package/dist/combat/actions/index.d.ts +15 -9
  50. package/dist/combat/actions/index.d.ts.map +1 -1
  51. package/dist/combat/actions/index.js +245 -274
  52. package/dist/combat/actions/index.js.map +1 -1
  53. package/dist/combat/index.d.ts +20 -5
  54. package/dist/combat/index.d.ts.map +1 -1
  55. package/dist/combat/index.js +12 -17
  56. package/dist/combat/index.js.map +1 -1
  57. package/dist/crafting/actions/index.d.ts +16 -5
  58. package/dist/crafting/actions/index.d.ts.map +1 -1
  59. package/dist/crafting/actions/index.js +204 -318
  60. package/dist/crafting/actions/index.js.map +1 -1
  61. package/dist/crafting/index.d.ts +33 -3
  62. package/dist/crafting/index.d.ts.map +1 -1
  63. package/dist/crafting/index.js +49 -28
  64. package/dist/crafting/index.js.map +1 -1
  65. package/dist/factions/actions/index.d.ts +2 -1
  66. package/dist/factions/actions/index.d.ts.map +1 -1
  67. package/dist/factions/actions/index.js +6 -4
  68. package/dist/factions/actions/index.js.map +1 -1
  69. package/dist/factions/index.d.ts +6 -1
  70. package/dist/factions/index.d.ts.map +1 -1
  71. package/dist/factions/index.js +16 -18
  72. package/dist/factions/index.js.map +1 -1
  73. package/dist/factions/profile-faction.d.ts +20 -8
  74. package/dist/factions/profile-faction.d.ts.map +1 -1
  75. package/dist/factions/profile-faction.js +20 -8
  76. package/dist/factions/profile-faction.js.map +1 -1
  77. package/dist/fleets/actions/add-ship.d.ts +35 -0
  78. package/dist/fleets/actions/add-ship.d.ts.map +1 -0
  79. package/dist/fleets/actions/add-ship.js +120 -0
  80. package/dist/fleets/actions/add-ship.js.map +1 -0
  81. package/dist/fleets/actions/create-fleet.d.ts +36 -0
  82. package/dist/fleets/actions/create-fleet.d.ts.map +1 -0
  83. package/dist/fleets/actions/create-fleet.js +108 -0
  84. package/dist/fleets/actions/create-fleet.js.map +1 -0
  85. package/dist/fleets/actions/crew-transfer.d.ts +41 -0
  86. package/dist/fleets/actions/crew-transfer.d.ts.map +1 -0
  87. package/dist/fleets/actions/crew-transfer.js +94 -0
  88. package/dist/fleets/actions/crew-transfer.js.map +1 -0
  89. package/dist/fleets/actions/dock-bounds.d.ts +38 -0
  90. package/dist/fleets/actions/dock-bounds.d.ts.map +1 -0
  91. package/dist/fleets/actions/dock-bounds.js +46 -0
  92. package/dist/fleets/actions/dock-bounds.js.map +1 -0
  93. package/dist/fleets/actions/index.d.ts +68 -26
  94. package/dist/fleets/actions/index.d.ts.map +1 -1
  95. package/dist/fleets/actions/index.js +395 -335
  96. package/dist/fleets/actions/index.js.map +1 -1
  97. package/dist/fleets/actions/respawn.d.ts +38 -0
  98. package/dist/fleets/actions/respawn.d.ts.map +1 -0
  99. package/dist/fleets/actions/respawn.js +93 -0
  100. package/dist/fleets/actions/respawn.js.map +1 -0
  101. package/dist/fleets/actions/ship-import.d.ts +1 -1
  102. package/dist/fleets/actions/ship-import.d.ts.map +1 -1
  103. package/dist/fleets/actions/ship-import.js +67 -91
  104. package/dist/fleets/actions/ship-import.js.map +1 -1
  105. package/dist/fleets/cooldown.d.ts +44 -0
  106. package/dist/fleets/cooldown.d.ts.map +1 -0
  107. package/dist/fleets/cooldown.js +43 -0
  108. package/dist/fleets/cooldown.js.map +1 -0
  109. package/dist/fleets/coordinate-warp-estimate.d.ts +70 -0
  110. package/dist/fleets/coordinate-warp-estimate.d.ts.map +1 -0
  111. package/dist/fleets/coordinate-warp-estimate.js +46 -0
  112. package/dist/fleets/coordinate-warp-estimate.js.map +1 -0
  113. package/dist/fleets/index.d.ts +35 -0
  114. package/dist/fleets/index.d.ts.map +1 -1
  115. package/dist/fleets/index.js +54 -12
  116. package/dist/fleets/index.js.map +1 -1
  117. package/dist/fleets/movement-arithmetic.d.ts +21 -0
  118. package/dist/fleets/movement-arithmetic.d.ts.map +1 -0
  119. package/dist/fleets/movement-arithmetic.js +41 -0
  120. package/dist/fleets/movement-arithmetic.js.map +1 -0
  121. package/dist/fleets/subwarp-estimate.d.ts +70 -0
  122. package/dist/fleets/subwarp-estimate.d.ts.map +1 -0
  123. package/dist/fleets/subwarp-estimate.js +38 -0
  124. package/dist/fleets/subwarp-estimate.js.map +1 -0
  125. package/dist/fleets/travel-profile.d.ts +102 -0
  126. package/dist/fleets/travel-profile.d.ts.map +1 -0
  127. package/dist/fleets/travel-profile.js +120 -0
  128. package/dist/fleets/travel-profile.js.map +1 -0
  129. package/dist/fleets/warp-lane-estimate.d.ts +59 -0
  130. package/dist/fleets/warp-lane-estimate.d.ts.map +1 -0
  131. package/dist/fleets/warp-lane-estimate.js +36 -0
  132. package/dist/fleets/warp-lane-estimate.js.map +1 -0
  133. package/dist/fleets/warp-lane-policy.d.ts +68 -0
  134. package/dist/fleets/warp-lane-policy.d.ts.map +1 -0
  135. package/dist/fleets/warp-lane-policy.js +91 -0
  136. package/dist/fleets/warp-lane-policy.js.map +1 -0
  137. package/dist/fleets/warp-lane-toll.d.ts +55 -0
  138. package/dist/fleets/warp-lane-toll.d.ts.map +1 -0
  139. package/dist/fleets/warp-lane-toll.js +79 -0
  140. package/dist/fleets/warp-lane-toll.js.map +1 -0
  141. package/dist/identity/actions/create-profile.d.ts +1 -1
  142. package/dist/identity/actions/create-profile.d.ts.map +1 -1
  143. package/dist/identity/actions/create-profile.js +2 -2
  144. package/dist/identity/actions/create-profile.js.map +1 -1
  145. package/dist/identity/actions/index.d.ts +5 -4
  146. package/dist/identity/actions/index.d.ts.map +1 -1
  147. package/dist/identity/actions/index.js +52 -29
  148. package/dist/identity/actions/index.js.map +1 -1
  149. package/dist/identity/actions/research-unlock.d.ts +52 -0
  150. package/dist/identity/actions/research-unlock.d.ts.map +1 -0
  151. package/dist/identity/actions/research-unlock.js +155 -0
  152. package/dist/identity/actions/research-unlock.js.map +1 -0
  153. package/dist/identity/index.d.ts +5 -2
  154. package/dist/identity/index.d.ts.map +1 -1
  155. package/dist/identity/index.js +6 -12
  156. package/dist/identity/index.js.map +1 -1
  157. package/dist/identity/research-state.d.ts +60 -0
  158. package/dist/identity/research-state.d.ts.map +1 -0
  159. package/dist/identity/research-state.js +68 -0
  160. package/dist/identity/research-state.js.map +1 -0
  161. package/dist/index.d.ts +24 -0
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +20 -3
  164. package/dist/index.js.map +1 -1
  165. package/dist/internal/c4/account-decoding.d.ts +49 -0
  166. package/dist/internal/c4/account-decoding.d.ts.map +1 -0
  167. package/dist/internal/c4/account-decoding.js +74 -0
  168. package/dist/internal/c4/account-decoding.js.map +1 -0
  169. package/dist/internal/c4/cargo-bytes-config.d.ts +7 -0
  170. package/dist/internal/c4/cargo-bytes-config.d.ts.map +1 -0
  171. package/dist/internal/c4/cargo-bytes-config.js +19 -0
  172. package/dist/internal/c4/cargo-bytes-config.js.map +1 -0
  173. package/dist/internal/c4/cargo-pod.d.ts +15 -0
  174. package/dist/internal/c4/cargo-pod.d.ts.map +1 -0
  175. package/dist/internal/c4/cargo-pod.js +13 -0
  176. package/dist/internal/c4/cargo-pod.js.map +1 -0
  177. package/dist/internal/c4/character-modifier.d.ts +1 -1
  178. package/dist/internal/c4/character-modifier.d.ts.map +1 -1
  179. package/dist/internal/c4/character-registration.d.ts +2 -0
  180. package/dist/internal/c4/character-registration.d.ts.map +1 -1
  181. package/dist/internal/c4/character-registration.js +2 -0
  182. package/dist/internal/c4/character-registration.js.map +1 -1
  183. package/dist/internal/c4/character.d.ts +157 -0
  184. package/dist/internal/c4/character.d.ts.map +1 -0
  185. package/dist/internal/c4/character.js +64 -0
  186. package/dist/internal/c4/character.js.map +1 -0
  187. package/dist/internal/c4/claim-stake-building-definitions.d.ts.map +1 -1
  188. package/dist/internal/c4/claim-stake-building-definitions.js +2 -1
  189. package/dist/internal/c4/claim-stake-building-definitions.js.map +1 -1
  190. package/dist/internal/c4/claim-stake-configuration.d.ts.map +1 -1
  191. package/dist/internal/c4/claim-stake-configuration.js +5 -36
  192. package/dist/internal/c4/claim-stake-configuration.js.map +1 -1
  193. package/dist/internal/c4/claim-stake-definitions.d.ts +4 -4
  194. package/dist/internal/c4/claim-stake-definitions.d.ts.map +1 -1
  195. package/dist/internal/c4/claim-stake-definitions.js +2 -1
  196. package/dist/internal/c4/claim-stake-definitions.js.map +1 -1
  197. package/dist/internal/c4/claim-stake-plots.d.ts +17 -0
  198. package/dist/internal/c4/claim-stake-plots.d.ts.map +1 -0
  199. package/dist/internal/c4/claim-stake-plots.js +29 -0
  200. package/dist/internal/c4/claim-stake-plots.js.map +1 -0
  201. package/dist/internal/c4/claim-stake.d.ts +7 -27
  202. package/dist/internal/c4/claim-stake.d.ts.map +1 -1
  203. package/dist/internal/c4/claim-stake.js +38 -83
  204. package/dist/internal/c4/claim-stake.js.map +1 -1
  205. package/dist/internal/c4/combat.d.ts +1 -82
  206. package/dist/internal/c4/combat.d.ts.map +1 -1
  207. package/dist/internal/c4/combat.js +16 -213
  208. package/dist/internal/c4/combat.js.map +1 -1
  209. package/dist/internal/c4/crafting-process-codec.d.ts +13 -0
  210. package/dist/internal/c4/crafting-process-codec.d.ts.map +1 -0
  211. package/dist/internal/c4/crafting-process-codec.js +34 -0
  212. package/dist/internal/c4/crafting-process-codec.js.map +1 -0
  213. package/dist/internal/c4/crafting.d.ts +27 -33
  214. package/dist/internal/c4/crafting.d.ts.map +1 -1
  215. package/dist/internal/c4/crafting.js +76 -127
  216. package/dist/internal/c4/crafting.js.map +1 -1
  217. package/dist/internal/c4/currency-cache.d.ts +6 -0
  218. package/dist/internal/c4/currency-cache.d.ts.map +1 -0
  219. package/dist/internal/c4/currency-cache.js +27 -0
  220. package/dist/internal/c4/currency-cache.js.map +1 -0
  221. package/dist/internal/c4/discriminators.d.ts +85 -0
  222. package/dist/internal/c4/discriminators.d.ts.map +1 -0
  223. package/dist/internal/c4/discriminators.js +174 -0
  224. package/dist/internal/c4/discriminators.js.map +1 -0
  225. package/dist/internal/c4/docking-funding.d.ts +4 -0
  226. package/dist/internal/c4/docking-funding.d.ts.map +1 -0
  227. package/dist/internal/c4/docking-funding.js +11 -0
  228. package/dist/internal/c4/docking-funding.js.map +1 -0
  229. package/dist/internal/c4/faction-epoch-meter.d.ts +10 -0
  230. package/dist/internal/c4/faction-epoch-meter.d.ts.map +1 -0
  231. package/dist/internal/c4/faction-epoch-meter.js +26 -0
  232. package/dist/internal/c4/faction-epoch-meter.js.map +1 -0
  233. package/dist/internal/c4/faction-treasury.d.ts +23 -0
  234. package/dist/internal/c4/faction-treasury.d.ts.map +1 -0
  235. package/dist/internal/c4/faction-treasury.js +41 -0
  236. package/dist/internal/c4/faction-treasury.js.map +1 -0
  237. package/dist/internal/c4/faction.d.ts +21 -0
  238. package/dist/internal/c4/faction.d.ts.map +1 -0
  239. package/dist/internal/c4/faction.js +23 -0
  240. package/dist/internal/c4/faction.js.map +1 -0
  241. package/dist/internal/c4/factions.d.ts +15 -57
  242. package/dist/internal/c4/factions.d.ts.map +1 -1
  243. package/dist/internal/c4/factions.js +80 -223
  244. package/dist/internal/c4/factions.js.map +1 -1
  245. package/dist/internal/c4/fleet-arrival.d.ts +28 -0
  246. package/dist/internal/c4/fleet-arrival.d.ts.map +1 -0
  247. package/dist/internal/c4/fleet-arrival.js +42 -0
  248. package/dist/internal/c4/fleet-arrival.js.map +1 -0
  249. package/dist/internal/c4/fleet-creation.d.ts +7 -0
  250. package/dist/internal/c4/fleet-creation.d.ts.map +1 -0
  251. package/dist/internal/c4/fleet-creation.js +171 -0
  252. package/dist/internal/c4/fleet-creation.js.map +1 -0
  253. package/dist/internal/c4/fleet-crew-binding.d.ts +9 -0
  254. package/dist/internal/c4/fleet-crew-binding.d.ts.map +1 -1
  255. package/dist/internal/c4/fleet-crew-binding.js +31 -44
  256. package/dist/internal/c4/fleet-crew-binding.js.map +1 -1
  257. package/dist/internal/c4/fleet-respawn.d.ts +17 -0
  258. package/dist/internal/c4/fleet-respawn.d.ts.map +1 -0
  259. package/dist/internal/c4/fleet-respawn.js +62 -0
  260. package/dist/internal/c4/fleet-respawn.js.map +1 -0
  261. package/dist/internal/c4/fleet-ship-assembly.d.ts +11 -0
  262. package/dist/internal/c4/fleet-ship-assembly.d.ts.map +1 -0
  263. package/dist/internal/c4/fleet-ship-assembly.js +44 -0
  264. package/dist/internal/c4/fleet-ship-assembly.js.map +1 -0
  265. package/dist/internal/c4/fleet.d.ts +48 -19
  266. package/dist/internal/c4/fleet.d.ts.map +1 -1
  267. package/dist/internal/c4/fleet.js +50 -87
  268. package/dist/internal/c4/fleet.js.map +1 -1
  269. package/dist/internal/c4/game-definition-layout.d.ts +2 -0
  270. package/dist/internal/c4/game-definition-layout.d.ts.map +1 -1
  271. package/dist/internal/c4/game-definition-layout.js +4 -0
  272. package/dist/internal/c4/game-definition-layout.js.map +1 -1
  273. package/dist/internal/c4/game.d.ts +101 -30
  274. package/dist/internal/c4/game.d.ts.map +1 -1
  275. package/dist/internal/c4/game.js +203 -124
  276. package/dist/internal/c4/game.js.map +1 -1
  277. package/dist/internal/c4/identity.d.ts +3 -152
  278. package/dist/internal/c4/identity.d.ts.map +1 -1
  279. package/dist/internal/c4/identity.js +19 -126
  280. package/dist/internal/c4/identity.js.map +1 -1
  281. package/dist/internal/c4/local-market-order.d.ts +29 -0
  282. package/dist/internal/c4/local-market-order.d.ts.map +1 -0
  283. package/dist/internal/c4/local-market-order.js +46 -0
  284. package/dist/internal/c4/local-market-order.js.map +1 -0
  285. package/dist/internal/c4/loot-layout.js +1 -1
  286. package/dist/internal/c4/loot-layout.js.map +1 -1
  287. package/dist/internal/c4/loot.d.ts +89 -0
  288. package/dist/internal/c4/loot.d.ts.map +1 -0
  289. package/dist/internal/c4/loot.js +109 -0
  290. package/dist/internal/c4/loot.js.map +1 -0
  291. package/dist/internal/c4/loyalty.d.ts +0 -27
  292. package/dist/internal/c4/loyalty.d.ts.map +1 -1
  293. package/dist/internal/c4/loyalty.js +32 -160
  294. package/dist/internal/c4/loyalty.js.map +1 -1
  295. package/dist/internal/c4/market.d.ts +2 -38
  296. package/dist/internal/c4/market.d.ts.map +1 -1
  297. package/dist/internal/c4/market.js +26 -120
  298. package/dist/internal/c4/market.js.map +1 -1
  299. package/dist/internal/c4/mining-instructions.d.ts +2 -0
  300. package/dist/internal/c4/mining-instructions.d.ts.map +1 -0
  301. package/dist/internal/c4/mining-instructions.js +3 -0
  302. package/dist/internal/c4/mining-instructions.js.map +1 -0
  303. package/dist/internal/c4/open-signal.d.ts +8 -0
  304. package/dist/internal/c4/open-signal.d.ts.map +1 -0
  305. package/dist/internal/c4/open-signal.js +37 -0
  306. package/dist/internal/c4/open-signal.js.map +1 -0
  307. package/dist/internal/c4/pda.d.ts +43 -0
  308. package/dist/internal/c4/pda.d.ts.map +1 -1
  309. package/dist/internal/c4/pda.js +83 -17
  310. package/dist/internal/c4/pda.js.map +1 -1
  311. package/dist/internal/c4/profile-faction.d.ts +2 -1
  312. package/dist/internal/c4/profile-faction.d.ts.map +1 -1
  313. package/dist/internal/c4/profile-faction.js +36 -72
  314. package/dist/internal/c4/profile-faction.js.map +1 -1
  315. package/dist/internal/c4/profile-permissions.d.ts +1 -1
  316. package/dist/internal/c4/profile-permissions.d.ts.map +1 -1
  317. package/dist/internal/c4/profile-permissions.js +4 -1
  318. package/dist/internal/c4/profile-permissions.js.map +1 -1
  319. package/dist/internal/c4/region-geometry.d.ts +8 -0
  320. package/dist/internal/c4/region-geometry.d.ts.map +1 -0
  321. package/dist/internal/c4/region-geometry.js +43 -0
  322. package/dist/internal/c4/region-geometry.js.map +1 -0
  323. package/dist/internal/c4/rewards.d.ts +1 -61
  324. package/dist/internal/c4/rewards.d.ts.map +1 -1
  325. package/dist/internal/c4/rewards.js +23 -203
  326. package/dist/internal/c4/rewards.js.map +1 -1
  327. package/dist/internal/c4/runtime-bindings.d.ts +4 -0
  328. package/dist/internal/c4/runtime-bindings.d.ts.map +1 -0
  329. package/dist/internal/c4/runtime-bindings.js +4 -0
  330. package/dist/internal/c4/runtime-bindings.js.map +1 -0
  331. package/dist/internal/c4/scan-detection-codecs.d.ts +3 -0
  332. package/dist/internal/c4/scan-detection-codecs.d.ts.map +1 -0
  333. package/dist/internal/c4/scan-detection-codecs.js +3 -0
  334. package/dist/internal/c4/scan-detection-codecs.js.map +1 -0
  335. package/dist/internal/c4/scan-lifecycle.d.ts +306 -0
  336. package/dist/internal/c4/scan-lifecycle.d.ts.map +1 -0
  337. package/dist/internal/c4/scan-lifecycle.js +235 -0
  338. package/dist/internal/c4/scan-lifecycle.js.map +1 -0
  339. package/dist/internal/c4/scanning.d.ts +4 -41
  340. package/dist/internal/c4/scanning.d.ts.map +1 -1
  341. package/dist/internal/c4/scanning.js +27 -108
  342. package/dist/internal/c4/scanning.js.map +1 -1
  343. package/dist/internal/c4/ship-import.d.ts +4 -0
  344. package/dist/internal/c4/ship-import.d.ts.map +1 -0
  345. package/dist/internal/c4/ship-import.js +13 -0
  346. package/dist/internal/c4/ship-import.js.map +1 -0
  347. package/dist/internal/c4/ship-stats.d.ts.map +1 -1
  348. package/dist/internal/c4/ship-stats.js +45 -43
  349. package/dist/internal/c4/ship-stats.js.map +1 -1
  350. package/dist/internal/c4/starbase.d.ts +0 -32
  351. package/dist/internal/c4/starbase.d.ts.map +1 -1
  352. package/dist/internal/c4/starbase.js +26 -136
  353. package/dist/internal/c4/starbase.js.map +1 -1
  354. package/dist/internal/c4/wallet-cargo-cache.js +2 -1
  355. package/dist/internal/c4/wallet-cargo-cache.js.map +1 -1
  356. package/dist/internal/c4/world.d.ts +37 -7
  357. package/dist/internal/c4/world.d.ts.map +1 -1
  358. package/dist/internal/c4/world.js +87 -129
  359. package/dist/internal/c4/world.js.map +1 -1
  360. package/dist/internal/cargo.d.ts +2 -0
  361. package/dist/internal/cargo.d.ts.map +1 -1
  362. package/dist/internal/cargo.js +8 -0
  363. package/dist/internal/cargo.js.map +1 -1
  364. package/dist/internal/fleet.d.ts +1 -0
  365. package/dist/internal/fleet.d.ts.map +1 -1
  366. package/dist/internal/fleet.js +3 -1
  367. package/dist/internal/fleet.js.map +1 -1
  368. package/dist/internal/loyalty-atlas-bank-state.d.ts +16 -0
  369. package/dist/internal/loyalty-atlas-bank-state.d.ts.map +1 -0
  370. package/dist/internal/loyalty-atlas-bank-state.js +10 -0
  371. package/dist/internal/loyalty-atlas-bank-state.js.map +1 -0
  372. package/dist/internal/planning/account-state.d.ts +6 -0
  373. package/dist/internal/planning/account-state.d.ts.map +1 -1
  374. package/dist/internal/planning/account-state.js +13 -0
  375. package/dist/internal/planning/account-state.js.map +1 -1
  376. package/dist/internal/planning/action-runtime.d.ts +38 -0
  377. package/dist/internal/planning/action-runtime.d.ts.map +1 -0
  378. package/dist/internal/planning/action-runtime.js +63 -0
  379. package/dist/internal/planning/action-runtime.js.map +1 -0
  380. package/dist/internal/planning/arrival-guards.d.ts +19 -0
  381. package/dist/internal/planning/arrival-guards.d.ts.map +1 -0
  382. package/dist/internal/planning/arrival-guards.js +172 -0
  383. package/dist/internal/planning/arrival-guards.js.map +1 -0
  384. package/dist/internal/planning/authorization-adapter.d.ts +55 -37
  385. package/dist/internal/planning/authorization-adapter.d.ts.map +1 -1
  386. package/dist/internal/planning/authorization-adapter.js +231 -81
  387. package/dist/internal/planning/authorization-adapter.js.map +1 -1
  388. package/dist/internal/planning/character-registration-guard.d.ts +4 -0
  389. package/dist/internal/planning/character-registration-guard.d.ts.map +1 -0
  390. package/dist/internal/planning/character-registration-guard.js +59 -0
  391. package/dist/internal/planning/character-registration-guard.js.map +1 -0
  392. package/dist/internal/planning/character-registration.d.ts +23 -0
  393. package/dist/internal/planning/character-registration.d.ts.map +1 -0
  394. package/dist/internal/planning/character-registration.js +87 -0
  395. package/dist/internal/planning/character-registration.js.map +1 -0
  396. package/dist/internal/planning/currency-cache-guard.d.ts +4 -0
  397. package/dist/internal/planning/currency-cache-guard.d.ts.map +1 -0
  398. package/dist/internal/planning/currency-cache-guard.js +34 -0
  399. package/dist/internal/planning/currency-cache-guard.js.map +1 -0
  400. package/dist/internal/planning/democracy-history.d.ts +50 -0
  401. package/dist/internal/planning/democracy-history.d.ts.map +1 -0
  402. package/dist/internal/planning/democracy-history.js +189 -0
  403. package/dist/internal/planning/democracy-history.js.map +1 -0
  404. package/dist/internal/planning/direct-options.d.ts +17 -0
  405. package/dist/internal/planning/direct-options.d.ts.map +1 -0
  406. package/dist/internal/planning/direct-options.js +43 -0
  407. package/dist/internal/planning/direct-options.js.map +1 -0
  408. package/dist/internal/planning/faction-enrollment.d.ts +0 -4
  409. package/dist/internal/planning/faction-enrollment.d.ts.map +1 -1
  410. package/dist/internal/planning/faction-enrollment.js +1 -31
  411. package/dist/internal/planning/faction-enrollment.js.map +1 -1
  412. package/dist/internal/planning/faction-trade-guards.d.ts +30 -0
  413. package/dist/internal/planning/faction-trade-guards.d.ts.map +1 -0
  414. package/dist/internal/planning/faction-trade-guards.js +15 -0
  415. package/dist/internal/planning/faction-trade-guards.js.map +1 -0
  416. package/dist/internal/planning/faction-trade-state.d.ts +16 -0
  417. package/dist/internal/planning/faction-trade-state.d.ts.map +1 -0
  418. package/dist/internal/planning/faction-trade-state.js +43 -0
  419. package/dist/internal/planning/faction-trade-state.js.map +1 -0
  420. package/dist/internal/planning/fleet-arrival.d.ts +40 -0
  421. package/dist/internal/planning/fleet-arrival.d.ts.map +1 -0
  422. package/dist/internal/planning/fleet-arrival.js +107 -0
  423. package/dist/internal/planning/fleet-arrival.js.map +1 -0
  424. package/dist/internal/planning/fleet-attack-xp.d.ts +20 -0
  425. package/dist/internal/planning/fleet-attack-xp.d.ts.map +1 -0
  426. package/dist/internal/planning/fleet-attack-xp.js +104 -0
  427. package/dist/internal/planning/fleet-attack-xp.js.map +1 -0
  428. package/dist/internal/planning/fleet-creation.d.ts +30 -0
  429. package/dist/internal/planning/fleet-creation.d.ts.map +1 -0
  430. package/dist/internal/planning/fleet-creation.js +89 -0
  431. package/dist/internal/planning/fleet-creation.js.map +1 -0
  432. package/dist/internal/planning/fleet-crew-guard.d.ts +28 -0
  433. package/dist/internal/planning/fleet-crew-guard.d.ts.map +1 -0
  434. package/dist/internal/planning/fleet-crew-guard.js +48 -0
  435. package/dist/internal/planning/fleet-crew-guard.js.map +1 -0
  436. package/dist/internal/planning/fleet-crew-transfer.d.ts +7 -0
  437. package/dist/internal/planning/fleet-crew-transfer.d.ts.map +1 -0
  438. package/dist/internal/planning/fleet-crew-transfer.js +123 -0
  439. package/dist/internal/planning/fleet-crew-transfer.js.map +1 -0
  440. package/dist/internal/planning/fleet-dock-funding-guard.d.ts +42 -0
  441. package/dist/internal/planning/fleet-dock-funding-guard.d.ts.map +1 -0
  442. package/dist/internal/planning/fleet-dock-funding-guard.js +209 -0
  443. package/dist/internal/planning/fleet-dock-funding-guard.js.map +1 -0
  444. package/dist/internal/planning/fleet-dock-funding.d.ts +9 -0
  445. package/dist/internal/planning/fleet-dock-funding.d.ts.map +1 -0
  446. package/dist/internal/planning/fleet-dock-funding.js +154 -0
  447. package/dist/internal/planning/fleet-dock-funding.js.map +1 -0
  448. package/dist/internal/planning/fleet-docking-guard.d.ts +4 -0
  449. package/dist/internal/planning/fleet-docking-guard.d.ts.map +1 -0
  450. package/dist/internal/planning/fleet-docking-guard.js +43 -0
  451. package/dist/internal/planning/fleet-docking-guard.js.map +1 -0
  452. package/dist/internal/planning/fleet-docking.d.ts +10 -0
  453. package/dist/internal/planning/fleet-docking.d.ts.map +1 -0
  454. package/dist/internal/planning/fleet-docking.js +71 -0
  455. package/dist/internal/planning/fleet-docking.js.map +1 -0
  456. package/dist/internal/planning/fleet-respawn.d.ts +28 -0
  457. package/dist/internal/planning/fleet-respawn.d.ts.map +1 -0
  458. package/dist/internal/planning/fleet-respawn.js +164 -0
  459. package/dist/internal/planning/fleet-respawn.js.map +1 -0
  460. package/dist/internal/planning/fleet-ship-assembly.d.ts +36 -0
  461. package/dist/internal/planning/fleet-ship-assembly.d.ts.map +1 -0
  462. package/dist/internal/planning/fleet-ship-assembly.js +118 -0
  463. package/dist/internal/planning/fleet-ship-assembly.js.map +1 -0
  464. package/dist/internal/planning/fleet-state.d.ts +25 -0
  465. package/dist/internal/planning/fleet-state.d.ts.map +1 -0
  466. package/dist/internal/planning/fleet-state.js +28 -0
  467. package/dist/internal/planning/fleet-state.js.map +1 -0
  468. package/dist/internal/planning/governance-fees.d.ts +64 -0
  469. package/dist/internal/planning/governance-fees.d.ts.map +1 -0
  470. package/dist/internal/planning/governance-fees.js +231 -0
  471. package/dist/internal/planning/governance-fees.js.map +1 -0
  472. package/dist/internal/planning/local-market-order-funding.d.ts +8 -0
  473. package/dist/internal/planning/local-market-order-funding.d.ts.map +1 -0
  474. package/dist/internal/planning/local-market-order-funding.js +128 -0
  475. package/dist/internal/planning/local-market-order-funding.js.map +1 -0
  476. package/dist/internal/planning/local-market-order.d.ts +40 -0
  477. package/dist/internal/planning/local-market-order.d.ts.map +1 -0
  478. package/dist/internal/planning/local-market-order.js +139 -0
  479. package/dist/internal/planning/local-market-order.js.map +1 -0
  480. package/dist/internal/planning/mining-stop.d.ts +14 -0
  481. package/dist/internal/planning/mining-stop.d.ts.map +1 -0
  482. package/dist/internal/planning/mining-stop.js +42 -0
  483. package/dist/internal/planning/mining-stop.js.map +1 -0
  484. package/dist/internal/planning/movement-character.d.ts +7 -0
  485. package/dist/internal/planning/movement-character.d.ts.map +1 -0
  486. package/dist/internal/planning/movement-character.js +41 -0
  487. package/dist/internal/planning/movement-character.js.map +1 -0
  488. package/dist/internal/planning/movement-xp-guard.d.ts +4 -0
  489. package/dist/internal/planning/movement-xp-guard.d.ts.map +1 -0
  490. package/dist/internal/planning/movement-xp-guard.js +104 -0
  491. package/dist/internal/planning/movement-xp-guard.js.map +1 -0
  492. package/dist/internal/planning/open-signal-guard.d.ts +3 -0
  493. package/dist/internal/planning/open-signal-guard.d.ts.map +1 -0
  494. package/dist/internal/planning/open-signal-guard.js +32 -0
  495. package/dist/internal/planning/open-signal-guard.js.map +1 -0
  496. package/dist/internal/planning/open-signal.d.ts +31 -0
  497. package/dist/internal/planning/open-signal.d.ts.map +1 -0
  498. package/dist/internal/planning/open-signal.js +85 -0
  499. package/dist/internal/planning/open-signal.js.map +1 -0
  500. package/dist/internal/planning/original-token.d.ts +40 -0
  501. package/dist/internal/planning/original-token.d.ts.map +1 -0
  502. package/dist/internal/planning/original-token.js +112 -0
  503. package/dist/internal/planning/original-token.js.map +1 -0
  504. package/dist/internal/planning/own-starbase-facts.d.ts +33 -0
  505. package/dist/internal/planning/own-starbase-facts.d.ts.map +1 -0
  506. package/dist/internal/planning/own-starbase-facts.js +49 -0
  507. package/dist/internal/planning/own-starbase-facts.js.map +1 -0
  508. package/dist/internal/planning/plan-fields.d.ts +60 -0
  509. package/dist/internal/planning/plan-fields.d.ts.map +1 -0
  510. package/dist/internal/planning/plan-fields.js +159 -0
  511. package/dist/internal/planning/plan-fields.js.map +1 -0
  512. package/dist/internal/planning/plan-guards.d.ts +4 -0
  513. package/dist/internal/planning/plan-guards.d.ts.map +1 -0
  514. package/dist/internal/planning/plan-guards.js +175 -0
  515. package/dist/internal/planning/plan-guards.js.map +1 -0
  516. package/dist/internal/planning/profile-key.d.ts +13 -0
  517. package/dist/internal/planning/profile-key.d.ts.map +1 -0
  518. package/dist/internal/planning/profile-key.js +20 -0
  519. package/dist/internal/planning/profile-key.js.map +1 -0
  520. package/dist/internal/planning/recipe-state.d.ts +9 -0
  521. package/dist/internal/planning/recipe-state.d.ts.map +1 -0
  522. package/dist/internal/planning/recipe-state.js +23 -0
  523. package/dist/internal/planning/recipe-state.js.map +1 -0
  524. package/dist/internal/planning/rent-catalog.d.ts +37 -0
  525. package/dist/internal/planning/rent-catalog.d.ts.map +1 -0
  526. package/dist/internal/planning/rent-catalog.js +165 -0
  527. package/dist/internal/planning/rent-catalog.js.map +1 -0
  528. package/dist/internal/planning/rent.d.ts +19 -0
  529. package/dist/internal/planning/rent.d.ts.map +1 -0
  530. package/dist/internal/planning/rent.js +35 -0
  531. package/dist/internal/planning/rent.js.map +1 -0
  532. package/dist/internal/planning/research-unlock.d.ts +60 -0
  533. package/dist/internal/planning/research-unlock.d.ts.map +1 -0
  534. package/dist/internal/planning/research-unlock.js +208 -0
  535. package/dist/internal/planning/research-unlock.js.map +1 -0
  536. package/dist/internal/planning/respawn-guards.d.ts +3 -0
  537. package/dist/internal/planning/respawn-guards.d.ts.map +1 -0
  538. package/dist/internal/planning/respawn-guards.js +42 -0
  539. package/dist/internal/planning/respawn-guards.js.map +1 -0
  540. package/dist/internal/planning/runtime-guards.d.ts +41 -0
  541. package/dist/internal/planning/runtime-guards.d.ts.map +1 -0
  542. package/dist/internal/planning/runtime-guards.js +658 -0
  543. package/dist/internal/planning/runtime-guards.js.map +1 -0
  544. package/dist/internal/planning/scan-completion-guard.d.ts +43 -0
  545. package/dist/internal/planning/scan-completion-guard.d.ts.map +1 -0
  546. package/dist/internal/planning/scan-completion-guard.js +95 -0
  547. package/dist/internal/planning/scan-completion-guard.js.map +1 -0
  548. package/dist/internal/planning/scan-completion.d.ts +20 -0
  549. package/dist/internal/planning/scan-completion.d.ts.map +1 -0
  550. package/dist/internal/planning/scan-completion.js +197 -0
  551. package/dist/internal/planning/scan-completion.js.map +1 -0
  552. package/dist/internal/planning/scan-detect-guard.d.ts +34 -0
  553. package/dist/internal/planning/scan-detect-guard.d.ts.map +1 -0
  554. package/dist/internal/planning/scan-detect-guard.js +77 -0
  555. package/dist/internal/planning/scan-detect-guard.js.map +1 -0
  556. package/dist/internal/planning/scan-detect.d.ts +24 -0
  557. package/dist/internal/planning/scan-detect.d.ts.map +1 -0
  558. package/dist/internal/planning/scan-detect.js +245 -0
  559. package/dist/internal/planning/scan-detect.js.map +1 -0
  560. package/dist/internal/planning/scan-input.d.ts +9 -0
  561. package/dist/internal/planning/scan-input.d.ts.map +1 -0
  562. package/dist/internal/planning/scan-input.js +58 -0
  563. package/dist/internal/planning/scan-input.js.map +1 -0
  564. package/dist/internal/planning/ship-import-funding.d.ts +22 -0
  565. package/dist/internal/planning/ship-import-funding.d.ts.map +1 -0
  566. package/dist/internal/planning/ship-import-funding.js +53 -0
  567. package/dist/internal/planning/ship-import-funding.js.map +1 -0
  568. package/dist/internal/planning/ship-token.d.ts +1 -6
  569. package/dist/internal/planning/ship-token.d.ts.map +1 -1
  570. package/dist/internal/planning/ship-token.js +2 -41
  571. package/dist/internal/planning/ship-token.js.map +1 -1
  572. package/dist/internal/planning/starbase-player-owner.d.ts +21 -0
  573. package/dist/internal/planning/starbase-player-owner.d.ts.map +1 -0
  574. package/dist/internal/planning/starbase-player-owner.js +17 -0
  575. package/dist/internal/planning/starbase-player-owner.js.map +1 -0
  576. package/dist/internal/planning/starbase-system-guard.d.ts +6 -0
  577. package/dist/internal/planning/starbase-system-guard.d.ts.map +1 -0
  578. package/dist/internal/planning/starbase-system-guard.js +94 -0
  579. package/dist/internal/planning/starbase-system-guard.js.map +1 -0
  580. package/dist/internal/planning/starbase-system.d.ts +15 -0
  581. package/dist/internal/planning/starbase-system.d.ts.map +1 -0
  582. package/dist/internal/planning/starbase-system.js +25 -0
  583. package/dist/internal/planning/starbase-system.js.map +1 -0
  584. package/dist/internal/planning/token-mint.d.ts +4 -0
  585. package/dist/internal/planning/token-mint.d.ts.map +1 -0
  586. package/dist/internal/planning/token-mint.js +16 -0
  587. package/dist/internal/planning/token-mint.js.map +1 -0
  588. package/dist/internal/planning/trade-faction-market.d.ts +20 -0
  589. package/dist/internal/planning/trade-faction-market.d.ts.map +1 -0
  590. package/dist/internal/planning/trade-faction-market.js +56 -0
  591. package/dist/internal/planning/trade-faction-market.js.map +1 -0
  592. package/dist/internal/planning/wallet-starbase.d.ts +34 -0
  593. package/dist/internal/planning/wallet-starbase.d.ts.map +1 -0
  594. package/dist/internal/planning/wallet-starbase.js +39 -0
  595. package/dist/internal/planning/wallet-starbase.js.map +1 -0
  596. package/dist/internal/planning/xp-runtime.d.ts +36 -0
  597. package/dist/internal/planning/xp-runtime.d.ts.map +1 -0
  598. package/dist/internal/planning/xp-runtime.js +117 -0
  599. package/dist/internal/planning/xp-runtime.js.map +1 -0
  600. package/dist/internal/read-meta.d.ts +12 -0
  601. package/dist/internal/read-meta.d.ts.map +1 -1
  602. package/dist/internal/read-meta.js +10 -0
  603. package/dist/internal/read-meta.js.map +1 -1
  604. package/dist/internal/system-program.d.ts +4 -0
  605. package/dist/internal/system-program.d.ts.map +1 -0
  606. package/dist/internal/system-program.js +3 -0
  607. package/dist/internal/system-program.js.map +1 -0
  608. package/dist/loyalty/actions/index.d.ts +1 -1
  609. package/dist/loyalty/actions/index.d.ts.map +1 -1
  610. package/dist/loyalty/actions/index.js +15 -45
  611. package/dist/loyalty/actions/index.js.map +1 -1
  612. package/dist/loyalty/index.d.ts.map +1 -1
  613. package/dist/loyalty/index.js +6 -18
  614. package/dist/loyalty/index.js.map +1 -1
  615. package/dist/markets/actions/index.d.ts +62 -4
  616. package/dist/markets/actions/index.d.ts.map +1 -1
  617. package/dist/markets/actions/index.js +230 -178
  618. package/dist/markets/actions/index.js.map +1 -1
  619. package/dist/markets/actions/trade-faction-market.d.ts +43 -0
  620. package/dist/markets/actions/trade-faction-market.d.ts.map +1 -0
  621. package/dist/markets/actions/trade-faction-market.js +277 -0
  622. package/dist/markets/actions/trade-faction-market.js.map +1 -0
  623. package/dist/markets/index.d.ts +38 -7
  624. package/dist/markets/index.d.ts.map +1 -1
  625. package/dist/markets/index.js +59 -20
  626. package/dist/markets/index.js.map +1 -1
  627. package/dist/mining/actions/index.d.ts +87 -0
  628. package/dist/mining/actions/index.d.ts.map +1 -0
  629. package/dist/mining/actions/index.js +319 -0
  630. package/dist/mining/actions/index.js.map +1 -0
  631. package/dist/mining/estimate.d.ts +114 -0
  632. package/dist/mining/estimate.d.ts.map +1 -0
  633. package/dist/mining/estimate.js +127 -0
  634. package/dist/mining/estimate.js.map +1 -0
  635. package/dist/mining/index.d.ts +9 -2
  636. package/dist/mining/index.d.ts.map +1 -1
  637. package/dist/mining/index.js +10 -13
  638. package/dist/mining/index.js.map +1 -1
  639. package/dist/mining/profile.d.ts +82 -0
  640. package/dist/mining/profile.d.ts.map +1 -0
  641. package/dist/mining/profile.js +109 -0
  642. package/dist/mining/profile.js.map +1 -0
  643. package/dist/planning/assembly.d.ts +6 -1
  644. package/dist/planning/assembly.d.ts.map +1 -1
  645. package/dist/planning/assembly.js +12 -8
  646. package/dist/planning/assembly.js.map +1 -1
  647. package/dist/planning/execution.d.ts +19 -3
  648. package/dist/planning/execution.d.ts.map +1 -1
  649. package/dist/planning/execution.js +540 -72
  650. package/dist/planning/execution.js.map +1 -1
  651. package/dist/planning/index.d.ts +217 -149
  652. package/dist/planning/index.d.ts.map +1 -1
  653. package/dist/planning/index.js +31 -355
  654. package/dist/planning/index.js.map +1 -1
  655. package/dist/planning/plan-construction.d.ts +25 -0
  656. package/dist/planning/plan-construction.d.ts.map +1 -0
  657. package/dist/planning/plan-construction.js +143 -0
  658. package/dist/planning/plan-construction.js.map +1 -0
  659. package/dist/planning/plan-sequence-checkpoint.d.ts +9 -0
  660. package/dist/planning/plan-sequence-checkpoint.d.ts.map +1 -1
  661. package/dist/planning/plan-sequence-checkpoint.js +16 -7
  662. package/dist/planning/plan-sequence-checkpoint.js.map +1 -1
  663. package/dist/planning/plan-sequence-execution.d.ts +5 -0
  664. package/dist/planning/plan-sequence-execution.d.ts.map +1 -1
  665. package/dist/planning/plan-sequence-execution.js +74 -40
  666. package/dist/planning/plan-sequence-execution.js.map +1 -1
  667. package/dist/planning/plan-sequence.d.ts +2 -1
  668. package/dist/planning/plan-sequence.d.ts.map +1 -1
  669. package/dist/planning/plan-sequence.js +8 -1
  670. package/dist/planning/plan-sequence.js.map +1 -1
  671. package/dist/planning/plan-validation.d.ts +17 -0
  672. package/dist/planning/plan-validation.d.ts.map +1 -0
  673. package/dist/planning/plan-validation.js +135 -0
  674. package/dist/planning/plan-validation.js.map +1 -0
  675. package/dist/planning/simulation.d.ts +25 -1
  676. package/dist/planning/simulation.d.ts.map +1 -1
  677. package/dist/planning/simulation.js +111 -11
  678. package/dist/planning/simulation.js.map +1 -1
  679. package/dist/registry/cargo.d.ts +7 -12
  680. package/dist/registry/cargo.d.ts.map +1 -1
  681. package/dist/registry/cargo.js +20 -20
  682. package/dist/registry/cargo.js.map +1 -1
  683. package/dist/registry/docking.d.ts +10 -0
  684. package/dist/registry/docking.d.ts.map +1 -0
  685. package/dist/registry/docking.js +12 -0
  686. package/dist/registry/docking.js.map +1 -0
  687. package/dist/registry/index.d.ts +4 -0
  688. package/dist/registry/index.d.ts.map +1 -1
  689. package/dist/registry/index.js +190 -224
  690. package/dist/registry/index.js.map +1 -1
  691. package/dist/registry/onboarding.d.ts +10 -2
  692. package/dist/registry/onboarding.d.ts.map +1 -1
  693. package/dist/registry/onboarding.js +20 -7
  694. package/dist/registry/onboarding.js.map +1 -1
  695. package/dist/registry/scanning.d.ts +7 -0
  696. package/dist/registry/scanning.d.ts.map +1 -0
  697. package/dist/registry/scanning.js +13 -0
  698. package/dist/registry/scanning.js.map +1 -0
  699. package/dist/registry/ship-stats-snapshot.js +19 -19
  700. package/dist/registry/ship-stats-snapshot.js.map +1 -1
  701. package/dist/registry/ships.d.ts +22 -2
  702. package/dist/registry/ships.d.ts.map +1 -1
  703. package/dist/registry/ships.js +31 -4
  704. package/dist/registry/ships.js.map +1 -1
  705. package/dist/registry/xp-runtime.d.ts +4 -0
  706. package/dist/registry/xp-runtime.d.ts.map +1 -0
  707. package/dist/registry/xp-runtime.js +14 -0
  708. package/dist/registry/xp-runtime.js.map +1 -0
  709. package/dist/rewards/index.d.ts +11 -5
  710. package/dist/rewards/index.d.ts.map +1 -1
  711. package/dist/rewards/index.js +10 -21
  712. package/dist/rewards/index.js.map +1 -1
  713. package/dist/scanning/actions/index.d.ts +116 -0
  714. package/dist/scanning/actions/index.d.ts.map +1 -0
  715. package/dist/scanning/actions/index.js +191 -0
  716. package/dist/scanning/actions/index.js.map +1 -0
  717. package/dist/scanning/index.d.ts +9 -12
  718. package/dist/scanning/index.d.ts.map +1 -1
  719. package/dist/scanning/index.js +18 -22
  720. package/dist/scanning/index.js.map +1 -1
  721. package/dist/scanning/lifecycle.d.ts +77 -0
  722. package/dist/scanning/lifecycle.d.ts.map +1 -0
  723. package/dist/scanning/lifecycle.js +93 -0
  724. package/dist/scanning/lifecycle.js.map +1 -0
  725. package/dist/scanning/odds.d.ts +111 -0
  726. package/dist/scanning/odds.d.ts.map +1 -0
  727. package/dist/scanning/odds.js +294 -0
  728. package/dist/scanning/odds.js.map +1 -0
  729. package/dist/scanning/signals.d.ts +121 -0
  730. package/dist/scanning/signals.d.ts.map +1 -0
  731. package/dist/scanning/signals.js +171 -0
  732. package/dist/scanning/signals.js.map +1 -0
  733. package/dist/starbases/actions/index.d.ts +6 -4
  734. package/dist/starbases/actions/index.d.ts.map +1 -1
  735. package/dist/starbases/actions/index.js +34 -67
  736. package/dist/starbases/actions/index.js.map +1 -1
  737. package/dist/starbases/index.d.ts.map +1 -1
  738. package/dist/starbases/index.js +3 -11
  739. package/dist/starbases/index.js.map +1 -1
  740. package/dist/world/index.d.ts +108 -5
  741. package/dist/world/index.d.ts.map +1 -1
  742. package/dist/world/index.js +110 -15
  743. package/dist/world/index.js.map +1 -1
  744. package/dist/world/planet-claim-stake-plots.d.ts +139 -0
  745. package/dist/world/planet-claim-stake-plots.d.ts.map +1 -0
  746. package/dist/world/planet-claim-stake-plots.js +117 -0
  747. package/dist/world/planet-claim-stake-plots.js.map +1 -0
  748. package/dist/world/starbase-status.d.ts +176 -0
  749. package/dist/world/starbase-status.d.ts.map +1 -0
  750. package/dist/world/starbase-status.js +153 -0
  751. package/dist/world/starbase-status.js.map +1 -0
  752. package/package.json +10 -2
@@ -1,15 +1,23 @@
1
- import { getAddressEncoder, getBytesEncoder, getProgramDerivedAddress, isAddress, } from '@solana/kit';
1
+ import { deriveCurrencyCache, validateCurrencyCache, } from '../../internal/c4/currency-cache.js';
2
+ import { validateStarbaseSystem } from '../../internal/planning/starbase-system.js';
3
+ import { SYSTEM_PROGRAM } from '../../internal/system-program.js';
4
+ import { isAddress } from '@solana/kit';
5
+ import { resolveActionRuntime } from '../../internal/planning/action-runtime.js';
6
+ import { requireProfileStarbasePlayer } from '../../internal/planning/starbase-player-owner.js';
2
7
  import { InvalidActionInputError, SageSdkError } from '../../client/errors.js';
3
8
  import { readContextRawAccounts } from '../../client/reconciliation.js';
4
- import { sage } from '../../internal/c4/bindings.js';
9
+ import { SAGE_PROGRAM_ADDRESS } from '../../internal/c4/runtime-bindings.js';
5
10
  import { craftingHabAccountDefinition, craftingProcessAccountDefinition, deriveRecipeAddress, recipeAccountDefinition, } from '../../internal/c4/crafting.js';
6
- import { characterAccountDefinition, findCharacterPda, } from '../../internal/c4/identity.js';
11
+ import { characterAccountDefinition, findCharacterPda, } from '../../internal/c4/character.js';
7
12
  import { deriveStarbasePlayerAddress, starbasePlayerAccountDefinition, } from '../../internal/c4/starbase.js';
8
13
  import { deriveInternalCraftingProcessState } from '../../internal/crafting-process-state.js';
9
14
  import { requireGameAddress } from '../../internal/game-context.js';
10
- import { adaptCancelCraftingProcessInstruction, adaptStartCraftingProcessInstruction, adaptCompleteCraftingProcessInstruction, validatePlanAuthorization, } from '../../internal/planning/authorization-adapter.js';
11
- import { deriveStarSystemAddress, starSystemAccountDefinition, } from '../../internal/c4/world.js';
12
- import { createPlan, } from '../../planning/index.js';
15
+ import { adaptCancelCraftingProcessInstruction, adaptStartCraftingProcessInstruction, adaptCompleteCraftingProcessInstruction, readPlanAuthorization, } from '../../internal/planning/authorization-adapter.js';
16
+ import { starSystemAccountDefinition } from '../../internal/c4/world.js';
17
+ import { buildPlannerPlan } from '../../planning/plan-construction.js';
18
+ import { hashRecipeConfiguration, validateRecipeUsage, } from '../../internal/planning/recipe-state.js';
19
+ import { accountStatePrecondition } from '../../internal/planning/account-state.js';
20
+ import { GAME_DISCRIMINATOR } from '../../internal/c4/discriminators.js';
13
21
  const U64_MAX = (1n << 64n) - 1n;
14
22
  const U32_MAX = 4_294_967_295;
15
23
  function invalid(field, value, acceptedRange, remedy) {
@@ -38,15 +46,7 @@ function readAddress(value, field) {
38
46
  function validateStartOptions(value) {
39
47
  const options = readRecord(value, 'options');
40
48
  assertKeys(options, 'options', ['authorization', 'craftingProcess', 'quantity', 'numCrew'], ['craftingHab']);
41
- const authorizationRecord = readRecord(options.authorization, 'authorization');
42
- assertKeys(authorizationRecord, 'authorization', ['profile', 'authority', 'keyIndex'], ['certificate']);
43
- const authorization = authorizationRecord;
44
- readAddress(authorization.profile, 'authorization.profile');
45
- readAddress(authorization.authority, 'authorization.authority');
46
- if (authorization.certificate !== undefined) {
47
- readAddress(authorization.certificate, 'authorization.certificate');
48
- }
49
- validatePlanAuthorization(authorization);
49
+ const authorization = readPlanAuthorization(options.authorization);
50
50
  if (typeof options.quantity !== 'bigint' ||
51
51
  options.quantity <= 0n ||
52
52
  options.quantity > U64_MAX) {
@@ -54,9 +54,9 @@ function validateStartOptions(value) {
54
54
  }
55
55
  if (typeof options.numCrew !== 'number' ||
56
56
  !Number.isInteger(options.numCrew) ||
57
- options.numCrew < 0 ||
57
+ options.numCrew < 1 ||
58
58
  options.numCrew > U32_MAX) {
59
- invalid('numCrew', options.numCrew, `an integer from 0 through ${String(U32_MAX)} (unsigned u32)`, 'Set numCrew to the exact available crew count within the instruction codec range.');
59
+ invalid('numCrew', options.numCrew, `an integer from 1 through ${String(U32_MAX)} (unsigned u32)`, 'Set numCrew to at least one crew member, within the instruction codec range; a Crafting Process cannot start without crew.');
60
60
  }
61
61
  return {
62
62
  authorization,
@@ -68,35 +68,11 @@ function validateStartOptions(value) {
68
68
  : { craftingHab: options.craftingHab }),
69
69
  };
70
70
  }
71
- function validateCompleteOptions(value) {
72
- const options = readRecord(value, 'options');
73
- assertKeys(options, 'options', ['authorization', 'atUnixSeconds']);
74
- const authorizationRecord = readRecord(options.authorization, 'authorization');
75
- assertKeys(authorizationRecord, 'authorization', ['profile', 'authority', 'keyIndex'], ['certificate']);
76
- const authorization = authorizationRecord;
77
- readAddress(authorization.profile, 'authorization.profile');
78
- readAddress(authorization.authority, 'authorization.authority');
79
- if (authorization.certificate !== undefined) {
80
- readAddress(authorization.certificate, 'authorization.certificate');
81
- }
82
- validatePlanAuthorization(authorization);
83
- if (typeof options.atUnixSeconds !== 'bigint' || options.atUnixSeconds < 0n) {
84
- invalid('atUnixSeconds', options.atUnixSeconds, 'a non-negative bigint Unix timestamp', 'Set atUnixSeconds to the explicit current Unix timestamp before retrying.');
85
- }
86
- return { atUnixSeconds: options.atUnixSeconds, authorization };
87
- }
88
- function validateCancelOptions(value) {
71
+ /** Validates completion or cancellation options, which share one shape. */
72
+ function validateProcessOptions(value) {
89
73
  const options = readRecord(value, 'options');
90
74
  assertKeys(options, 'options', ['authorization', 'atUnixSeconds']);
91
- const authorizationRecord = readRecord(options.authorization, 'authorization');
92
- assertKeys(authorizationRecord, 'authorization', ['profile', 'authority', 'keyIndex'], ['certificate']);
93
- const authorization = authorizationRecord;
94
- readAddress(authorization.profile, 'authorization.profile');
95
- readAddress(authorization.authority, 'authorization.authority');
96
- if (authorization.certificate !== undefined) {
97
- readAddress(authorization.certificate, 'authorization.certificate');
98
- }
99
- validatePlanAuthorization(authorization);
75
+ const authorization = readPlanAuthorization(options.authorization);
100
76
  if (typeof options.atUnixSeconds !== 'bigint' || options.atUnixSeconds < 0n) {
101
77
  invalid('atUnixSeconds', options.atUnixSeconds, 'a non-negative bigint Unix timestamp', 'Set atUnixSeconds to the explicit current Unix timestamp before retrying.');
102
78
  }
@@ -134,48 +110,19 @@ function validateKnownInputs(recipe, items, quantity, source, sourceAddress) {
134
110
  }
135
111
  }
136
112
  }
137
- async function deriveCurrencyCacheAddress(game) {
138
- const [address] = await getProgramDerivedAddress({
139
- programAddress: sage.SAGE_PROGRAM_ADDRESS,
140
- seeds: [
141
- getBytesEncoder().encode(new TextEncoder().encode('CurrencyConfig')),
142
- getAddressEncoder().encode(game),
143
- ],
144
- });
145
- return address;
146
- }
147
- function validateCurrencyCache(account, game, canonicalAddress) {
148
- const decoder = sage.getCurrencyConfigCacheDecoder();
149
- const validDiscriminator = sage.CURRENCY_CONFIG_CACHE_DISCRIMINATOR.every((byte, index) => account.data[index] === byte);
150
- if (account.address !== canonicalAddress ||
151
- account.owner !== sage.SAGE_PROGRAM_ADDRESS ||
152
- account.data.length !== decoder.fixedSize ||
153
- !validDiscriminator ||
154
- decoder.decode(account.data).gameId !== game) {
155
- fail(`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);
156
- }
157
- }
158
- async function hashAccountState(account) {
159
- const owner = getAddressEncoder().encode(account.owner);
160
- const canonical = new Uint8Array(owner.length + account.data.length);
161
- canonical.set(owner);
162
- canonical.set(account.data, owner.length);
163
- const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', canonical));
164
- return [...digest].map((byte) => byte.toString(16).padStart(2, '0')).join('');
165
- }
166
- async function precondition(account, describes) {
167
- return Object.freeze({
113
+ async function recipePrecondition(account, describes, requiredUses = 0n) {
114
+ return {
115
+ kind: 'recipe-state',
168
116
  address: account.address,
169
- dataHash: await hashAccountState(account),
117
+ configHash: await hashRecipeConfiguration(account),
118
+ requiredUses,
170
119
  describes,
171
- kind: 'account-state',
172
- });
120
+ };
173
121
  }
174
- async function resolveAccounts(ctx, recipe, player, options, game) {
175
- const character = await findCharacterPda(options.authorization.profile, game);
122
+ async function resolveAccounts(ctx, recipe, player, options, game, character) {
176
123
  const currencyCache = options.craftingHab === undefined
177
124
  ? undefined
178
- : await deriveCurrencyCacheAddress(game);
125
+ : await deriveCurrencyCache(game).then(([address]) => address);
179
126
  const addresses = [
180
127
  character,
181
128
  player.address,
@@ -218,11 +165,12 @@ async function resolveAccounts(ctx, recipe, player, options, game) {
218
165
  recipeData.id !== recipe.id ||
219
166
  recipeData.status !== recipe.status ||
220
167
  recipeData.habRequired !== recipe.habRequired ||
221
- recipeData.usageCountRaw !== recipe.usageCountRaw ||
222
168
  recipeData.usageLimitRaw !== recipe.usageLimitRaw ||
223
169
  !sameBalances(recipe.ingredients, recipeData.inputs)) {
224
170
  fail(`Recipe ${recipe.address} changed or does not match the configured Game, canonical PDA, status, limits, or ingredients. Refresh the Recipe through this context and retry.`, recipe.address);
225
171
  }
172
+ // One start consumes one Recipe use, independent of the crafted quantity.
173
+ validateRecipeUsage(recipeAccount, 1n);
226
174
  if (options.craftingHab === undefined) {
227
175
  return { character, characterAccount, playerAccount, recipeAccount };
228
176
  }
@@ -234,13 +182,22 @@ async function resolveAccounts(ctx, recipe, player, options, game) {
234
182
  habData.ownerProfile !== options.authorization.profile ||
235
183
  habData.system !== player.system.address ||
236
184
  habData.state.kind !== options.craftingHab.state.kind ||
185
+ // The crew reservation was computed from the snapshot's modifier.
186
+ habData.modifiers.crewCount.raw !==
187
+ options.craftingHab.modifiers.crewCount.raw ||
237
188
  Math.max(0, habData.jobCapacity - habData.jobsRunning) !==
238
189
  options.craftingHab.availableJobSlots ||
239
190
  !habData.unlockedRecipeIds.includes(recipe.id) ||
240
191
  !sameBalances(options.craftingHab.production.inventory.items, habData.production.inventory.amounts)) {
241
- fail(`Crafting Hab ${options.craftingHab.address} changed or does not match its Game, Profile, System, active capacity, unlocked Recipe, or production inventory. Refresh the Crafting Hab through this context and retry.`, options.craftingHab.address);
192
+ fail(`Crafting Hab ${options.craftingHab.address} changed or does not match its Game, Profile, System, active capacity, crew-count modifier, unlocked Recipe, or production inventory. Refresh the Crafting Hab through this context and retry.`, options.craftingHab.address);
242
193
  }
243
- validateCurrencyCache(currencyCacheAccount, game, currencyCache);
194
+ // The Character's research concurrency bonus raises the Hab's job limit.
195
+ const jobLimit = habData.jobCapacity +
196
+ characterData.modifiers.values.craftingJobConcurrencyBonus;
197
+ if (habData.jobsRunning >= jobLimit) {
198
+ fail(`Crafting Hab ${options.craftingHab.address} runs ${String(habData.jobsRunning)} jobs, its limit including the Character's concurrency bonus (${String(jobLimit)}). Complete or cancel another Hab job, refresh it, and retry.`, options.craftingHab.address);
199
+ }
200
+ await validateCurrencyCache(currencyCacheAccount, game, 'crafting');
244
201
  return {
245
202
  character,
246
203
  characterAccount,
@@ -254,9 +211,16 @@ async function resolveAccounts(ctx, recipe, player, options, game) {
254
211
  /** Plans one Crafting Process start without signing, simulation, or writes.
255
212
  *
256
213
  * The planner validates the loaded Recipe and Starbase Player, optional Hab,
257
- * known ingredient balances, available crew, and exact whole-account state. It
258
- * returns one inert Plan whose two required signer roles are bound only during
259
- * execution.
214
+ * known ingredient balances, the crew the job reserves, the Hab job limit
215
+ * including the Character's research concurrency bonus, and exact
216
+ * whole-account state. The ATLAS fee and any crew-roster bonuses remain
217
+ * chain-authoritative. It returns one inert Plan whose two required signer
218
+ * roles are bound only during execution.
219
+ *
220
+ * Each start consumes exactly one Recipe use, whatever its quantity, and needs
221
+ * the Recipe's fresh `usageCountRaw` to be below `usageLimitRaw`. A stored
222
+ * limit of `0n` is therefore never usable. Cancelling or destroying a process
223
+ * returns its use. See `docs/evidence/crafting-zero-usage-limit.md`.
260
224
  *
261
225
  * @example
262
226
  * ```ts
@@ -275,26 +239,19 @@ export async function planStartCraftingProcess(ctx, recipe, player, input) {
275
239
  if (recipe.game.address !== game || canonicalRecipe !== recipe.address) {
276
240
  fail(`Recipe ${recipe.address} does not match the configured Game ${game} or its canonical recipe-id PDA. Refresh the Recipe through this context and retry.`, recipe.address);
277
241
  }
278
- if (player.playerProfile.address !== options.authorization.profile) {
279
- fail(`Starbase Player ${player.address} does not belong to authorization Profile ${options.authorization.profile}. Refresh the Starbase Player for that Profile and retry.`, player.address);
280
- }
281
- const canonicalPlayer = await deriveStarbasePlayerAddress(player.system.address, player.character.address);
282
- if (canonicalPlayer !== player.address) {
283
- fail(`Starbase Player ${player.address} is not canonical for its Character and System. Refresh the Starbase Player through this context and retry.`, player.address);
284
- }
242
+ const character = await requireProfileStarbasePlayer(player, options.authorization.profile, game);
285
243
  if (recipe.status !== 'active') {
286
244
  fail(`Recipe ${recipe.name} is ${recipe.status}, so it cannot start a Crafting Process. Choose an active Recipe, refresh it, and retry.`, recipe.address);
287
245
  }
288
- if (recipe.usageLimitRaw !== 0n &&
289
- (recipe.usageCountRaw >= recipe.usageLimitRaw ||
290
- options.quantity > recipe.usageLimitRaw - recipe.usageCountRaw)) {
291
- const remaining = recipe.usageCountRaw >= recipe.usageLimitRaw
292
- ? 0n
293
- : recipe.usageLimitRaw - recipe.usageCountRaw;
294
- fail(`Recipe ${recipe.name} usage limit has remaining ${String(remaining)}, but requested ${String(options.quantity)}. Reduce quantity or choose another active Recipe before retrying.`, recipe.address);
295
- }
296
- if (options.numCrew > player.availableCrew) {
297
- fail(`Starbase Player ${player.address} has only ${String(player.availableCrew)} crew available, but numCrew requested ${String(options.numCrew)}. Reduce numCrew or free crew, refresh the Starbase Player, and retry.`, player.address);
246
+ // A Crafting Hab scales the reserved crew by its crew-count modifier
247
+ // (U26F6, 64 raw units per 1.0), rounded up.
248
+ const reservedCrew = options.craftingHab === undefined
249
+ ? BigInt(options.numCrew)
250
+ : (BigInt(options.numCrew) * options.craftingHab.modifiers.crewCount.raw +
251
+ 63n) /
252
+ 64n;
253
+ if (reservedCrew > BigInt(player.availableCrew)) {
254
+ fail(`Starbase Player ${player.address} has only ${String(player.availableCrew)} crew available, but this job reserves ${String(reservedCrew)} (numCrew ${String(options.numCrew)}${options.craftingHab === undefined ? '' : ' scaled by the Crafting Hab crew-count modifier'}). Reduce numCrew or free crew, refresh the Starbase Player, and retry.`, player.address);
298
255
  }
299
256
  if (recipe.habRequired && options.craftingHab === undefined) {
300
257
  fail(`Recipe ${recipe.name} requires a Crafting Hab. Provide craftingHab from the same Profile and Star System before retrying.`, recipe.address);
@@ -312,37 +269,47 @@ export async function planStartCraftingProcess(ctx, recipe, player, input) {
312
269
  if (options.craftingHab.state.kind !== 'active') {
313
270
  fail(`Crafting Hab ${options.craftingHab.address} is ${options.craftingHab.state.kind}; it must be active before starting a Crafting Process. Refresh or reactivate the Hab and retry.`, options.craftingHab.address);
314
271
  }
315
- if (options.craftingHab.availableJobSlots < 1) {
316
- fail(`Crafting Hab ${options.craftingHab.address} has no available job slots. Complete or cancel another Hab job, refresh it, and retry.`, options.craftingHab.address);
317
- }
318
272
  if (!options.craftingHab.unlockedRecipes.some(({ address }) => address === recipe.address)) {
319
273
  fail(`Crafting Hab ${options.craftingHab.address} has not unlocked Recipe ${recipe.name}. Choose an unlocked Recipe or update the Hab before retrying.`, options.craftingHab.address);
320
274
  }
321
- validateKnownInputs(recipe, options.craftingHab.production.inventory.items, options.quantity, 'Crafting Hab', options.craftingHab.address);
322
- }
323
- else {
324
- validateKnownInputs(recipe, player.cargo.items, options.quantity, 'Starbase Player', player.address);
325
275
  }
326
- const resolved = await resolveAccounts(ctx, recipe, player, options, game);
276
+ // Inputs come from the Starbase Player's cargo whether or not a Hab is used.
277
+ validateKnownInputs(recipe, player.cargo.items, options.quantity, 'Starbase Player', player.address);
278
+ const resolved = await resolveAccounts(ctx, recipe, player, options, game, character);
279
+ const [runtimeSystem] = await readContextRawAccounts(ctx, [
280
+ player.system.address,
281
+ ]);
282
+ if (!runtimeSystem)
283
+ fail('The crafting System is missing. Refresh the Starbase and recreate this Plan.', player.system.address);
284
+ const runtime = await resolveActionRuntime(ctx, {
285
+ mode: 'crafting-start',
286
+ game,
287
+ system: player.system.address,
288
+ starbaseSeqId: starSystemAccountDefinition.decode(runtimeSystem).sequenceId,
289
+ ...(options.craftingHab === undefined
290
+ ? {}
291
+ : { structure: options.craftingHab.address }),
292
+ });
327
293
  const description = `Start crafting ${String(options.quantity)} units of ${recipe.name} with ${String(options.numCrew)} crew at Starbase Player ${player.address}.`;
328
294
  const preconditions = [
329
- precondition(resolved.characterAccount, `The canonical Character remains assigned to Profile ${options.authorization.profile} in the configured Game.`),
330
- precondition(resolved.playerAccount, `Starbase Player ${player.address} retains its Character, Profile, System, crew, and input inventory.`),
331
- precondition(resolved.recipeAccount, `Recipe ${recipe.name} remains active with the validated usage limit and ingredients.`),
295
+ accountStatePrecondition(resolved.characterAccount, `The canonical Character remains assigned to Profile ${options.authorization.profile} in the configured Game.`),
296
+ accountStatePrecondition(resolved.playerAccount, `Starbase Player ${player.address} retains its Character, Profile, System, crew, and input inventory.`),
297
+ recipePrecondition(resolved.recipeAccount, `Recipe ${recipe.name} retains its configuration and at least one remaining use for this job.`, 1n),
332
298
  ...(resolved.habAccount === undefined
333
299
  ? []
334
300
  : [
335
- precondition(resolved.habAccount, `Crafting Hab ${resolved.habAccount.address} remains active with an available job slot, the Recipe unlocked, and sufficient inputs.`),
336
- precondition(resolved.currencyCacheAccount, 'The canonical CurrencyCache remains assigned to the configured Game for Hab crafting.'),
301
+ accountStatePrecondition(resolved.habAccount, `Crafting Hab ${resolved.habAccount.address} remains active with an available job slot and the Recipe unlocked; inputs come from the Starbase Player's cargo.`),
337
302
  ]),
338
303
  ];
339
- return createPlan({
304
+ return buildPlannerPlan({
340
305
  kind: 'crafting.start-process',
341
- preconditions: await Promise.all(preconditions),
306
+ preconditions: [...runtime.guards, ...(await Promise.all(preconditions))],
342
307
  steps: [
343
308
  {
344
- describes: description,
309
+ describes: `${description} ${runtime.description}`,
345
310
  instruction: adaptStartCraftingProcessInstruction({
311
+ ...runtime.accounts,
312
+ starbaseGovernance: runtime.accounts.starbaseGovernance,
346
313
  authorization: options.authorization,
347
314
  character: resolved.character,
348
315
  craftingProcess: options.craftingProcess,
@@ -362,7 +329,7 @@ export async function planStartCraftingProcess(ctx, recipe, player, input) {
362
329
  signers: [options.authorization.authority, options.craftingProcess],
363
330
  },
364
331
  ],
365
- summary: description,
332
+ summary: `${description} ${runtime.description}`,
366
333
  });
367
334
  }
368
335
  function sameProcessSnapshot(process, account) {
@@ -372,7 +339,7 @@ function sameProcessSnapshot(process, account) {
372
339
  account.system === process.system.address &&
373
340
  account.starbasePlayer === process.starbasePlayer.address &&
374
341
  account.starbaseSequenceId === process.starbaseSequenceId &&
375
- account.craftingHab === process.craftingHab.address &&
342
+ account.craftingHab === process.craftingHab?.address &&
376
343
  account.quantityRaw === process.quantityRaw &&
377
344
  account.numCrew === process.numCrew &&
378
345
  account.startsAtUnixSeconds === process.startsAtUnixSeconds &&
@@ -382,47 +349,57 @@ function sameProcessSnapshot(process, account) {
382
349
  account.inputs.storageCostRaw === process.inputs.usedStorageUnitsRaw &&
383
350
  sameBalances(process.inputs.items, account.inputs.amounts));
384
351
  }
352
+ /** SDK reads omit `craftingHab` for a Process without a Hab; a caller-built
353
+ * snapshot carrying the raw stored System address is rejected with that cause
354
+ * instead of being read as a Hab and reported as a changed Process. */
355
+ function processHabAddress(process) {
356
+ const habAddress = process.craftingHab?.address;
357
+ if (habAddress === SYSTEM_PROGRAM)
358
+ invalid('process.craftingHab', habAddress, 'a Crafting Hab address, or no craftingHab for a Process started without a Hab', 'The stored System address means this Process has no Hab. Use a snapshot from getCraftingProcess, which omits craftingHab, or omit craftingHab, then plan again.');
359
+ return habAddress;
360
+ }
385
361
  function validateGameRead(account, game) {
386
362
  if (account.address !== game ||
387
- account.owner !== sage.SAGE_PROGRAM_ADDRESS ||
388
- account.data.length < sage.GAME_DISCRIMINATOR.length ||
389
- !sage.GAME_DISCRIMINATOR.every((byte, index) => account.data[index] === byte)) {
363
+ account.owner !== SAGE_PROGRAM_ADDRESS ||
364
+ account.data.length < GAME_DISCRIMINATOR.length ||
365
+ !GAME_DISCRIMINATOR.every((byte, index) => account.data[index] === byte)) {
390
366
  fail(`Game ${account.address} does not match the configured address, owner, or pinned account layout. Refresh the configured Game and retry.`, account.address);
391
367
  }
392
368
  }
393
- async function resolveCompleteAccounts(ctx, process, options, game) {
394
- const character = await findCharacterPda(options.authorization.profile, game);
395
- const currencyCache = await deriveCurrencyCacheAddress(game);
396
- const habAddress = process.craftingHab.address === sage.SAGE_PROGRAM_ADDRESS
397
- ? undefined
398
- : process.craftingHab.address;
399
- const addresses = [
369
+ /** Reads and validates the Crafting Process graph shared by completion and
370
+ * cancellation, with `extra` in the same read: the unchanged Process, its
371
+ * canonical System and Starbase, the unchanged Recipe and its Hab policy, the
372
+ * Profile's canonical Starbase Player and Character, and the Process Hab,
373
+ * active and owned, when present. `action` completes the remedies, and
374
+ * `staleStarbaseGuidance` adds advice for a replaced Starbase. */
375
+ async function resolveProcessAccounts(ctx, process, profile, game, action, extra, staleStarbaseGuidance) {
376
+ const character = await findCharacterPda(profile, game);
377
+ const habAddress = processHabAddress(process);
378
+ const [processCandidate, recipeCandidate, playerCandidate, systemCandidate, characterCandidate, extraAccount, habCandidate,] = await readContextRawAccounts(ctx, [
400
379
  process.address,
401
380
  process.recipe.address,
402
381
  process.starbasePlayer.address,
403
382
  process.system.address,
404
- ...(habAddress === undefined ? [] : [habAddress]),
405
383
  character,
406
- game,
407
- currencyCache,
408
- ];
409
- const reads = await readContextRawAccounts(ctx, addresses);
410
- const byAddress = new Map(addresses.map((address, index) => [address, reads[index]]));
411
- const processAccount = requireAccount(byAddress.get(process.address), process.address, `Crafting Process ${process.address} is missing, so it may already be cancelled or closed. Refresh the Crafting Process and retry only if it still exists.`);
412
- const recipeAccount = requireAccount(byAddress.get(process.recipe.address), process.recipe.address, `Recipe ${process.recipe.address} is missing. Refresh the Crafting Process and its Recipe before retrying completion.`);
413
- const playerAccount = requireAccount(byAddress.get(process.starbasePlayer.address), process.starbasePlayer.address, `Starbase Player ${process.starbasePlayer.address} is missing. Refresh the Crafting Process and Starbase Player before retrying completion.`);
414
- const systemAccount = requireAccount(byAddress.get(process.system.address), process.system.address, `Star System ${process.system.address} is missing. Refresh the Crafting Process and Star System before retrying completion.`);
415
- const characterAccount = requireAccount(byAddress.get(character), character, `Canonical Character ${character} is missing for Profile ${options.authorization.profile}. Create or repair the Character in the configured Game before retrying completion.`);
416
- const gameAccount = requireAccount(byAddress.get(game), game, `Configured Game ${game} is missing. Refresh the configured Game before retrying completion.`);
417
- const currencyCacheAccount = requireAccount(byAddress.get(currencyCache), currencyCache, `Canonical CurrencyCache ${currencyCache} is missing for the configured Game. Refresh the Game currency configuration before retrying completion.`);
418
- const habAccount = habAddress === undefined
419
- ? undefined
420
- : requireAccount(byAddress.get(habAddress), habAddress, `Crafting Hab ${habAddress} is missing. Refresh the Crafting Process and Hab before retrying completion.`);
421
- const processData = craftingProcessAccountDefinition.decode(processAccount);
384
+ extra,
385
+ ...(habAddress === undefined ? [] : [habAddress]),
386
+ ]);
387
+ const processAccount = requireAccount(processCandidate, process.address, `Crafting Process ${process.address} is missing, so it may already be completed, cancelled, or closed. Refresh the Crafting Process and retry only if it still exists.`);
422
388
  if (processAccount.address !== process.address ||
423
- !sameProcessSnapshot(process, processData)) {
389
+ !sameProcessSnapshot(process, craftingProcessAccountDefinition.decode(processAccount))) {
424
390
  fail(`Crafting Process ${process.address} changed or no longer matches its relationships, timing, crew, quantity, fee, or inputs. Refresh the Crafting Process and retry.`, process.address);
425
391
  }
392
+ await validateStarbaseSystem(requireAccount(systemCandidate, process.system.address, `Star System ${process.system.address} is missing. Refresh the Crafting Process and Star System before retrying ${action}.`), {
393
+ address: process.system.address,
394
+ game,
395
+ starbaseSequenceId: process.starbaseSequenceId,
396
+ }, staleStarbaseGuidance);
397
+ const recipeAccount = requireAccount(recipeCandidate, process.recipe.address, `Recipe ${process.recipe.address} is missing. Refresh the Crafting Process and its Recipe before retrying ${action}.`);
398
+ const playerAccount = requireAccount(playerCandidate, process.starbasePlayer.address, `Starbase Player ${process.starbasePlayer.address} is missing. Refresh the Crafting Process and Starbase Player before retrying ${action}.`);
399
+ const characterAccount = requireAccount(characterCandidate, character, `Canonical Character ${character} is missing for Profile ${profile}. Create or repair the Character in the configured Game before retrying ${action}.`);
400
+ const habAccount = habAddress === undefined
401
+ ? undefined
402
+ : requireAccount(habCandidate, habAddress, `Crafting Hab ${habAddress} is missing. Refresh the Crafting Process and Hab before retrying ${action}.`);
426
403
  const recipeData = recipeAccountDefinition.decode(recipeAccount);
427
404
  const canonicalRecipe = await deriveRecipeAddress(game, recipeData.id);
428
405
  if (recipeAccount.address !== process.recipe.address ||
@@ -432,65 +409,72 @@ async function resolveCompleteAccounts(ctx, process, options, game) {
432
409
  recipeData.name !== process.recipe.name ||
433
410
  recipeData.status !== process.recipe.status ||
434
411
  recipeData.habRequired !== process.recipe.habRequired ||
435
- recipeData.usageCountRaw !== process.recipe.usageCountRaw ||
436
412
  recipeData.usageLimitRaw !== process.recipe.usageLimitRaw ||
437
413
  !sameBalances(process.recipe.ingredients, recipeData.inputs) ||
438
414
  !sameBalances(process.recipe.outputs, recipeData.outputs)) {
439
- fail(`Recipe ${process.recipe.address} changed or does not match the configured Game, canonical recipe-id PDA, status, Hab policy, limits, ingredients, or outputs. Refresh the Crafting Process and Recipe before retrying completion.`, process.recipe.address);
415
+ fail(`Recipe ${process.recipe.address} changed or does not match the configured Game, canonical recipe-id PDA, status, Hab policy, limits, ingredients, or outputs. Refresh the Crafting Process and Recipe before retrying ${action}.`, process.recipe.address);
440
416
  }
441
417
  if (recipeData.habRequired && habAddress === undefined) {
442
- fail(`Recipe ${recipeData.name} requires a Crafting Hab, but Crafting Process ${process.address} omits one. Refresh or repair the Process relationship before retrying completion.`, process.address);
418
+ fail(`Recipe ${recipeData.name} requires a Crafting Hab, but Crafting Process ${process.address} omits one. Refresh or repair the Process relationship before retrying ${action}.`, process.address);
443
419
  }
444
420
  const playerData = starbasePlayerAccountDefinition.decode(playerAccount);
445
421
  const canonicalPlayer = await deriveStarbasePlayerAddress(process.system.address, character);
446
422
  if (playerAccount.address !== process.starbasePlayer.address ||
447
423
  canonicalPlayer !== process.starbasePlayer.address ||
448
- playerData.playerProfile !== options.authorization.profile ||
424
+ playerData.playerProfile !== profile ||
449
425
  playerData.character !== character ||
450
426
  playerData.system !== process.system.address) {
451
- fail(`Starbase Player ${process.starbasePlayer.address} does not match the authorization Profile, canonical Character, or Crafting Process System. Refresh the Crafting Process and Starbase Player before retrying completion.`, process.starbasePlayer.address);
452
- }
453
- const systemData = starSystemAccountDefinition.decode(systemAccount);
454
- const canonicalSystem = await deriveStarSystemAddress(game, systemData.systemId);
455
- if (systemAccount.address !== process.system.address ||
456
- canonicalSystem !== process.system.address ||
457
- systemData.game !== game ||
458
- systemData.sequenceId !== process.starbaseSequenceId ||
459
- systemData.starbase === undefined) {
460
- fail(`Star System ${process.system.address} does not match the configured Game, canonical system-id PDA, active Starbase, or Crafting Process Starbase sequence. Refresh the Crafting Process and Star System before retrying completion.`, process.system.address);
427
+ fail(`Starbase Player ${process.starbasePlayer.address} does not match the authorization Profile, canonical Character, or Crafting Process System. Refresh the Crafting Process and Starbase Player before retrying ${action}.`, process.starbasePlayer.address);
461
428
  }
462
429
  if (habAccount !== undefined) {
463
430
  const habData = craftingHabAccountDefinition.decode(habAccount);
464
431
  if (habAccount.address !== habAddress ||
465
432
  habData.game !== game ||
466
- habData.ownerProfile !== options.authorization.profile ||
433
+ habData.ownerProfile !== profile ||
467
434
  habData.system !== process.system.address ||
468
435
  habData.systemSequenceId !== process.starbaseSequenceId ||
469
436
  habData.state.kind !== 'active') {
470
- fail(`Crafting Hab ${habAddress} is not active or does not match the configured Game, authorization Profile, Crafting Process System, or Starbase sequence. Refresh the Crafting Process and Hab before retrying completion.`, habAccount.address);
437
+ fail(`Crafting Hab ${habAddress} is not active or does not match the configured Game, authorization Profile, Crafting Process System, or Starbase sequence. Refresh the Crafting Process and Hab before retrying ${action}.`, habAccount.address);
471
438
  }
472
439
  }
473
440
  const characterData = characterAccountDefinition.decode(characterAccount);
474
441
  if (characterAccount.address !== character ||
475
- characterData.playerProfile !== options.authorization.profile ||
442
+ characterData.playerProfile !== profile ||
476
443
  characterData.game !== game) {
477
- fail(`The canonical Character does not match Profile ${options.authorization.profile} and the configured Game ${game}. Refresh or repair the Character relationship before retrying completion.`, characterAccount.address);
444
+ fail(`The canonical Character does not match Profile ${profile} and the configured Game ${game}. Refresh or repair the Character relationship before retrying ${action}.`, characterAccount.address);
478
445
  }
479
- validateGameRead(gameAccount, game);
480
- validateCurrencyCache(currencyCacheAccount, game, currencyCache);
481
446
  return {
482
447
  character,
483
448
  characterAccount,
484
- currencyCache,
485
- currencyCacheAccount,
486
- gameAccount,
487
- ...(habAccount === undefined ? {} : { habAccount }),
449
+ extraAccount,
450
+ habAccount,
488
451
  playerAccount,
489
452
  processAccount,
490
453
  recipeAccount,
491
- systemAccount,
492
454
  };
493
455
  }
456
+ /** The validated Process graph preconditions, with `systemGuard` after the
457
+ * Starbase Player when the action guards the Starbase separately. */
458
+ function processPreconditions(process, resolved, profile, systemGuard = []) {
459
+ return [
460
+ accountStatePrecondition(resolved.processAccount, `Crafting Process ${process.address} retains its validated relationships, timing, crew, quantity, fee, and inputs.`),
461
+ recipePrecondition(resolved.recipeAccount, `Recipe ${process.recipe.name} retains its validated Game, Hab policy, ingredients, and outputs.`),
462
+ accountStatePrecondition(resolved.playerAccount, `Starbase Player ${process.starbasePlayer.address} retains its Profile, Character, and System relationships.`),
463
+ ...systemGuard.map((guard) => Promise.resolve(guard)),
464
+ ...(resolved.habAccount === undefined
465
+ ? []
466
+ : [
467
+ accountStatePrecondition(resolved.habAccount, `Crafting Hab ${resolved.habAccount.address} remains active in the validated Game, Profile, System, and Starbase sequence.`),
468
+ ]),
469
+ accountStatePrecondition(resolved.characterAccount, `The canonical Character remains assigned to Profile ${profile} in the configured Game.`),
470
+ ];
471
+ }
472
+ /** Requires the authorization Profile to own the Process. */
473
+ function requireProcessOwner(process, profile) {
474
+ if (process.profile.address !== profile) {
475
+ fail(`Crafting Process ${process.address} does not belong to authorization Profile ${profile}. Use the owning Profile, refresh the Process, and retry.`, process.address);
476
+ }
477
+ }
494
478
  /** Plans completion of one Crafting Process without signing, simulation, or writes.
495
479
  *
496
480
  * The planner resolves and validates the Process account graph, requires Profile
@@ -508,11 +492,10 @@ async function resolveCompleteAccounts(ctx, process, options, game) {
508
492
  * ```
509
493
  */
510
494
  export async function planCompleteCraftingProcess(ctx, process, input) {
511
- const options = validateCompleteOptions(input);
495
+ const options = validateProcessOptions(input);
512
496
  const game = requireGameAddress(ctx);
513
- if (process.profile.address !== options.authorization.profile) {
514
- fail(`Crafting Process ${process.address} does not belong to authorization Profile ${options.authorization.profile}. Use the owning Profile, refresh the Process, and retry.`, process.address);
515
- }
497
+ const { profile } = options.authorization;
498
+ requireProcessOwner(process, profile);
516
499
  const state = deriveInternalCraftingProcessState(process, options.atUnixSeconds);
517
500
  if (state.kind !== 'complete') {
518
501
  const timing = state.kind === 'scheduled'
@@ -520,33 +503,36 @@ export async function planCompleteCraftingProcess(ctx, process, input) {
520
503
  : `in-progress and not complete with ${String(state.remainingSeconds)} seconds remaining`;
521
504
  fail(`Crafting Process ${process.address} is ${timing} at Unix timestamp ${String(options.atUnixSeconds)}. Wait until it is complete, provide a current timestamp, and retry.`, process.address);
522
505
  }
523
- const resolved = await resolveCompleteAccounts(ctx, process, options, game);
524
- const description = `Complete crafting ${String(process.quantityRaw)} units of ${process.recipe.name} at Starbase Player ${process.starbasePlayer.address}, returning ${String(process.numCrew)} crew and producing the Recipe outputs.`;
525
- const preconditions = [
526
- precondition(resolved.processAccount, `Crafting Process ${process.address} retains its validated relationships, timing, crew, quantity, fee, and inputs.`),
527
- precondition(resolved.recipeAccount, `Recipe ${process.recipe.name} retains its validated Game, Hab policy, ingredients, and outputs.`),
528
- precondition(resolved.playerAccount, `Starbase Player ${process.starbasePlayer.address} retains its Profile, Character, and System relationships.`),
529
- precondition(resolved.systemAccount, `Star System ${process.system.address} retains its active Starbase and validated sequence.`),
506
+ const [currencyCache] = await deriveCurrencyCache(game);
507
+ const resolved = await resolveProcessAccounts(ctx, process, profile, game, 'completion', currencyCache);
508
+ await validateCurrencyCache(requireAccount(resolved.extraAccount, currencyCache, `Canonical CurrencyCache ${currencyCache} is missing for the configured Game. Refresh the Game currency configuration before retrying completion.`), game, 'crafting');
509
+ const runtime = await resolveActionRuntime(ctx, {
510
+ mode: 'crafting-complete',
511
+ game,
512
+ system: process.system.address,
513
+ starbaseSeqId: process.starbaseSequenceId,
514
+ character: resolved.character,
515
+ process: process.address,
530
516
  ...(resolved.habAccount === undefined
531
- ? []
532
- : [
533
- precondition(resolved.habAccount, `Crafting Hab ${resolved.habAccount.address} remains active in the validated Game, Profile, System, and Starbase sequence.`),
534
- ]),
535
- precondition(resolved.characterAccount, `The canonical Character remains assigned to Profile ${options.authorization.profile} in the configured Game.`),
536
- precondition(resolved.gameAccount, `Game ${game} retains its pinned owner and account layout.`),
537
- precondition(resolved.currencyCacheAccount, 'The canonical CurrencyCache remains assigned to the configured Game.'),
538
- ];
539
- return createPlan({
517
+ ? {}
518
+ : { structure: resolved.habAccount.address }),
519
+ });
520
+ const description = `Complete crafting ${String(process.quantityRaw)} units of ${process.recipe.name} at Starbase Player ${process.starbasePlayer.address}, returning ${String(process.numCrew)} crew and producing the Recipe outputs.`;
521
+ return buildPlannerPlan({
540
522
  kind: 'crafting.complete-process',
541
- preconditions: await Promise.all(preconditions),
523
+ preconditions: [
524
+ ...runtime.guards,
525
+ ...(await Promise.all(processPreconditions(process, resolved, profile))),
526
+ ],
542
527
  steps: [
543
528
  {
544
- describes: description,
529
+ describes: `${description} ${runtime.description}`,
545
530
  instruction: adaptCompleteCraftingProcessInstruction({
531
+ ...runtime.accounts,
546
532
  authorization: options.authorization,
547
533
  character: resolved.character,
548
534
  craftingProcess: process.address,
549
- currencyCache: resolved.currencyCache,
535
+ currencyCache,
550
536
  game,
551
537
  recipe: process.recipe.address,
552
538
  starbasePlayer: process.starbasePlayer.address,
@@ -558,108 +544,9 @@ export async function planCompleteCraftingProcess(ctx, process, input) {
558
544
  signers: [options.authorization.authority],
559
545
  },
560
546
  ],
561
- summary: description,
547
+ summary: `${description} ${runtime.description}`,
562
548
  });
563
549
  }
564
- async function resolveCancelAccounts(ctx, process, options, game) {
565
- const character = await findCharacterPda(options.authorization.profile, game);
566
- const habAddress = process.craftingHab.address === sage.SAGE_PROGRAM_ADDRESS
567
- ? undefined
568
- : process.craftingHab.address;
569
- const addresses = [
570
- process.address,
571
- process.recipe.address,
572
- process.starbasePlayer.address,
573
- process.system.address,
574
- ...(habAddress === undefined ? [] : [habAddress]),
575
- character,
576
- game,
577
- ];
578
- const reads = await readContextRawAccounts(ctx, addresses);
579
- const byAddress = new Map(addresses.map((address, index) => [address, reads[index]]));
580
- const processAccount = requireAccount(byAddress.get(process.address), process.address, `Crafting Process ${process.address} is missing, so it may already be completed, cancelled, or closed. Refresh the Crafting Process and retry only if it still exists.`);
581
- const systemAccount = requireAccount(byAddress.get(process.system.address), process.system.address, `Star System ${process.system.address} is missing. Refresh the Crafting Process and Star System before retrying cancellation.`);
582
- const processData = craftingProcessAccountDefinition.decode(processAccount);
583
- if (processAccount.address !== process.address ||
584
- !sameProcessSnapshot(process, processData)) {
585
- fail(`Crafting Process ${process.address} changed or no longer matches its relationships, timing, crew, quantity, fee, or inputs. Refresh the Crafting Process and retry.`, process.address);
586
- }
587
- const systemData = starSystemAccountDefinition.decode(systemAccount);
588
- const canonicalSystem = await deriveStarSystemAddress(game, systemData.systemId);
589
- if (systemAccount.address !== process.system.address ||
590
- canonicalSystem !== process.system.address ||
591
- systemData.game !== game) {
592
- fail(`Star System ${process.system.address} does not match the configured Game or canonical system-id PDA. Refresh the Crafting Process and Star System before retrying cancellation.`, process.system.address);
593
- }
594
- if (systemData.sequenceId !== process.starbaseSequenceId) {
595
- fail(`The Starbase sequence for Crafting Process ${process.address} is stale at ${String(process.starbaseSequenceId)}, while Star System ${process.system.address} is at sequence ${String(systemData.sequenceId)}. The program requires destroyCraftingProcess for this destroyed-Starbase cleanup case; do not cancel the Process.`, process.address);
596
- }
597
- if (systemData.starbase === undefined) {
598
- fail(`Star System ${process.system.address} does not have an active Starbase. Refresh the Crafting Process and Star System before retrying cancellation.`, process.system.address);
599
- }
600
- const recipeAccount = requireAccount(byAddress.get(process.recipe.address), process.recipe.address, `Recipe ${process.recipe.address} is missing. Refresh the Crafting Process and its Recipe before retrying cancellation.`);
601
- const playerAccount = requireAccount(byAddress.get(process.starbasePlayer.address), process.starbasePlayer.address, `Starbase Player ${process.starbasePlayer.address} is missing. Refresh the Crafting Process and Starbase Player before retrying cancellation.`);
602
- const characterAccount = requireAccount(byAddress.get(character), character, `Canonical Character ${character} is missing for Profile ${options.authorization.profile}. Create or repair the Character in the configured Game before retrying cancellation.`);
603
- const gameAccount = requireAccount(byAddress.get(game), game, `Configured Game ${game} is missing. Refresh the configured Game before retrying cancellation.`);
604
- const habAccount = habAddress === undefined
605
- ? undefined
606
- : requireAccount(byAddress.get(habAddress), habAddress, `Crafting Hab ${habAddress} is missing. Refresh the Crafting Process and Hab before retrying cancellation.`);
607
- const recipeData = recipeAccountDefinition.decode(recipeAccount);
608
- const canonicalRecipe = await deriveRecipeAddress(game, recipeData.id);
609
- if (recipeAccount.address !== process.recipe.address ||
610
- canonicalRecipe !== process.recipe.address ||
611
- recipeData.game !== game ||
612
- recipeData.id !== process.recipe.id ||
613
- recipeData.name !== process.recipe.name ||
614
- recipeData.status !== process.recipe.status ||
615
- recipeData.habRequired !== process.recipe.habRequired ||
616
- recipeData.usageCountRaw !== process.recipe.usageCountRaw ||
617
- recipeData.usageLimitRaw !== process.recipe.usageLimitRaw ||
618
- !sameBalances(process.recipe.ingredients, recipeData.inputs) ||
619
- !sameBalances(process.recipe.outputs, recipeData.outputs)) {
620
- fail(`Recipe ${process.recipe.address} changed or does not match the configured Game, canonical recipe-id PDA, status, Hab policy, limits, ingredients, or outputs. Refresh the Crafting Process and Recipe before retrying cancellation.`, process.recipe.address);
621
- }
622
- if (recipeData.habRequired && habAddress === undefined) {
623
- fail(`Recipe ${recipeData.name} requires a Crafting Hab, but Crafting Process ${process.address} omits one. Refresh or repair the Process relationship before retrying cancellation.`, process.address);
624
- }
625
- const playerData = starbasePlayerAccountDefinition.decode(playerAccount);
626
- const canonicalPlayer = await deriveStarbasePlayerAddress(process.system.address, character);
627
- if (playerAccount.address !== process.starbasePlayer.address ||
628
- canonicalPlayer !== process.starbasePlayer.address ||
629
- playerData.playerProfile !== options.authorization.profile ||
630
- playerData.character !== character ||
631
- playerData.system !== process.system.address) {
632
- fail(`Starbase Player ${process.starbasePlayer.address} does not match the authorization Profile, canonical Character, or Crafting Process System. Refresh the Crafting Process and Starbase Player before retrying cancellation.`, process.starbasePlayer.address);
633
- }
634
- if (habAccount !== undefined) {
635
- const habData = craftingHabAccountDefinition.decode(habAccount);
636
- if (habAccount.address !== habAddress ||
637
- habData.game !== game ||
638
- habData.ownerProfile !== options.authorization.profile ||
639
- habData.system !== process.system.address ||
640
- habData.systemSequenceId !== process.starbaseSequenceId ||
641
- habData.state.kind !== 'active') {
642
- fail(`Crafting Hab ${habAddress} is not active or does not match the configured Game, authorization Profile, Crafting Process System, or Starbase sequence. Refresh the Crafting Process and Hab before retrying cancellation.`, habAccount.address);
643
- }
644
- }
645
- const characterData = characterAccountDefinition.decode(characterAccount);
646
- if (characterAccount.address !== character ||
647
- characterData.playerProfile !== options.authorization.profile ||
648
- characterData.game !== game) {
649
- fail(`The canonical Character does not match Profile ${options.authorization.profile} and the configured Game ${game}. Refresh or repair the Character relationship before retrying cancellation.`, characterAccount.address);
650
- }
651
- validateGameRead(gameAccount, game);
652
- return {
653
- character,
654
- characterAccount,
655
- gameAccount,
656
- ...(habAccount === undefined ? {} : { habAccount }),
657
- playerAccount,
658
- processAccount,
659
- recipeAccount,
660
- systemAccount,
661
- };
662
- }
663
550
  /** Plans cancellation of one unfinished Crafting Process without signing or writes.
664
551
  *
665
552
  * The planner resolves and validates the Process account graph, requires Profile
@@ -677,33 +564,32 @@ async function resolveCancelAccounts(ctx, process, options, game) {
677
564
  * ```
678
565
  */
679
566
  export async function planCancelCraftingProcess(ctx, process, input) {
680
- const options = validateCancelOptions(input);
567
+ const options = validateProcessOptions(input);
681
568
  const game = requireGameAddress(ctx);
682
- if (process.profile.address !== options.authorization.profile) {
683
- fail(`Crafting Process ${process.address} does not belong to authorization Profile ${options.authorization.profile}. Use the owning Profile, refresh the Process, and retry.`, process.address);
684
- }
569
+ const { profile } = options.authorization;
570
+ requireProcessOwner(process, profile);
685
571
  const state = deriveInternalCraftingProcessState(process, options.atUnixSeconds);
686
572
  if (state.kind === 'complete') {
687
573
  fail(`Crafting Process ${process.address} is complete at Unix timestamp ${String(options.atUnixSeconds)} and cannot be cancelled. Use planCompleteCraftingProcess with a refreshed snapshot instead.`, process.address);
688
574
  }
689
- const resolved = await resolveCancelAccounts(ctx, process, options, game);
575
+ const resolved = await resolveProcessAccounts(ctx, process, profile, game, 'cancellation', game, 'For a Crafting Process belonging to the destroyed Starbase, use destroyCraftingProcess; do not cancel the Process.');
576
+ const gameAccount = requireAccount(resolved.extraAccount, game, `Configured Game ${game} is missing. Refresh the configured Game before retrying cancellation.`);
577
+ validateGameRead(gameAccount, game);
690
578
  const description = `Cancel crafting ${String(process.quantityRaw)} units of ${process.recipe.name} at Starbase Player ${process.starbasePlayer.address}, returning all inputs and ${String(process.numCrew)} crew and closing the Crafting Process.`;
691
- const preconditions = [
692
- precondition(resolved.processAccount, `Crafting Process ${process.address} retains its validated relationships, timing, crew, quantity, fee, and inputs.`),
693
- precondition(resolved.recipeAccount, `Recipe ${process.recipe.name} retains its validated Game, Hab policy, usage, ingredients, and outputs.`),
694
- precondition(resolved.playerAccount, `Starbase Player ${process.starbasePlayer.address} retains its Profile, Character, and System relationships.`),
695
- precondition(resolved.systemAccount, `Star System ${process.system.address} retains its active Starbase and validated sequence.`),
696
- ...(resolved.habAccount === undefined
697
- ? []
698
- : [
699
- precondition(resolved.habAccount, `Crafting Hab ${resolved.habAccount.address} remains active in the validated Game, Profile, System, and Starbase sequence.`),
700
- ]),
701
- precondition(resolved.characterAccount, `The canonical Character remains assigned to Profile ${options.authorization.profile} in the configured Game.`),
702
- precondition(resolved.gameAccount, `Game ${game} retains its pinned owner and account layout.`),
703
- ];
704
- return createPlan({
579
+ return buildPlannerPlan({
705
580
  kind: 'crafting.cancel-process',
706
- preconditions: await Promise.all(preconditions),
581
+ preconditions: await Promise.all([
582
+ ...processPreconditions(process, resolved, profile, [
583
+ {
584
+ kind: 'starbase-system',
585
+ address: process.system.address,
586
+ game,
587
+ starbaseSequenceId: process.starbaseSequenceId,
588
+ describes: `Star System ${process.system.address} retains its canonical Game identity, active Starbase and sequence ${process.starbaseSequenceId}; unrelated shared activity may change.`,
589
+ },
590
+ ]),
591
+ accountStatePrecondition(gameAccount, `Game ${game} retains its pinned owner and account layout.`),
592
+ ]),
707
593
  steps: [
708
594
  {
709
595
  describes: description,