@aeolus-fleet/core 0.26.1 → 0.27.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 (286) 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 +8 -0
  10. package/dist/adapters/prisma/generated/client.d.ts +8 -0
  11. package/dist/adapters/prisma/generated/enums.d.ts +2 -0
  12. package/dist/adapters/prisma/generated/enums.js +3 -1
  13. package/dist/adapters/prisma/generated/enums.js.map +1 -1
  14. package/dist/adapters/prisma/generated/internal/class.d.ts +11 -0
  15. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  16. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  17. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +94 -1
  18. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +18 -1
  19. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  20. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +18 -0
  21. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +18 -1
  22. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  23. package/dist/adapters/prisma/generated/models/Delivery.d.ts +71 -1
  24. package/dist/adapters/prisma/generated/models/Fleet.d.ts +275 -0
  25. package/dist/adapters/prisma/generated/models/Lease.d.ts +113 -1
  26. package/dist/adapters/prisma/generated/models/NetworkSettings.d.ts +151 -19
  27. package/dist/adapters/prisma/generated/models/ReachRefusal.d.ts +71 -1
  28. package/dist/adapters/prisma/generated/models/ScopeNamespace.d.ts +1220 -0
  29. package/dist/adapters/prisma/generated/models/ScopeNamespace.js +2 -0
  30. package/dist/adapters/prisma/generated/models/ScopeNamespace.js.map +1 -0
  31. package/dist/adapters/prisma/generated/models/Ship.d.ts +983 -55
  32. package/dist/adapters/prisma/generated/models.d.ts +1 -0
  33. package/dist/adapters/prisma/health.js +27 -7
  34. package/dist/adapters/prisma/health.js.map +1 -1
  35. package/dist/adapters/prisma/history.js +14 -70
  36. package/dist/adapters/prisma/history.js.map +1 -1
  37. package/dist/adapters/prisma/messaging.js +27 -34
  38. package/dist/adapters/prisma/messaging.js.map +1 -1
  39. package/dist/adapters/prisma/network.js +39 -12
  40. package/dist/adapters/prisma/network.js.map +1 -1
  41. package/dist/adapters/prisma/registry.js +65 -11
  42. package/dist/adapters/prisma/registry.js.map +1 -1
  43. package/dist/adapters/prisma/rows.d.ts +3 -0
  44. package/dist/adapters/prisma/rows.js +20 -7
  45. package/dist/adapters/prisma/rows.js.map +1 -1
  46. package/dist/adapters/prisma/scope-namespaces.d.ts +4 -0
  47. package/dist/adapters/prisma/scope-namespaces.js +39 -0
  48. package/dist/adapters/prisma/scope-namespaces.js.map +1 -0
  49. package/dist/adapters/prisma/unit-of-work.d.ts +2 -1
  50. package/dist/adapters/prisma/unit-of-work.js +2 -0
  51. package/dist/adapters/prisma/unit-of-work.js.map +1 -1
  52. package/dist/adapters/rest/rest-api.js +2 -2
  53. package/dist/adapters/rest/rest-api.js.map +1 -1
  54. package/dist/adapters/trpc/console.d.ts +1 -1
  55. package/dist/adapters/trpc/console.js +6 -4
  56. package/dist/adapters/trpc/console.js.map +1 -1
  57. package/dist/adapters/trpc/context.d.ts +20 -4
  58. package/dist/adapters/trpc/fleet.d.ts +179 -82
  59. package/dist/adapters/trpc/fleet.js +117 -53
  60. package/dist/adapters/trpc/fleet.js.map +1 -1
  61. package/dist/adapters/trpc/router.d.ts +231 -80
  62. package/dist/adapters/trpc/ship-contract.js +4 -0
  63. package/dist/adapters/trpc/ship-contract.js.map +1 -1
  64. package/dist/adapters/trpc/ship-protocol.js +7 -5
  65. package/dist/adapters/trpc/ship-protocol.js.map +1 -1
  66. package/dist/adapters/trpc/ship.d.ts +71 -3
  67. package/dist/adapters/trpc/ship.js +42 -5
  68. package/dist/adapters/trpc/ship.js.map +1 -1
  69. package/dist/adapters/trpc/trpc.d.ts +6 -5
  70. package/dist/adapters/trpc/trpc.js +76 -21
  71. package/dist/adapters/trpc/trpc.js.map +1 -1
  72. package/dist/domain/messaging/check-inbox.d.ts +5 -5
  73. package/dist/domain/messaging/check-inbox.js +9 -7
  74. package/dist/domain/messaging/check-inbox.js.map +1 -1
  75. package/dist/domain/messaging/dismiss-delivery.d.ts +9 -4
  76. package/dist/domain/messaging/dismiss-delivery.js +26 -19
  77. package/dist/domain/messaging/dismiss-delivery.js.map +1 -1
  78. package/dist/domain/messaging/message.d.ts +11 -5
  79. package/dist/domain/messaging/message.js +11 -4
  80. package/dist/domain/messaging/message.js.map +1 -1
  81. package/dist/domain/messaging/ping-ship.d.ts +3 -3
  82. package/dist/domain/messaging/ping-ship.js +6 -2
  83. package/dist/domain/messaging/ping-ship.js.map +1 -1
  84. package/dist/domain/messaging/ports.d.ts +9 -3
  85. package/dist/domain/messaging/receive-deliveries.d.ts +2 -0
  86. package/dist/domain/messaging/receive-deliveries.js +1 -0
  87. package/dist/domain/messaging/receive-deliveries.js.map +1 -1
  88. package/dist/domain/messaging/resend-delivery.d.ts +5 -2
  89. package/dist/domain/messaging/resend-delivery.js +8 -4
  90. package/dist/domain/messaging/resend-delivery.js.map +1 -1
  91. package/dist/domain/messaging/send-message.d.ts +9 -2
  92. package/dist/domain/messaging/send-message.js +12 -2
  93. package/dist/domain/messaging/send-message.js.map +1 -1
  94. package/dist/domain/messaging/send-request.d.ts +3 -1
  95. package/dist/domain/messaging/send-request.js +4 -2
  96. package/dist/domain/messaging/send-request.js.map +1 -1
  97. package/dist/domain/registry/assign-label.d.ts +2 -1
  98. package/dist/domain/registry/assign-label.js +3 -2
  99. package/dist/domain/registry/assign-label.js.map +1 -1
  100. package/dist/domain/registry/check-reach.d.ts +63 -4
  101. package/dist/domain/registry/check-reach.js +107 -11
  102. package/dist/domain/registry/check-reach.js.map +1 -1
  103. package/dist/domain/registry/commission-ship.d.ts +17 -8
  104. package/dist/domain/registry/commission-ship.js +24 -10
  105. package/dist/domain/registry/commission-ship.js.map +1 -1
  106. package/dist/domain/registry/crew-request.d.ts +1 -1
  107. package/dist/domain/registry/declare-scopes.d.ts +38 -0
  108. package/dist/domain/registry/declare-scopes.js +34 -0
  109. package/dist/domain/registry/declare-scopes.js.map +1 -0
  110. package/dist/domain/registry/declared-network-rules.d.ts +2 -1
  111. package/dist/domain/registry/declared-network-rules.js +11 -5
  112. package/dist/domain/registry/declared-network-rules.js.map +1 -1
  113. package/dist/domain/registry/discover.d.ts +28 -0
  114. package/dist/domain/registry/discover.js +54 -0
  115. package/dist/domain/registry/discover.js.map +1 -0
  116. package/dist/domain/registry/explain-reach.d.ts +12 -12
  117. package/dist/domain/registry/explain-reach.js +35 -12
  118. package/dist/domain/registry/explain-reach.js.map +1 -1
  119. package/dist/domain/registry/get-ship.d.ts +11 -3
  120. package/dist/domain/registry/get-ship.js +8 -2
  121. package/dist/domain/registry/get-ship.js.map +1 -1
  122. package/dist/domain/registry/get-starting-prompt.d.ts +18 -2
  123. package/dist/domain/registry/get-starting-prompt.js +7 -7
  124. package/dist/domain/registry/get-starting-prompt.js.map +1 -1
  125. package/dist/domain/registry/grant-scopes.d.ts +34 -0
  126. package/dist/domain/registry/grant-scopes.js +35 -0
  127. package/dist/domain/registry/grant-scopes.js.map +1 -0
  128. package/dist/domain/registry/label.d.ts +12 -7
  129. package/dist/domain/registry/label.js +21 -4
  130. package/dist/domain/registry/label.js.map +1 -1
  131. package/dist/domain/registry/list-fleet.d.ts +19 -6
  132. package/dist/domain/registry/list-fleet.js +18 -3
  133. package/dist/domain/registry/list-fleet.js.map +1 -1
  134. package/dist/domain/registry/list-scopes.d.ts +24 -0
  135. package/dist/domain/registry/list-scopes.js +22 -0
  136. package/dist/domain/registry/list-scopes.js.map +1 -0
  137. package/dist/domain/registry/managed-or-assigned.d.ts +25 -0
  138. package/dist/domain/registry/managed-or-assigned.js +23 -0
  139. package/dist/domain/registry/managed-or-assigned.js.map +1 -0
  140. package/dist/domain/registry/named-namespaces.d.ts +19 -0
  141. package/dist/domain/registry/named-namespaces.js +19 -0
  142. package/dist/domain/registry/named-namespaces.js.map +1 -0
  143. package/dist/domain/registry/network-settings.d.ts +84 -24
  144. package/dist/domain/registry/network-settings.js +134 -45
  145. package/dist/domain/registry/network-settings.js.map +1 -1
  146. package/dist/domain/registry/ports.d.ts +63 -1
  147. package/dist/domain/registry/public.d.ts +3 -2
  148. package/dist/domain/registry/public.js +3 -2
  149. package/dist/domain/registry/public.js.map +1 -1
  150. package/dist/domain/registry/reach-refusal.d.ts +12 -4
  151. package/dist/domain/registry/read-assigned-crew-requests.d.ts +12 -3
  152. package/dist/domain/registry/read-assigned-crew-requests.js +8 -8
  153. package/dist/domain/registry/read-assigned-crew-requests.js.map +1 -1
  154. package/dist/domain/registry/read-built-in-rules.d.ts +20 -0
  155. package/dist/domain/registry/read-built-in-rules.js +23 -0
  156. package/dist/domain/registry/read-built-in-rules.js.map +1 -0
  157. package/dist/domain/registry/read-clear-requests.d.ts +5 -3
  158. package/dist/domain/registry/read-clear-requests.js +7 -5
  159. package/dist/domain/registry/read-clear-requests.js.map +1 -1
  160. package/dist/domain/registry/read-on-behalf.d.ts +20 -0
  161. package/dist/domain/registry/read-on-behalf.js +31 -0
  162. package/dist/domain/registry/read-on-behalf.js.map +1 -0
  163. package/dist/domain/registry/read-reach.d.ts +62 -0
  164. package/dist/domain/registry/read-reach.js +78 -0
  165. package/dist/domain/registry/read-reach.js.map +1 -0
  166. package/dist/domain/registry/recrew-ship.d.ts +3 -2
  167. package/dist/domain/registry/recrew-ship.js +6 -1
  168. package/dist/domain/registry/recrew-ship.js.map +1 -1
  169. package/dist/domain/registry/release-ship.d.ts +6 -3
  170. package/dist/domain/registry/release-ship.js +7 -7
  171. package/dist/domain/registry/release-ship.js.map +1 -1
  172. package/dist/domain/registry/remove-crew-request.d.ts +4 -3
  173. package/dist/domain/registry/remove-crew-request.js +6 -1
  174. package/dist/domain/registry/remove-crew-request.js.map +1 -1
  175. package/dist/domain/registry/rename-ship.d.ts +7 -5
  176. package/dist/domain/registry/rename-ship.js +9 -3
  177. package/dist/domain/registry/rename-ship.js.map +1 -1
  178. package/dist/domain/registry/request-crew.d.ts +5 -4
  179. package/dist/domain/registry/request-crew.js +6 -1
  180. package/dist/domain/registry/request-crew.js.map +1 -1
  181. package/dist/domain/registry/request-worktree-clear.d.ts +3 -2
  182. package/dist/domain/registry/request-worktree-clear.js +6 -1
  183. package/dist/domain/registry/request-worktree-clear.js.map +1 -1
  184. package/dist/domain/registry/retire-ship.d.ts +16 -7
  185. package/dist/domain/registry/retire-ship.js +46 -5
  186. package/dist/domain/registry/retire-ship.js.map +1 -1
  187. package/dist/domain/registry/scope-grant.d.ts +53 -0
  188. package/dist/domain/registry/scope-grant.js +74 -0
  189. package/dist/domain/registry/scope-grant.js.map +1 -0
  190. package/dist/domain/registry/scope-namespace.d.ts +68 -0
  191. package/dist/domain/registry/scope-namespace.js +82 -0
  192. package/dist/domain/registry/scope-namespace.js.map +1 -0
  193. package/dist/domain/registry/set-built-in-rule.d.ts +28 -0
  194. package/dist/domain/registry/set-built-in-rule.js +33 -0
  195. package/dist/domain/registry/set-built-in-rule.js.map +1 -0
  196. package/dist/domain/registry/set-network-rules.d.ts +3 -3
  197. package/dist/domain/registry/set-network-rules.js +2 -2
  198. package/dist/domain/registry/set-owner.d.ts +30 -0
  199. package/dist/domain/registry/set-owner.js +37 -0
  200. package/dist/domain/registry/set-owner.js.map +1 -0
  201. package/dist/domain/registry/set-statement.d.ts +27 -0
  202. package/dist/domain/registry/set-statement.js +28 -0
  203. package/dist/domain/registry/set-statement.js.map +1 -0
  204. package/dist/domain/registry/ship.d.ts +70 -10
  205. package/dist/domain/registry/ship.js +95 -10
  206. package/dist/domain/registry/ship.js.map +1 -1
  207. package/dist/domain/registry/statement.d.ts +32 -0
  208. package/dist/domain/registry/statement.js +39 -0
  209. package/dist/domain/registry/statement.js.map +1 -0
  210. package/dist/domain/registry/unassign-label.js +1 -1
  211. package/dist/domain/registry/unassign-label.js.map +1 -1
  212. package/dist/domain/registry/whoami.d.ts +5 -1
  213. package/dist/domain/registry/whoami.js +7 -4
  214. package/dist/domain/registry/whoami.js.map +1 -1
  215. package/dist/domain/shared/caller.d.ts +5 -2
  216. package/dist/domain/shared/caller.js.map +1 -1
  217. package/dist/domain/shared/errors.d.ts +1 -1
  218. package/dist/domain/shared/errors.js.map +1 -1
  219. package/dist/domain/shared/events-read.d.ts +16 -0
  220. package/dist/domain/shared/events-read.js +15 -0
  221. package/dist/domain/shared/events-read.js.map +1 -0
  222. package/dist/domain/shared/follow-fleet.d.ts +8 -2
  223. package/dist/domain/shared/follow-fleet.js +14 -4
  224. package/dist/domain/shared/follow-fleet.js.map +1 -1
  225. package/dist/domain/shared/health.d.ts +9 -2
  226. package/dist/domain/shared/health.js +9 -3
  227. package/dist/domain/shared/health.js.map +1 -1
  228. package/dist/domain/shared/history.d.ts +9 -42
  229. package/dist/domain/shared/history.js +9 -0
  230. package/dist/domain/shared/history.js.map +1 -1
  231. package/dist/domain/shared/read-fleet-events.d.ts +8 -2
  232. package/dist/domain/shared/read-fleet-events.js +10 -4
  233. package/dist/domain/shared/read-fleet-events.js.map +1 -1
  234. package/dist/domain/shared/read-health.d.ts +4 -1
  235. package/dist/domain/shared/read-health.js +7 -2
  236. package/dist/domain/shared/read-health.js.map +1 -1
  237. package/dist/domain/shared/read-inbox.d.ts +6 -3
  238. package/dist/domain/shared/read-inbox.js +14 -4
  239. package/dist/domain/shared/read-inbox.js.map +1 -1
  240. package/dist/domain/shared/read-message.d.ts +6 -2
  241. package/dist/domain/shared/read-message.js +6 -2
  242. package/dist/domain/shared/read-message.js.map +1 -1
  243. package/dist/domain/shared/read-needs-attention.d.ts +4 -1
  244. package/dist/domain/shared/read-needs-attention.js +8 -3
  245. package/dist/domain/shared/read-needs-attention.js.map +1 -1
  246. package/dist/domain/shared/read-ship-messages.d.ts +6 -2
  247. package/dist/domain/shared/read-ship-messages.js +7 -2
  248. package/dist/domain/shared/read-ship-messages.js.map +1 -1
  249. package/dist/domain/shared/read-ship-timeline.d.ts +5 -2
  250. package/dist/domain/shared/read-ship-timeline.js +11 -6
  251. package/dist/domain/shared/read-ship-timeline.js.map +1 -1
  252. package/dist/domain/shared/read-ship-way.d.ts +11 -4
  253. package/dist/domain/shared/read-ship-way.js +9 -2
  254. package/dist/domain/shared/read-ship-way.js.map +1 -1
  255. package/dist/domain/shared/stuck.d.ts +10 -1
  256. package/dist/domain/shared/stuck.js +1 -1
  257. package/dist/domain/shared/stuck.js.map +1 -1
  258. package/dist/wiring.d.ts +18 -4
  259. package/dist/wiring.js +37 -18
  260. package/dist/wiring.js.map +1 -1
  261. package/package.json +2 -2
  262. package/src/adapters/prisma/migrations/20261018100000_force_scope/migration.sql +8 -0
  263. package/src/adapters/prisma/migrations/20261018110000_forced_delivery/migration.sql +4 -0
  264. package/src/adapters/prisma/migrations/20261018120000_person_and_app_ships/migration.sql +3 -0
  265. package/src/adapters/prisma/migrations/20261018130000_owners/migration.sql +14 -0
  266. package/src/adapters/prisma/migrations/20261018140000_owners_on_reach_refusals/migration.sql +14 -0
  267. package/src/adapters/prisma/migrations/20261018150000_network_verbs/migration.sql +9 -0
  268. package/src/adapters/prisma/migrations/20261018160000_built_in_rules/migration.sql +13 -0
  269. package/src/adapters/prisma/migrations/20261018170000_network_rules_a_list/migration.sql +5 -0
  270. package/src/adapters/prisma/migrations/20261018180000_verb_on_reach_refusals/migration.sql +4 -0
  271. package/src/adapters/prisma/migrations/20261018200000_lease_statements/migration.sql +3 -0
  272. package/src/adapters/prisma/migrations/20261018210000_declare_and_grant_scopes/migration.sql +8 -0
  273. package/src/adapters/prisma/migrations/20261018220000_plugin_scopes/migration.sql +14 -0
  274. package/src/adapters/prisma/migrations/20261018230000_scope_namespaces/migration.sql +20 -0
  275. package/src/adapters/prisma/migrations/20261018240000_trierarch_plugin_crew_run/migration.sql +44 -0
  276. package/src/adapters/prisma/migrations/20261018250000_scope_catalogue/migration.sql +66 -0
  277. package/src/adapters/prisma/migrations/20261019090000_reach_refusal_asked_by/migration.sql +2 -0
  278. package/src/adapters/prisma/migrations/20261019100000_on_behalf_scope/migration.sql +59 -0
  279. package/src/adapters/prisma/migrations/20261019110000_events_fleet_id_occurred_at/migration.sql +2 -0
  280. package/src/adapters/prisma/schema.prisma +47 -2
  281. package/dist/domain/shared/read-no-ship-can-take.d.ts +0 -13
  282. package/dist/domain/shared/read-no-ship-can-take.js +0 -12
  283. package/dist/domain/shared/read-no-ship-can-take.js.map +0 -1
  284. package/dist/domain/shared/read-overdue.d.ts +0 -13
  285. package/dist/domain/shared/read-overdue.js +0 -12
  286. package/dist/domain/shared/read-overdue.js.map +0 -1
@@ -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 { ShipRepository } from './ports.js';
9
+ import { type ChangeOwnerRefusal } from './ship.js';
10
+ export interface SetOwnerTx {
11
+ ships: Pick<ShipRepository, 'findForUpdate' | 'setOwner'>;
12
+ events: EventLog;
13
+ }
14
+ export type SetOwnerRefusal = DomainError<'NOT_THE_OPERATOR_SHIP' | 'SHIP_NOT_FOUND'> | ChangeOwnerRefusal;
15
+ export type SetOwner = (caller: Caller, input: {
16
+ shipId: ShipId;
17
+ ownerShipId: ShipId;
18
+ }) => Promise<Result<undefined, SetOwnerRefusal>>;
19
+ /**
20
+ * Use case: argo, and only argo, gives a ship a new owner, an active person's
21
+ * ship or argo (decision 0045), with OwnerChanged in the same unit of work.
22
+ * It locks the owner first, then the ship, as a retire of the owner locks it
23
+ * before the ships it owns, so the two never wait on each other: the new
24
+ * owner is never one a retire already passed by.
25
+ */
26
+ export declare function createSetOwner(deps: {
27
+ uow: UnitOfWork<SetOwnerTx>;
28
+ clock: Clock;
29
+ ids: IdGenerator;
30
+ }): SetOwner;
@@ -0,0 +1,37 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { recordEvent, shipActor } from '../shared/events.js';
3
+ import { ok } from '../shared/result.js';
4
+ import { changeOwner } from './ship.js';
5
+ /**
6
+ * Use case: argo, and only argo, gives a ship a new owner, an active person's
7
+ * ship or argo (decision 0045), with OwnerChanged in the same unit of work.
8
+ * It locks the owner first, then the ship, as a retire of the owner locks it
9
+ * before the ships it owns, so the two never wait on each other: the new
10
+ * owner is never one a retire already passed by.
11
+ */
12
+ export function createSetOwner(deps) {
13
+ return (caller, input) => deps.uow.run(async (tx) => {
14
+ if (caller.kind !== 'operator') {
15
+ return refuse('NOT_THE_OPERATOR_SHIP', "Only argo changes a ship's owner");
16
+ }
17
+ const { fleetId } = caller;
18
+ const owner = await tx.ships.findForUpdate(fleetId, input.ownerShipId);
19
+ const ship = await tx.ships.findForUpdate(fleetId, input.shipId);
20
+ if (!ship) {
21
+ return refuse('SHIP_NOT_FOUND', `Ship ${input.shipId} does not exist`);
22
+ }
23
+ const changed = changeOwner(ship, { owner, why: 'setByArgo', at: deps.clock.now(), actor: shipActor(caller.shipId) });
24
+ if (!changed.isOk) {
25
+ return changed;
26
+ }
27
+ const { ship: owned, events } = changed.value;
28
+ if (owned.owner !== null && owned.owner !== ship.owner) {
29
+ await tx.ships.setOwner({ fleetId, shipId: ship.id, ownerShipId: owned.owner });
30
+ }
31
+ for (const event of events) {
32
+ await recordEvent({ events: tx.events, ids: deps.ids }, event);
33
+ }
34
+ return ok(undefined);
35
+ });
36
+ }
37
+ //# sourceMappingURL=set-owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-owner.js","sourceRoot":"","sources":["../../../src/domain/registry/set-owner.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,WAAW,CAAC;AAWjE;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAqE;IAClG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA+C,EAAE;QACrE,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,uBAAuB,EAAE,kCAAkC,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACvE,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,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9C,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACvD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,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"}
@@ -0,0 +1,27 @@
1
+ import type { IdGenerator, Statement } from '@aeolus-fleet/common';
2
+ import type { Crew } 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 LeaseEnded } from './lease.js';
8
+ import type { LeaseRepository } from './ports.js';
9
+ export interface SetStatementTx {
10
+ leases: Pick<LeaseRepository, 'findStatementForUpdate' | 'saveStatement'>;
11
+ events: EventLog;
12
+ }
13
+ export type SetStatement = (crew: Crew, statement: Statement) => Promise<Result<{
14
+ version: number;
15
+ }, LeaseEnded>>;
16
+ /**
17
+ * Use case: the crew states what its ship is and offers (`setStatement`,
18
+ * decision 0047), whole, its shape checked at the edge. No scope beyond being
19
+ * the crew: it speaks only for its own ship. Kept with the crew's lease,
20
+ * locked meanwhile, with StatementSet on a change, in one unit of work.
21
+ * Answers the version; refused once the lease has ended.
22
+ */
23
+ export declare function createSetStatement(deps: {
24
+ uow: UnitOfWork<SetStatementTx>;
25
+ clock: Clock;
26
+ ids: IdGenerator;
27
+ }): SetStatement;
@@ -0,0 +1,28 @@
1
+ import { recordEvent } from '../shared/events.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { refuseEndedLease } from './lease.js';
4
+ import { stateStatement } from './statement.js';
5
+ /**
6
+ * Use case: the crew states what its ship is and offers (`setStatement`,
7
+ * decision 0047), whole, its shape checked at the edge. No scope beyond being
8
+ * the crew: it speaks only for its own ship. Kept with the crew's lease,
9
+ * locked meanwhile, with StatementSet on a change, in one unit of work.
10
+ * Answers the version; refused once the lease has ended.
11
+ */
12
+ export function createSetStatement(deps) {
13
+ return (crew, statement) => deps.uow.run(async (tx) => {
14
+ const held = await tx.leases.findStatementForUpdate(crew.fleetId, crew.leaseId);
15
+ if (!held) {
16
+ return refuseEndedLease();
17
+ }
18
+ const { stated, events } = stateStatement(held.stated, { crew, statement, at: deps.clock.now() });
19
+ if (events.length > 0) {
20
+ await tx.leases.saveStatement({ fleetId: crew.fleetId, leaseId: crew.leaseId, stated });
21
+ }
22
+ for (const event of events) {
23
+ await recordEvent({ events: tx.events, ids: deps.ids }, event);
24
+ }
25
+ return ok({ version: stated.version });
26
+ });
27
+ }
28
+ //# sourceMappingURL=set-statement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-statement.js","sourceRoot":"","sources":["../../../src/domain/registry/set-statement.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAShD;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAyE;IAC1G,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAoD,EAAE;QAC1E,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,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,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,9 +1,10 @@
1
- import { type FleetId, type FleetScope, type LeaseId, type Scope, type ShipId, type ShipKind, type ShipStatus } from '@aeolus-fleet/common';
1
+ import { type CommissionedShipKind, type FleetId, type LeaseId, type Scope, type ScopeName, type ShipId, type ShipKind, type ShipStatus } from '@aeolus-fleet/common';
2
2
  import { type DomainError } from '../shared/errors.js';
3
3
  import { type Actor, type NewEvent } from '../shared/events.js';
4
4
  import { type Result } from '../shared/result.js';
5
5
  import type { Recipient } from '../shared/selector.js';
6
6
  import { type Lease, type LeaseEnded, type Location } from './lease.js';
7
+ import type { ScopeNamespace } from './scope-namespace.js';
7
8
  /** A durable, addressable identity with an inbox. Outlives any session. */
8
9
  export interface Ship {
9
10
  id: ShipId;
@@ -11,7 +12,8 @@ export interface Ship {
11
12
  name: string;
12
13
  type: string;
13
14
  kind: ShipKind;
14
- scopes: readonly Scope[];
15
+ /** Core scopes and plugin scopes (decision 0046). */
16
+ scopes: readonly ScopeName[];
15
17
  note: string | null;
16
18
  createdAt: Date;
17
19
  retiredAt: Date | null;
@@ -25,7 +27,24 @@ export interface Ship {
25
27
  idempotencyKey: string;
26
28
  requestHash: string;
27
29
  } | null;
30
+ /** The ship that answers for it, a person's ship or argo (decision 0045); null for argo and the viewer. */
31
+ owner: ShipId | null;
28
32
  }
33
+ /**
34
+ * How a ship got its owner at commission: its commissioner's owner, argo when
35
+ * the commissioner has none, or the owner of the ship that asked a plugin's
36
+ * ship for it, which the plugin named (decision 0045).
37
+ */
38
+ export type OwnerSetHow = 'inherited' | 'argoByDefault' | 'askingShipOwner';
39
+ /** OwnerSet's details: the owner and how it was set, with the asking ship when a plugin named its owner. */
40
+ export type OwnerSet = {
41
+ ownerShipId: ShipId;
42
+ how: 'inherited' | 'argoByDefault';
43
+ } | {
44
+ ownerShipId: ShipId;
45
+ how: 'askingShipOwner';
46
+ askingShipId: ShipId;
47
+ };
29
48
  /** The operator ship's name. Reserved: no other ship can take it. */
30
49
  export declare const OPERATOR_SHIP_NAME = "argo";
31
50
  /** The operator ship's type label, the same word as its kind. */
@@ -50,23 +69,41 @@ export declare function viewerShip(input: {
50
69
  fleetId: FleetId;
51
70
  createdAt: Date;
52
71
  }): Ship;
72
+ /**
73
+ * Whether the ship is the console's own, argo or the viewer: always crewed,
74
+ * with no secret. Every other kind is crewed through its lease (decision 0044).
75
+ */
76
+ export declare function isConsoleShip(ship: Pick<Ship, 'kind'>): boolean;
53
77
  /** The scopes every agent ship gets at creation: it sends and receives; commissioning may add fleet scopes (ADR 0002). */
54
78
  export declare const AGENT_SCOPES: readonly Scope[];
55
- export type CommissionRefusal = DomainError<'INVALID_SHIP_NAME' | 'SHIP_NAME_RESERVED' | 'INVALID_SHIP_TYPE' | 'INVALID_SHIP_NOTE' | 'SHIP_NAME_TAKEN'>;
79
+ export type CommissionRefusal = DomainError<'INVALID_SHIP_NAME' | 'SHIP_NAME_RESERVED' | 'INVALID_SHIP_TYPE' | 'INVALID_SHIP_NOTE' | 'SHIP_NAME_TAKEN' | 'KIND_COMMISSIONED_BY_ARGO_ONLY' | 'INVALID_SCOPE' | 'SCOPE_NOT_DECLARED' | 'SCOPE_NOT_HELD' | 'PLUGIN_SCOPE_NOT_YOURS'>;
56
80
  /**
57
- * A new agent ship, awaiting crew, and its ShipCommissioned event. The name is
58
- * a handle, never `argo`, and unique among the fleet's active ships:
59
- * `activeShipNamed` is the active ship that already holds it, if any, read
60
- * while the name is locked.
81
+ * A new ship, awaiting crew, and its ShipCommissioned event. An agent unless
82
+ * the commission states another kind; only argo commissions a person or app
83
+ * ship, to be true to what the ship is (decision 0044). The name is a handle,
84
+ * never `argo`, and unique among the fleet's active ships: `activeShipNamed`
85
+ * is the active ship that already holds it, if any, read while the name is
86
+ * locked. It gets the scopes every ship has and those asked for that the
87
+ * commissioner may grant (decision 0046): core scopes in their fixed order,
88
+ * then plugin scopes in name order, each once. Its owner is the
89
+ * commissioner's owner, argo by default; a commissioner holding
90
+ * fleet:on-behalf, a plugin's ship, may name instead the ship that asked it,
91
+ * whose owner it gets (decision 0045).
61
92
  */
62
- export declare function commissionAgentShip(input: {
93
+ export declare function commissionShip(input: {
63
94
  id: ShipId;
64
95
  fleetId: FleetId;
65
96
  name: string;
66
97
  type: string;
98
+ kind?: CommissionedShipKind;
99
+ /** The ship that commissions it, and the fleet's argo: the new ship's owner is the commissioner's owner, argo by default (decision 0045). */
100
+ commissioner: Ship;
101
+ argoShipId: ShipId;
102
+ /** The ship that asked a plugin's ship for this one, whose owner the new ship gets (decision 0045). */
103
+ askingShip?: Ship;
67
104
  note?: string;
68
- /** fleet:read, fleet:manage, crew:assign and/or crew:run, added to the agent scopes (ADR 0002, decision 0029). */
69
- fleetScopes?: readonly FleetScope[];
105
+ /** Scopes added to the agent scopes (decision 0046). */
106
+ scopes?: readonly string[];
70
107
  at: Date;
71
108
  actor: Actor;
72
109
  commission: {
@@ -76,10 +113,33 @@ export declare function commissionAgentShip(input: {
76
113
  };
77
114
  }, fleet: {
78
115
  activeShipNamed: Ship | undefined;
116
+ /** The plugin namespaces the scopes name, with their declarers' names, by namespace. */
117
+ namespaces: ReadonlyMap<string, {
118
+ namespace: ScopeNamespace;
119
+ declarerName: string;
120
+ }>;
79
121
  }): Result<{
80
122
  ship: Ship;
81
123
  events: NewEvent[];
82
124
  }, CommissionRefusal>;
125
+ /** Why a ship's owner changed: argo set it, or its owner's ship retired and it fell to argo. */
126
+ export type OwnerChangedWhy = 'setByArgo' | 'ownerRetired';
127
+ export type ChangeOwnerRefusal = DomainError<'SHIP_HAS_NO_OWNER' | 'SHIP_ALREADY_RETIRED' | 'INVALID_OWNER'>;
128
+ /**
129
+ * The ship with its new owner and OwnerChanged (decision 0045). The owner is
130
+ * an active person's ship or argo; argo and the viewer have none, and a
131
+ * retired ship keeps the owner it had. The same owner again changes nothing
132
+ * and writes no event.
133
+ */
134
+ export declare function changeOwner(ship: Ship, change: {
135
+ owner: Ship | undefined;
136
+ why: OwnerChangedWhy;
137
+ at: Date;
138
+ actor: Actor;
139
+ }): Result<{
140
+ ship: Ship;
141
+ events: NewEvent[];
142
+ }, ChangeOwnerRefusal>;
83
143
  /**
84
144
  * Awaiting crew, crewed or retired: derived from whether a session holds the
85
145
  * ship's lease and whether the ship is retired, never set by hand.
@@ -1,8 +1,9 @@
1
- import { FLEET_SCOPES, SCOPES, } from '@aeolus-fleet/common';
1
+ import { SCOPES, } from '@aeolus-fleet/common';
2
2
  import { refuse } from '../shared/errors.js';
3
3
  import { shipActor } from '../shared/events.js';
4
4
  import { ok } from '../shared/result.js';
5
5
  import { refuseEndedLease } from './lease.js';
6
+ import { mayGrant } from './scope-grant.js';
6
7
  import { shipName, shipType } from './ship-handle.js';
7
8
  import { shipNote } from './ship-note.js';
8
9
  /** The operator ship's name. Reserved: no other ship can take it. */
@@ -20,6 +21,7 @@ export function operatorShip(input) {
20
21
  note: null,
21
22
  retiredAt: null,
22
23
  commission: null,
24
+ owner: null,
23
25
  };
24
26
  }
25
27
  /** The viewer ship's name, reserved as argo's is (decision 0022). */
@@ -41,19 +43,42 @@ export function viewerShip(input) {
41
43
  note: null,
42
44
  retiredAt: null,
43
45
  commission: null,
46
+ owner: null,
44
47
  };
45
48
  }
46
49
  /** The ships no session crews with a secret and no fleet action ends or renames, by kind, as their refusals name them. */
47
50
  const PERMANENT_SHIPS = { operator: 'the operator ship', viewer: 'the viewer ship' };
51
+ /**
52
+ * Whether the ship is the console's own, argo or the viewer: always crewed,
53
+ * with no secret. Every other kind is crewed through its lease (decision 0044).
54
+ */
55
+ export function isConsoleShip(ship) {
56
+ return PERMANENT_SHIPS[ship.kind] !== undefined;
57
+ }
48
58
  /** The scopes every agent ship gets at creation: it sends and receives; commissioning may add fleet scopes (ADR 0002). */
49
59
  export const AGENT_SCOPES = ['messages:send', 'messages:receive'];
60
+ /** Whether the scope is one of core's, not a plugin's. */
61
+ function isCoreScope(scope) {
62
+ return SCOPES.some((core) => core === scope);
63
+ }
50
64
  /**
51
- * A new agent ship, awaiting crew, and its ShipCommissioned event. The name is
52
- * a handle, never `argo`, and unique among the fleet's active ships:
53
- * `activeShipNamed` is the active ship that already holds it, if any, read
54
- * while the name is locked.
65
+ * A new ship, awaiting crew, and its ShipCommissioned event. An agent unless
66
+ * the commission states another kind; only argo commissions a person or app
67
+ * ship, to be true to what the ship is (decision 0044). The name is a handle,
68
+ * never `argo`, and unique among the fleet's active ships: `activeShipNamed`
69
+ * is the active ship that already holds it, if any, read while the name is
70
+ * locked. It gets the scopes every ship has and those asked for that the
71
+ * commissioner may grant (decision 0046): core scopes in their fixed order,
72
+ * then plugin scopes in name order, each once. Its owner is the
73
+ * commissioner's owner, argo by default; a commissioner holding
74
+ * fleet:on-behalf, a plugin's ship, may name instead the ship that asked it,
75
+ * whose owner it gets (decision 0045).
55
76
  */
56
- export function commissionAgentShip(input, fleet) {
77
+ export function commissionShip(input, fleet) {
78
+ const { kind = 'agent' } = input;
79
+ if (kind !== 'agent' && input.commissioner.kind !== 'operator') {
80
+ return refuse('KIND_COMMISSIONED_BY_ARGO_ONLY', `Only argo commissions a ${kind} ship: commission an agent ship instead`);
81
+ }
57
82
  const name = shipName(input.name);
58
83
  if (!name.isOk) {
59
84
  return name;
@@ -73,18 +98,31 @@ export function commissionAgentShip(input, fleet) {
73
98
  if (fleet.activeShipNamed) {
74
99
  return refuse('SHIP_NAME_TAKEN', `An active ship is already named ${name.value}`);
75
100
  }
101
+ const asked = input.scopes ?? [];
102
+ const granter = { shipId: input.commissioner.id, kind: input.commissioner.kind, scopes: input.commissioner.scopes };
103
+ for (const scope of asked) {
104
+ const allowed = mayGrant(scope, { granter, namespaces: fleet.namespaces });
105
+ if (!allowed.isOk) {
106
+ return allowed;
107
+ }
108
+ }
109
+ if (input.askingShip !== undefined && !input.commissioner.scopes.includes('fleet:on-behalf')) {
110
+ return refuse('SCOPE_NOT_HELD', 'Naming the ship that asked for this one needs the fleet:on-behalf scope: commission without ownerOf');
111
+ }
76
112
  const { id, fleetId, at, actor } = input;
113
+ const owner = ownerAtCommission(input);
77
114
  const ship = {
78
115
  id,
79
116
  fleetId,
80
117
  name: name.value,
81
118
  type: type.value,
82
- kind: 'agent',
83
- scopes: [...AGENT_SCOPES, ...FLEET_SCOPES.filter((scope) => input.fleetScopes?.includes(scope))],
119
+ kind,
120
+ scopes: [...SCOPES.filter((scope) => AGENT_SCOPES.includes(scope) || asked.includes(scope)), ...[...new Set(asked.filter((scope) => !isCoreScope(scope)))].toSorted()],
84
121
  note: note.value,
85
122
  createdAt: at,
86
123
  retiredAt: null,
87
124
  commission: input.commission,
125
+ owner: owner.ownerShipId,
88
126
  };
89
127
  return ok({
90
128
  ship,
@@ -97,9 +135,56 @@ export function commissionAgentShip(input, fleet) {
97
135
  shipId: id,
98
136
  details: { name: ship.name, type: ship.type, kind: ship.kind, scopes: ship.scopes.join(' ') },
99
137
  },
138
+ { fleetId, type: 'OwnerSet', occurredAt: at, actor, shipId: id, details: owner },
139
+ ],
140
+ });
141
+ }
142
+ /**
143
+ * The ship with its new owner and OwnerChanged (decision 0045). The owner is
144
+ * an active person's ship or argo; argo and the viewer have none, and a
145
+ * retired ship keeps the owner it had. The same owner again changes nothing
146
+ * and writes no event.
147
+ */
148
+ export function changeOwner(ship, change) {
149
+ const { owner } = change;
150
+ if (isConsoleShip(ship)) {
151
+ return refuse('SHIP_HAS_NO_OWNER', `${ship.name} is the console's own ship: it has no owner`);
152
+ }
153
+ if (ship.retiredAt !== null) {
154
+ return refuse('SHIP_ALREADY_RETIRED', `${ship.name} is retired: it keeps the owner it had`);
155
+ }
156
+ if (owner?.retiredAt !== null || (owner.kind !== 'person' && owner.kind !== 'operator')) {
157
+ return refuse('INVALID_OWNER', "An owner is an active person's ship or argo");
158
+ }
159
+ if (ship.owner === owner.id) {
160
+ return ok({ ship, events: [] });
161
+ }
162
+ return ok({
163
+ ship: { ...ship, owner: owner.id },
164
+ events: [
165
+ {
166
+ fleetId: ship.fleetId,
167
+ type: 'OwnerChanged',
168
+ occurredAt: change.at,
169
+ actor: change.actor,
170
+ shipId: ship.id,
171
+ details: { fromShipId: ship.owner, toShipId: owner.id, why: change.why },
172
+ },
100
173
  ],
101
174
  });
102
175
  }
176
+ /**
177
+ * The asking ship's owner, when a plugin's ship named it; else the
178
+ * commissioner's owner, inherited. argo for a ship that has none, as argo
179
+ * itself has none.
180
+ */
181
+ function ownerAtCommission(input) {
182
+ const { commissioner, askingShip, argoShipId } = input;
183
+ if (askingShip !== undefined) {
184
+ return { ownerShipId: askingShip.owner ?? argoShipId, how: 'askingShipOwner', askingShipId: askingShip.id };
185
+ }
186
+ return commissioner.owner === null ? { ownerShipId: argoShipId, how: 'argoByDefault' } : { ownerShipId: commissioner.owner, how: 'inherited' };
187
+ }
103
188
  /**
104
189
  * Awaiting crew, crewed or retired: derived from whether a session holds the
105
190
  * ship's lease and whether the ship is retired, never set by hand.
@@ -110,7 +195,7 @@ export function shipStatus(ship, lease) {
110
195
  }
111
196
  // argo and the viewer ship are the console's own: argo's crew is the console, signed in or not
112
197
  // (decision 0012), and the viewer ship is a door into it, always open (decision 0022).
113
- return lease.isCrewed || ship.kind !== 'agent' ? 'crewed' : 'awaitingCrew';
198
+ return lease.isCrewed || isConsoleShip(ship) ? 'crewed' : 'awaitingCrew';
114
199
  }
115
200
  const STATUS_WORDS = {
116
201
  awaitingCrew: 'awaiting crew',
@@ -122,7 +207,7 @@ const STATUS_WORDS = {
122
207
  * it has no secret, and only the operator's console sign-in crews it (ADR 0012).
123
208
  */
124
209
  export function checkCanIssueStartingPrompt(ship, lease) {
125
- if (ship.kind !== 'agent') {
210
+ if (isConsoleShip(ship)) {
126
211
  return refuse('OPERATOR_SHIP_GETS_NO_STARTING_PROMPT', `${ship.name} has no secret: only the operator's console sign-in crews it, so it gets no starting prompt`);
127
212
  }
128
213
  const status = shipStatus(ship, lease);
@@ -1 +1 @@
1
- {"version":3,"file":"ship.js","sourceRoot":"","sources":["../../../src/domain/registry/ship.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ship.js","sourceRoot":"","sources":["../../../src/domain/registry/ship.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,GAQP,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAA6B,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAA8C,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAoC1C,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAE7C,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,KAAwD;IACnF,OAAO;QACL,GAAG,KAAK;QACR,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;QACnB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAEzC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAwD;IACjF,OAAO;QACL,GAAG,KAAK;QACR,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC,YAAY,CAAC;QACtB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC;AAED,0HAA0H;AAC1H,MAAM,eAAe,GAAsC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AAExH;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAwB;IACpD,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;AAClD,CAAC;AAED,0HAA0H;AAC1H,MAAM,CAAC,MAAM,YAAY,GAAqB,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAEpF,0DAA0D;AAC1D,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AAC/C,CAAC;AAeD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,KAiBC,EACD,KAIC;IAED,MAAM,EAAE,IAAI,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;IACjC,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC,gCAAgC,EAAE,2BAA2B,IAAI,yCAAyC,CAAC,CAAC;IAC5H,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IACpH,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC7F,OAAO,MAAM,CAAC,gBAAgB,EAAE,qGAAqG,CAAC,CAAC;IACzI,CAAC;IAED,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACzC,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,IAAI,GAAS;QACjB,EAAE;QACF,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,KAAK;QAChB,IAAI,EAAE,IAAI,CAAC,KAAK;QAChB,IAAI;QACJ,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtK,IAAI,EAAE,IAAI,CAAC,KAAK;QAChB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,KAAK,CAAC,WAAW;KACzB,CAAC;IACF,OAAO,EAAE,CAAC;QACR,IAAI;QACJ,MAAM,EAAE;YACN;gBACE,OAAO;gBACP,IAAI,EAAE,kBAAkB;gBACxB,UAAU,EAAE,EAAE;gBACd,KAAK;gBACL,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;aAC9F;YACD,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;SACjF;KACF,CAAC,CAAC;AACL,CAAC;AAOD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,IAAU,EACV,MAAiF;IAEjF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACzB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC,IAAI,6CAA6C,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,IAAI,wCAAwC,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,KAAK,EAAE,SAAS,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;QACxF,OAAO,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,CAAC;QACR,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;QAClC,MAAM,EAAE;YACN;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,MAAM,CAAC,EAAE;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE;aACzE;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,KAAoE;IAC7F,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IACvD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,KAAK,IAAI,UAAU,EAAE,GAAG,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;IAC9G,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;AACjJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,KAA4B;IACjE,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,+FAA+F;IAC/F,uFAAuF;IACvF,OAAO,KAAK,CAAC,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC;AAC3E,CAAC;AAED,MAAM,YAAY,GAA+B;IAC/C,YAAY,EAAE,eAAe;IAC7B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAU,EACV,KAA4B;IAE5B,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CACX,uCAAuC,EACvC,GAAG,IAAI,CAAC,IAAI,6FAA6F,CAC1G,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,MAAM,KAAK,cAAc;QAC9B,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACf,CAAC,CAAC,MAAM,CACJ,wBAAwB,EACxB,GAAG,IAAI,CAAC,IAAI,OAAO,YAAY,CAAC,MAAM,CAAC,6DAA6D,CACrG,CAAC;AACR,CAAC;AAID;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAU,EAAE,KAA4B;IACvE,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,6BAA6B,EAAE,GAAG,IAAI,CAAC,IAAI,wDAAwD,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,6BAA6B,EAAE,GAAG,IAAI,CAAC,IAAI,4DAA4D,CAAC,CAAC;IACzH,CAAC;IACD,QAAQ,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,QAAQ;YACX,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,IAAI,oDAAoD,CAAC,CAAC;QAC1G,KAAK,cAAc;YACjB,OAAO,MAAM,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,IAAI,mDAAmD,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAID;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CACvB,IAAkD,EAClD,KAAiG;IAEjG,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACjC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,6BAA6B,EAAE,GAAG,IAAI,CAAC,IAAI,8DAA8D,CAAC,CAAC;IAC3H,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,6BAA6B,EAAE,GAAG,IAAI,CAAC,IAAI,kFAAkF,CAAC,CAAC;IAC/I,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC;IACvE,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QAC9B,OAAO,MAAM,CACX,wBAAwB,EACxB,GAAG,IAAI,CAAC,IAAI,OAAO,YAAY,CAAC,MAAM,CAAC,qDAAqD,CAC7F,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IACvD,MAAM,KAAK,GAAU;QACnB,EAAE,EAAE,OAAO;QACX,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,QAAQ;QACR,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa;QACb,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,IAAI;KACd,CAAC;IACF,OAAO,EAAE,CAAC;QACR,KAAK;QACL,MAAM,EAAE;YACN;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;aACjH;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAU;IACpC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,uBAAuB,EAAE,GAAG,IAAI,CAAC,IAAI,oEAAoE,CAAC,CAAC;IAC3H,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI;QAC5B,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QACvC,CAAC,CAAC,MAAM,CAAC,uBAAuB,EAAE,GAAG,IAAI,CAAC,IAAI,sDAAsD,CAAC,CAAC;AAC1G,CAAC;AAED,6DAA6D;AAC7D,MAAM,cAAc,GAAgC,IAAI,GAAG,CAAC;IAC1D,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;IACzC,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAKD,gGAAgG;AAChG,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,oBAAoB,EAAE,YAAY,IAAI,oBAAoB,OAAO,EAAE,CAAC,CAAC;AAC7H,CAAC;AAMD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAU;IACvC,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI;QAC5B,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACf,CAAC,CAAC,MAAM,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,IAAI,mDAAmD,CAAC,CAAC;AACtG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAU,EAAE,SAA4B;IACtE,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC;IACvE,IAAI,SAAS,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAAE,CAAC;QACrG,OAAO,MAAM,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,IAAI,OAAO,YAAY,CAAC,MAAM,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAU,EACV,IAAwD;IAExD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACpC,OAAO,SAAS,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAU,EAAE,OAAe;IACxD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtE,CAAC;AAOD;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CACxB,IAAU,EACV,MAAmF;IAEnF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,IAAI,mDAAmD,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;QACpE,OAAO,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,CAAC;QACR,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE;QACnC,MAAM,EAAE;YACN;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,MAAM,CAAC,EAAE;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE;aAC7C;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAID,kIAAkI;AAClI,MAAM,UAAU,uBAAuB,CAAC,IAAU;IAChD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI;QAC5B,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACf,CAAC,CAAC,MAAM,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,IAAI,wCAAwC,CAAC,CAAC;AAC3F,CAAC;AAED,2HAA2H;AAC3H,SAAS,oBAAoB,CAAC,IAAU,EAAE,MAAgE;IACxG,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,4BAA4B,EAAE,GAAG,IAAI,CAAC,IAAI,OAAO,SAAS,qBAAqB,MAAM,EAAE,CAAC,CAAC;AACnJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * A crew's statement (decision 0047): what its ship is and offers, kept with
3
+ * the lease and versioned, so it goes when the lease ends and the next crew
4
+ * starts with none. Its shape is common's, checked at the edge; nothing here
5
+ * acts on it. Until a crew states one, the commission note stands in.
6
+ */
7
+ import type { DiscoveredStatement, Statement } from '@aeolus-fleet/common';
8
+ import type { Crew } from '../shared/caller.js';
9
+ import { type NewEvent } from '../shared/events.js';
10
+ /** The statement a lease holds, with its version: 1 for the first, one more on every change. */
11
+ export interface StatedStatement {
12
+ statement: Statement;
13
+ version: number;
14
+ }
15
+ /**
16
+ * The crew states its statement, whole: at the next version, with
17
+ * StatementSet caused by its ship, holding the lease, the version and how
18
+ * many capabilities, never the statement. The same statement again changes
19
+ * nothing and writes no event.
20
+ */
21
+ export declare function stateStatement(current: StatedStatement | null, input: {
22
+ crew: Crew;
23
+ statement: Statement;
24
+ at: Date;
25
+ }): {
26
+ stated: StatedStatement;
27
+ events: NewEvent[];
28
+ };
29
+ /** A ship's statement as discovery shows it: its crew's while one is stated, else its commission note, else none. */
30
+ export declare function discoveredStatementOf(ship: {
31
+ note: string | null;
32
+ }, stated: StatedStatement | null): DiscoveredStatement;
@@ -0,0 +1,39 @@
1
+ import { shipActor } from '../shared/events.js';
2
+ /**
3
+ * The crew states its statement, whole: at the next version, with
4
+ * StatementSet caused by its ship, holding the lease, the version and how
5
+ * many capabilities, never the statement. The same statement again changes
6
+ * nothing and writes no event.
7
+ */
8
+ export function stateStatement(current, input) {
9
+ const { crew, statement, at } = input;
10
+ if (current !== null && canonicalJson(current.statement) === canonicalJson(statement)) {
11
+ return { stated: current, events: [] };
12
+ }
13
+ const stated = { statement, version: (current?.version ?? 0) + 1 };
14
+ return {
15
+ stated,
16
+ events: [
17
+ {
18
+ fleetId: crew.fleetId,
19
+ type: 'StatementSet',
20
+ occurredAt: at,
21
+ actor: shipActor(crew.shipId),
22
+ shipId: crew.shipId,
23
+ details: { leaseId: crew.leaseId, version: stated.version, capabilities: statement.capabilities.length },
24
+ },
25
+ ],
26
+ };
27
+ }
28
+ /** A ship's statement as discovery shows it: its crew's while one is stated, else its commission note, else none. */
29
+ export function discoveredStatementOf(ship, stated) {
30
+ if (stated !== null) {
31
+ return { by: 'crew', version: stated.version, ...stated.statement };
32
+ }
33
+ return ship.note === null ? null : { by: 'commission', note: ship.note };
34
+ }
35
+ /** JSON with every object's keys in order, so two statements that differ only in key order are the same. */
36
+ function canonicalJson(value) {
37
+ return JSON.stringify(value, (_key, held) => held !== null && typeof held === 'object' && !Array.isArray(held) ? Object.fromEntries(Object.entries(held).sort(([one], [other]) => one.localeCompare(other))) : held);
38
+ }
39
+ //# sourceMappingURL=statement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statement.js","sourceRoot":"","sources":["../../../src/domain/registry/statement.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAQ/D;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAA+B,EAC/B,KAAqD;IAErD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IACtC,IAAI,OAAO,KAAK,IAAI,IAAI,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QACtF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,MAAM,GAAoB,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACpF,OAAO;QACL,MAAM;QACN,MAAM,EAAE;YACN;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE;aACzG;SACF;KACF,CAAC;AACJ,CAAC;AAED,qHAAqH;AACrH,MAAM,UAAU,qBAAqB,CAAC,IAA6B,EAAE,MAA8B;IACjG,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC3E,CAAC;AAED,4GAA4G;AAC5G,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAa,EAAE,EAAE,CACnD,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACvK,CAAC;AACJ,CAAC"}
@@ -21,7 +21,7 @@ export function createUnassignLabel(deps) {
21
21
  return refuse('LABEL_VALUE_NOT_FOUND', `The fleet has no label value ${input.valueId}`);
22
22
  }
23
23
  const owner = await tx.ships.find(fleetId, label.ownerShipId);
24
- const unassigned = unassignLabel({ label, ownerName: owner?.name ?? label.ownerShipId, carried: await tx.labels.carriedBy(fleetId, ship.id) }, { callerShipId: caller.shipId, valueId: input.valueId, at: deps.clock.now(), actor: shipActor(caller.shipId) });
24
+ const unassigned = unassignLabel({ label, ownerName: owner?.name ?? label.ownerShipId, ship, carried: await tx.labels.carriedBy(fleetId, ship.id) }, { callerShipId: caller.shipId, callerKind: caller.kind, valueId: input.valueId, at: deps.clock.now(), actor: shipActor(caller.shipId) });
25
25
  if (!unassigned.isOk) {
26
26
  return unassigned;
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"unassign-label.js","sourceRoot":"","sources":["../../../src/domain/registry/unassign-label.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,YAAY,CAAC;AAatE;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA0E;IAC5G,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAoD,EAAE;QAC1E,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,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,sFAAsF;QACtF,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,OAAO,MAAM,CAAC,uBAAuB,EAAE,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,aAAa,CAC9B,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAC5G,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAC/G,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5C,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"}
1
+ {"version":3,"file":"unassign-label.js","sourceRoot":"","sources":["../../../src/domain/registry/unassign-label.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,YAAY,CAAC;AAatE;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA0E;IAC5G,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAoD,EAAE;QAC1E,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,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,sFAAsF;QACtF,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,OAAO,MAAM,CAAC,uBAAuB,EAAE,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,aAAa,CAC9B,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAClH,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACxI,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5C,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"}
@@ -9,10 +9,14 @@ export interface ShipIdentity {
9
9
  fleetId: FleetId;
10
10
  name: string;
11
11
  type: string;
12
+ /** Its owner's id and name, both null for argo and the viewer (decision 0045). */
13
+ ownerShipId: ShipId | null;
14
+ ownerName: string | null;
12
15
  }
13
16
  export type Whoami = (caller: Caller) => Promise<Result<ShipIdentity, DomainError<'SHIP_NOT_FOUND'>>>;
14
17
  /**
15
- * Use case: tells the caller which ship it crews: id, fleet, name and type.
18
+ * Use case: tells the caller which ship it crews: id, fleet, name, type and
19
+ * owner.
16
20
  * Any caller may ask, whatever its scopes: it learns only about itself.
17
21
  */
18
22
  export declare function createWhoami(deps: {
@@ -1,15 +1,18 @@
1
1
  import { refuse } from '../shared/errors.js';
2
2
  import { ok } from '../shared/result.js';
3
3
  /**
4
- * Use case: tells the caller which ship it crews: id, fleet, name and type.
4
+ * Use case: tells the caller which ship it crews: id, fleet, name, type and
5
+ * owner.
5
6
  * Any caller may ask, whatever its scopes: it learns only about itself.
6
7
  */
7
8
  export function createWhoami(deps) {
8
9
  return async (caller) => {
9
10
  const ship = await deps.ships.find(caller.fleetId, caller.shipId);
10
- return ship
11
- ? ok({ shipId: ship.id, fleetId: ship.fleetId, name: ship.name, type: ship.type })
12
- : refuse('SHIP_NOT_FOUND', `Ship ${caller.shipId} does not exist`);
11
+ if (!ship) {
12
+ return refuse('SHIP_NOT_FOUND', `Ship ${caller.shipId} does not exist`);
13
+ }
14
+ const owner = ship.owner === null ? undefined : await deps.ships.find(caller.fleetId, ship.owner);
15
+ return ok({ shipId: ship.id, fleetId: ship.fleetId, name: ship.name, type: ship.type, ownerShipId: owner?.id ?? null, ownerName: owner?.name ?? null });
13
16
  };
14
17
  }
15
18
  //# sourceMappingURL=whoami.js.map