@aeolus-fleet/core 0.26.1 → 0.27.1

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 (364) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/http/request-credentials.d.ts +2 -9
  3. package/dist/adapters/http/request-credentials.js +8 -1
  4. package/dist/adapters/http/request-credentials.js.map +1 -1
  5. package/dist/adapters/http/server.js +2 -1
  6. package/dist/adapters/http/server.js.map +1 -1
  7. package/dist/adapters/mcp/mcp-endpoint.js +11 -1
  8. package/dist/adapters/mcp/mcp-endpoint.js.map +1 -1
  9. package/dist/adapters/prisma/generated/browser.d.ts +14 -0
  10. package/dist/adapters/prisma/generated/client.d.ts +14 -0
  11. package/dist/adapters/prisma/generated/commonInputTypes.d.ts +30 -0
  12. package/dist/adapters/prisma/generated/enums.d.ts +10 -0
  13. package/dist/adapters/prisma/generated/enums.js +10 -1
  14. package/dist/adapters/prisma/generated/enums.js.map +1 -1
  15. package/dist/adapters/prisma/generated/internal/class.d.ts +22 -0
  16. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  17. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  18. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +186 -1
  19. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +27 -2
  20. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  21. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +27 -0
  22. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +27 -2
  23. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  24. package/dist/adapters/prisma/generated/models/Delivery.d.ts +71 -1
  25. package/dist/adapters/prisma/generated/models/Fleet.d.ts +558 -0
  26. package/dist/adapters/prisma/generated/models/Lease.d.ts +172 -1
  27. package/dist/adapters/prisma/generated/models/NetworkSettings.d.ts +185 -21
  28. package/dist/adapters/prisma/generated/models/PluginConnection.d.ts +1180 -0
  29. package/dist/adapters/prisma/generated/models/PluginConnection.js +2 -0
  30. package/dist/adapters/prisma/generated/models/PluginConnection.js.map +1 -0
  31. package/dist/adapters/prisma/generated/models/ReachRefusal.d.ts +71 -1
  32. package/dist/adapters/prisma/generated/models/ScopeNamespace.d.ts +1220 -0
  33. package/dist/adapters/prisma/generated/models/ScopeNamespace.js +2 -0
  34. package/dist/adapters/prisma/generated/models/ScopeNamespace.js.map +1 -0
  35. package/dist/adapters/prisma/generated/models/Ship.d.ts +1269 -51
  36. package/dist/adapters/prisma/generated/models.d.ts +2 -0
  37. package/dist/adapters/prisma/health.js +27 -7
  38. package/dist/adapters/prisma/health.js.map +1 -1
  39. package/dist/adapters/prisma/history.js +18 -72
  40. package/dist/adapters/prisma/history.js.map +1 -1
  41. package/dist/adapters/prisma/messaging.js +31 -35
  42. package/dist/adapters/prisma/messaging.js.map +1 -1
  43. package/dist/adapters/prisma/network.js +45 -15
  44. package/dist/adapters/prisma/network.js.map +1 -1
  45. package/dist/adapters/prisma/overdue.js +4 -3
  46. package/dist/adapters/prisma/overdue.js.map +1 -1
  47. package/dist/adapters/prisma/plugin-connections.d.ts +4 -0
  48. package/dist/adapters/prisma/plugin-connections.js +20 -0
  49. package/dist/adapters/prisma/plugin-connections.js.map +1 -0
  50. package/dist/adapters/prisma/registry.js +68 -13
  51. package/dist/adapters/prisma/registry.js.map +1 -1
  52. package/dist/adapters/prisma/rows.d.ts +3 -0
  53. package/dist/adapters/prisma/rows.js +22 -7
  54. package/dist/adapters/prisma/rows.js.map +1 -1
  55. package/dist/adapters/prisma/scope-namespaces.d.ts +4 -0
  56. package/dist/adapters/prisma/scope-namespaces.js +39 -0
  57. package/dist/adapters/prisma/scope-namespaces.js.map +1 -0
  58. package/dist/adapters/prisma/unit-of-work.d.ts +3 -1
  59. package/dist/adapters/prisma/unit-of-work.js +4 -0
  60. package/dist/adapters/prisma/unit-of-work.js.map +1 -1
  61. package/dist/adapters/rest/rest-api.js +2 -2
  62. package/dist/adapters/rest/rest-api.js.map +1 -1
  63. package/dist/adapters/trpc/console.d.ts +1 -1
  64. package/dist/adapters/trpc/console.js +6 -4
  65. package/dist/adapters/trpc/console.js.map +1 -1
  66. package/dist/adapters/trpc/context.d.ts +28 -4
  67. package/dist/adapters/trpc/fleet.d.ts +243 -90
  68. package/dist/adapters/trpc/fleet.js +146 -57
  69. package/dist/adapters/trpc/fleet.js.map +1 -1
  70. package/dist/adapters/trpc/router.d.ts +366 -86
  71. package/dist/adapters/trpc/ship-contract.js +5 -0
  72. package/dist/adapters/trpc/ship-contract.js.map +1 -1
  73. package/dist/adapters/trpc/ship-protocol.js +7 -5
  74. package/dist/adapters/trpc/ship-protocol.js.map +1 -1
  75. package/dist/adapters/trpc/ship.d.ts +156 -3
  76. package/dist/adapters/trpc/ship.js +89 -8
  77. package/dist/adapters/trpc/ship.js.map +1 -1
  78. package/dist/adapters/trpc/trpc.d.ts +13 -9
  79. package/dist/adapters/trpc/trpc.js +90 -26
  80. package/dist/adapters/trpc/trpc.js.map +1 -1
  81. package/dist/domain/messaging/check-inbox.d.ts +5 -5
  82. package/dist/domain/messaging/check-inbox.js +9 -7
  83. package/dist/domain/messaging/check-inbox.js.map +1 -1
  84. package/dist/domain/messaging/delivery.d.ts +8 -2
  85. package/dist/domain/messaging/delivery.js +14 -9
  86. package/dist/domain/messaging/delivery.js.map +1 -1
  87. package/dist/domain/messaging/dismiss-delivery.d.ts +9 -4
  88. package/dist/domain/messaging/dismiss-delivery.js +26 -19
  89. package/dist/domain/messaging/dismiss-delivery.js.map +1 -1
  90. package/dist/domain/messaging/hand-over-delivery.d.ts +1 -0
  91. package/dist/domain/messaging/hand-over-delivery.js +1 -0
  92. package/dist/domain/messaging/hand-over-delivery.js.map +1 -1
  93. package/dist/domain/messaging/message.d.ts +11 -5
  94. package/dist/domain/messaging/message.js +11 -4
  95. package/dist/domain/messaging/message.js.map +1 -1
  96. package/dist/domain/messaging/overdue.d.ts +2 -0
  97. package/dist/domain/messaging/overdue.js +3 -0
  98. package/dist/domain/messaging/overdue.js.map +1 -1
  99. package/dist/domain/messaging/ping-ship.d.ts +3 -3
  100. package/dist/domain/messaging/ping-ship.js +6 -2
  101. package/dist/domain/messaging/ping-ship.js.map +1 -1
  102. package/dist/domain/messaging/ports.d.ts +11 -3
  103. package/dist/domain/messaging/push-receive-deliveries.d.ts +4 -1
  104. package/dist/domain/messaging/push-receive-deliveries.js +5 -3
  105. package/dist/domain/messaging/push-receive-deliveries.js.map +1 -1
  106. package/dist/domain/messaging/receive-deliveries.d.ts +23 -0
  107. package/dist/domain/messaging/receive-deliveries.js +6 -3
  108. package/dist/domain/messaging/receive-deliveries.js.map +1 -1
  109. package/dist/domain/messaging/receive-reply.d.ts +32 -0
  110. package/dist/domain/messaging/receive-reply.js +25 -0
  111. package/dist/domain/messaging/receive-reply.js.map +1 -0
  112. package/dist/domain/messaging/resend-delivery.d.ts +5 -2
  113. package/dist/domain/messaging/resend-delivery.js +8 -4
  114. package/dist/domain/messaging/resend-delivery.js.map +1 -1
  115. package/dist/domain/messaging/send-message.d.ts +9 -2
  116. package/dist/domain/messaging/send-message.js +12 -2
  117. package/dist/domain/messaging/send-message.js.map +1 -1
  118. package/dist/domain/messaging/send-request.d.ts +3 -1
  119. package/dist/domain/messaging/send-request.js +4 -2
  120. package/dist/domain/messaging/send-request.js.map +1 -1
  121. package/dist/domain/registry/assign-label.d.ts +2 -1
  122. package/dist/domain/registry/assign-label.js +3 -2
  123. package/dist/domain/registry/assign-label.js.map +1 -1
  124. package/dist/domain/registry/check-reach.d.ts +69 -6
  125. package/dist/domain/registry/check-reach.js +109 -12
  126. package/dist/domain/registry/check-reach.js.map +1 -1
  127. package/dist/domain/registry/commission-ship.d.ts +21 -8
  128. package/dist/domain/registry/commission-ship.js +55 -10
  129. package/dist/domain/registry/commission-ship.js.map +1 -1
  130. package/dist/domain/registry/connect-plugin.d.ts +30 -0
  131. package/dist/domain/registry/connect-plugin.js +35 -0
  132. package/dist/domain/registry/connect-plugin.js.map +1 -0
  133. package/dist/domain/registry/crew-request.d.ts +1 -1
  134. package/dist/domain/registry/declare-scopes.d.ts +38 -0
  135. package/dist/domain/registry/declare-scopes.js +34 -0
  136. package/dist/domain/registry/declare-scopes.js.map +1 -0
  137. package/dist/domain/registry/declared-network-rules.d.ts +2 -1
  138. package/dist/domain/registry/declared-network-rules.js +11 -5
  139. package/dist/domain/registry/declared-network-rules.js.map +1 -1
  140. package/dist/domain/registry/discover.d.ts +29 -0
  141. package/dist/domain/registry/discover.js +54 -0
  142. package/dist/domain/registry/discover.js.map +1 -0
  143. package/dist/domain/registry/explain-reach.d.ts +13 -12
  144. package/dist/domain/registry/explain-reach.js +35 -12
  145. package/dist/domain/registry/explain-reach.js.map +1 -1
  146. package/dist/domain/registry/get-ship.d.ts +11 -3
  147. package/dist/domain/registry/get-ship.js +8 -2
  148. package/dist/domain/registry/get-ship.js.map +1 -1
  149. package/dist/domain/registry/get-starting-prompt.d.ts +18 -2
  150. package/dist/domain/registry/get-starting-prompt.js +7 -7
  151. package/dist/domain/registry/get-starting-prompt.js.map +1 -1
  152. package/dist/domain/registry/grant-scopes.d.ts +34 -0
  153. package/dist/domain/registry/grant-scopes.js +35 -0
  154. package/dist/domain/registry/grant-scopes.js.map +1 -0
  155. package/dist/domain/registry/label.d.ts +12 -7
  156. package/dist/domain/registry/label.js +21 -4
  157. package/dist/domain/registry/label.js.map +1 -1
  158. package/dist/domain/registry/leases.d.ts +6 -3
  159. package/dist/domain/registry/leases.js +7 -5
  160. package/dist/domain/registry/leases.js.map +1 -1
  161. package/dist/domain/registry/list-fleet.d.ts +19 -6
  162. package/dist/domain/registry/list-fleet.js +18 -3
  163. package/dist/domain/registry/list-fleet.js.map +1 -1
  164. package/dist/domain/registry/list-scopes.d.ts +24 -0
  165. package/dist/domain/registry/list-scopes.js +22 -0
  166. package/dist/domain/registry/list-scopes.js.map +1 -0
  167. package/dist/domain/registry/managed-or-assigned.d.ts +25 -0
  168. package/dist/domain/registry/managed-or-assigned.js +23 -0
  169. package/dist/domain/registry/managed-or-assigned.js.map +1 -0
  170. package/dist/domain/registry/named-namespaces.d.ts +19 -0
  171. package/dist/domain/registry/named-namespaces.js +19 -0
  172. package/dist/domain/registry/named-namespaces.js.map +1 -0
  173. package/dist/domain/registry/network-settings.d.ts +95 -24
  174. package/dist/domain/registry/network-settings.js +146 -46
  175. package/dist/domain/registry/network-settings.js.map +1 -1
  176. package/dist/domain/registry/plugin-connection.d.ts +48 -0
  177. package/dist/domain/registry/plugin-connection.js +35 -0
  178. package/dist/domain/registry/plugin-connection.js.map +1 -0
  179. package/dist/domain/registry/ports.d.ts +75 -1
  180. package/dist/domain/registry/public.d.ts +3 -2
  181. package/dist/domain/registry/public.js +3 -2
  182. package/dist/domain/registry/public.js.map +1 -1
  183. package/dist/domain/registry/reach-refusal.d.ts +12 -4
  184. package/dist/domain/registry/read-assigned-crew-requests.d.ts +12 -3
  185. package/dist/domain/registry/read-assigned-crew-requests.js +8 -8
  186. package/dist/domain/registry/read-assigned-crew-requests.js.map +1 -1
  187. package/dist/domain/registry/read-built-in-rules.d.ts +20 -0
  188. package/dist/domain/registry/read-built-in-rules.js +24 -0
  189. package/dist/domain/registry/read-built-in-rules.js.map +1 -0
  190. package/dist/domain/registry/read-clear-requests.d.ts +5 -3
  191. package/dist/domain/registry/read-clear-requests.js +7 -5
  192. package/dist/domain/registry/read-clear-requests.js.map +1 -1
  193. package/dist/domain/registry/read-network-plugin.d.ts +23 -0
  194. package/dist/domain/registry/read-network-plugin.js +15 -0
  195. package/dist/domain/registry/read-network-plugin.js.map +1 -0
  196. package/dist/domain/registry/read-on-behalf.d.ts +20 -0
  197. package/dist/domain/registry/read-on-behalf.js +31 -0
  198. package/dist/domain/registry/read-on-behalf.js.map +1 -0
  199. package/dist/domain/registry/read-reach.d.ts +64 -0
  200. package/dist/domain/registry/read-reach.js +83 -0
  201. package/dist/domain/registry/read-reach.js.map +1 -0
  202. package/dist/domain/registry/recrew-ship.d.ts +3 -2
  203. package/dist/domain/registry/recrew-ship.js +8 -1
  204. package/dist/domain/registry/recrew-ship.js.map +1 -1
  205. package/dist/domain/registry/release-ship.d.ts +10 -5
  206. package/dist/domain/registry/release-ship.js +11 -8
  207. package/dist/domain/registry/release-ship.js.map +1 -1
  208. package/dist/domain/registry/remove-crew-request.d.ts +4 -3
  209. package/dist/domain/registry/remove-crew-request.js +6 -1
  210. package/dist/domain/registry/remove-crew-request.js.map +1 -1
  211. package/dist/domain/registry/rename-ship.d.ts +7 -5
  212. package/dist/domain/registry/rename-ship.js +9 -3
  213. package/dist/domain/registry/rename-ship.js.map +1 -1
  214. package/dist/domain/registry/request-crew.d.ts +5 -4
  215. package/dist/domain/registry/request-crew.js +6 -1
  216. package/dist/domain/registry/request-crew.js.map +1 -1
  217. package/dist/domain/registry/request-worktree-clear.d.ts +3 -2
  218. package/dist/domain/registry/request-worktree-clear.js +6 -1
  219. package/dist/domain/registry/request-worktree-clear.js.map +1 -1
  220. package/dist/domain/registry/retire-ship.d.ts +17 -7
  221. package/dist/domain/registry/retire-ship.js +48 -5
  222. package/dist/domain/registry/retire-ship.js.map +1 -1
  223. package/dist/domain/registry/scope-grant.d.ts +53 -0
  224. package/dist/domain/registry/scope-grant.js +74 -0
  225. package/dist/domain/registry/scope-grant.js.map +1 -0
  226. package/dist/domain/registry/scope-namespace.d.ts +68 -0
  227. package/dist/domain/registry/scope-namespace.js +82 -0
  228. package/dist/domain/registry/scope-namespace.js.map +1 -0
  229. package/dist/domain/registry/set-built-in-rule.d.ts +28 -0
  230. package/dist/domain/registry/set-built-in-rule.js +33 -0
  231. package/dist/domain/registry/set-built-in-rule.js.map +1 -0
  232. package/dist/domain/registry/set-network-rules.d.ts +3 -3
  233. package/dist/domain/registry/set-network-rules.js +2 -2
  234. package/dist/domain/registry/set-owner.d.ts +30 -0
  235. package/dist/domain/registry/set-owner.js +37 -0
  236. package/dist/domain/registry/set-owner.js.map +1 -0
  237. package/dist/domain/registry/set-statement.d.ts +27 -0
  238. package/dist/domain/registry/set-statement.js +28 -0
  239. package/dist/domain/registry/set-statement.js.map +1 -0
  240. package/dist/domain/registry/ship.d.ts +74 -10
  241. package/dist/domain/registry/ship.js +128 -10
  242. package/dist/domain/registry/ship.js.map +1 -1
  243. package/dist/domain/registry/statement.d.ts +32 -0
  244. package/dist/domain/registry/statement.js +39 -0
  245. package/dist/domain/registry/statement.js.map +1 -0
  246. package/dist/domain/registry/unassign-label.js +1 -1
  247. package/dist/domain/registry/unassign-label.js.map +1 -1
  248. package/dist/domain/registry/whoami.d.ts +5 -1
  249. package/dist/domain/registry/whoami.js +7 -4
  250. package/dist/domain/registry/whoami.js.map +1 -1
  251. package/dist/domain/shared/caller.d.ts +5 -2
  252. package/dist/domain/shared/caller.js.map +1 -1
  253. package/dist/domain/shared/delivery-way.d.ts +9 -5
  254. package/dist/domain/shared/delivery-way.js +17 -5
  255. package/dist/domain/shared/delivery-way.js.map +1 -1
  256. package/dist/domain/shared/errors.d.ts +1 -1
  257. package/dist/domain/shared/errors.js.map +1 -1
  258. package/dist/domain/shared/events-read.d.ts +16 -0
  259. package/dist/domain/shared/events-read.js +15 -0
  260. package/dist/domain/shared/events-read.js.map +1 -0
  261. package/dist/domain/shared/follow-fleet.d.ts +8 -2
  262. package/dist/domain/shared/follow-fleet.js +14 -4
  263. package/dist/domain/shared/follow-fleet.js.map +1 -1
  264. package/dist/domain/shared/health.d.ts +11 -2
  265. package/dist/domain/shared/health.js +11 -3
  266. package/dist/domain/shared/health.js.map +1 -1
  267. package/dist/domain/shared/history.d.ts +11 -42
  268. package/dist/domain/shared/history.js +9 -0
  269. package/dist/domain/shared/history.js.map +1 -1
  270. package/dist/domain/shared/read-fleet-events.d.ts +8 -2
  271. package/dist/domain/shared/read-fleet-events.js +10 -4
  272. package/dist/domain/shared/read-fleet-events.js.map +1 -1
  273. package/dist/domain/shared/read-health.d.ts +5 -1
  274. package/dist/domain/shared/read-health.js +13 -2
  275. package/dist/domain/shared/read-health.js.map +1 -1
  276. package/dist/domain/shared/read-inbox.d.ts +6 -3
  277. package/dist/domain/shared/read-inbox.js +14 -4
  278. package/dist/domain/shared/read-inbox.js.map +1 -1
  279. package/dist/domain/shared/read-message.d.ts +6 -2
  280. package/dist/domain/shared/read-message.js +6 -2
  281. package/dist/domain/shared/read-message.js.map +1 -1
  282. package/dist/domain/shared/read-needs-attention.d.ts +4 -1
  283. package/dist/domain/shared/read-needs-attention.js +8 -3
  284. package/dist/domain/shared/read-needs-attention.js.map +1 -1
  285. package/dist/domain/shared/read-sent-message.d.ts +31 -0
  286. package/dist/domain/shared/read-sent-message.js +28 -0
  287. package/dist/domain/shared/read-sent-message.js.map +1 -0
  288. package/dist/domain/shared/read-ship-messages.d.ts +6 -2
  289. package/dist/domain/shared/read-ship-messages.js +7 -2
  290. package/dist/domain/shared/read-ship-messages.js.map +1 -1
  291. package/dist/domain/shared/read-ship-timeline.d.ts +5 -2
  292. package/dist/domain/shared/read-ship-timeline.js +11 -6
  293. package/dist/domain/shared/read-ship-timeline.js.map +1 -1
  294. package/dist/domain/shared/read-ship-way.d.ts +11 -4
  295. package/dist/domain/shared/read-ship-way.js +9 -2
  296. package/dist/domain/shared/read-ship-way.js.map +1 -1
  297. package/dist/domain/shared/stuck.d.ts +10 -1
  298. package/dist/domain/shared/stuck.js +5 -3
  299. package/dist/domain/shared/stuck.js.map +1 -1
  300. package/dist/testing/container-images.d.ts +14 -0
  301. package/dist/testing/container-images.js +18 -0
  302. package/dist/testing/container-images.js.map +1 -0
  303. package/dist/testing/database.d.ts +14 -0
  304. package/dist/testing/database.js +48 -0
  305. package/dist/testing/database.js.map +1 -0
  306. package/dist/testing/fleet.d.ts +13 -0
  307. package/dist/testing/fleet.js +17 -0
  308. package/dist/testing/fleet.js.map +1 -0
  309. package/dist/testing/index.d.ts +12 -0
  310. package/dist/testing/index.js +12 -0
  311. package/dist/testing/index.js.map +1 -0
  312. package/dist/testing/keys.d.ts +1 -0
  313. package/dist/testing/keys.js +7 -0
  314. package/dist/testing/keys.js.map +1 -0
  315. package/dist/testing/migrate-lock.d.ts +12 -0
  316. package/dist/testing/migrate-lock.js +51 -0
  317. package/dist/testing/migrate-lock.js.map +1 -0
  318. package/dist/testing/migrated-template.d.ts +12 -0
  319. package/dist/testing/migrated-template.js +29 -0
  320. package/dist/testing/migrated-template.js.map +1 -0
  321. package/dist/testing/postgres-container.d.ts +16 -0
  322. package/dist/testing/postgres-container.js +30 -0
  323. package/dist/testing/postgres-container.js.map +1 -0
  324. package/dist/testing/postgres-global-setup.d.ts +15 -0
  325. package/dist/testing/postgres-global-setup.js +20 -0
  326. package/dist/testing/postgres-global-setup.js.map +1 -0
  327. package/dist/testing/prisma-cli.d.ts +5 -0
  328. package/dist/testing/prisma-cli.js +15 -0
  329. package/dist/testing/prisma-cli.js.map +1 -0
  330. package/dist/testing/result.d.ts +5 -0
  331. package/dist/testing/result.js +15 -0
  332. package/dist/testing/result.js.map +1 -0
  333. package/dist/wiring.d.ts +26 -4
  334. package/dist/wiring.js +51 -18
  335. package/dist/wiring.js.map +1 -1
  336. package/package.json +28 -2
  337. package/src/adapters/prisma/migrations/20261018100000_force_scope/migration.sql +8 -0
  338. package/src/adapters/prisma/migrations/20261018110000_forced_delivery/migration.sql +4 -0
  339. package/src/adapters/prisma/migrations/20261018120000_person_and_app_ships/migration.sql +3 -0
  340. package/src/adapters/prisma/migrations/20261018130000_owners/migration.sql +14 -0
  341. package/src/adapters/prisma/migrations/20261018140000_owners_on_reach_refusals/migration.sql +14 -0
  342. package/src/adapters/prisma/migrations/20261018150000_network_verbs/migration.sql +9 -0
  343. package/src/adapters/prisma/migrations/20261018160000_built_in_rules/migration.sql +13 -0
  344. package/src/adapters/prisma/migrations/20261018170000_network_rules_a_list/migration.sql +5 -0
  345. package/src/adapters/prisma/migrations/20261018180000_verb_on_reach_refusals/migration.sql +4 -0
  346. package/src/adapters/prisma/migrations/20261018200000_lease_statements/migration.sql +3 -0
  347. package/src/adapters/prisma/migrations/20261018210000_declare_and_grant_scopes/migration.sql +8 -0
  348. package/src/adapters/prisma/migrations/20261018220000_plugin_scopes/migration.sql +14 -0
  349. package/src/adapters/prisma/migrations/20261018230000_scope_namespaces/migration.sql +20 -0
  350. package/src/adapters/prisma/migrations/20261018240000_trierarch_plugin_crew_run/migration.sql +44 -0
  351. package/src/adapters/prisma/migrations/20261018250000_scope_catalogue/migration.sql +67 -0
  352. package/src/adapters/prisma/migrations/20261019090000_reach_refusal_asked_by/migration.sql +2 -0
  353. package/src/adapters/prisma/migrations/20261019100000_on_behalf_scope/migration.sql +61 -0
  354. package/src/adapters/prisma/migrations/20261019110000_events_fleet_id_occurred_at/migration.sql +2 -0
  355. package/src/adapters/prisma/migrations/20261019130000_plugin_connections/migration.sql +54 -0
  356. package/src/adapters/prisma/migrations/20261019150000_network_plugin_registered_at/migration.sql +23 -0
  357. package/src/adapters/prisma/migrations/20261019160000_lease_waker/migration.sql +4 -0
  358. package/src/adapters/prisma/schema.prisma +81 -7
  359. package/dist/domain/shared/read-no-ship-can-take.d.ts +0 -13
  360. package/dist/domain/shared/read-no-ship-can-take.js +0 -12
  361. package/dist/domain/shared/read-no-ship-can-take.js.map +0 -1
  362. package/dist/domain/shared/read-overdue.d.ts +0 -13
  363. package/dist/domain/shared/read-overdue.js +0 -12
  364. package/dist/domain/shared/read-overdue.js.map +0 -1
@@ -1,22 +1,55 @@
1
- import { FLEET_SCOPES } from '@aeolus-fleet/common';
2
1
  import { refuse } from '../shared/errors.js';
3
2
  import { recordEvent, shipActor } from '../shared/events.js';
4
3
  import { idempotencyKey } from '../shared/idempotency-key.js';
5
4
  import { ok } from '../shared/result.js';
6
5
  import { appliedLimits } from './applied-limits.js';
7
- import { commissionAgentShip } from './ship.js';
6
+ import { lockNamedNamespaces } from './named-namespaces.js';
7
+ import { commissionShip } from './ship.js';
8
8
  import { issueStartingPrompt } from './starting-prompt.js';
9
- /** The request as one text, so a repeat is known by its hash: the fleet scopes in a fixed order, each once. */
9
+ /** The request as one text, so a repeat is known by its hash: the scopes in a fixed order, each once. */
10
10
  function commissionRequestText(input) {
11
- const fleetScopes = FLEET_SCOPES.filter((scope) => input.fleetScopes?.includes(scope));
12
- return JSON.stringify({ name: input.name, type: input.type, note: input.note ?? null, fleetScopes });
11
+ const scopes = [...new Set(input.scopes)].toSorted();
12
+ return JSON.stringify({
13
+ name: input.name,
14
+ type: input.type,
15
+ kind: input.kind ?? 'agent',
16
+ note: input.note ?? null,
17
+ scopes,
18
+ ownerOf: input.ownerOf ?? null,
19
+ owner: input.owner ?? null,
20
+ });
13
21
  }
14
22
  /**
15
- * Use case: the caller commissions an agent ship in its own fleet. The ship
23
+ * The ship, read again once its owner is held FOR SHARE, so the owner the new
24
+ * ship gets is never a retired one. A retire locks the owner first: one that
25
+ * committed before has moved the ship to argo, so the owner read changed and
26
+ * its new owner is held instead; one after waits for this commission and finds
27
+ * the new ship among those it hands to argo.
28
+ */
29
+ async function findWithOwnerHeld(tx, ref) {
30
+ let ship = await tx.ships.find(ref.fleetId, ref.shipId);
31
+ while (ship?.owner) {
32
+ const owner = ship.owner;
33
+ await tx.ships.findForShare(ref.fleetId, owner);
34
+ ship = await tx.ships.find(ref.fleetId, ref.shipId);
35
+ if (ship?.owner === owner) {
36
+ return ship;
37
+ }
38
+ }
39
+ return ship;
40
+ }
41
+ /**
42
+ * Use case: the caller commissions a ship in its own fleet, an agent unless
43
+ * it states another kind (only argo commissions a person ship; an app ship
44
+ * also a caller holding fleet:on-behalf, the gateway). The ship
16
45
  * awaits crew and gets its first starting prompt, all in one transaction. The
17
- * caller's scope (fleet:manage) is checked before this runs. The ship gets
18
- * the agent scopes and any fleet scopes asked for; any caller with
19
- * fleet:manage may give them (ADR 0016). The caller's idempotency key makes
46
+ * caller's scope (fleet:commission) is checked before this runs. The ship gets
47
+ * the agent scopes and the scopes asked for, each one the caller's ship may
48
+ * grant, read from the server (decision 0046); each plugin namespace they
49
+ * name is locked after the name. Its owner is the caller's owner; a caller
50
+ * holding fleet:on-behalf may name the ship that asked it instead, whose owner
51
+ * it gets, or for an app ship the owner argo picked (decision 0045). The
52
+ * caller's idempotency key makes
20
53
  * a retry safe: the same key with the same request answers the ship it
21
54
  * commissioned, with no secret, and changes nothing; the same key with another
22
55
  * request is refused.
@@ -53,8 +86,20 @@ export function createCommissionShip(deps) {
53
86
  return refuse('SHIP_LIMIT_REACHED', `The fleet is at its limit of ${String(shipLimit)} ships, so it takes no new one.`);
54
87
  }
55
88
  }
89
+ const commissioner = await findWithOwnerHeld(tx, { fleetId, shipId: caller.shipId });
90
+ const argo = await tx.ships.findOperatorShip(fleetId);
91
+ if (!commissioner || !argo) {
92
+ return refuse('SHIP_NOT_FOUND', `Ship ${caller.shipId} or its fleet's argo does not exist`);
93
+ }
94
+ const askingShip = input.ownerOf === undefined ? undefined : await findWithOwnerHeld(tx, { fleetId, shipId: input.ownerOf });
95
+ if (input.ownerOf !== undefined && askingShip === undefined) {
96
+ return refuse('SHIP_NOT_FOUND', `Ship ${input.ownerOf}, named as the ship that asked, does not exist`);
97
+ }
98
+ // Held FOR SHARE, as an asking ship's owner is: a retire of the named owner waits, so the new ship never keeps a retired owner.
99
+ const namedOwner = input.owner === undefined ? undefined : await tx.ships.findForShare(fleetId, input.owner);
56
100
  await tx.ships.lockName(fleetId, input.name);
57
- const commissioned = commissionAgentShip({ ...input, id: deps.ids('ship'), fleetId, at, actor, commission: { by: caller.shipId, idempotencyKey: key.value, requestHash } }, { activeShipNamed: await tx.ships.findActiveByName(fleetId, input.name) });
101
+ const namespaces = await lockNamedNamespaces(tx, { fleetId, scopes: input.scopes ?? [] });
102
+ const commissioned = commissionShip({ ...input, id: deps.ids('ship'), fleetId, commissioner, argoShipId: argo.id, askingShip, namedOwner, at, actor, commission: { by: caller.shipId, idempotencyKey: key.value, requestHash } }, { activeShipNamed: await tx.ships.findActiveByName(fleetId, input.name), namespaces });
58
103
  if (!commissioned.isOk) {
59
104
  return commissioned;
60
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commission-ship.js","sourceRoot":"","sources":["../../../src/domain/registry/commission-ship.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commission-ship.js","sourceRoot":"","sources":["../../../src/domain/registry/commission-ship.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { IdGenerator, ShipId } from '@aeolus-fleet/common';
2
+ import type { Caller } from '../shared/caller.js';
3
+ import type { Clock } from '../shared/clock.js';
4
+ import { type DomainError } from '../shared/errors.js';
5
+ import { type EventLog } from '../shared/events.js';
6
+ import { type Result } from '../shared/result.js';
7
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
8
+ import { type ConnectPluginRefusal } from './plugin-connection.js';
9
+ import type { PluginConnectionRepository, ShipRepository } from './ports.js';
10
+ export interface ConnectPluginTx {
11
+ ships: Pick<ShipRepository, 'findForUpdate'>;
12
+ pluginConnections: PluginConnectionRepository;
13
+ events: EventLog;
14
+ }
15
+ export type ConnectPluginUseCaseRefusal = DomainError<'NOT_THE_OPERATOR_SHIP' | 'SHIP_NOT_FOUND'> | ConnectPluginRefusal;
16
+ export type ConnectPlugin = (caller: Caller, input: {
17
+ shipId: ShipId;
18
+ }) => Promise<Result<undefined, ConnectPluginUseCaseRefusal>>;
19
+ /**
20
+ * Use case: argo, and only argo, connects a ship as a plugin of its fleet,
21
+ * as the console's Connect does (decision 0034): from then on the ship reads
22
+ * every ship, whatever the rules, until a release or a retire of the ship
23
+ * ends it. PluginConnected in the same unit of work. It holds the ship, as a
24
+ * release and a retire do, so neither passes it by.
25
+ */
26
+ export declare function createConnectPlugin(deps: {
27
+ uow: UnitOfWork<ConnectPluginTx>;
28
+ clock: Clock;
29
+ ids: IdGenerator;
30
+ }): ConnectPlugin;
@@ -0,0 +1,35 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { recordEvent, shipActor } from '../shared/events.js';
3
+ import { ok } from '../shared/result.js';
4
+ import { connectPlugin } from './plugin-connection.js';
5
+ /**
6
+ * Use case: argo, and only argo, connects a ship as a plugin of its fleet,
7
+ * as the console's Connect does (decision 0034): from then on the ship reads
8
+ * every ship, whatever the rules, until a release or a retire of the ship
9
+ * ends it. PluginConnected in the same unit of work. It holds the ship, as a
10
+ * release and a retire do, so neither passes it by.
11
+ */
12
+ export function createConnectPlugin(deps) {
13
+ return (caller, input) => deps.uow.run(async (tx) => {
14
+ if (caller.kind !== 'operator') {
15
+ return refuse('NOT_THE_OPERATOR_SHIP', 'Only argo connects a plugin');
16
+ }
17
+ const { fleetId } = caller;
18
+ const ship = await tx.ships.findForUpdate(fleetId, input.shipId);
19
+ if (!ship) {
20
+ return refuse('SHIP_NOT_FOUND', `Ship ${input.shipId} does not exist`);
21
+ }
22
+ const connected = connectPlugin(ship, { current: await tx.pluginConnections.find(fleetId, ship.id), at: deps.clock.now(), actor: shipActor(caller.shipId) });
23
+ if (!connected.isOk) {
24
+ return connected;
25
+ }
26
+ if (connected.value.connection) {
27
+ await tx.pluginConnections.connect(connected.value.connection);
28
+ }
29
+ for (const event of connected.value.events) {
30
+ await recordEvent({ events: tx.events, ids: deps.ids }, event);
31
+ }
32
+ return ok(undefined);
33
+ });
34
+ }
35
+ //# sourceMappingURL=connect-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-plugin.js","sourceRoot":"","sources":["../../../src/domain/registry/connect-plugin.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;AAEtD,OAAO,EAAE,aAAa,EAA6B,MAAM,wBAAwB,CAAC;AAalF;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA0E;IAC5G,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA2D,EAAE;QACjF,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,CAAC,CAAC;QACxE,CAAC;QACD,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,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7J,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3C,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,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -46,7 +46,7 @@ export interface GiveBack {
46
46
  }
47
47
  type NotFound = DomainError<'CREW_REQUEST_NOT_FOUND'>;
48
48
  type Releasing = DomainError<'CREW_REQUEST_RELEASING'>;
49
- type NotTheCallers = DomainError<'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER'>;
49
+ export type NotTheCallers = DomainError<'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER'>;
50
50
  export type RequestCrewRefusal = CrewRequestShipRefusal | Releasing | DomainError<'CREW_REQUEST_SETTINGS_TOO_LARGE'> | DomainError<'CREW_REQUEST_SETTINGS_INVALID'>;
51
51
  /**
52
52
  * A requester asks that the ship be kept crewed, with these settings: the
@@ -0,0 +1,38 @@
1
+ import type { IdGenerator } from '@aeolus-fleet/common';
2
+ import type { Caller } from '../shared/caller.js';
3
+ import type { Clock } from '../shared/clock.js';
4
+ import { type EventLog } from '../shared/events.js';
5
+ import { type Result } from '../shared/result.js';
6
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
7
+ import type { ScopeNamespaceRepository, ShipRepository } from './ports.js';
8
+ import { type DeclaredScope, type DeclareScopesRefusal } from './scope-namespace.js';
9
+ export interface DeclareScopesTx {
10
+ ships: Pick<ShipRepository, 'find' | 'findForUpdate' | 'scopesHeldIn'>;
11
+ scopeNamespaces: Pick<ScopeNamespaceRepository, 'lockNamespace' | 'find' | 'findByDeclarer' | 'save'>;
12
+ events: EventLog;
13
+ }
14
+ /** The namespace as declared, with its whole list of scopes. */
15
+ export interface DeclaredNamespace {
16
+ namespace: string;
17
+ scopes: readonly DeclaredScope[];
18
+ }
19
+ export type DeclareScopes = (caller: Caller, input: {
20
+ namespace: string;
21
+ scopes: readonly {
22
+ scope: string;
23
+ description: string;
24
+ }[];
25
+ }) => Promise<Result<DeclaredNamespace, DeclareScopesRefusal>>;
26
+ /**
27
+ * Use case: the caller's ship declares its plugin namespace with its whole
28
+ * list of scopes, the first time or again (decision 0046). Its scope
29
+ * (scopes:declare) is checked before this runs. In one unit of work, holding
30
+ * the declaring ship, so one ship never takes two namespaces, then the
31
+ * namespace, so two ships never both find it free and a grant of its scopes
32
+ * waits: the namespace and ScopesDeclared.
33
+ */
34
+ export declare function createDeclareScopes(deps: {
35
+ uow: UnitOfWork<DeclareScopesTx>;
36
+ clock: Clock;
37
+ ids: IdGenerator;
38
+ }): DeclareScopes;
@@ -0,0 +1,34 @@
1
+ import { recordEvent, shipActor } from '../shared/events.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { declareScopes } from './scope-namespace.js';
4
+ /**
5
+ * Use case: the caller's ship declares its plugin namespace with its whole
6
+ * list of scopes, the first time or again (decision 0046). Its scope
7
+ * (scopes:declare) is checked before this runs. In one unit of work, holding
8
+ * the declaring ship, so one ship never takes two namespaces, then the
9
+ * namespace, so two ships never both find it free and a grant of its scopes
10
+ * waits: the namespace and ScopesDeclared.
11
+ */
12
+ export function createDeclareScopes(deps) {
13
+ return (caller, input) => deps.uow.run(async (tx) => {
14
+ const { fleetId, shipId } = caller;
15
+ await tx.ships.findForUpdate(fleetId, shipId);
16
+ await tx.scopeNamespaces.lockNamespace(fleetId, input.namespace);
17
+ const taken = await tx.scopeNamespaces.find(fleetId, input.namespace);
18
+ const declarer = taken && (await tx.ships.find(fleetId, taken.declaredBy));
19
+ const declared = declareScopes({ fleetId, declarer: shipId, namespace: input.namespace, scopes: input.scopes, at: deps.clock.now(), actor: shipActor(shipId) }, {
20
+ taken: taken && { namespace: taken, declarerName: declarer?.name ?? taken.declaredBy },
21
+ ofDeclarer: await tx.scopeNamespaces.findByDeclarer(fleetId, shipId),
22
+ held: taken === undefined ? [] : await tx.ships.scopesHeldIn(fleetId, input.namespace),
23
+ });
24
+ if (!declared.isOk) {
25
+ return declared;
26
+ }
27
+ await tx.scopeNamespaces.save(declared.value.namespace);
28
+ for (const event of declared.value.events) {
29
+ await recordEvent({ events: tx.events, ids: deps.ids }, event);
30
+ }
31
+ return ok({ namespace: declared.value.namespace.namespace, scopes: declared.value.namespace.scopes });
32
+ });
33
+ }
34
+ //# sourceMappingURL=declare-scopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declare-scopes.js","sourceRoot":"","sources":["../../../src/domain/registry/declare-scopes.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAiD,MAAM,sBAAsB,CAAC;AAmBpG;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA0E;IAC5G,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA4D,EAAE;QAClF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QACnC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,aAAa,CAC5B,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,EAC/H;YACE,KAAK,EAAE,KAAK,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE;YACtF,UAAU,EAAE,MAAM,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC;YACpE,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;SACvF,CACF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1C,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,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -32,7 +32,8 @@ export declare function namedInRules(rules: readonly NetworkRule[]): {
32
32
  * The ship declares its whole list from now on, replacing what it declared
33
33
  * before; an empty list withdraws them. At most 20, each rule within
34
34
  * decision 0034's own limits, and every term on a label the ship owns: an
35
- * exact value's label, and the label of a term of any or the same value. An
35
+ * exact value's label, and the label of a term of any or the same value; a
36
+ * term of the owner is on no label, so it is refused. An
36
37
  * id the fleet does not have is refused, as its owner cannot be checked.
37
38
  * NetworkRulesDeclared names the ship and the number of rules, never them.
38
39
  */
@@ -5,15 +5,15 @@
5
5
  * supplies the list. Only rules on labels the ship owns keep them safe: only
6
6
  * it assigns those labels, so its rules reach no ship it did not label.
7
7
  */
8
- import { DECLARED_NETWORK_RULES_MAX } from '@aeolus-fleet/common';
8
+ import { DECLARED_NETWORK_RULES_MAX, isOwnerTerm } from '@aeolus-fleet/common';
9
9
  import { refuse } from '../shared/errors.js';
10
10
  import { ok } from '../shared/result.js';
11
- import { copyOfRule, invalidRule } from './network-settings.js';
11
+ import { copyOfRule, invalidRule, termText } from './network-settings.js';
12
12
  /** Every label and every exact value the rules' terms name, each once: what the caller looks up before declaring. */
13
13
  export function namedInRules(rules) {
14
14
  const terms = rules.flatMap((rule) => [...rule.from, ...rule.to]);
15
15
  return {
16
- labelIds: [...new Set(terms.flatMap((term) => (typeof term === 'string' ? [] : [term.labelId])))],
16
+ labelIds: [...new Set(terms.flatMap((term) => (typeof term !== 'string' && !isOwnerTerm(term) ? [term.labelId] : [])))],
17
17
  valueIds: [...new Set(terms.flatMap((term) => (typeof term === 'string' ? [term] : [])))],
18
18
  };
19
19
  }
@@ -21,7 +21,8 @@ export function namedInRules(rules) {
21
21
  * The ship declares its whole list from now on, replacing what it declared
22
22
  * before; an empty list withdraws them. At most 20, each rule within
23
23
  * decision 0034's own limits, and every term on a label the ship owns: an
24
- * exact value's label, and the label of a term of any or the same value. An
24
+ * exact value's label, and the label of a term of any or the same value; a
25
+ * term of the owner is on no label, so it is refused. An
25
26
  * id the fleet does not have is refused, as its owner cannot be checked.
26
27
  * NetworkRulesDeclared names the ship and the number of rules, never them.
27
28
  */
@@ -34,7 +35,12 @@ export function declareNetworkRules(named, change) {
34
35
  if (invalid !== undefined) {
35
36
  return refuse('INVALID_NETWORK_RULES', `${invalid} (decision 0034)`);
36
37
  }
37
- for (const term of rules.flatMap((rule) => [...rule.from, ...rule.to])) {
38
+ const terms = rules.flatMap((rule) => [...rule.from, ...rule.to]);
39
+ const ownerTerm = terms.find(isOwnerTerm);
40
+ if (ownerTerm !== undefined) {
41
+ return refuse('INVALID_NETWORK_RULES', `A declared rule holds only terms on labels the ship owns: ${termText(ownerTerm)} is a term of the owner (decision 0037)`);
42
+ }
43
+ for (const term of terms.filter((each) => !isOwnerTerm(each))) {
38
44
  const owned = checkOwnedTerm(named, { term, shipId });
39
45
  if (!owned.isOk) {
40
46
  return owned;
@@ -1 +1 @@
1
- {"version":3,"file":"declared-network-rules.js","sourceRoot":"","sources":["../../../src/domain/registry/declared-network-rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"declared-network-rules.js","sourceRoot":"","sources":["../../../src/domain/registry/declared-network-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Discovered } from '@aeolus-fleet/common';
2
+ import type { Caller } from '../shared/caller.js';
3
+ import type { Clock } from '../shared/clock.js';
4
+ import { type Result } from '../shared/result.js';
5
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
6
+ import { type CheckReachTx } from './check-reach.js';
7
+ import type { LeaseRepository, ShipRepository } from './ports.js';
8
+ export interface DiscoverTx {
9
+ networkSettings: CheckReachTx['networkSettings'];
10
+ ships: Pick<ShipRepository, 'find' | 'listActive'>;
11
+ labels: CheckReachTx['labels'];
12
+ pluginConnections: CheckReachTx['pluginConnections'];
13
+ leases: Pick<LeaseRepository, 'findLastSeen' | 'listOpenStatements'>;
14
+ }
15
+ export type Discover = (caller: Caller) => Promise<Result<Discovered, never>>;
16
+ /**
17
+ * Use case: a ship asks which ships and types it may send to now (decision
18
+ * 0047), its scope (messages:send) checked before this runs. Each active
19
+ * ship but the caller and the viewer is checked as a send to it would be at
20
+ * this moment (decision 0034): the rules in force, what the networking plugin
21
+ * declared while it does not respond, the built-in rules; there is no message,
22
+ * so no answer to a sender. Each reached ship comes with its name, type, kind,
23
+ * status and statement, and each type with how many of its ships it reaches.
24
+ * Ships, never rules; it records nothing, a refusal included.
25
+ */
26
+ export declare function createDiscover(deps: {
27
+ uow: UnitOfWork<DiscoverTx>;
28
+ clock: Clock;
29
+ }): Discover;
@@ -0,0 +1,54 @@
1
+ import { ok } from '../shared/result.js';
2
+ import { reaching, rulesInForceAt, shipAsItIs } from './check-reach.js';
3
+ import { allowsReach } from './network-settings.js';
4
+ import { discoveredStatementOf } from './statement.js';
5
+ /**
6
+ * Use case: a ship asks which ships and types it may send to now (decision
7
+ * 0047), its scope (messages:send) checked before this runs. Each active
8
+ * ship but the caller and the viewer is checked as a send to it would be at
9
+ * this moment (decision 0034): the rules in force, what the networking plugin
10
+ * declared while it does not respond, the built-in rules; there is no message,
11
+ * so no answer to a sender. Each reached ship comes with its name, type, kind,
12
+ * status and statement, and each type with how many of its ships it reaches.
13
+ * Ships, never rules; it records nothing, a refusal included.
14
+ */
15
+ export function createDiscover(deps) {
16
+ return (caller) => deps.uow.run(async (tx) => {
17
+ const { fleetId } = caller;
18
+ const settings = await tx.networkSettings.findForShare(fleetId);
19
+ const inForce = await rulesInForceAt(tx, { settings, now: deps.clock.now() });
20
+ const active = await tx.ships.listActive(fleetId);
21
+ const callerShip = active.find((ship) => ship.id === caller.shipId);
22
+ const sender = callerShip === undefined ? undefined : reaching(await shipAsItIs(tx, callerShip));
23
+ const crews = new Map((await tx.leases.listOpenStatements(fleetId)).map(({ shipId, stated }) => [shipId, stated]));
24
+ const ships = [];
25
+ for (const ship of active) {
26
+ if (ship.id === caller.shipId || ship.kind === 'viewer' || sender === undefined) {
27
+ continue;
28
+ }
29
+ const recipient = reaching(await shipAsItIs(tx, ship));
30
+ if (!allowsReach(inForce, { verb: 'send', sender, recipient, isAnswerToSender: false })) {
31
+ continue;
32
+ }
33
+ const isCrewed = ship.kind === 'operator' || crews.has(ship.id);
34
+ ships.push({
35
+ id: ship.id,
36
+ name: ship.name,
37
+ type: ship.type,
38
+ kind: ship.kind,
39
+ status: isCrewed ? 'crewed' : 'awaitingCrew',
40
+ statement: discoveredStatementOf(ship, crews.get(ship.id) ?? null),
41
+ });
42
+ }
43
+ return ok({ ships, types: typesOf(ships) });
44
+ });
45
+ }
46
+ /** Each type of the reached ships with how many of them, in the order the ships come. */
47
+ function typesOf(ships) {
48
+ const counts = new Map();
49
+ for (const ship of ships) {
50
+ counts.set(ship.type, (counts.get(ship.type) ?? 0) + 1);
51
+ }
52
+ return [...counts].map(([type, reachable]) => ({ type, reachable }));
53
+ }
54
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/domain/registry/discover.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAqB,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAYvD;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAmD;IAChF,OAAO,CAAC,MAAM,EAAE,EAAE,CAChB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAsC,EAAE;QAC5D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACjG,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACnH,MAAM,KAAK,GAAwB,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChF,SAAS;YACX,CAAC;YACD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBACxF,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc;gBAC5C,SAAS,EAAE,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;aACnE,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,yFAAyF;AACzF,SAAS,OAAO,CAAC,KAA0B;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -1,32 +1,33 @@
1
- import type { ShipId } from '@aeolus-fleet/common';
1
+ import { type ExplainedReach, type ShipId } from '@aeolus-fleet/common';
2
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 Result } from '../shared/result.js';
6
6
  import type { UnitOfWork } from '../shared/unit-of-work.js';
7
7
  import { type CheckReachTx } from './check-reach.js';
8
- import type { ShipRepository } from './ports.js';
8
+ import type { DeclaredNetworkRulesRepository, ShipRepository } from './ports.js';
9
9
  export interface ExplainReachTx {
10
10
  networkSettings: CheckReachTx['networkSettings'];
11
11
  ships: Pick<ShipRepository, 'find' | 'listActive'>;
12
12
  labels: CheckReachTx['labels'];
13
+ pluginConnections: CheckReachTx['pluginConnections'];
13
14
  leases: CheckReachTx['leases'];
15
+ declaredNetworkRules: Pick<DeclaredNetworkRulesRepository, 'list'>;
14
16
  }
15
17
  export type ExplainReachFailure = DomainError<'NOT_THE_OPERATOR_SHIP' | 'SHIP_NOT_FOUND'>;
16
18
  export type ExplainReach = (caller: Caller, input: {
17
19
  fromShipId: ShipId;
18
20
  toShipId?: ShipId;
19
- }) => Promise<Result<{
20
- reachableShipIds: ShipId[];
21
- }, ExplainReachFailure>>;
21
+ }) => Promise<Result<ExplainedReach, ExplainReachFailure>>;
22
22
  /**
23
- * Use case: argo asks which ships a ship reaches now, or whether it reaches
24
- * one ship (design points 11 and 12 on #260). It answers as a send would be
25
- * checked at this moment: the rules in force, what the networking plugin
26
- * declared while it does not respond, argo both ways. There is no message, so
27
- * no answer to a sender. It answers the ships, never the rules or the reasons,
28
- * and records nothing: an explain is not a send. Only argo; the viewer ship
29
- * receives nothing, so it is never reached.
23
+ * Use case: argo asks which ships a ship reaches now, per verb, or whether it
24
+ * reaches one ship (decision 0034). It answers as a send would be checked at
25
+ * this moment: the rules in force, what the networking plugin declared while
26
+ * it does not respond, the built-in rules. Each ship comes with the rule that
27
+ * allows it: a built-in rule, a rule the plugin supplied, or a rule a ship
28
+ * declared, named by its declarer, when the plugin supplied it as declared.
29
+ * There is no message, so no answer to a sender. It records nothing: an
30
+ * explain is not a send. Only argo.
30
31
  */
31
32
  export declare function createExplainReach(deps: {
32
33
  uow: UnitOfWork<ExplainReachTx>;
@@ -1,15 +1,17 @@
1
+ import { NETWORK_VERBS } from '@aeolus-fleet/common';
1
2
  import { refuse } from '../shared/errors.js';
2
3
  import { ok } from '../shared/result.js';
3
4
  import { reaching, rulesInForceAt, shipAsItIs } from './check-reach.js';
4
- import { allowsReach } from './network-settings.js';
5
+ import { reachRuleOf } from './network-settings.js';
5
6
  /**
6
- * Use case: argo asks which ships a ship reaches now, or whether it reaches
7
- * one ship (design points 11 and 12 on #260). It answers as a send would be
8
- * checked at this moment: the rules in force, what the networking plugin
9
- * declared while it does not respond, argo both ways. There is no message, so
10
- * no answer to a sender. It answers the ships, never the rules or the reasons,
11
- * and records nothing: an explain is not a send. Only argo; the viewer ship
12
- * receives nothing, so it is never reached.
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.
13
15
  */
14
16
  export function createExplainReach(deps) {
15
17
  return (caller, input) => deps.uow.run(async (tx) => {
@@ -28,15 +30,36 @@ export function createExplainReach(deps) {
28
30
  }
29
31
  const settings = await tx.networkSettings.findForShare(fleetId);
30
32
  const inForce = await rulesInForceAt(tx, { settings, now: deps.clock.now() });
33
+ const declared = await tx.declaredNetworkRules.list(fleetId);
31
34
  const sender = reaching(await shipAsItIs(tx, from));
32
- const reachableShipIds = [];
35
+ const explained = { send: [], read: [], manage: [] };
33
36
  for (const ship of others) {
34
37
  const recipient = reaching(await shipAsItIs(tx, ship));
35
- if (allowsReach(inForce, { sender, recipient, isAnswerToSender: false })) {
36
- reachableShipIds.push(ship.id);
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 }) });
42
+ }
37
43
  }
38
44
  }
39
- return ok({ reachableShipIds });
45
+ return ok(explained);
40
46
  });
41
47
  }
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
+ }
59
+ }
60
+ return { plugin: rule.index };
61
+ }
62
+ function ruleText(rule) {
63
+ return JSON.stringify(rule === undefined ? null : [rule.verb, rule.from, rule.to]);
64
+ }
42
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":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAqB,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAiBpD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuD;IACxF,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAwE,EAAE;QAC9F,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,IAAI,EAAE,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,gBAAgB,EAAE,2DAA2D,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5H,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACtF,OAAO,MAAM,CAAC,gBAAgB,EAAE,+DAA+D,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACpD,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YACvD,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBACzE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"explain-reach.js","sourceRoot":"","sources":["../../../src/domain/registry/explain-reach.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,8 @@ import type { ShipId } from '@aeolus-fleet/common';
2
2
  import type { Caller } from '../shared/caller.js';
3
3
  import { type DomainError } from '../shared/errors.js';
4
4
  import { type Result } from '../shared/result.js';
5
- import { type ListedShip } from './list-fleet.js';
5
+ import { type ListedShip, type ShipOutsideReadReach } from './list-fleet.js';
6
+ import { type ReadReachOf } from './read-reach.js';
6
7
  import { type CrewRequest } from './crew-request.js';
7
8
  import type { FleetListing } from './ports.js';
8
9
  import { type ShownReport } from './ship-report.js';
@@ -19,16 +20,23 @@ export interface ShipDetail extends Omit<ListedShip, 'report' | 'crewRequest'> {
19
20
  inFlightDeliveries: number;
20
21
  /** Its direct deliveries pending or in flight: what a retire abandons. */
21
22
  openDeliveries: number;
23
+ /** Its owner by id and name; null for argo and the viewer (decision 0045). */
24
+ owner: {
25
+ id: ShipId;
26
+ name: string;
27
+ } | null;
22
28
  }
23
29
  export type GetShip = (caller: Caller, input: {
24
30
  shipId: ShipId;
25
- }) => Promise<Result<ShipDetail, DomainError<'SHIP_NOT_FOUND' | 'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER'>>>;
31
+ }) => Promise<Result<ShipDetail | ShipOutsideReadReach, DomainError<'SHIP_NOT_FOUND' | 'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER'>>>;
26
32
  /**
27
33
  * Use case: one ship of the caller's fleet, retired ships included: they keep
28
34
  * their page. The caller's scope (fleet:read or crew:run) is
29
35
  * checked before this runs; crew:run reads only the ships whose crew requests
30
- * are assigned to the caller's ship.
36
+ * are assigned to the caller's ship, whole. Any other ship outside the
37
+ * caller's read reach shows its name, type and status only (decision 0034).
31
38
  */
32
39
  export declare function createGetShip(deps: {
33
40
  listing: FleetListing;
41
+ readReach: ReadReachOf;
34
42
  }): GetShip;