@aeolus-fleet/core 0.27.0 → 0.28.0

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 (452) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/crypto/account-token-signatures.d.ts +12 -0
  3. package/dist/adapters/crypto/account-token-signatures.js +104 -0
  4. package/dist/adapters/crypto/account-token-signatures.js.map +1 -0
  5. package/dist/adapters/http/request-credentials.d.ts +7 -1
  6. package/dist/adapters/http/request-credentials.js +18 -5
  7. package/dist/adapters/http/request-credentials.js.map +1 -1
  8. package/dist/adapters/http/server.js +4 -2
  9. package/dist/adapters/http/server.js.map +1 -1
  10. package/dist/adapters/prisma/event-log.js +13 -1
  11. package/dist/adapters/prisma/event-log.js.map +1 -1
  12. package/dist/adapters/prisma/generated/browser.d.ts +36 -0
  13. package/dist/adapters/prisma/generated/client.d.ts +36 -0
  14. package/dist/adapters/prisma/generated/commonInputTypes.d.ts +150 -0
  15. package/dist/adapters/prisma/generated/enums.d.ts +33 -0
  16. package/dist/adapters/prisma/generated/enums.js +29 -1
  17. package/dist/adapters/prisma/generated/enums.js.map +1 -1
  18. package/dist/adapters/prisma/generated/internal/class.d.ts +55 -0
  19. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  20. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  21. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +463 -8
  22. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +45 -10
  23. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  24. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +47 -7
  25. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +45 -10
  26. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  27. package/dist/adapters/prisma/generated/models/AccountCutOff.d.ts +944 -0
  28. package/dist/adapters/prisma/generated/models/AccountCutOff.js +2 -0
  29. package/dist/adapters/prisma/generated/models/AccountCutOff.js.map +1 -0
  30. package/dist/adapters/prisma/generated/models/ConsoleSession.d.ts +59 -1
  31. package/dist/adapters/prisma/generated/models/Event.d.ts +426 -1
  32. package/dist/adapters/prisma/generated/models/Fleet.d.ts +1270 -116
  33. package/dist/adapters/prisma/generated/models/InstallationDeclaredNetworkRules.d.ts +1031 -0
  34. package/dist/adapters/prisma/generated/models/InstallationDeclaredNetworkRules.js +2 -0
  35. package/dist/adapters/prisma/generated/models/InstallationDeclaredNetworkRules.js.map +1 -0
  36. package/dist/adapters/prisma/generated/models/Label.d.ts +113 -39
  37. package/dist/adapters/prisma/generated/models/Lease.d.ts +60 -1
  38. package/dist/adapters/prisma/generated/models/NetworkRulesDraft.d.ts +1133 -0
  39. package/dist/adapters/prisma/generated/models/NetworkRulesDraft.js +2 -0
  40. package/dist/adapters/prisma/generated/models/NetworkRulesDraft.js.map +1 -0
  41. package/dist/adapters/prisma/generated/models/NetworkSettings.d.ts +24 -223
  42. package/dist/adapters/prisma/generated/models/PluginConnection.d.ts +1180 -0
  43. package/dist/adapters/prisma/generated/models/PluginConnection.js +2 -0
  44. package/dist/adapters/prisma/generated/models/PluginConnection.js.map +1 -0
  45. package/dist/adapters/prisma/generated/models/ReachRefusal.d.ts +1 -40
  46. package/dist/adapters/prisma/generated/models/Ship.d.ts +1072 -6
  47. package/dist/adapters/prisma/generated/models/SignInTicket.d.ts +39 -1
  48. package/dist/adapters/prisma/generated/models/VerifiedFacts.d.ts +1325 -0
  49. package/dist/adapters/prisma/generated/models/VerifiedFacts.js +2 -0
  50. package/dist/adapters/prisma/generated/models/VerifiedFacts.js.map +1 -0
  51. package/dist/adapters/prisma/generated/models.d.ts +5 -0
  52. package/dist/adapters/prisma/history.js +5 -2
  53. package/dist/adapters/prisma/history.js.map +1 -1
  54. package/dist/adapters/prisma/identity.d.ts +3 -1
  55. package/dist/adapters/prisma/identity.js +41 -8
  56. package/dist/adapters/prisma/identity.js.map +1 -1
  57. package/dist/adapters/prisma/messaging.js +5 -2
  58. package/dist/adapters/prisma/messaging.js.map +1 -1
  59. package/dist/adapters/prisma/network.d.ts +7 -2
  60. package/dist/adapters/prisma/network.js +92 -62
  61. package/dist/adapters/prisma/network.js.map +1 -1
  62. package/dist/adapters/prisma/overdue.js +4 -3
  63. package/dist/adapters/prisma/overdue.js.map +1 -1
  64. package/dist/adapters/prisma/plugin-connections.d.ts +4 -0
  65. package/dist/adapters/prisma/plugin-connections.js +20 -0
  66. package/dist/adapters/prisma/plugin-connections.js.map +1 -0
  67. package/dist/adapters/prisma/registry.js +22 -16
  68. package/dist/adapters/prisma/registry.js.map +1 -1
  69. package/dist/adapters/prisma/rows.d.ts +9 -4
  70. package/dist/adapters/prisma/rows.js +77 -19
  71. package/dist/adapters/prisma/rows.js.map +1 -1
  72. package/dist/adapters/prisma/unit-of-work.d.ts +5 -2
  73. package/dist/adapters/prisma/unit-of-work.js +7 -2
  74. package/dist/adapters/prisma/unit-of-work.js.map +1 -1
  75. package/dist/adapters/prisma/verified-facts.d.ts +4 -0
  76. package/dist/adapters/prisma/verified-facts.js +65 -0
  77. package/dist/adapters/prisma/verified-facts.js.map +1 -0
  78. package/dist/adapters/rest/rest-api.js +2 -2
  79. package/dist/adapters/rest/rest-api.js.map +1 -1
  80. package/dist/adapters/trpc/console.d.ts +3 -1
  81. package/dist/adapters/trpc/context.d.ts +28 -6
  82. package/dist/adapters/trpc/fleet.d.ts +314 -51
  83. package/dist/adapters/trpc/fleet.js +137 -75
  84. package/dist/adapters/trpc/fleet.js.map +1 -1
  85. package/dist/adapters/trpc/installation-token.d.ts +7 -0
  86. package/dist/adapters/trpc/installation-token.js +10 -0
  87. package/dist/adapters/trpc/installation-token.js.map +1 -0
  88. package/dist/adapters/trpc/installation.d.ts +32 -2
  89. package/dist/adapters/trpc/installation.js +14 -10
  90. package/dist/adapters/trpc/installation.js.map +1 -1
  91. package/dist/adapters/trpc/router.d.ts +435 -42
  92. package/dist/adapters/trpc/ship-contract.js +6 -3
  93. package/dist/adapters/trpc/ship-contract.js.map +1 -1
  94. package/dist/adapters/trpc/ship-protocol.js +1 -1
  95. package/dist/adapters/trpc/ship-protocol.js.map +1 -1
  96. package/dist/adapters/trpc/ship.d.ts +117 -1
  97. package/dist/adapters/trpc/ship.js +52 -6
  98. package/dist/adapters/trpc/ship.js.map +1 -1
  99. package/dist/adapters/trpc/trpc.d.ts +43 -17
  100. package/dist/adapters/trpc/trpc.js +131 -31
  101. package/dist/adapters/trpc/trpc.js.map +1 -1
  102. package/dist/app.d.ts +2 -0
  103. package/dist/app.js +22 -0
  104. package/dist/app.js.map +1 -1
  105. package/dist/config.d.ts +5 -0
  106. package/dist/config.js +3 -1
  107. package/dist/config.js.map +1 -1
  108. package/dist/domain/identity/authenticate-account.d.ts +35 -0
  109. package/dist/domain/identity/authenticate-account.js +54 -0
  110. package/dist/domain/identity/authenticate-account.js.map +1 -0
  111. package/dist/domain/identity/authenticate-installation.d.ts +23 -0
  112. package/dist/domain/identity/authenticate-installation.js +20 -0
  113. package/dist/domain/identity/authenticate-installation.js.map +1 -0
  114. package/dist/domain/identity/authenticate.d.ts +2 -2
  115. package/dist/domain/identity/console-session.d.ts +6 -3
  116. package/dist/domain/identity/console-session.js.map +1 -1
  117. package/dist/domain/identity/cut-off-account.d.ts +29 -0
  118. package/dist/domain/identity/cut-off-account.js +37 -0
  119. package/dist/domain/identity/cut-off-account.js.map +1 -0
  120. package/dist/domain/identity/dismiss-notice.d.ts +2 -2
  121. package/dist/domain/identity/issue-sign-in-ticket.d.ts +9 -3
  122. package/dist/domain/identity/issue-sign-in-ticket.js +8 -2
  123. package/dist/domain/identity/issue-sign-in-ticket.js.map +1 -1
  124. package/dist/domain/identity/ports.d.ts +52 -5
  125. package/dist/domain/identity/read-account.d.ts +8 -4
  126. package/dist/domain/identity/read-account.js +1 -1
  127. package/dist/domain/identity/read-account.js.map +1 -1
  128. package/dist/domain/identity/read-guide.d.ts +2 -2
  129. package/dist/domain/identity/read-notices.d.ts +2 -2
  130. package/dist/domain/identity/record-guide-progress.d.ts +2 -2
  131. package/dist/domain/identity/redeem-sign-in-ticket.d.ts +2 -1
  132. package/dist/domain/identity/redeem-sign-in-ticket.js +3 -2
  133. package/dist/domain/identity/redeem-sign-in-ticket.js.map +1 -1
  134. package/dist/domain/identity/set-theme.d.ts +2 -2
  135. package/dist/domain/identity/sign-in-ticket.d.ts +3 -1
  136. package/dist/domain/identity/sign-in.d.ts +2 -2
  137. package/dist/domain/identity/sign-in.js +2 -0
  138. package/dist/domain/identity/sign-in.js.map +1 -1
  139. package/dist/domain/identity/sign-out.d.ts +2 -2
  140. package/dist/domain/identity/sign-out.js +1 -1
  141. package/dist/domain/identity/sign-out.js.map +1 -1
  142. package/dist/domain/identity/start-console-session.d.ts +4 -2
  143. package/dist/domain/identity/start-console-session.js +6 -4
  144. package/dist/domain/identity/start-console-session.js.map +1 -1
  145. package/dist/domain/identity/start-viewer-session.js +1 -0
  146. package/dist/domain/identity/start-viewer-session.js.map +1 -1
  147. package/dist/domain/messaging/delivery.d.ts +11 -3
  148. package/dist/domain/messaging/delivery.js +23 -15
  149. package/dist/domain/messaging/delivery.js.map +1 -1
  150. package/dist/domain/messaging/dismiss-delivery.d.ts +2 -2
  151. package/dist/domain/messaging/hand-over-delivery.d.ts +1 -0
  152. package/dist/domain/messaging/hand-over-delivery.js +1 -0
  153. package/dist/domain/messaging/hand-over-delivery.js.map +1 -1
  154. package/dist/domain/messaging/message.d.ts +3 -1
  155. package/dist/domain/messaging/message.js +1 -1
  156. package/dist/domain/messaging/message.js.map +1 -1
  157. package/dist/domain/messaging/overdue.d.ts +2 -0
  158. package/dist/domain/messaging/overdue.js +3 -0
  159. package/dist/domain/messaging/overdue.js.map +1 -1
  160. package/dist/domain/messaging/ping-ship.d.ts +2 -2
  161. package/dist/domain/messaging/ping-ship.js +1 -1
  162. package/dist/domain/messaging/ping-ship.js.map +1 -1
  163. package/dist/domain/messaging/ports.d.ts +2 -0
  164. package/dist/domain/messaging/push-receive-deliveries.d.ts +4 -1
  165. package/dist/domain/messaging/push-receive-deliveries.js +5 -3
  166. package/dist/domain/messaging/push-receive-deliveries.js.map +1 -1
  167. package/dist/domain/messaging/receive-deliveries.d.ts +21 -0
  168. package/dist/domain/messaging/receive-deliveries.js +5 -3
  169. package/dist/domain/messaging/receive-deliveries.js.map +1 -1
  170. package/dist/domain/messaging/receive-reply.d.ts +32 -0
  171. package/dist/domain/messaging/receive-reply.js +25 -0
  172. package/dist/domain/messaging/receive-reply.js.map +1 -0
  173. package/dist/domain/messaging/resend-delivery.d.ts +2 -2
  174. package/dist/domain/messaging/resend-delivery.js +1 -0
  175. package/dist/domain/messaging/resend-delivery.js.map +1 -1
  176. package/dist/domain/messaging/send-message.d.ts +3 -3
  177. package/dist/domain/messaging/send-message.js +1 -0
  178. package/dist/domain/messaging/send-message.js.map +1 -1
  179. package/dist/domain/registry/apply-network-rules.d.ts +32 -0
  180. package/dist/domain/registry/apply-network-rules.js +33 -0
  181. package/dist/domain/registry/apply-network-rules.js.map +1 -0
  182. package/dist/domain/registry/assign-crew.d.ts +2 -2
  183. package/dist/domain/registry/assign-crew.js +3 -2
  184. package/dist/domain/registry/assign-crew.js.map +1 -1
  185. package/dist/domain/registry/assign-label.d.ts +7 -5
  186. package/dist/domain/registry/assign-label.js +16 -6
  187. package/dist/domain/registry/assign-label.js.map +1 -1
  188. package/dist/domain/registry/change-label-values.d.ts +1 -1
  189. package/dist/domain/registry/change-label-values.js +4 -3
  190. package/dist/domain/registry/change-label-values.js.map +1 -1
  191. package/dist/domain/registry/check-reach.d.ts +49 -24
  192. package/dist/domain/registry/check-reach.js +77 -42
  193. package/dist/domain/registry/check-reach.js.map +1 -1
  194. package/dist/domain/registry/clear-request.d.ts +1 -1
  195. package/dist/domain/registry/clear-request.js +1 -1
  196. package/dist/domain/registry/clear-request.js.map +1 -1
  197. package/dist/domain/registry/commission-ship.d.ts +26 -13
  198. package/dist/domain/registry/commission-ship.js +199 -22
  199. package/dist/domain/registry/commission-ship.js.map +1 -1
  200. package/dist/domain/registry/confirm-crew-release.d.ts +2 -2
  201. package/dist/domain/registry/confirm-crew-release.js +3 -2
  202. package/dist/domain/registry/confirm-crew-release.js.map +1 -1
  203. package/dist/domain/registry/confirm-worktree-cleared.d.ts +2 -2
  204. package/dist/domain/registry/confirm-worktree-cleared.js +3 -2
  205. package/dist/domain/registry/confirm-worktree-cleared.js.map +1 -1
  206. package/dist/domain/registry/connect-plugin.d.ts +31 -0
  207. package/dist/domain/registry/connect-plugin.js +34 -0
  208. package/dist/domain/registry/connect-plugin.js.map +1 -0
  209. package/dist/domain/registry/crew-request.d.ts +2 -2
  210. package/dist/domain/registry/crew-request.js.map +1 -1
  211. package/dist/domain/registry/declare-network-rules.d.ts +9 -6
  212. package/dist/domain/registry/declare-network-rules.js +13 -8
  213. package/dist/domain/registry/declare-network-rules.js.map +1 -1
  214. package/dist/domain/registry/declare-scopes.d.ts +2 -2
  215. package/dist/domain/registry/declared-network-rules.d.ts +30 -21
  216. package/dist/domain/registry/declared-network-rules.js +46 -22
  217. package/dist/domain/registry/declared-network-rules.js.map +1 -1
  218. package/dist/domain/registry/define-label.d.ts +1 -1
  219. package/dist/domain/registry/define-label.js +5 -5
  220. package/dist/domain/registry/define-label.js.map +1 -1
  221. package/dist/domain/registry/delete-label.d.ts +1 -1
  222. package/dist/domain/registry/delete-label.js +4 -3
  223. package/dist/domain/registry/delete-label.js.map +1 -1
  224. package/dist/domain/registry/discard-network-rules-draft.d.ts +23 -0
  225. package/dist/domain/registry/discard-network-rules-draft.js +24 -0
  226. package/dist/domain/registry/discard-network-rules-draft.js.map +1 -0
  227. package/dist/domain/registry/discover.d.ts +12 -10
  228. package/dist/domain/registry/discover.js +11 -5
  229. package/dist/domain/registry/discover.js.map +1 -1
  230. package/dist/domain/registry/explain-crew-request.d.ts +2 -2
  231. package/dist/domain/registry/explain-crew-request.js +3 -2
  232. package/dist/domain/registry/explain-crew-request.js.map +1 -1
  233. package/dist/domain/registry/explain-reach.d.ts +22 -14
  234. package/dist/domain/registry/explain-reach.js +53 -53
  235. package/dist/domain/registry/explain-reach.js.map +1 -1
  236. package/dist/domain/registry/get-ship.d.ts +2 -2
  237. package/dist/domain/registry/get-starting-prompt.d.ts +4 -2
  238. package/dist/domain/registry/get-starting-prompt.js +7 -5
  239. package/dist/domain/registry/get-starting-prompt.js.map +1 -1
  240. package/dist/domain/registry/give-back-crew-request.d.ts +2 -2
  241. package/dist/domain/registry/give-back-crew-request.js +3 -2
  242. package/dist/domain/registry/give-back-crew-request.js.map +1 -1
  243. package/dist/domain/registry/grant-scopes.d.ts +8 -5
  244. package/dist/domain/registry/grant-scopes.js +14 -5
  245. package/dist/domain/registry/grant-scopes.js.map +1 -1
  246. package/dist/domain/registry/label.d.ts +69 -18
  247. package/dist/domain/registry/label.js +79 -28
  248. package/dist/domain/registry/label.js.map +1 -1
  249. package/dist/domain/registry/lease.d.ts +1 -1
  250. package/dist/domain/registry/leases.d.ts +6 -3
  251. package/dist/domain/registry/leases.js +7 -5
  252. package/dist/domain/registry/leases.js.map +1 -1
  253. package/dist/domain/registry/list-fleet.d.ts +2 -0
  254. package/dist/domain/registry/list-fleet.js +1 -0
  255. package/dist/domain/registry/list-fleet.js.map +1 -1
  256. package/dist/domain/registry/list-scopes.d.ts +2 -1
  257. package/dist/domain/registry/list-scopes.js +2 -1
  258. package/dist/domain/registry/list-scopes.js.map +1 -1
  259. package/dist/domain/registry/managed-or-assigned.d.ts +12 -4
  260. package/dist/domain/registry/managed-or-assigned.js +25 -7
  261. package/dist/domain/registry/managed-or-assigned.js.map +1 -1
  262. package/dist/domain/registry/network-rules-draft.d.ts +45 -0
  263. package/dist/domain/registry/network-rules-draft.js +41 -0
  264. package/dist/domain/registry/network-rules-draft.js.map +1 -0
  265. package/dist/domain/registry/network-settings.d.ts +96 -115
  266. package/dist/domain/registry/network-settings.js +101 -150
  267. package/dist/domain/registry/network-settings.js.map +1 -1
  268. package/dist/domain/registry/plugin-connection.d.ts +48 -0
  269. package/dist/domain/registry/plugin-connection.js +35 -0
  270. package/dist/domain/registry/plugin-connection.js.map +1 -0
  271. package/dist/domain/registry/ports.d.ts +60 -12
  272. package/dist/domain/registry/reach-refusal.d.ts +18 -4
  273. package/dist/domain/registry/read-assigned-crew-requests.d.ts +2 -2
  274. package/dist/domain/registry/read-built-in-rules.d.ts +5 -4
  275. package/dist/domain/registry/read-built-in-rules.js +9 -7
  276. package/dist/domain/registry/read-built-in-rules.js.map +1 -1
  277. package/dist/domain/registry/read-clear-requests.d.ts +2 -2
  278. package/dist/domain/registry/read-clear-requests.js.map +1 -1
  279. package/dist/domain/registry/read-declared-network-rules.d.ts +5 -5
  280. package/dist/domain/registry/read-declared-network-rules.js +4 -4
  281. package/dist/domain/registry/read-declared-network-rules.js.map +1 -1
  282. package/dist/domain/registry/read-network-rules-draft-changes.d.ts +22 -0
  283. package/dist/domain/registry/read-network-rules-draft-changes.js +53 -0
  284. package/dist/domain/registry/read-network-rules-draft-changes.js.map +1 -0
  285. package/dist/domain/registry/read-network-rules.d.ts +30 -0
  286. package/dist/domain/registry/read-network-rules.js +18 -0
  287. package/dist/domain/registry/read-network-rules.js.map +1 -0
  288. package/dist/domain/registry/read-on-behalf.d.ts +3 -3
  289. package/dist/domain/registry/read-on-behalf.js.map +1 -1
  290. package/dist/domain/registry/read-reach-refusals.d.ts +6 -5
  291. package/dist/domain/registry/read-reach-refusals.js +13 -8
  292. package/dist/domain/registry/read-reach-refusals.js.map +1 -1
  293. package/dist/domain/registry/read-reach.d.ts +10 -10
  294. package/dist/domain/registry/read-reach.js +26 -16
  295. package/dist/domain/registry/read-reach.js.map +1 -1
  296. package/dist/domain/registry/recrew-ship.d.ts +2 -2
  297. package/dist/domain/registry/recrew-ship.js +5 -3
  298. package/dist/domain/registry/recrew-ship.js.map +1 -1
  299. package/dist/domain/registry/release-ship.d.ts +7 -4
  300. package/dist/domain/registry/release-ship.js +8 -4
  301. package/dist/domain/registry/release-ship.js.map +1 -1
  302. package/dist/domain/registry/remove-crew-request.d.ts +2 -2
  303. package/dist/domain/registry/remove-crew-request.js +4 -3
  304. package/dist/domain/registry/remove-crew-request.js.map +1 -1
  305. package/dist/domain/registry/rename-ship.d.ts +1 -1
  306. package/dist/domain/registry/rename-ship.js +4 -3
  307. package/dist/domain/registry/rename-ship.js.map +1 -1
  308. package/dist/domain/registry/report-crew-status.d.ts +2 -2
  309. package/dist/domain/registry/report-crew-status.js +3 -2
  310. package/dist/domain/registry/report-crew-status.js.map +1 -1
  311. package/dist/domain/registry/request-crew.d.ts +3 -3
  312. package/dist/domain/registry/request-crew.js +4 -3
  313. package/dist/domain/registry/request-crew.js.map +1 -1
  314. package/dist/domain/registry/request-worktree-clear.d.ts +2 -2
  315. package/dist/domain/registry/request-worktree-clear.js +4 -3
  316. package/dist/domain/registry/request-worktree-clear.js.map +1 -1
  317. package/dist/domain/registry/retire-ship.d.ts +17 -12
  318. package/dist/domain/registry/retire-ship.js +30 -21
  319. package/dist/domain/registry/retire-ship.js.map +1 -1
  320. package/dist/domain/registry/save-network-rules-draft.d.ts +31 -0
  321. package/dist/domain/registry/save-network-rules-draft.js +27 -0
  322. package/dist/domain/registry/save-network-rules-draft.js.map +1 -0
  323. package/dist/domain/registry/scope-grant.d.ts +19 -19
  324. package/dist/domain/registry/scope-grant.js +8 -9
  325. package/dist/domain/registry/scope-grant.js.map +1 -1
  326. package/dist/domain/registry/set-built-in-rule.d.ts +3 -3
  327. package/dist/domain/registry/set-built-in-rule.js +5 -9
  328. package/dist/domain/registry/set-built-in-rule.js.map +1 -1
  329. package/dist/domain/registry/set-owner.d.ts +9 -6
  330. package/dist/domain/registry/set-owner.js +14 -8
  331. package/dist/domain/registry/set-owner.js.map +1 -1
  332. package/dist/domain/registry/set-verified-facts.d.ts +36 -0
  333. package/dist/domain/registry/set-verified-facts.js +58 -0
  334. package/dist/domain/registry/set-verified-facts.js.map +1 -0
  335. package/dist/domain/registry/ship.d.ts +55 -17
  336. package/dist/domain/registry/ship.js +107 -16
  337. package/dist/domain/registry/ship.js.map +1 -1
  338. package/dist/domain/registry/statement.d.ts +2 -2
  339. package/dist/domain/registry/statement.js +2 -2
  340. package/dist/domain/registry/statement.js.map +1 -1
  341. package/dist/domain/registry/turn.d.ts +2 -2
  342. package/dist/domain/registry/turn.js +2 -2
  343. package/dist/domain/registry/turn.js.map +1 -1
  344. package/dist/domain/registry/unassign-label.d.ts +8 -5
  345. package/dist/domain/registry/unassign-label.js +17 -6
  346. package/dist/domain/registry/unassign-label.js.map +1 -1
  347. package/dist/domain/registry/verified-facts.d.ts +75 -0
  348. package/dist/domain/registry/verified-facts.js +107 -0
  349. package/dist/domain/registry/verified-facts.js.map +1 -0
  350. package/dist/domain/registry/whoami.d.ts +2 -2
  351. package/dist/domain/shared/caller.d.ts +40 -6
  352. package/dist/domain/shared/caller.js +20 -0
  353. package/dist/domain/shared/caller.js.map +1 -1
  354. package/dist/domain/shared/delivery-way.d.ts +9 -5
  355. package/dist/domain/shared/delivery-way.js +17 -5
  356. package/dist/domain/shared/delivery-way.js.map +1 -1
  357. package/dist/domain/shared/errors.d.ts +1 -1
  358. package/dist/domain/shared/errors.js.map +1 -1
  359. package/dist/domain/shared/events.d.ts +13 -2
  360. package/dist/domain/shared/events.js.map +1 -1
  361. package/dist/domain/shared/health.d.ts +3 -1
  362. package/dist/domain/shared/health.js +5 -3
  363. package/dist/domain/shared/health.js.map +1 -1
  364. package/dist/domain/shared/history.d.ts +5 -1
  365. package/dist/domain/shared/history.js.map +1 -1
  366. package/dist/domain/shared/read-fleet-limits.d.ts +2 -2
  367. package/dist/domain/shared/read-health.d.ts +4 -3
  368. package/dist/domain/shared/read-health.js +9 -3
  369. package/dist/domain/shared/read-health.js.map +1 -1
  370. package/dist/domain/shared/read-inbox.d.ts +2 -2
  371. package/dist/domain/shared/read-message.d.ts +2 -2
  372. package/dist/domain/shared/read-needs-attention.d.ts +2 -2
  373. package/dist/domain/shared/read-sent-message.d.ts +31 -0
  374. package/dist/domain/shared/read-sent-message.js +28 -0
  375. package/dist/domain/shared/read-sent-message.js.map +1 -0
  376. package/dist/domain/shared/read-ship-messages.d.ts +2 -2
  377. package/dist/domain/shared/read-ship-timeline.d.ts +2 -2
  378. package/dist/domain/shared/read-ship-way.d.ts +2 -2
  379. package/dist/domain/shared/read-ship-way.js +1 -1
  380. package/dist/domain/shared/read-ship-way.js.map +1 -1
  381. package/dist/domain/shared/stuck.js +4 -2
  382. package/dist/domain/shared/stuck.js.map +1 -1
  383. package/dist/start.js +1 -0
  384. package/dist/start.js.map +1 -1
  385. package/dist/testing/account-token-issuer.d.ts +30 -0
  386. package/dist/testing/account-token-issuer.js +48 -0
  387. package/dist/testing/account-token-issuer.js.map +1 -0
  388. package/dist/testing/container-images.d.ts +14 -0
  389. package/dist/testing/container-images.js +18 -0
  390. package/dist/testing/container-images.js.map +1 -0
  391. package/dist/testing/database.d.ts +14 -0
  392. package/dist/testing/database.js +48 -0
  393. package/dist/testing/database.js.map +1 -0
  394. package/dist/testing/fleet.d.ts +13 -0
  395. package/dist/testing/fleet.js +17 -0
  396. package/dist/testing/fleet.js.map +1 -0
  397. package/dist/testing/index.d.ts +12 -0
  398. package/dist/testing/index.js +12 -0
  399. package/dist/testing/index.js.map +1 -0
  400. package/dist/testing/keys.d.ts +1 -0
  401. package/dist/testing/keys.js +7 -0
  402. package/dist/testing/keys.js.map +1 -0
  403. package/dist/testing/migrate-lock.d.ts +12 -0
  404. package/dist/testing/migrate-lock.js +51 -0
  405. package/dist/testing/migrate-lock.js.map +1 -0
  406. package/dist/testing/migrated-template.d.ts +12 -0
  407. package/dist/testing/migrated-template.js +29 -0
  408. package/dist/testing/migrated-template.js.map +1 -0
  409. package/dist/testing/postgres-container.d.ts +16 -0
  410. package/dist/testing/postgres-container.js +30 -0
  411. package/dist/testing/postgres-container.js.map +1 -0
  412. package/dist/testing/postgres-global-setup.d.ts +15 -0
  413. package/dist/testing/postgres-global-setup.js +20 -0
  414. package/dist/testing/postgres-global-setup.js.map +1 -0
  415. package/dist/testing/prisma-cli.d.ts +5 -0
  416. package/dist/testing/prisma-cli.js +15 -0
  417. package/dist/testing/prisma-cli.js.map +1 -0
  418. package/dist/testing/result.d.ts +5 -0
  419. package/dist/testing/result.js +15 -0
  420. package/dist/testing/result.js.map +1 -0
  421. package/dist/wiring.d.ts +27 -6
  422. package/dist/wiring.js +44 -11
  423. package/dist/wiring.js.map +1 -1
  424. package/package.json +26 -3
  425. package/src/adapters/prisma/migrations/20261018250000_scope_catalogue/migration.sql +8 -7
  426. package/src/adapters/prisma/migrations/20261019100000_on_behalf_scope/migration.sql +3 -1
  427. package/src/adapters/prisma/migrations/20261019130000_plugin_connections/migration.sql +54 -0
  428. package/src/adapters/prisma/migrations/20261019150000_network_plugin_registered_at/migration.sql +23 -0
  429. package/src/adapters/prisma/migrations/20261019160000_lease_waker/migration.sql +4 -0
  430. package/src/adapters/prisma/migrations/20261019200000_account_cut_offs/migration.sql +10 -0
  431. package/src/adapters/prisma/migrations/20261019210000_event_actors/migration.sql +32 -0
  432. package/src/adapters/prisma/migrations/20261020090000_argos_jobs_as_scopes/migration.sql +65 -0
  433. package/src/adapters/prisma/migrations/20261020100000_installation_labels/migration.sql +7 -0
  434. package/src/adapters/prisma/migrations/20261020110000_installation_declared_network_rules/migration.sql +10 -0
  435. package/src/adapters/prisma/migrations/20261020120000_commissioning_actors/migration.sql +14 -0
  436. package/src/adapters/prisma/migrations/20261020130000_console_sign_in_accounts/migration.sql +4 -0
  437. package/src/adapters/prisma/migrations/20261020140000_event_signed_in_accounts/migration.sql +4 -0
  438. package/src/adapters/prisma/migrations/20261020150000_account_cut_off_ends_console_sessions/migration.sql +2 -0
  439. package/src/adapters/prisma/migrations/20261020160000_network_in_core/migration.sql +30 -0
  440. package/src/adapters/prisma/migrations/20261020170000_verify_scope/migration.sql +64 -0
  441. package/src/adapters/prisma/migrations/20261020180000_verified_facts/migration.sql +21 -0
  442. package/src/adapters/prisma/migrations/20261020190000_verified_facts_by_writer/migration.sql +3 -0
  443. package/src/adapters/prisma/schema.prisma +160 -22
  444. package/dist/domain/registry/register-network-plugin.d.ts +0 -28
  445. package/dist/domain/registry/register-network-plugin.js +0 -26
  446. package/dist/domain/registry/register-network-plugin.js.map +0 -1
  447. package/dist/domain/registry/set-network-rules.d.ts +0 -31
  448. package/dist/domain/registry/set-network-rules.js +0 -27
  449. package/dist/domain/registry/set-network-rules.js.map +0 -1
  450. package/dist/domain/registry/unregister-network-plugin.d.ts +0 -27
  451. package/dist/domain/registry/unregister-network-plugin.js +0 -25
  452. package/dist/domain/registry/unregister-network-plugin.js.map +0 -1
@@ -1,34 +1,42 @@
1
1
  import { type ExplainedReach, type ShipId } from '@aeolus-fleet/common';
2
2
  import type { Caller } from '../shared/caller.js';
3
- import type { Clock } from '../shared/clock.js';
4
3
  import { type DomainError } from '../shared/errors.js';
5
4
  import { type Result } from '../shared/result.js';
6
5
  import type { UnitOfWork } from '../shared/unit-of-work.js';
7
6
  import { type CheckReachTx } from './check-reach.js';
8
- import type { DeclaredNetworkRulesRepository, ShipRepository } from './ports.js';
7
+ import { type NoNetworkRulesDraft } from './network-rules-draft.js';
8
+ import { type RulesInForce } from './network-settings.js';
9
+ import { type ReadReachOf } from './read-reach.js';
10
+ import type { NetworkRulesDraftRepository, ShipRepository } from './ports.js';
9
11
  export interface ExplainReachTx {
10
12
  networkSettings: CheckReachTx['networkSettings'];
11
13
  ships: Pick<ShipRepository, 'find' | 'listActive'>;
12
14
  labels: CheckReachTx['labels'];
13
- leases: CheckReachTx['leases'];
14
- declaredNetworkRules: Pick<DeclaredNetworkRulesRepository, 'list'>;
15
+ pluginConnections: CheckReachTx['pluginConnections'];
16
+ declaredNetworkRules: CheckReachTx['declaredNetworkRules'];
17
+ networkRulesDrafts: Pick<NetworkRulesDraftRepository, 'find'>;
15
18
  }
16
- export type ExplainReachFailure = DomainError<'NOT_THE_OPERATOR_SHIP' | 'SHIP_NOT_FOUND'>;
19
+ export type ExplainReachFailure = DomainError<'NOT_REACHABLE' | 'SHIP_NOT_FOUND'> | NoNetworkRulesDraft;
17
20
  export type ExplainReach = (caller: Caller, input: {
18
21
  fromShipId: ShipId;
19
22
  toShipId?: ShipId;
23
+ against?: 'applied' | 'draft';
20
24
  }) => Promise<Result<ExplainedReach, ExplainReachFailure>>;
21
25
  /**
22
- * Use case: argo asks which ships a ship reaches now, per verb, or whether it
23
- * reaches one ship (decision 0034). It answers as a send would be checked at
24
- * this moment: the rules in force, what the networking plugin declared while
25
- * it does not respond, the built-in rules. Each ship comes with the rule that
26
- * allows it: a built-in rule, a rule the plugin supplied, or a rule a ship
27
- * declared, named by its declarer, when the plugin supplied it as declared.
28
- * There is no message, so no answer to a sender. It records nothing: an
29
- * explain is not a send. Only argo.
26
+ * Use case: an actor asks which ships a ship reaches now, per verb, or
27
+ * whether it reaches one ship (decision 0034). It answers as a send would be
28
+ * checked at this moment: the built-in rules, the fleet's own rules and the
29
+ * declared ones; or, asked of the draft, as one would be checked once the
30
+ * draft is applied. Each ship comes with the rule that allows it: a built-in
31
+ * rule, one of the fleet's own by its place, or a declared rule by its
32
+ * declarer and place. There is no message, so no answer to a sender. It
33
+ * records nothing: an explain is not a send. Any actor holding fleet:explain
34
+ * asks, the scope checked before this runs, about the ships it reads
35
+ * (decision 0053).
30
36
  */
31
37
  export declare function createExplainReach(deps: {
32
38
  uow: UnitOfWork<ExplainReachTx>;
33
- clock: Clock;
39
+ readReach: ReadReachOf;
34
40
  }): ExplainReach;
41
+ /** The rules that would be in force once the fleet's draft is applied, with the declared ones as they are now; none without a draft. */
42
+ export declare function draftInForce(tx: Pick<ExplainReachTx, 'networkSettings' | 'declaredNetworkRules' | 'networkRulesDrafts'>, fleetId: Caller['fleetId']): Promise<RulesInForce | undefined>;
@@ -1,65 +1,65 @@
1
1
  import { NETWORK_VERBS } from '@aeolus-fleet/common';
2
2
  import { refuse } from '../shared/errors.js';
3
3
  import { ok } from '../shared/result.js';
4
- import { reaching, rulesInForceAt, shipAsItIs } from './check-reach.js';
5
- import { reachRuleOf } from './network-settings.js';
4
+ import { reaching, rulesInForceOf, shipAsItIs } from './check-reach.js';
5
+ import { refuseNoDraft } from './network-rules-draft.js';
6
+ import { reachRuleOf, rulesInForce } from './network-settings.js';
7
+ import { readsShip } from './read-reach.js';
6
8
  /**
7
- * Use case: argo asks which ships a ship reaches now, per verb, or whether it
8
- * reaches one ship (decision 0034). It answers as a send would be checked at
9
- * this moment: the rules in force, what the networking plugin declared while
10
- * it does not respond, the built-in rules. Each ship comes with the rule that
11
- * allows it: a built-in rule, a rule the plugin supplied, or a rule a ship
12
- * declared, named by its declarer, when the plugin supplied it as declared.
13
- * There is no message, so no answer to a sender. It records nothing: an
14
- * explain is not a send. Only argo.
9
+ * Use case: an actor asks which ships a ship reaches now, per verb, or
10
+ * whether it reaches one ship (decision 0034). It answers as a send would be
11
+ * checked at this moment: the built-in rules, the fleet's own rules and the
12
+ * declared ones; or, asked of the draft, as one would be checked once the
13
+ * draft is applied. Each ship comes with the rule that allows it: a built-in
14
+ * rule, one of the fleet's own by its place, or a declared rule by its
15
+ * declarer and place. There is no message, so no answer to a sender. It
16
+ * records nothing: an explain is not a send. Any actor holding fleet:explain
17
+ * asks, the scope checked before this runs, about the ships it reads
18
+ * (decision 0053).
15
19
  */
16
20
  export function createExplainReach(deps) {
17
- return (caller, input) => deps.uow.run(async (tx) => {
18
- if (caller.kind !== 'operator') {
19
- return refuse('NOT_THE_OPERATOR_SHIP', 'Only argo explains reach');
20
- }
21
- const { fleetId } = caller;
22
- const from = await tx.ships.find(fleetId, input.fromShipId);
23
- if (from?.retiredAt !== null) {
24
- return refuse('SHIP_NOT_FOUND', 'The fleet has no active ship with this id to explain from');
25
- }
26
- const active = await tx.ships.listActive(fleetId);
27
- const others = active.filter((ship) => ship.id !== from.id && (input.toShipId === undefined || ship.id === input.toShipId));
28
- if (input.toShipId !== undefined && others.length === 0 && input.toShipId !== from.id) {
29
- return refuse('SHIP_NOT_FOUND', 'The fleet has no active ship with this id to explain reach to');
30
- }
31
- const settings = await tx.networkSettings.findForShare(fleetId);
32
- const inForce = await rulesInForceAt(tx, { settings, now: deps.clock.now() });
33
- const declared = await tx.declaredNetworkRules.list(fleetId);
34
- const sender = reaching(await shipAsItIs(tx, from));
35
- const explained = { send: [], read: [], manage: [] };
36
- for (const ship of others) {
37
- const recipient = reaching(await shipAsItIs(tx, ship));
38
- for (const verb of NETWORK_VERBS) {
39
- const rule = reachRuleOf(inForce, { verb, sender, recipient, isAnswerToSender: false });
40
- if (rule !== undefined) {
41
- explained[verb].push({ shipId: ship.id, rule: namedRule(rule, { rules: inForce.rules, declared }) });
21
+ return async (caller, input) => {
22
+ const reads = await deps.readReach(caller);
23
+ return deps.uow.run(async (tx) => {
24
+ const { fleetId } = caller;
25
+ const from = await tx.ships.find(fleetId, input.fromShipId);
26
+ if (from?.retiredAt !== null) {
27
+ return refuse('SHIP_NOT_FOUND', 'The fleet has no active ship with this id to explain from');
28
+ }
29
+ if (!readsShip(reads, from.id)) {
30
+ return refuse('NOT_REACHABLE', 'The network rules do not let you read the ship to explain from');
31
+ }
32
+ const active = await tx.ships.listActive(fleetId);
33
+ const others = active.filter((ship) => ship.id !== from.id && readsShip(reads, ship.id) && (input.toShipId === undefined || ship.id === input.toShipId));
34
+ if (input.toShipId !== undefined && others.length === 0 && input.toShipId !== from.id) {
35
+ return refuse('SHIP_NOT_FOUND', 'The fleet has no active ship with this id to explain reach to');
36
+ }
37
+ const inForce = input.against === 'draft' ? await draftInForce(tx, fleetId) : await rulesInForceOf(tx, await tx.networkSettings.findForShare(fleetId));
38
+ if (inForce === undefined) {
39
+ return refuseNoDraft();
40
+ }
41
+ const sender = reaching(await shipAsItIs(tx, from));
42
+ const explained = { send: [], read: [], manage: [] };
43
+ for (const ship of others) {
44
+ const recipient = reaching(await shipAsItIs(tx, ship));
45
+ for (const verb of NETWORK_VERBS) {
46
+ const rule = reachRuleOf(inForce, { verb, sender, recipient, isAnswerToSender: false });
47
+ if (rule !== undefined) {
48
+ explained[verb].push({ shipId: ship.id, rule });
49
+ }
42
50
  }
43
51
  }
44
- }
45
- return ok(explained);
46
- });
52
+ return ok(explained);
53
+ });
54
+ };
47
55
  }
48
- /** A rule of the settings named as argo reads it: a declared one by its declarer and its place in that ship's list, any other as the plugin's. */
49
- function namedRule(rule, held) {
50
- if ('builtIn' in rule) {
51
- return rule;
52
- }
53
- const text = ruleText(held.rules[rule.index]);
54
- for (const { shipId, rules } of held.declared) {
55
- const index = rules.findIndex((each) => ruleText(each) === text);
56
- if (index !== -1) {
57
- return { declared: shipId, index };
58
- }
56
+ /** The rules that would be in force once the fleet's draft is applied, with the declared ones as they are now; none without a draft. */
57
+ export async function draftInForce(tx, fleetId) {
58
+ const settings = await tx.networkSettings.findForShare(fleetId);
59
+ const draft = await tx.networkRulesDrafts.find(fleetId);
60
+ if (draft === undefined) {
61
+ return undefined;
59
62
  }
60
- return { plugin: rule.index };
61
- }
62
- function ruleText(rule) {
63
- return JSON.stringify(rule === undefined ? null : [rule.verb, rule.from, rule.to]);
63
+ return rulesInForce({ rules: draft.rules, isViewerReadOn: settings.isViewerReadOn }, await tx.declaredNetworkRules.list(fleetId));
64
64
  }
65
65
  //# sourceMappingURL=explain-reach.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"explain-reach.js","sourceRoot":"","sources":["../../../src/domain/registry/explain-reach.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"explain-reach.js","sourceRoot":"","sources":["../../../src/domain/registry/explain-reach.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { ShipId } from '@aeolus-fleet/common';
2
- import type { Caller } from '../shared/caller.js';
2
+ import type { ShipCaller } from '../shared/caller.js';
3
3
  import { type DomainError } from '../shared/errors.js';
4
4
  import { type Result } from '../shared/result.js';
5
5
  import { type ListedShip, type ShipOutsideReadReach } from './list-fleet.js';
@@ -26,7 +26,7 @@ export interface ShipDetail extends Omit<ListedShip, 'report' | 'crewRequest'> {
26
26
  name: string;
27
27
  } | null;
28
28
  }
29
- export type GetShip = (caller: Caller, input: {
29
+ export type GetShip = (caller: ShipCaller, input: {
30
30
  shipId: ShipId;
31
31
  }) => Promise<Result<ShipDetail | ShipOutsideReadReach, DomainError<'SHIP_NOT_FOUND' | 'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER'>>>;
32
32
  /**
@@ -1,6 +1,6 @@
1
1
  import type { IdGenerator, ShipId } from '@aeolus-fleet/common';
2
2
  import { type SecretTools } from '../identity/public.js';
3
- import type { Caller } from '../shared/caller.js';
3
+ import { type Caller } from '../shared/caller.js';
4
4
  import type { Clock } from '../shared/clock.js';
5
5
  import { type DomainError } from '../shared/errors.js';
6
6
  import { type Result } from '../shared/result.js';
@@ -24,7 +24,9 @@ export type GetStartingPrompt = (caller: Caller, input: {
24
24
  * prompt lost before use costs nothing. The caller's scope (fleet:manage or
25
25
  * crew:run) is checked before this runs; crew:run reaches only
26
26
  * the ships whose crew requests are assigned to the caller's ship, and
27
- * fleet:manage the ships in its manage reach (decision 0034).
27
+ * fleet:manage the ships in its manage reach (decision 0034). An account gets
28
+ * one only for its own person ship, with no scope for it, so the app it uses
29
+ * crews it (decision 0052).
28
30
  *
29
31
  * Locks in the fleet's order: the ship first, so concurrent prompts for one
30
32
  * ship take turns and the last one issued is the valid one; then its secret;
@@ -1,9 +1,9 @@
1
1
  import { revokeShipSecret } from '../identity/public.js';
2
+ import { actorOf } from '../shared/caller.js';
2
3
  import { refuse } from '../shared/errors.js';
3
- import { shipActor } from '../shared/events.js';
4
4
  import { ok } from '../shared/result.js';
5
5
  import { keepingReachRefusal } from './check-reach.js';
6
- import { checkManagedOrAssigned } from './managed-or-assigned.js';
6
+ import { checkManagedOrAssigned, checkOwnPersonShip } from './managed-or-assigned.js';
7
7
  import { checkCanIssueStartingPrompt } from './ship.js';
8
8
  import { issueStartingPrompt } from './starting-prompt.js';
9
9
  /**
@@ -12,7 +12,9 @@ import { issueStartingPrompt } from './starting-prompt.js';
12
12
  * prompt lost before use costs nothing. The caller's scope (fleet:manage or
13
13
  * crew:run) is checked before this runs; crew:run reaches only
14
14
  * the ships whose crew requests are assigned to the caller's ship, and
15
- * fleet:manage the ships in its manage reach (decision 0034).
15
+ * fleet:manage the ships in its manage reach (decision 0034). An account gets
16
+ * one only for its own person ship, with no scope for it, so the app it uses
17
+ * crews it (decision 0052).
16
18
  *
17
19
  * Locks in the fleet's order: the ship first, so concurrent prompts for one
18
20
  * ship take turns and the last one issued is the valid one; then its secret;
@@ -28,11 +30,11 @@ export function createGetStartingPrompt(deps) {
28
30
  return refuse('SHIP_NOT_FOUND', `Ship ${shipId} does not exist`);
29
31
  }
30
32
  const at = deps.clock.now();
31
- const reaches = await checkManagedOrAssigned({ tx, ids: deps.ids }, { caller, ship, at });
33
+ const reaches = caller.kind === 'account' ? checkOwnPersonShip(caller, ship) : await checkManagedOrAssigned({ tx, ids: deps.ids }, { caller, ship, at });
32
34
  if (!reaches.isOk) {
33
35
  return reaches;
34
36
  }
35
- const actor = shipActor(caller.shipId);
37
+ const actor = actorOf(caller);
36
38
  await revokeShipSecret({ tx, ids: deps.ids }, { fleetId, shipId, actor, at });
37
39
  const lease = await tx.leases.findOpenForUpdate(fleetId, shipId);
38
40
  const allowed = checkCanIssueStartingPrompt(ship, { isCrewed: lease !== undefined });
@@ -1 +1 @@
1
- {"version":3,"file":"get-starting-prompt.js","sourceRoot":"","sources":["../../../src/domain/registry/get-starting-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAoB,MAAM,uBAAuB,CAAC;AAG3E,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAqB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAA4B,MAAM,0BAA0B,CAAC;AAE5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAoD,MAAM,sBAAsB,CAAC;AAiB7G;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAKvC;IACC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAC5B,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAmE,EAAE;QAC1G,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,MAAM,iBAAiB,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EACnD,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAC/B,CAAC;QACF,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"get-starting-prompt.js","sourceRoot":"","sources":["../../../src/domain/registry/get-starting-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAoB,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAe,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAqB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAA4B,MAAM,0BAA0B,CAAC;AAEhH,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAoD,MAAM,sBAAsB,CAAC;AAiB7G;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAKvC;IACC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAC5B,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAmE,EAAE;QAC1G,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,MAAM,iBAAiB,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,sBAAsB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzJ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EACnD,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAC/B,CAAC;QACF,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { IdGenerator, ShipId } from '@aeolus-fleet/common';
2
2
  import { type CredentialTx } from '../identity/public.js';
3
- import type { Caller } from '../shared/caller.js';
3
+ import { type ShipCaller } from '../shared/caller.js';
4
4
  import type { Clock } from '../shared/clock.js';
5
5
  import { type DomainError } from '../shared/errors.js';
6
6
  import { type EventLog } from '../shared/events.js';
@@ -14,7 +14,7 @@ export interface GiveBackCrewRequestTx extends LeaseTx, CredentialTx {
14
14
  crewRequests: CrewRequestRepository;
15
15
  events: EventLog;
16
16
  }
17
- export type GiveBack = (caller: Caller, input: {
17
+ export type GiveBack = (caller: ShipCaller, input: {
18
18
  shipId: ShipId;
19
19
  settingsVersion: number;
20
20
  reason: string;
@@ -1,6 +1,7 @@
1
1
  import { revokeShipSecret } from '../identity/public.js';
2
+ import { actorOf } from '../shared/caller.js';
2
3
  import { refuse } from '../shared/errors.js';
3
- import { recordEvent, shipActor } from '../shared/events.js';
4
+ import { recordEvent } from '../shared/events.js';
4
5
  import { ok } from '../shared/result.js';
5
6
  import { giveBackCrewRequest } from './crew-request.js';
6
7
  import { endLease } from './leases.js';
@@ -21,7 +22,7 @@ export function createGiveBackCrewRequest(deps) {
21
22
  return refuse('SHIP_NOT_FOUND', `Ship ${input.shipId} does not exist`);
22
23
  }
23
24
  const at = deps.clock.now();
24
- const actor = shipActor(caller.shipId);
25
+ const actor = actorOf(caller);
25
26
  const given = giveBackCrewRequest({ ship, current: await tx.crewRequests.find(fleetId, ship.id), trierarchShipId: caller.shipId }, { settingsVersion: input.settingsVersion, reason: input.reason, at, actor });
26
27
  if (!given.isOk) {
27
28
  return given;
@@ -1 +1 @@
1
- {"version":3,"file":"give-back-crew-request.js","sourceRoot":"","sources":["../../../src/domain/registry/give-back-crew-request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAC;AAG5E,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAmC,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAgB,MAAM,aAAa,CAAC;AAcrD;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAgF;IACxH,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA0F,EAAE;QAChH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,mBAAmB,CAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,EAC/F,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAC5E,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvF,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"give-back-crew-request.js","sourceRoot":"","sources":["../../../src/domain/registry/give-back-crew-request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAmB,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAmC,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAgB,MAAM,aAAa,CAAC;AAcrD;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAgF;IACxH,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA0F,EAAE;QAChH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,mBAAmB,CAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,EAC/F,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAC5E,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvF,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,13 +1,14 @@
1
1
  import type { IdGenerator, ShipId } from '@aeolus-fleet/common';
2
- import type { Caller } from '../shared/caller.js';
2
+ import { type Caller } from '../shared/caller.js';
3
3
  import type { Clock } from '../shared/clock.js';
4
4
  import { type DomainError } from '../shared/errors.js';
5
5
  import { type EventLog } from '../shared/events.js';
6
6
  import { type Result } from '../shared/result.js';
7
7
  import type { UnitOfWork } from '../shared/unit-of-work.js';
8
+ import { type CheckManageTx, type NotReachable } from './check-reach.js';
8
9
  import type { ScopeNamespaceRepository, ShipRepository } from './ports.js';
9
10
  import { type GrantScopesRefusal } from './scope-grant.js';
10
- export interface GrantScopesTx {
11
+ export interface GrantScopesTx extends Omit<CheckManageTx, 'ships'> {
11
12
  ships: Pick<ShipRepository, 'find' | 'findForUpdate' | 'setScopes'>;
12
13
  scopeNamespaces: Pick<ScopeNamespaceRepository, 'lockNamespace' | 'find'>;
13
14
  events: EventLog;
@@ -18,10 +19,12 @@ export type GrantScopes = (caller: Caller, input: {
18
19
  revoke: readonly string[];
19
20
  }) => Promise<Result<{
20
21
  scopes: readonly string[];
21
- }, GrantScopesRefusal | DomainError<'SHIP_NOT_FOUND'>>>;
22
+ }, GrantScopesUseCaseRefusal>>;
23
+ export type GrantScopesUseCaseRefusal = GrantScopesRefusal | NotReachable | DomainError<'SHIP_NOT_FOUND'>;
22
24
  /**
23
- * Use case: the caller grants and revokes scopes on a live ship of its fleet
24
- * (decision 0046), within what its ship may grant, read from the server.
25
+ * Use case: any actor grants and revokes scopes on a live ship of its fleet
26
+ * within its manage reach (decisions 0046, 0053), within what it may grant,
27
+ * read from the server or its checked token. A refused reach keeps its record.
25
28
  * Its scope (scopes:grant) is checked before this runs. In one unit of work,
26
29
  * holding the ship, then each plugin namespace the scopes name, so a
27
30
  * declaration that removes a scope waits: the ship's scopes and
@@ -1,25 +1,34 @@
1
+ import { actorOf, isShipCaller } from '../shared/caller.js';
1
2
  import { refuse } from '../shared/errors.js';
2
- import { recordEvent, shipActor } from '../shared/events.js';
3
+ import { recordEvent } from '../shared/events.js';
3
4
  import { ok } from '../shared/result.js';
5
+ import { checkManage, keepingReachRefusal } from './check-reach.js';
4
6
  import { grantScopes } from './scope-grant.js';
5
7
  import { lockNamedNamespaces } from './named-namespaces.js';
6
8
  /**
7
- * Use case: the caller grants and revokes scopes on a live ship of its fleet
8
- * (decision 0046), within what its ship may grant, read from the server.
9
+ * Use case: any actor grants and revokes scopes on a live ship of its fleet
10
+ * within its manage reach (decisions 0046, 0053), within what it may grant,
11
+ * read from the server or its checked token. A refused reach keeps its record.
9
12
  * Its scope (scopes:grant) is checked before this runs. In one unit of work,
10
13
  * holding the ship, then each plugin namespace the scopes name, so a
11
14
  * declaration that removes a scope waits: the ship's scopes and
12
15
  * ScopesChanged. The ship's crew holds them from its next call.
13
16
  */
14
17
  export function createGrantScopes(deps) {
15
- return (caller, input) => deps.uow.run(async (tx) => {
18
+ return (caller, input) => keepingReachRefusal(deps.uow, async (tx) => {
16
19
  const { fleetId } = caller;
17
20
  const ship = await tx.ships.findForUpdate(fleetId, input.shipId);
18
21
  if (!ship) {
19
22
  return refuse('SHIP_NOT_FOUND', `Ship ${input.shipId} does not exist`);
20
23
  }
24
+ const at = deps.clock.now();
25
+ const managed = await checkManage({ tx, ids: deps.ids }, { manager: caller, shipId: ship.id, at });
26
+ if (!managed.isOk) {
27
+ return managed;
28
+ }
21
29
  const namespaces = await lockNamedNamespaces(tx, { fleetId, scopes: [...input.grant, ...input.revoke] });
22
- const granted = grantScopes({ ship, granter: caller, grant: input.grant, revoke: input.revoke, at: deps.clock.now(), actor: shipActor(caller.shipId) }, { namespaces });
30
+ const granter = { shipId: isShipCaller(caller) ? caller.shipId : null, isOperator: caller.kind === 'operator', scopes: caller.scopes };
31
+ const granted = grantScopes({ ship, granter, grant: input.grant, revoke: input.revoke, at, actor: actorOf(caller) }, { namespaces });
23
32
  if (!granted.isOk) {
24
33
  return granted;
25
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"grant-scopes.js","sourceRoot":"","sources":["../../../src/domain/registry/grant-scopes.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,WAAW,EAA2B,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAa5D;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAwE;IACxG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAsG,EAAE;QAC5H,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzG,MAAM,OAAO,GAAG,WAAW,CACzB,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAC1H,EAAE,UAAU,EAAE,CACf,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"grant-scopes.js","sourceRoot":"","sources":["../../../src/domain/registry/grant-scopes.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { type FleetId, type LabelId, type LabelValueId, type ShipId, type ShipKind } from '@aeolus-fleet/common';
1
+ import { type FleetId, type LabelId, type LabelValueId, type ShipId } from '@aeolus-fleet/common';
2
+ import type { Caller } from '../shared/caller.js';
2
3
  import { type DomainError } from '../shared/errors.js';
3
4
  import type { Actor, NewEvent } from '../shared/events.js';
4
5
  import { type Result } from '../shared/result.js';
@@ -8,9 +9,23 @@ export interface LabelValue {
8
9
  id: LabelValueId;
9
10
  value: string;
10
11
  }
12
+ /** Who owns a label (decision 0031): the ship that defined it, or the installation; never an account. */
13
+ export type LabelOwner = {
14
+ kind: 'ship';
15
+ shipId: ShipId;
16
+ } | {
17
+ kind: 'installation';
18
+ };
19
+ /** The owner an actor defines a label as: none for an account, which owns no label (decision 0031). */
20
+ export declare function labelOwnerOf(caller: Caller): LabelOwner | undefined;
21
+ /** The owner as a refusal names it: a ship by its name, or the installation. */
22
+ export declare function ownerNameOf(owner: LabelOwner, shipNameOf: (shipId: ShipId) => Promise<string | undefined>): Promise<string>;
23
+ /** Whether the other is the same owner: none, an account, is no owner. */
24
+ export declare function isSameOwner(owner: LabelOwner, other: LabelOwner | undefined): boolean;
11
25
  /**
12
26
  * A label (docs/blueprint.md, "Label"; decision 0031): a key with a defined
13
- * set of values, each with its own id, owned by the ship that defined it.
27
+ * set of values, each with its own id, owned by the ship or the installation
28
+ * that defined it.
14
29
  * Ids are for machines, key and value texts for people. Only its owner
15
30
  * changes its values and assigns them, to any ship, its own included. It
16
31
  * retires with its owner.
@@ -22,16 +37,19 @@ export interface Label {
22
37
  key: string;
23
38
  /** In the order the owner gave them, each once. */
24
39
  values: readonly LabelValue[];
25
- ownerShipId: ShipId;
40
+ owner: LabelOwner;
26
41
  }
27
- /** A label as the fleet lists it: its id, key and values, and its owner by id and name. */
42
+ /** A label as the fleet lists it: its id, key and values, and its owner: a ship by id and name, or the installation. */
28
43
  export interface ListedLabel {
29
44
  id: LabelId;
30
45
  key: string;
31
46
  values: readonly LabelValue[];
32
47
  owner: {
48
+ kind: 'ship';
33
49
  id: ShipId;
34
50
  name: string;
51
+ } | {
52
+ kind: 'installation';
35
53
  };
36
54
  }
37
55
  /** One value a ship carries, with its label: ids and texts. */
@@ -64,15 +82,17 @@ type InvalidValue = DomainError<'INVALID_LABEL_VALUE'>;
64
82
  type InvalidValues = DomainError<'INVALID_LABEL_VALUES'>;
65
83
  /** A label's key, checked against the limits. */
66
84
  export declare function labelKey(key: string): Result<string, InvalidKey>;
67
- export type DefineLabelRefusal = InvalidKey | InvalidValue | InvalidValues | DomainError<'LABEL_KEY_TAKEN'>;
85
+ export type DefineLabelRefusal = InvalidKey | InvalidValue | InvalidValues | DomainError<'LABEL_KEY_TAKEN' | 'ACCOUNT_OWNS_NO_LABEL'>;
68
86
  /**
69
- * A ship defines a label, owning it: a key unique in the fleet and its values,
70
- * the label and each value with its new id. A key the fleet has is refused,
71
- * naming its owner. LabelDefined names the owner, with the label and its
72
- * values.
87
+ * A ship or the installation defines a label, owning it: a key unique in the
88
+ * fleet and its values, the label and each value with its new id. An account
89
+ * owns no label, so it defines none (decision 0031). A key the fleet has is
90
+ * refused, naming its owner. LabelDefined names the owning ship, if a ship
91
+ * owns it, with the label and its values.
73
92
  */
74
- export declare function defineLabel({ owner, existing, }: {
75
- owner: Pick<Ship, 'fleetId' | 'id'>;
93
+ export declare function defineLabel({ fleetId, owner, existing, }: {
94
+ fleetId: FleetId;
95
+ owner: LabelOwner | undefined;
76
96
  existing: {
77
97
  label: Label;
78
98
  ownerName: string;
@@ -103,7 +123,7 @@ export declare function changeLabelValues({ label, ownerName, carriers, }: {
103
123
  shipName: string;
104
124
  }[];
105
125
  }, input: {
106
- callerShipId: ShipId;
126
+ caller: LabelOwner | undefined;
107
127
  values: readonly NewLabelValue[];
108
128
  at: Date;
109
129
  actor: Actor;
@@ -122,14 +142,24 @@ export declare function deleteLabel({ label, ownerName, carrierNames }: {
122
142
  ownerName: string;
123
143
  carrierNames: readonly string[];
124
144
  }, input: {
125
- callerShipId: ShipId;
145
+ caller: LabelOwner | undefined;
126
146
  at: Date;
127
147
  actor: Actor;
128
148
  }): Result<{
129
149
  events: NewEvent[];
130
150
  }, DeleteLabelRefusal>;
131
- /** A ship the caller may not label: neither its own nor one it commissioned, and the caller is not argo. */
151
+ /** A ship the caller may not label: neither its own nor one it commissioned, and the caller holds no labels:any. */
132
152
  export type NotYourShipToLabel = DomainError<'NOT_YOUR_SHIP_TO_LABEL'>;
153
+ /**
154
+ * Who labels a ship: the label's owner on its own ship and the ships it
155
+ * commissioned, or an actor holding labels:any, whose manage reach the use
156
+ * case checks, on any ship (decisions 0031, 0053).
157
+ */
158
+ export interface Labeller {
159
+ owner: LabelOwner | undefined;
160
+ shipId: ShipId | null;
161
+ canLabelAnyShip: boolean;
162
+ }
133
163
  export type AssignLabelRefusal = NotTheOwner | NotYourShipToLabel | DomainError<'SHIP_ALREADY_RETIRED' | 'SHIP_LABEL_LIMIT_REACHED'>;
134
164
  /**
135
165
  * The owner gives a ship one of its label's values, by its id: the ship
@@ -144,8 +174,7 @@ export declare function assignLabel({ label, ownerName, ship, carried, }: {
144
174
  ship: Ship;
145
175
  carried: readonly ShipLabel[];
146
176
  }, input: {
147
- callerShipId: ShipId;
148
- callerKind: ShipKind;
177
+ caller: Labeller;
149
178
  valueId: LabelValueId;
150
179
  at: Date;
151
180
  actor: Actor;
@@ -153,6 +182,29 @@ export declare function assignLabel({ label, ownerName, ship, carried, }: {
153
182
  assignment: ShipLabel | undefined;
154
183
  events: NewEvent[];
155
184
  }, AssignLabelRefusal>;
185
+ /** A label value a commission gives the new ship, with its label as the fleet holds it now and its owner's name. */
186
+ export interface GivenValue {
187
+ label: Label;
188
+ valueId: LabelValueId;
189
+ ownerName: string;
190
+ }
191
+ /**
192
+ * The values a commission gives the new ship (decision 0053), each once: a
193
+ * value of a label the commissioner owns, or a value it carries itself, a
194
+ * ship's labels or an account's token, so a new ship never reaches further
195
+ * than its commissioner can make it. Argo is no exception. LabelAssigned
196
+ * names the new ship for each.
197
+ */
198
+ export declare function labelsAtCommission(given: readonly GivenValue[], commission: {
199
+ ship: Ship;
200
+ owner: LabelOwner | undefined;
201
+ carried: readonly LabelValueId[];
202
+ at: Date;
203
+ actor: Actor;
204
+ }): Result<{
205
+ assignments: ShipLabel[];
206
+ events: NewEvent[];
207
+ }, NotTheOwner>;
156
208
  export type UnassignLabelRefusal = NotTheOwner | NotYourShipToLabel;
157
209
  /**
158
210
  * The owner takes one value of its label off a ship. A ship that does not
@@ -165,8 +217,7 @@ export declare function unassignLabel({ label, ownerName, ship, carried, }: {
165
217
  ship: Ship;
166
218
  carried: readonly ShipLabel[];
167
219
  }, input: {
168
- callerShipId: ShipId;
169
- callerKind: ShipKind;
220
+ caller: Labeller;
170
221
  valueId: LabelValueId;
171
222
  at: Date;
172
223
  actor: Actor;