@aeolus-fleet/core 0.24.0 → 0.25.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 (158) hide show
  1. package/README.md +5 -5
  2. package/dist/adapters/prisma/generated/browser.d.ts +12 -3
  3. package/dist/adapters/prisma/generated/client.d.ts +12 -3
  4. package/dist/adapters/prisma/generated/commonInputTypes.d.ts +60 -0
  5. package/dist/adapters/prisma/generated/enums.d.ts +15 -1
  6. package/dist/adapters/prisma/generated/enums.js +13 -1
  7. package/dist/adapters/prisma/generated/enums.js.map +1 -1
  8. package/dist/adapters/prisma/generated/internal/class.d.ts +11 -0
  9. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  10. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  11. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +109 -1
  12. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +16 -0
  13. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  14. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +17 -0
  15. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +16 -0
  16. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  17. package/dist/adapters/prisma/generated/models/Delivery.d.ts +304 -4
  18. package/dist/adapters/prisma/generated/models/Fleet.d.ts +267 -0
  19. package/dist/adapters/prisma/generated/models/Lease.d.ts +332 -1
  20. package/dist/adapters/prisma/generated/models/OverdueDelivery.d.ts +1687 -0
  21. package/dist/adapters/prisma/generated/models/OverdueDelivery.js +2 -0
  22. package/dist/adapters/prisma/generated/models/OverdueDelivery.js.map +1 -0
  23. package/dist/adapters/prisma/generated/models/Ship.d.ts +271 -0
  24. package/dist/adapters/prisma/generated/models.d.ts +1 -0
  25. package/dist/adapters/prisma/history.js +231 -46
  26. package/dist/adapters/prisma/history.js.map +1 -1
  27. package/dist/adapters/prisma/installation.js +30 -1
  28. package/dist/adapters/prisma/installation.js.map +1 -1
  29. package/dist/adapters/prisma/messaging.js +11 -7
  30. package/dist/adapters/prisma/messaging.js.map +1 -1
  31. package/dist/adapters/prisma/overdue.d.ts +4 -0
  32. package/dist/adapters/prisma/overdue.js +63 -0
  33. package/dist/adapters/prisma/overdue.js.map +1 -0
  34. package/dist/adapters/prisma/registry.js +32 -7
  35. package/dist/adapters/prisma/registry.js.map +1 -1
  36. package/dist/adapters/prisma/rows.d.ts +12 -1
  37. package/dist/adapters/prisma/rows.js +46 -1
  38. package/dist/adapters/prisma/rows.js.map +1 -1
  39. package/dist/adapters/prisma/unit-of-work.d.ts +2 -1
  40. package/dist/adapters/prisma/unit-of-work.js +2 -0
  41. package/dist/adapters/prisma/unit-of-work.js.map +1 -1
  42. package/dist/adapters/trpc/context.d.ts +16 -0
  43. package/dist/adapters/trpc/fleet.d.ts +232 -14
  44. package/dist/adapters/trpc/fleet.js +49 -6
  45. package/dist/adapters/trpc/fleet.js.map +1 -1
  46. package/dist/adapters/trpc/installation.d.ts +14 -0
  47. package/dist/adapters/trpc/installation.js +7 -1
  48. package/dist/adapters/trpc/installation.js.map +1 -1
  49. package/dist/adapters/trpc/router.d.ts +301 -9
  50. package/dist/adapters/trpc/ship-protocol.js +2 -2
  51. package/dist/adapters/trpc/ship-protocol.js.map +1 -1
  52. package/dist/adapters/trpc/ship.d.ts +87 -0
  53. package/dist/adapters/trpc/ship.js +96 -1
  54. package/dist/adapters/trpc/ship.js.map +1 -1
  55. package/dist/adapters/trpc/starting-prompt-text.d.ts +1 -1
  56. package/dist/adapters/trpc/starting-prompt-text.js +22 -25
  57. package/dist/adapters/trpc/starting-prompt-text.js.map +1 -1
  58. package/dist/adapters/trpc/trpc.js +3 -0
  59. package/dist/adapters/trpc/trpc.js.map +1 -1
  60. package/dist/app.d.ts +4 -2
  61. package/dist/app.js +21 -9
  62. package/dist/app.js.map +1 -1
  63. package/dist/domain/messaging/delivery.d.ts +88 -28
  64. package/dist/domain/messaging/delivery.js +213 -39
  65. package/dist/domain/messaging/delivery.js.map +1 -1
  66. package/dist/domain/messaging/dismiss-delivery.d.ts +1 -1
  67. package/dist/domain/messaging/dismiss-delivery.js +1 -1
  68. package/dist/domain/messaging/hand-over-delivery.d.ts +38 -0
  69. package/dist/domain/messaging/hand-over-delivery.js +46 -0
  70. package/dist/domain/messaging/hand-over-delivery.js.map +1 -0
  71. package/dist/domain/messaging/message.d.ts +12 -1
  72. package/dist/domain/messaging/message.js +2 -0
  73. package/dist/domain/messaging/message.js.map +1 -1
  74. package/dist/domain/messaging/overdue.d.ts +60 -0
  75. package/dist/domain/messaging/overdue.js +52 -0
  76. package/dist/domain/messaging/overdue.js.map +1 -0
  77. package/dist/domain/messaging/ports.d.ts +20 -0
  78. package/dist/domain/messaging/public.d.ts +1 -0
  79. package/dist/domain/messaging/public.js +2 -0
  80. package/dist/domain/messaging/public.js.map +1 -0
  81. package/dist/domain/messaging/push-receive-deliveries.d.ts +48 -0
  82. package/dist/domain/messaging/push-receive-deliveries.js +70 -0
  83. package/dist/domain/messaging/push-receive-deliveries.js.map +1 -0
  84. package/dist/domain/messaging/receive-deliveries.d.ts +39 -6
  85. package/dist/domain/messaging/receive-deliveries.js +80 -50
  86. package/dist/domain/messaging/receive-deliveries.js.map +1 -1
  87. package/dist/domain/messaging/report-handled.d.ts +22 -0
  88. package/dist/domain/messaging/report-handled.js +13 -0
  89. package/dist/domain/messaging/report-handled.js.map +1 -0
  90. package/dist/domain/messaging/report-not-handled.d.ts +22 -0
  91. package/dist/domain/messaging/report-not-handled.js +13 -0
  92. package/dist/domain/messaging/report-not-handled.js.map +1 -0
  93. package/dist/domain/messaging/report-turn-end.d.ts +29 -0
  94. package/dist/domain/messaging/report-turn-end.js +36 -0
  95. package/dist/domain/messaging/report-turn-end.js.map +1 -0
  96. package/dist/domain/messaging/resend-delivery.d.ts +1 -1
  97. package/dist/domain/messaging/resend-delivery.js +1 -1
  98. package/dist/domain/messaging/tell-overdue-deliveries.d.ts +25 -0
  99. package/dist/domain/messaging/tell-overdue-deliveries.js +30 -0
  100. package/dist/domain/messaging/tell-overdue-deliveries.js.map +1 -0
  101. package/dist/domain/registry/installation-fleet.d.ts +3 -2
  102. package/dist/domain/registry/installation-fleet.js.map +1 -1
  103. package/dist/domain/registry/leases.d.ts +26 -0
  104. package/dist/domain/registry/leases.js +26 -1
  105. package/dist/domain/registry/leases.js.map +1 -1
  106. package/dist/domain/registry/ping-status.d.ts +2 -2
  107. package/dist/domain/registry/ping-status.js +7 -4
  108. package/dist/domain/registry/ping-status.js.map +1 -1
  109. package/dist/domain/registry/ports.d.ts +40 -0
  110. package/dist/domain/registry/public.d.ts +2 -2
  111. package/dist/domain/registry/public.js +1 -1
  112. package/dist/domain/registry/public.js.map +1 -1
  113. package/dist/domain/registry/report-turn.d.ts +28 -0
  114. package/dist/domain/registry/report-turn.js +28 -0
  115. package/dist/domain/registry/report-turn.js.map +1 -0
  116. package/dist/domain/registry/turn.d.ts +25 -0
  117. package/dist/domain/registry/turn.js +30 -0
  118. package/dist/domain/registry/turn.js.map +1 -0
  119. package/dist/domain/shared/delivery-way.d.ts +83 -0
  120. package/dist/domain/shared/delivery-way.js +89 -0
  121. package/dist/domain/shared/delivery-way.js.map +1 -0
  122. package/dist/domain/shared/errors.d.ts +1 -1
  123. package/dist/domain/shared/errors.js.map +1 -1
  124. package/dist/domain/shared/history.d.ts +116 -19
  125. package/dist/domain/shared/history.js +1 -1
  126. package/dist/domain/shared/history.js.map +1 -1
  127. package/dist/domain/shared/read-message.d.ts +7 -3
  128. package/dist/domain/shared/read-message.js +7 -4
  129. package/dist/domain/shared/read-message.js.map +1 -1
  130. package/dist/domain/shared/read-needs-attention.d.ts +5 -5
  131. package/dist/domain/shared/read-needs-attention.js +4 -4
  132. package/dist/domain/shared/read-needs-attention.js.map +1 -1
  133. package/dist/domain/shared/read-no-ship-can-take.d.ts +13 -0
  134. package/dist/domain/shared/read-no-ship-can-take.js +12 -0
  135. package/dist/domain/shared/read-no-ship-can-take.js.map +1 -0
  136. package/dist/domain/shared/read-overdue.d.ts +13 -0
  137. package/dist/domain/shared/read-overdue.js +12 -0
  138. package/dist/domain/shared/read-overdue.js.map +1 -0
  139. package/dist/domain/shared/read-ship-messages.d.ts +4 -1
  140. package/dist/domain/shared/read-ship-messages.js +6 -1
  141. package/dist/domain/shared/read-ship-messages.js.map +1 -1
  142. package/dist/domain/shared/read-ship-way.d.ts +41 -0
  143. package/dist/domain/shared/read-ship-way.js +39 -0
  144. package/dist/domain/shared/read-ship-way.js.map +1 -0
  145. package/dist/repeating-pass.d.ts +15 -0
  146. package/dist/repeating-pass.js +31 -0
  147. package/dist/repeating-pass.js.map +1 -0
  148. package/dist/wiring.d.ts +19 -0
  149. package/dist/wiring.js +25 -0
  150. package/dist/wiring.js.map +1 -1
  151. package/package.json +2 -2
  152. package/src/adapters/prisma/migrations/20261012190000_delivery_handed/migration.sql +11 -0
  153. package/src/adapters/prisma/migrations/20261012210000_push_receive/migration.sql +7 -0
  154. package/src/adapters/prisma/migrations/20261013090000_handled/migration.sql +6 -0
  155. package/src/adapters/prisma/migrations/20261013100000_turn/migration.sql +6 -0
  156. package/src/adapters/prisma/migrations/20261013120000_overdue/migration.sql +28 -0
  157. package/src/adapters/prisma/migrations/20261013140000_delivery_state_index/migration.sql +4 -0
  158. package/src/adapters/prisma/schema.prisma +66 -4
@@ -4,25 +4,25 @@ import { shipActor } from '../shared/events.js';
4
4
  import { ok } from '../shared/result.js';
5
5
  /**
6
6
  * The Delivery's rules once it is stored (docs/blueprint.md, "Key flows"): a
7
- * receive claims it, the claiming ship acknowledges it, and a delivery that
8
- * keeps being claimed without an acknowledgement stops, undeliverable, where
9
- * the operator sees it.
7
+ * plain receive hands it over at once, a push receive takes it for the
8
+ * computer side to hand over, the ship it was handed to acknowledges it,
9
+ * and a delivery that keeps being handed over without an acknowledgement
10
+ * stops, undeliverable, where the operator sees it.
10
11
  */
11
12
  /**
12
- * The claim at which a delivery never acknowledged becomes undeliverable
13
- * instead of being handed out again: the fifth. A poison message stops there
13
+ * The attempt at which a delivery never acknowledged becomes undeliverable
14
+ * instead of being handed over again: the fifth. A poison message stops there
14
15
  * rather than looping forever.
15
16
  */
16
- export const UNDELIVERABLE_AT_CLAIM = 5;
17
+ export const UNDELIVERABLE_AT_ATTEMPT = 5;
17
18
  /**
18
- * A crew claims a delivery it may take: one pending for its ship or its type,
19
- * or one of its own in flight, returned again after a lost reply. Every claim
20
- * counts. The claim that reaches the fifth makes the delivery undeliverable
21
- * and hands it to no one; before that, the delivery is in flight with the
22
- * crew's ship and lease. Either change is caused by the receiving ship.
19
+ * Counts one attempt at handing the delivery to the crew: the fifth makes it
20
+ * undeliverable and hands it to no one; before that, it is handed, in flight
21
+ * with the crew's ship and lease. A hand-over by a push receive's crew keeps
22
+ * its number. Either change is caused by the receiving ship.
23
23
  */
24
- export function claimDelivery(delivery, claim) {
25
- const { crew, at } = claim;
24
+ function countAttempt(delivery, attempt) {
25
+ const { crew, at, handOverNumber } = attempt;
26
26
  const attempts = delivery.attempts + 1;
27
27
  const concerns = {
28
28
  fleetId: delivery.fleetId,
@@ -31,36 +31,204 @@ export function claimDelivery(delivery, claim) {
31
31
  shipId: crew.shipId,
32
32
  messageId: delivery.messageId,
33
33
  deliveryId: delivery.id,
34
- details: { leaseId: crew.leaseId, attempts },
34
+ details: { leaseId: crew.leaseId, attempts, ...(handOverNumber !== null && { handOverNumber }) },
35
35
  };
36
- if (attempts >= UNDELIVERABLE_AT_CLAIM) {
36
+ if (attempts >= UNDELIVERABLE_AT_ATTEMPT) {
37
37
  return {
38
38
  outcome: 'undeliverable',
39
- delivery: { ...delivery, state: 'undeliverable', claimedByShipId: null, claimedByLeaseId: null, attempts },
39
+ delivery: { ...delivery, state: 'undeliverable', claimedByShipId: null, claimedByLeaseId: null, attempts, handOverNumber },
40
40
  events: [{ ...concerns, type: 'DeliveryUndeliverable' }],
41
41
  };
42
42
  }
43
43
  return {
44
- outcome: 'claimed',
45
- delivery: { ...delivery, state: 'delivered', claimedByShipId: crew.shipId, claimedByLeaseId: crew.leaseId, attempts },
46
- events: [{ ...concerns, type: 'DeliveryClaimed' }],
44
+ outcome: 'handed',
45
+ delivery: { ...delivery, state: 'handed', claimedByShipId: crew.shipId, claimedByLeaseId: crew.leaseId, attempts, handOverNumber },
46
+ events: [{ ...concerns, type: 'DeliveryHanded' }],
47
47
  };
48
48
  }
49
+ /**
50
+ * A plain receive hands a crew a delivery it may take at once: one pending
51
+ * for its ship or its type, or one of its own handed, again after a lost
52
+ * reply. Every plain receive is one attempt (see `countAttempt`).
53
+ */
54
+ export function handDelivery(delivery, handOver) {
55
+ return countAttempt(delivery, { ...handOver, handOverNumber: null });
56
+ }
57
+ /**
58
+ * A push receive takes a delivery for the crew's computer side, which hands
59
+ * it to the agent later (decision 0040). A pending one becomes received, in
60
+ * flight with the crew's ship and lease, with no attempt counted and no
61
+ * hand-over number yet. One of the crew's own in flight, received or handed,
62
+ * is received again: nothing changes, and DeliveryReceived marked again says
63
+ * so. The repository returns nothing else to a push receive.
64
+ */
65
+ export function pushReceiveDelivery(delivery, receipt) {
66
+ const { crew, at } = receipt;
67
+ const isAgain = delivery.state !== 'pending';
68
+ const event = {
69
+ fleetId: delivery.fleetId,
70
+ type: 'DeliveryReceived',
71
+ occurredAt: at,
72
+ actor: shipActor(crew.shipId),
73
+ shipId: crew.shipId,
74
+ messageId: delivery.messageId,
75
+ deliveryId: delivery.id,
76
+ details: { leaseId: crew.leaseId, ...(isAgain && { again: true }) },
77
+ };
78
+ return isAgain
79
+ ? { delivery, events: [event] }
80
+ : {
81
+ delivery: { ...delivery, state: 'received', claimedByShipId: crew.shipId, claimedByLeaseId: crew.leaseId, handOverNumber: null },
82
+ events: [event],
83
+ };
84
+ }
85
+ /**
86
+ * The crew's computer side reports it handed a delivery to the agent, with
87
+ * its hand-over number (decision 0040). A higher number than the last is a
88
+ * new hand-over and counts one attempt; the fifth is undeliverable and
89
+ * nothing is handed. The same number again, or a lower one, is a lost
90
+ * answer: OK, and nothing changes, also once the agent acknowledged it. Only
91
+ * the crew holding the delivery hands it over; one that is not in flight is
92
+ * refused. Handed once more is its own rule (see `handOnceMore`).
93
+ */
94
+ export function handOverDelivery(delivery, handOver) {
95
+ const { crew, handOverNumber, at } = handOver;
96
+ const isRepeat = delivery.handOverNumber !== null && handOverNumber <= delivery.handOverNumber;
97
+ switch (delivery.state) {
98
+ case 'received':
99
+ case 'handed':
100
+ case 'acknowledged': {
101
+ if (delivery.claimedByLeaseId !== crew.leaseId) {
102
+ return refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another ship: only the crew that received it hands it over`);
103
+ }
104
+ if (handOver.isOnceMore) {
105
+ return handOnceMore(delivery, handOver);
106
+ }
107
+ if (delivery.state !== 'received' && isRepeat) {
108
+ return ok({ state: delivery.state, delivery, events: [] });
109
+ }
110
+ if (delivery.state === 'acknowledged') {
111
+ return refuse('DELIVERY_NOT_IN_FLIGHT', `Delivery ${delivery.id} is acknowledged, not in flight: its agent confirmed it, so hand it only once more, after its turn died`);
112
+ }
113
+ const { outcome, delivery: changed, events } = countAttempt(delivery, { crew, at, handOverNumber });
114
+ return ok({ state: outcome, delivery: changed, events });
115
+ }
116
+ case 'pending':
117
+ case 'handled':
118
+ case 'notHandled':
119
+ case 'undeliverable':
120
+ case 'dismissed':
121
+ case 'abandoned':
122
+ return refuse('DELIVERY_NOT_IN_FLIGHT', `Delivery ${delivery.id} is ${delivery.state}, not in flight: hand over a delivery once a push receive took it`);
123
+ }
124
+ }
125
+ /**
126
+ * A confirmed message whose turn or session died is handed once more, the
127
+ * one retry (decision 0040). The fleet's promise ended at the ack, so it stays
128
+ * acknowledged and counts no attempt; DeliveryHanded marked once more records
129
+ * it. Its repeat, at the same or a lower number, is a lost answer: OK, and
130
+ * nothing changes. A second once more is refused: if that turn dies too, the
131
+ * message is not handled. Only an acknowledged delivery is handed once more.
132
+ */
133
+ function handOnceMore(delivery, handOver) {
134
+ const { crew, handOverNumber, at } = handOver;
135
+ if (delivery.state !== 'acknowledged') {
136
+ return refuse('DELIVERY_NOT_ACKNOWLEDGED', `Delivery ${delivery.id} is ${delivery.state}, not acknowledged: only a confirmed message is handed once more`);
137
+ }
138
+ if (delivery.handedOnceMoreAt !== null) {
139
+ return delivery.handOverNumber !== null && handOverNumber <= delivery.handOverNumber
140
+ ? ok({ state: delivery.state, delivery, events: [] })
141
+ : refuse('DELIVERY_HANDED_ONCE_MORE', `Delivery ${delivery.id} was handed once more already: if that turn died too, report it not handled`);
142
+ }
143
+ return ok({
144
+ state: delivery.state,
145
+ delivery: { ...delivery, handOverNumber, handedOnceMoreAt: at },
146
+ events: [
147
+ {
148
+ fleetId: delivery.fleetId,
149
+ type: 'DeliveryHanded',
150
+ occurredAt: at,
151
+ actor: shipActor(crew.shipId),
152
+ shipId: crew.shipId,
153
+ messageId: delivery.messageId,
154
+ deliveryId: delivery.id,
155
+ details: { leaseId: crew.leaseId, attempts: delivery.attempts, handOverNumber, onceMore: true },
156
+ },
157
+ ],
158
+ });
159
+ }
160
+ /**
161
+ * A pushed crew reports how the turn that took an acknowledged delivery
162
+ * ended (decision 0040): handled when it ended by itself, not handled when
163
+ * the turn it was handed once more to died too. Either writes its event,
164
+ * DeliveryHandled or DeliveryNotHandled, and keeps who it was handed to.
165
+ * The same report again is harmless: OK, and nothing changes. A delivery not
166
+ * acknowledged yet, or that ended the other way, is refused, so a ping not
167
+ * answered with pong stays handed. Not handled needs the once more first.
168
+ * Only the crew holding the delivery reports it.
169
+ */
170
+ export function endTurn(delivery, report) {
171
+ const { crew, end, at } = report;
172
+ switch (delivery.state) {
173
+ case 'received':
174
+ case 'handed':
175
+ case 'acknowledged':
176
+ case 'handled':
177
+ case 'notHandled': {
178
+ if (delivery.claimedByLeaseId !== crew.leaseId) {
179
+ return refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another ship: only the crew it was handed to reports its turn`);
180
+ }
181
+ if (delivery.state === end) {
182
+ return ok({ delivery, events: [] });
183
+ }
184
+ if (delivery.state !== 'acknowledged') {
185
+ return refuse('DELIVERY_NOT_ACKNOWLEDGED', `Delivery ${delivery.id} is ${delivery.state}, not acknowledged: report how its turn ended once the agent confirmed it`);
186
+ }
187
+ if (end === 'notHandled' && delivery.handedOnceMoreAt === null) {
188
+ return refuse('DELIVERY_NOT_HANDED_ONCE_MORE', `Delivery ${delivery.id} was never handed once more: hand it once more after its turn died, and report it not handled only if that turn dies too`);
189
+ }
190
+ return ok({
191
+ delivery: { ...delivery, state: end },
192
+ events: [
193
+ {
194
+ fleetId: delivery.fleetId,
195
+ type: end === 'handled' ? 'DeliveryHandled' : 'DeliveryNotHandled',
196
+ occurredAt: at,
197
+ actor: shipActor(crew.shipId),
198
+ shipId: crew.shipId,
199
+ messageId: delivery.messageId,
200
+ deliveryId: delivery.id,
201
+ details: { leaseId: crew.leaseId },
202
+ },
203
+ ],
204
+ });
205
+ }
206
+ case 'pending':
207
+ case 'undeliverable':
208
+ case 'dismissed':
209
+ case 'abandoned':
210
+ return refuse('DELIVERY_NOT_IN_FLIGHT', `Delivery ${delivery.id} is ${delivery.state}, not in flight: report how its turn ended once the agent confirmed it`);
211
+ }
212
+ }
49
213
  /**
50
214
  * The ship takes responsibility for a delivery it received (ADR 0001): only a
51
- * delivery in flight with that ship moves to acknowledged, keeping who claimed
52
- * it. Acknowledging it again is harmless: OK, and nothing changes. A delivery
215
+ * delivery in flight with that ship, received or handed, moves to
216
+ * acknowledged, keeping who it was handed to. A received one is taken too, so
217
+ * a lost answer to handed never blocks the agent's confirmation. Acknowledging it again, also once handled or not handled, is harmless: OK, and nothing changes. A delivery
53
218
  * another ship holds or acknowledged, or one that is not in flight, is refused.
54
219
  */
55
220
  export function acknowledgeDelivery(delivery, ack) {
56
221
  const { crew, at } = ack;
57
222
  switch (delivery.state) {
58
- case 'delivered':
223
+ case 'received':
224
+ case 'handed':
59
225
  case 'acknowledged':
226
+ case 'handled':
227
+ case 'notHandled':
60
228
  if (delivery.claimedByShipId !== crew.shipId) {
61
229
  return refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another ship: only the ship that received it acknowledges it`);
62
230
  }
63
- if (delivery.state === 'acknowledged') {
231
+ if (delivery.state !== 'received' && delivery.state !== 'handed') {
64
232
  return ok({ delivery, events: [] });
65
233
  }
66
234
  return ok({
@@ -103,18 +271,19 @@ export function answerPing(delivery, pong) {
103
271
  return ok({ delivery: acknowledged.value.delivery, events });
104
272
  }
105
273
  /**
106
- * The operator lets an undeliverable delivery go (docs/blueprint.md,
107
- * "DeliveryUndeliverable"): it becomes dismissed, kept in history with its
108
- * claims, and leaves Needs attention. The event names the ship it was for; a
109
- * delivery to a type names none. Dismissing it again is harmless: OK, and
110
- * nothing changes. Any other delivery is refused: only an undeliverable one
111
- * waits for the operator.
274
+ * The operator lets an undeliverable or not handled delivery go
275
+ * (docs/blueprint.md, "DeliveryUndeliverable"): it becomes dismissed, kept in
276
+ * history with its claims, and leaves Needs attention. The event names the
277
+ * ship it was for; a delivery to a type names none. Dismissing it again is
278
+ * harmless: OK, and nothing changes. Any other delivery is refused: only
279
+ * those two wait for the operator.
112
280
  */
113
281
  export function dismissDelivery(delivery, dismiss) {
114
282
  switch (delivery.state) {
115
283
  case 'dismissed':
116
284
  return ok({ delivery, events: [] });
117
285
  case 'undeliverable':
286
+ case 'notHandled':
118
287
  return ok({
119
288
  delivery: { ...delivery, state: 'dismissed' },
120
289
  events: [
@@ -130,25 +299,27 @@ export function dismissDelivery(delivery, dismiss) {
130
299
  ],
131
300
  });
132
301
  case 'pending':
133
- case 'delivered':
302
+ case 'received':
303
+ case 'handed':
134
304
  case 'acknowledged':
305
+ case 'handled':
135
306
  case 'abandoned':
136
- return refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}, not undeliverable: only an undeliverable delivery is dismissed`);
307
+ return refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}: only an undeliverable or not handled delivery is dismissed`);
137
308
  }
138
309
  }
139
310
  /**
140
- * A resend dismisses the delivery it resends, which must be undeliverable:
141
- * one already dismissed has nothing left to resend.
311
+ * A resend dismisses the delivery it resends, which must be undeliverable or
312
+ * not handled: one already dismissed has nothing left to resend.
142
313
  */
143
314
  export function dismissForResend(delivery, dismiss) {
144
- return delivery.state === 'undeliverable'
315
+ return delivery.state === 'undeliverable' || delivery.state === 'notHandled'
145
316
  ? dismissDelivery(delivery, dismiss)
146
- : refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}, not undeliverable: only an undeliverable delivery is resent`);
317
+ : refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}: only an undeliverable or not handled delivery is resent`);
147
318
  }
148
319
  /**
149
320
  * argo marks a message to it done (docs/blueprint.md, "Inbox"): the console
150
- * never receives, so an open delivery is claimed and acknowledged at once
151
- * under the console session's lease, one claim counted, and its two events
321
+ * never receives, so an open delivery is handed and acknowledged at once
322
+ * under the console session's lease, one attempt counted, and its two events
152
323
  * written as a receive and an ack would write them. One the session already
153
324
  * holds in flight is only acknowledged. The acknowledgement names the reply
154
325
  * that made it done, when a reply did. Marking it done again is harmless: OK,
@@ -176,15 +347,18 @@ export function markDone(delivery, done) {
176
347
  };
177
348
  switch (delivery.state) {
178
349
  case 'acknowledged':
350
+ case 'handled':
351
+ case 'notHandled':
179
352
  return ok({ delivery, events: [] });
180
353
  case 'pending': {
181
354
  const attempts = delivery.attempts + 1;
182
355
  return ok({
183
356
  delivery: { ...delivery, state: 'acknowledged', claimedByShipId: crew.shipId, claimedByLeaseId: crew.leaseId, attempts },
184
- events: [{ ...concerns, type: 'DeliveryClaimed', details: { leaseId: crew.leaseId, attempts } }, acknowledged],
357
+ events: [{ ...concerns, type: 'DeliveryHanded', details: { leaseId: crew.leaseId, attempts } }, acknowledged],
185
358
  });
186
359
  }
187
- case 'delivered':
360
+ case 'received':
361
+ case 'handed':
188
362
  return delivery.claimedByLeaseId === crew.leaseId
189
363
  ? ok({ delivery: { ...delivery, state: 'acknowledged' }, events: [acknowledged] })
190
364
  : refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another session`);
@@ -1 +1 @@
1
- {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/delivery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/delivery.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export type DismissDelivery = (caller: Caller, input: {
16
16
  deliveryId: DeliveryId;
17
17
  }) => Promise<Result<undefined, DismissDeliveryRefusal>>;
18
18
  /**
19
- * Use case: the operator dismisses an undeliverable delivery from Needs
19
+ * Use case: the operator dismisses an undeliverable or not handled delivery from Needs
20
20
  * attention. Its scope (fleet:manage) is checked before this runs. The
21
21
  * delivery, locked, becomes dismissed with DeliveryDismissed in one unit of
22
22
  * work, so a resend of the same delivery waits and then finds it dismissed.
@@ -3,7 +3,7 @@ import { recordEvent } from '../shared/events.js';
3
3
  import { ok } from '../shared/result.js';
4
4
  import { dismissDelivery } from './delivery.js';
5
5
  /**
6
- * Use case: the operator dismisses an undeliverable delivery from Needs
6
+ * Use case: the operator dismisses an undeliverable or not handled delivery from Needs
7
7
  * attention. Its scope (fleet:manage) is checked before this runs. The
8
8
  * delivery, locked, becomes dismissed with DeliveryDismissed in one unit of
9
9
  * work, so a resend of the same delivery waits and then finds it dismissed.
@@ -0,0 +1,38 @@
1
+ import type { DeliveryId, IdGenerator } from '@aeolus-fleet/common';
2
+ import { type HoldLeaseTx, type LeaseEnded } from '../registry/public.js';
3
+ import type { Crew } from '../shared/caller.js';
4
+ import type { Clock } from '../shared/clock.js';
5
+ import { type DomainError } from '../shared/errors.js';
6
+ import { type EventLog } from '../shared/events.js';
7
+ import { type Result } from '../shared/result.js';
8
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
9
+ import { type HandedState, type HandOverRefusal } from './delivery.js';
10
+ import type { DeliveryRepository } from './ports.js';
11
+ export interface HandOverDeliveryTx extends HoldLeaseTx {
12
+ deliveries: Pick<DeliveryRepository, 'findForUpdate' | 'update'>;
13
+ events: EventLog;
14
+ }
15
+ export type HandOverDeliveryRefusal = DomainError<'DELIVERY_NOT_FOUND'> | HandOverRefusal | LeaseEnded;
16
+ export type HandOverDelivery = (crew: Crew, input: {
17
+ deliveryId: DeliveryId;
18
+ handOverNumber: number;
19
+ isOnceMore?: boolean;
20
+ }) => Promise<Result<{
21
+ state: HandedState;
22
+ }, HandOverDeliveryRefusal>>;
23
+ /**
24
+ * Use case: the crew's computer side reports it handed a delivery to the
25
+ * agent (`handed`, decision 0040), with its hand-over number. Its scope
26
+ * (messages:receive) is checked before this runs. In one unit of work it
27
+ * holds the crew's lease, so a release waits for it, locks the delivery and
28
+ * applies the hand-over: a new number counts one attempt and writes
29
+ * DeliveryHanded, the fifth is undeliverable instead, and a repeated number
30
+ * changes nothing. Handed once more keeps a confirmed message acknowledged
31
+ * and writes DeliveryHanded marked once more, only once. The lock makes a hand-over, an ack and a receive of the
32
+ * same delivery take turns. It answers where the delivery stands.
33
+ */
34
+ export declare function createHandOverDelivery(deps: {
35
+ uow: UnitOfWork<HandOverDeliveryTx>;
36
+ clock: Clock;
37
+ ids: IdGenerator;
38
+ }): HandOverDelivery;
@@ -0,0 +1,46 @@
1
+ import { holdLease } from '../registry/public.js';
2
+ import { refuse } from '../shared/errors.js';
3
+ import { recordEvent } from '../shared/events.js';
4
+ import { ok } from '../shared/result.js';
5
+ import { handOverDelivery } from './delivery.js';
6
+ /**
7
+ * Use case: the crew's computer side reports it handed a delivery to the
8
+ * agent (`handed`, decision 0040), with its hand-over number. Its scope
9
+ * (messages:receive) is checked before this runs. In one unit of work it
10
+ * holds the crew's lease, so a release waits for it, locks the delivery and
11
+ * applies the hand-over: a new number counts one attempt and writes
12
+ * DeliveryHanded, the fifth is undeliverable instead, and a repeated number
13
+ * changes nothing. Handed once more keeps a confirmed message acknowledged
14
+ * and writes DeliveryHanded marked once more, only once. The lock makes a hand-over, an ack and a receive of the
15
+ * same delivery take turns. It answers where the delivery stands.
16
+ */
17
+ export function createHandOverDelivery(deps) {
18
+ return (crew, input) => deps.uow.run(async (tx) => {
19
+ const held = await holdLease(tx, crew);
20
+ if (!held.isOk) {
21
+ return held;
22
+ }
23
+ const delivery = await tx.deliveries.findForUpdate(crew.fleetId, input.deliveryId);
24
+ if (!delivery) {
25
+ return refuse('DELIVERY_NOT_FOUND', `Delivery ${input.deliveryId} does not exist`);
26
+ }
27
+ const handedOver = handOverDelivery(delivery, {
28
+ crew,
29
+ handOverNumber: input.handOverNumber,
30
+ isOnceMore: input.isOnceMore === true,
31
+ at: deps.clock.now(),
32
+ });
33
+ if (!handedOver.isOk) {
34
+ return handedOver;
35
+ }
36
+ const { state, delivery: changed, events } = handedOver.value;
37
+ if (events.length > 0) {
38
+ await tx.deliveries.update(changed);
39
+ }
40
+ for (const event of events) {
41
+ await recordEvent({ events: tx.events, ids: deps.ids }, event);
42
+ }
43
+ return ok({ state });
44
+ });
45
+ }
46
+ //# sourceMappingURL=hand-over-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hand-over-delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/hand-over-delivery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAqC,MAAM,uBAAuB,CAAC;AAGrF,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAA0C,MAAM,eAAe,CAAC;AAezF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAItC;IACC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAoE,EAAE;QAC1F,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,KAAK,CAAC,UAAU,iBAAiB,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,EAAE;YAC5C,IAAI;YACJ,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,UAAU,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI;YACrC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC;QAC9D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,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,KAAK,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -47,8 +47,19 @@ export interface Delivery {
47
47
  */
48
48
  claimedByShipId: ShipId | null;
49
49
  claimedByLeaseId: LeaseId | null;
50
- /** How many times a receive claimed it. */
50
+ /** How many times it was handed over: once per plain receive, or once per new hand-over number on a pushed ship. */
51
51
  attempts: number;
52
+ /**
53
+ * The last hand-over number its crew reported with handed: a repeat of it,
54
+ * or a lower one, changes nothing. None until a push receive's crew hands it
55
+ * over, and none again once it returns to pending.
56
+ */
57
+ handOverNumber: number | null;
58
+ /**
59
+ * When its crew handed it once more, after the turn that took it died
60
+ * (decision 0040): only once, so none until then.
61
+ */
62
+ handedOnceMoreAt: Date | null;
52
63
  /**
53
64
  * For a type, under network rules: the ships of the type its sender may
54
65
  * reach, fixed at send time; only they may claim it (decision 0034).
@@ -58,6 +58,8 @@ export function acceptMessage(fleet, send) {
58
58
  claimedByShipId: null,
59
59
  claimedByLeaseId: null,
60
60
  attempts: 0,
61
+ handOverNumber: null,
62
+ handedOnceMoreAt: null,
61
63
  ...(reachableShipIds && { reachableShipIds: [...reachableShipIds] }),
62
64
  createdAt: at,
63
65
  };
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/domain/messaging/message.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/domain/messaging/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * The 10 and 60 minute clocks of a pushed ship (#586, decision 0040). The
3
+ * fleet runs them from the states and the turn the computer side reports, so
4
+ * a computer that died leaves the source of truth true. argo is told once per
5
+ * lease and oldest delivery whose clock ran out.
6
+ */
7
+ import type { DeliveryId, FleetId, LeaseId, MessageId, ShipId, TurnState } from '@aeolus-fleet/common';
8
+ import { type NewEvent } from '../shared/events.js';
9
+ /** A delivery handed and not confirmed this long is overdue, whatever the turn. */
10
+ export declare const NOT_CONFIRMED_MINUTES = 10;
11
+ /** A delivery waiting this long while the session is idle is overdue. */
12
+ export declare const IDLE_MINUTES = 10;
13
+ /** A delivery waiting this long while the session is busy is overdue. */
14
+ export declare const BUSY_MINUTES = 60;
15
+ /** Which clock ran out: handed and not confirmed, or waiting while idle or busy. */
16
+ export type OverdueClock = 'notConfirmed' | 'idle' | 'busy';
17
+ /** The states a delivery waits in for a pushed ship: pending for it, or in flight with its lease. */
18
+ export type WaitingState = 'pending' | 'received' | 'handed';
19
+ /** A delivery waiting for a pushed crew, and since when it is in its state. */
20
+ export interface WaitingDelivery {
21
+ deliveryId: DeliveryId;
22
+ messageId: MessageId;
23
+ state: WaitingState;
24
+ /** When it entered its state: stored, returned, received, or handed with its latest hand-over number. */
25
+ since: Date;
26
+ /** When its message was sent: the oldest waiting is told first. */
27
+ sentAt: Date;
28
+ }
29
+ /** An open pushed lease, with its turn and the deliveries waiting for it. */
30
+ export interface PushedCrew {
31
+ fleetId: FleetId;
32
+ shipId: ShipId;
33
+ leaseId: LeaseId;
34
+ pushedAt: Date;
35
+ /** The turn its hooks last reported, since when; null before the first report. */
36
+ turn: {
37
+ state: TurnState;
38
+ at: Date;
39
+ } | null;
40
+ waiting: WaitingDelivery[];
41
+ }
42
+ /** A delivery whose clock ran out on a pushed crew's lease. */
43
+ export interface Overdue {
44
+ fleetId: FleetId;
45
+ shipId: ShipId;
46
+ leaseId: LeaseId;
47
+ delivery: WaitingDelivery;
48
+ clock: OverdueClock;
49
+ minutes: number;
50
+ }
51
+ /**
52
+ * The crew's oldest waiting delivery whose clock ran out, if any. A handed
53
+ * delivery runs the 10 minute clock from its hand-over. A pending or received
54
+ * one runs 10 minutes while the session is idle and 60 while it is busy,
55
+ * counted from the latest of its state, the turn and the lease's push: a
56
+ * lease with no turn reported is idle since it was pushed.
57
+ */
58
+ export declare function overdueDelivery(crew: PushedCrew, now: Date): Overdue | undefined;
59
+ /** DeliveryOverdue: the fleet told argo, as the system, that the delivery's clock ran out. */
60
+ export declare function overdueEvent(overdue: Overdue, at: Date): NewEvent;