@aeolus-fleet/core 0.20.2 → 0.20.4

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 (125) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/http/server.d.ts +0 -2
  3. package/dist/adapters/http/server.js +4 -12
  4. package/dist/adapters/http/server.js.map +1 -1
  5. package/dist/adapters/prisma/client.d.ts +0 -2
  6. package/dist/adapters/prisma/client.js +0 -9
  7. package/dist/adapters/prisma/client.js.map +1 -1
  8. package/dist/adapters/prisma/generated/browser.d.ts +23 -0
  9. package/dist/adapters/prisma/generated/client.d.ts +23 -0
  10. package/dist/adapters/prisma/generated/internal/class.d.ts +33 -0
  11. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  12. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  13. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +254 -1
  14. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +25 -0
  15. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  16. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +28 -0
  17. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +25 -0
  18. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  19. package/dist/adapters/prisma/generated/models/CrewRequest.d.ts +149 -0
  20. package/dist/adapters/prisma/generated/models/CrewRequestGiveBack.d.ts +1468 -0
  21. package/dist/adapters/prisma/generated/models/CrewRequestGiveBack.js +2 -0
  22. package/dist/adapters/prisma/generated/models/CrewRequestGiveBack.js.map +1 -0
  23. package/dist/adapters/prisma/generated/models/Delivery.d.ts +68 -1
  24. package/dist/adapters/prisma/generated/models/Fleet.d.ts +716 -0
  25. package/dist/adapters/prisma/generated/models/NetworkSettings.d.ts +1101 -0
  26. package/dist/adapters/prisma/generated/models/NetworkSettings.js +2 -0
  27. package/dist/adapters/prisma/generated/models/NetworkSettings.js.map +1 -0
  28. package/dist/adapters/prisma/generated/models/ReachRefusal.d.ts +1239 -0
  29. package/dist/adapters/prisma/generated/models/ReachRefusal.js +2 -0
  30. package/dist/adapters/prisma/generated/models/ReachRefusal.js.map +1 -0
  31. package/dist/adapters/prisma/generated/models/Ship.d.ts +255 -0
  32. package/dist/adapters/prisma/generated/models.d.ts +3 -0
  33. package/dist/adapters/prisma/messaging.js +16 -2
  34. package/dist/adapters/prisma/messaging.js.map +1 -1
  35. package/dist/adapters/prisma/network.d.ts +4 -0
  36. package/dist/adapters/prisma/network.js +69 -0
  37. package/dist/adapters/prisma/network.js.map +1 -0
  38. package/dist/adapters/prisma/registry.js +20 -5
  39. package/dist/adapters/prisma/registry.js.map +1 -1
  40. package/dist/adapters/prisma/rows.js +10 -1
  41. package/dist/adapters/prisma/rows.js.map +1 -1
  42. package/dist/adapters/prisma/unit-of-work.d.ts +3 -1
  43. package/dist/adapters/prisma/unit-of-work.js +3 -0
  44. package/dist/adapters/prisma/unit-of-work.js.map +1 -1
  45. package/dist/adapters/trpc/console.d.ts +1 -1
  46. package/dist/adapters/trpc/context.d.ts +6 -0
  47. package/dist/adapters/trpc/fleet.d.ts +96 -6
  48. package/dist/adapters/trpc/fleet.js +46 -3
  49. package/dist/adapters/trpc/fleet.js.map +1 -1
  50. package/dist/adapters/trpc/router.d.ts +94 -7
  51. package/dist/adapters/trpc/ship-contract.js +2 -0
  52. package/dist/adapters/trpc/ship-contract.js.map +1 -1
  53. package/dist/adapters/trpc/ship-protocol.js +9 -8
  54. package/dist/adapters/trpc/ship-protocol.js.map +1 -1
  55. package/dist/adapters/trpc/trpc.js +4 -0
  56. package/dist/adapters/trpc/trpc.js.map +1 -1
  57. package/dist/app.js +1 -2
  58. package/dist/app.js.map +1 -1
  59. package/dist/domain/messaging/answer.d.ts +17 -0
  60. package/dist/domain/messaging/answer.js +16 -0
  61. package/dist/domain/messaging/answer.js.map +1 -0
  62. package/dist/domain/messaging/message.d.ts +10 -1
  63. package/dist/domain/messaging/message.js +4 -2
  64. package/dist/domain/messaging/message.js.map +1 -1
  65. package/dist/domain/messaging/ports.d.ts +2 -0
  66. package/dist/domain/messaging/resend-delivery.d.ts +11 -4
  67. package/dist/domain/messaging/resend-delivery.js +87 -62
  68. package/dist/domain/messaging/resend-delivery.js.map +1 -1
  69. package/dist/domain/messaging/send-message.d.ts +11 -4
  70. package/dist/domain/messaging/send-message.js +32 -6
  71. package/dist/domain/messaging/send-message.js.map +1 -1
  72. package/dist/domain/registry/check-reach.d.ts +44 -0
  73. package/dist/domain/registry/check-reach.js +75 -0
  74. package/dist/domain/registry/check-reach.js.map +1 -0
  75. package/dist/domain/registry/crew-request.d.ts +32 -0
  76. package/dist/domain/registry/crew-request.js +53 -0
  77. package/dist/domain/registry/crew-request.js.map +1 -1
  78. package/dist/domain/registry/get-ship.d.ts +3 -3
  79. package/dist/domain/registry/get-ship.js +2 -1
  80. package/dist/domain/registry/get-ship.js.map +1 -1
  81. package/dist/domain/registry/give-back-crew-request.d.ts +35 -0
  82. package/dist/domain/registry/give-back-crew-request.js +44 -0
  83. package/dist/domain/registry/give-back-crew-request.js.map +1 -0
  84. package/dist/domain/registry/list-fleet.d.ts +3 -1
  85. package/dist/domain/registry/list-fleet.js +2 -1
  86. package/dist/domain/registry/list-fleet.js.map +1 -1
  87. package/dist/domain/registry/network-settings.d.ts +58 -0
  88. package/dist/domain/registry/network-settings.js +81 -0
  89. package/dist/domain/registry/network-settings.js.map +1 -0
  90. package/dist/domain/registry/ports.d.ts +32 -0
  91. package/dist/domain/registry/public.d.ts +1 -0
  92. package/dist/domain/registry/public.js +1 -0
  93. package/dist/domain/registry/public.js.map +1 -1
  94. package/dist/domain/registry/reach-refusal.d.ts +30 -0
  95. package/dist/domain/registry/reach-refusal.js +2 -0
  96. package/dist/domain/registry/reach-refusal.js.map +1 -0
  97. package/dist/domain/registry/read-reach-refusals.d.ts +14 -0
  98. package/dist/domain/registry/read-reach-refusals.js +17 -0
  99. package/dist/domain/registry/read-reach-refusals.js.map +1 -0
  100. package/dist/domain/registry/set-network-rules.d.ts +29 -0
  101. package/dist/domain/registry/set-network-rules.js +25 -0
  102. package/dist/domain/registry/set-network-rules.js.map +1 -0
  103. package/dist/domain/registry/ship-report.d.ts +5 -0
  104. package/dist/domain/registry/ship-report.js +3 -0
  105. package/dist/domain/registry/ship-report.js.map +1 -1
  106. package/dist/domain/shared/errors.d.ts +1 -1
  107. package/dist/domain/shared/errors.js.map +1 -1
  108. package/dist/domain/shared/history.d.ts +17 -0
  109. package/dist/domain/shared/history.js +4 -1
  110. package/dist/domain/shared/history.js.map +1 -1
  111. package/dist/domain/shared/read-needs-attention.d.ts +4 -4
  112. package/dist/domain/shared/read-needs-attention.js +4 -3
  113. package/dist/domain/shared/read-needs-attention.js.map +1 -1
  114. package/dist/domain/shared/read-ship-timeline.d.ts +5 -4
  115. package/dist/domain/shared/read-ship-timeline.js +7 -3
  116. package/dist/domain/shared/read-ship-timeline.js.map +1 -1
  117. package/dist/wiring.d.ts +6 -0
  118. package/dist/wiring.js +7 -0
  119. package/dist/wiring.js.map +1 -1
  120. package/package.json +2 -2
  121. package/src/adapters/prisma/migrations/20261009090000_crew_request_give_backs/migration.sql +26 -0
  122. package/src/adapters/prisma/migrations/20261009200000_network_scope/migration.sql +8 -0
  123. package/src/adapters/prisma/migrations/20261009210000_network_rules/migration.sql +31 -0
  124. package/src/adapters/prisma/migrations/20261009220000_type_delivery_reachable_ships/migration.sql +5 -0
  125. package/src/adapters/prisma/schema.prisma +59 -0
@@ -0,0 +1,81 @@
1
+ /**
2
+ * The fleet's network settings (decision 0034): which ships may send to
3
+ * which. A rule says that the ships matching one label selector may send to
4
+ * the ships matching another; allow-only, no deny rules, no precedence. A
5
+ * fleet holds its rules, or none (all-to-all), with a version that moves on
6
+ * every set, so a refusal names the settings that refused it.
7
+ */
8
+ import { NETWORK_RULES_MAX, SHIP_LABELS_MAX } from '@aeolus-fleet/common';
9
+ import { refuse } from '../shared/errors.js';
10
+ import { ok } from '../shared/result.js';
11
+ /** A fleet that never set rules: none, at version 0. */
12
+ export function noNetworkSettings(fleetId) {
13
+ return { fleetId, rules: null, version: 0 };
14
+ }
15
+ /**
16
+ * The fleet's rules from now on, replacing the ones it had, at the next
17
+ * version, with NetworkRulesSet. The rules are within the decision's limits:
18
+ * at most 200, each selector at most 20 label values, as a ship carries no
19
+ * more, each once. A value id need not exist: an unknown one matches no ship,
20
+ * as in label selection.
21
+ */
22
+ export function setNetworkRules(current, change) {
23
+ const { rules } = change;
24
+ if (rules !== null) {
25
+ const invalid = invalidRules(rules);
26
+ if (invalid !== undefined) {
27
+ return refuse('INVALID_NETWORK_RULES', `${invalid} (decision 0034)`);
28
+ }
29
+ }
30
+ const settings = { fleetId: current.fleetId, rules: rules?.map(copyOfRule) ?? null, version: current.version + 1 };
31
+ return ok({
32
+ settings,
33
+ events: [
34
+ {
35
+ type: 'NetworkRulesSet',
36
+ fleetId: current.fleetId,
37
+ occurredAt: change.at,
38
+ actor: change.actor,
39
+ details: { version: settings.version, rules: rules?.length ?? null },
40
+ },
41
+ ],
42
+ });
43
+ }
44
+ /** What breaks the limits, said for the caller, or undefined when the rules keep them. */
45
+ function invalidRules(rules) {
46
+ if (rules.length > NETWORK_RULES_MAX) {
47
+ return `A fleet holds at most ${String(NETWORK_RULES_MAX)} network rules`;
48
+ }
49
+ for (const selector of rules.flatMap((rule) => [rule.from, rule.to])) {
50
+ if (selector.length > SHIP_LABELS_MAX) {
51
+ return `A selector holds at most ${String(SHIP_LABELS_MAX)} label values, as a ship carries no more`;
52
+ }
53
+ const twice = selector.find((valueId, index) => selector.indexOf(valueId) !== index);
54
+ if (twice !== undefined) {
55
+ return `A selector names each label value once: ${twice} twice`;
56
+ }
57
+ }
58
+ return undefined;
59
+ }
60
+ function copyOfRule(rule) {
61
+ return { from: [...rule.from], to: [...rule.to] };
62
+ }
63
+ /**
64
+ * Whether the settings let the sender reach the recipient. With no rules,
65
+ * every ship reaches every ship. The fixed exceptions hold whatever the
66
+ * rules: argo reaches every ship and every ship reaches argo, and a ship
67
+ * answers the sender of a message it received. Otherwise a rule must match
68
+ * the sender with its `from` and the recipient with its `to`.
69
+ */
70
+ export function allowsReach(settings, send) {
71
+ const { sender, recipient, isAnswerToSender } = send;
72
+ if (settings.rules === null || sender.kind === 'operator' || recipient.kind === 'operator' || isAnswerToSender) {
73
+ return true;
74
+ }
75
+ return settings.rules.some((rule) => matches(rule.from, sender) && matches(rule.to, recipient));
76
+ }
77
+ /** A ship matches a selector when it carries every value in it: exact matches, combined with AND. */
78
+ function matches(selector, ship) {
79
+ return selector.every((valueId) => ship.labels.includes(valueId));
80
+ }
81
+ //# sourceMappingURL=network-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-settings.js","sourceRoot":"","sources":["../../../src/domain/registry/network-settings.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ import type { InstallationRequest } from './installation-request.js';
7
7
  import type { CarriedLabel, Label, ListedLabel, ShipLabel } from './label.js';
8
8
  import type { FleetLimitSettings, InstallationSettings } from './limits.js';
9
9
  import type { Lease, Location } from './lease.js';
10
+ import type { NetworkSettings } from './network-settings.js';
11
+ import type { ReachRefusal } from './reach-refusal.js';
10
12
  import type { Ship } from './ship.js';
11
13
  import type { ShipReport } from './ship-report.js';
12
14
  /** The crew a report speaks for: its ship and lease, in its fleet. */
@@ -108,6 +110,8 @@ export interface ShipRepository {
108
110
  findActiveByNameForShare(fleetId: FleetId, name: string): Promise<Ship | undefined>;
109
111
  /** Whether at least one ship of the fleet with this type is not retired and receives: the viewer ship receives nothing (decision 0022). */
110
112
  hasActiveShipOfType(fleetId: FleetId, type: string): Promise<boolean>;
113
+ /** The fleet's ships of the type that may take a type delivery: not retired, never the viewer ship. By id. */
114
+ listActiveOfType(fleetId: FleetId, type: string): Promise<Ship[]>;
111
115
  /** Gives the ship a new name. */
112
116
  rename(change: {
113
117
  fleetId: FleetId;
@@ -202,6 +206,24 @@ export interface ClearRequestRepository {
202
206
  /** One trierarch's, oldest first. */
203
207
  listFor(fleetId: FleetId, trierarchShipId: ShipId): Promise<ClearRequest[]>;
204
208
  }
209
+ /**
210
+ * Outbound port: the fleet's network settings, one per fleet (decision 0034).
211
+ * A send holds them shared and a set holds them exclusively, so every send is
212
+ * checked against exactly one version.
213
+ */
214
+ export interface NetworkSettingsRepository {
215
+ /** The fleet's settings, held shared until the unit of work ends; none at version 0 when it never set rules. */
216
+ findForShare(fleetId: FleetId): Promise<NetworkSettings>;
217
+ /** The fleet's settings, held exclusively until the unit of work ends, even before the fleet first set rules. */
218
+ findForUpdate(fleetId: FleetId): Promise<NetworkSettings>;
219
+ save(settings: NetworkSettings): Promise<void>;
220
+ }
221
+ /** Outbound port: the records of the sends the fleet's network rules refused (decision 0034). */
222
+ export interface ReachRefusalRepository {
223
+ record(refusal: ReachRefusal): Promise<void>;
224
+ /** The fleet's latest refusals, newest first, at most `limit`. Read outside a unit of work. */
225
+ latest(fleetId: FleetId, limit: number): Promise<ReachRefusal[]>;
226
+ }
205
227
  /**
206
228
  * Outbound port: the fleet's labels, their values and the values its ships
207
229
  * carry, always within one fleet (decision 0031). A retired or deleted label
@@ -290,6 +312,16 @@ export interface ShipFacts {
290
312
  id: ShipId;
291
313
  name: string;
292
314
  } | null;
315
+ /** The trierarchs that gave its crew request back, by id and name, oldest first (#382); none without a request. */
316
+ crewRequestGivenBack: {
317
+ trierarch: {
318
+ id: ShipId;
319
+ name: string;
320
+ };
321
+ settingsVersion: number;
322
+ reason: string;
323
+ givenBackAt: Date;
324
+ }[];
293
325
  /** The label values the ship carries, by key then value (decision 0031). */
294
326
  labels: readonly CarriedLabel[];
295
327
  /**
@@ -2,6 +2,7 @@ export { location, refuseEndedLease, type Lease, type LeaseEnded, type LeaseEndR
2
2
  export { endLease, holdLease, takeOverOperatorLease, type HoldLeaseTx, type LeaseTx } from './leases.js';
3
3
  export type { InFlightDeliveries, LeaseRepository, ShipRepository } from './ports.js';
4
4
  export { findPingableShip, type PingableShipTx, type UnpingableShip } from './pingable-ship.js';
5
+ export { checkReach, type CheckReachTx, type NotReachable } from './check-reach.js';
5
6
  export { resolveSelector, type ResolveSelectorTx, type UnresolvableSelector } from './resolve-selector.js';
6
7
  export { findOperatorShip, findShip, findViewerShip, type FindShipTx, type ShipTx } from './ships.js';
7
8
  export { OPERATOR_SHIP_NAME, type Ship } from './ship.js';
@@ -3,6 +3,7 @@
3
3
  export { location, refuseEndedLease } from './lease.js';
4
4
  export { endLease, holdLease, takeOverOperatorLease } from './leases.js';
5
5
  export { findPingableShip } from './pingable-ship.js';
6
+ export { checkReach } from './check-reach.js';
6
7
  export { resolveSelector } from './resolve-selector.js';
7
8
  export { findOperatorShip, findShip, findViewerShip } from './ships.js';
8
9
  export { OPERATOR_SHIP_NAME } from './ship.js';
@@ -1 +1 @@
1
- {"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/domain/registry/public.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2DAA2D;AAC3D,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAmE,MAAM,YAAY,CAAC;AACzH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAkC,MAAM,aAAa,CAAC;AAEzG,OAAO,EAAE,gBAAgB,EAA4C,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,eAAe,EAAqD,MAAM,uBAAuB,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAgC,MAAM,YAAY,CAAC;AACtG,OAAO,EAAE,kBAAkB,EAAa,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAwB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/domain/registry/public.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2DAA2D;AAC3D,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAmE,MAAM,YAAY,CAAC;AACzH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAkC,MAAM,aAAa,CAAC;AAEzG,OAAO,EAAE,gBAAgB,EAA4C,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,UAAU,EAAwC,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,eAAe,EAAqD,MAAM,uBAAuB,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAgC,MAAM,YAAY,CAAC;AACtG,OAAO,EAAE,kBAAkB,EAAa,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAwB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { FleetId, ReachRefusalId, ShipId } from '@aeolus-fleet/common';
2
+ import type { CarriedLabel } from './label.js';
3
+ /** A ship as a refusal saw it: its id, its name and the label values it carried then, by key. */
4
+ export interface RefusedShip {
5
+ id: ShipId;
6
+ name: string;
7
+ labels: readonly CarriedLabel[];
8
+ }
9
+ /**
10
+ * The record of a send the network rules refused (decision 0034): who tried
11
+ * to reach whom, both ships as they were at that moment, so a later rename or
12
+ * relabelling keeps it true, and the version of the settings that refused it.
13
+ * Not an event: only argo reads it.
14
+ */
15
+ export interface ReachRefusal {
16
+ fleetId: FleetId;
17
+ id: ReachRefusalId;
18
+ at: Date;
19
+ sender: RefusedShip;
20
+ /** The ship it was for, or the type and each ship of it, none of which the sender may reach. */
21
+ recipient: {
22
+ kind: 'ship';
23
+ ship: RefusedShip;
24
+ } | {
25
+ kind: 'type';
26
+ type: string;
27
+ ships: readonly RefusedShip[];
28
+ };
29
+ settingsVersion: number;
30
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reach-refusal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reach-refusal.js","sourceRoot":"","sources":["../../../src/domain/registry/reach-refusal.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { Caller } from '../shared/caller.js';
2
+ import { type DomainError } from '../shared/errors.js';
3
+ import { type Result } from '../shared/result.js';
4
+ import type { ReachRefusalRepository } from './ports.js';
5
+ import type { ReachRefusal } from './reach-refusal.js';
6
+ export type ReadReachRefusals = (caller: Caller) => Promise<Result<ReachRefusal[], DomainError<'NOT_THE_OPERATOR_SHIP'>>>;
7
+ /**
8
+ * Use case: argo reads the sends the fleet's network rules refused, the
9
+ * latest first (decision 0034). Only argo: a ship that sets the rules does
10
+ * not read who tried to reach whom.
11
+ */
12
+ export declare function createReadReachRefusals(deps: {
13
+ reachRefusals: Pick<ReachRefusalRepository, 'latest'>;
14
+ }): ReadReachRefusals;
@@ -0,0 +1,17 @@
1
+ import { REACH_REFUSALS_READ_MAX } from '@aeolus-fleet/common';
2
+ import { refuse } from '../shared/errors.js';
3
+ import { ok } from '../shared/result.js';
4
+ /**
5
+ * Use case: argo reads the sends the fleet's network rules refused, the
6
+ * latest first (decision 0034). Only argo: a ship that sets the rules does
7
+ * not read who tried to reach whom.
8
+ */
9
+ export function createReadReachRefusals(deps) {
10
+ return async (caller) => {
11
+ if (caller.kind !== 'operator') {
12
+ return refuse('NOT_THE_OPERATOR_SHIP', 'Only argo reads the reach refusals');
13
+ }
14
+ return ok(await deps.reachRefusals.latest(caller.fleetId, REACH_REFUSALS_READ_MAX));
15
+ };
16
+ }
17
+ //# sourceMappingURL=read-reach-refusals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-reach-refusals.js","sourceRoot":"","sources":["../../../src/domain/registry/read-reach-refusals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAMtD;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAA+D;IACrG,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,uBAAuB,EAAE,oCAAoC,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { IdGenerator } from '@aeolus-fleet/common';
2
+ import type { Caller } from '../shared/caller.js';
3
+ import type { Clock } from '../shared/clock.js';
4
+ import { type EventLog } from '../shared/events.js';
5
+ import { type Result } from '../shared/result.js';
6
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
7
+ import { type NetworkRule, type SetNetworkRulesRefusal } from './network-settings.js';
8
+ import type { NetworkSettingsRepository } from './ports.js';
9
+ export interface SetNetworkRulesTx {
10
+ networkSettings: Pick<NetworkSettingsRepository, 'findForUpdate' | 'save'>;
11
+ events: EventLog;
12
+ }
13
+ export type SetNetworkRules = (caller: Caller, input: {
14
+ rules: readonly NetworkRule[] | null;
15
+ }) => Promise<Result<{
16
+ version: number;
17
+ }, SetNetworkRulesRefusal>>;
18
+ /**
19
+ * Use case: the caller sets the fleet's network rules, the whole list, or
20
+ * none for all-to-all (decision 0034). Its scope (fleet:network, which argo
21
+ * holds) is checked before this runs. In one unit of work, holding the
22
+ * settings exclusively so no send is checked halfway: the settings at their
23
+ * next version, and NetworkRulesSet.
24
+ */
25
+ export declare function createSetNetworkRules(deps: {
26
+ uow: UnitOfWork<SetNetworkRulesTx>;
27
+ clock: Clock;
28
+ ids: IdGenerator;
29
+ }): SetNetworkRules;
@@ -0,0 +1,25 @@
1
+ import { recordEvent, shipActor } from '../shared/events.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { setNetworkRules } from './network-settings.js';
4
+ /**
5
+ * Use case: the caller sets the fleet's network rules, the whole list, or
6
+ * none for all-to-all (decision 0034). Its scope (fleet:network, which argo
7
+ * holds) is checked before this runs. In one unit of work, holding the
8
+ * settings exclusively so no send is checked halfway: the settings at their
9
+ * next version, and NetworkRulesSet.
10
+ */
11
+ export function createSetNetworkRules(deps) {
12
+ return (caller, input) => deps.uow.run(async (tx) => {
13
+ const current = await tx.networkSettings.findForUpdate(caller.fleetId);
14
+ const set = setNetworkRules(current, { rules: input.rules, at: deps.clock.now(), actor: shipActor(caller.shipId) });
15
+ if (!set.isOk) {
16
+ return set;
17
+ }
18
+ await tx.networkSettings.save(set.value.settings);
19
+ for (const event of set.value.events) {
20
+ await recordEvent({ events: tx.events, ids: deps.ids }, event);
21
+ }
22
+ return ok({ version: set.value.settings.version });
23
+ });
24
+ }
25
+ //# sourceMappingURL=set-network-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-network-rules.js","sourceRoot":"","sources":["../../../src/domain/registry/set-network-rules.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAiD,MAAM,uBAAuB,CAAC;AAUvG;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA4E;IAChH,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAgE,EAAE;QACtF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpH,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACrC,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,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -19,6 +19,11 @@ export interface ShipReport {
19
19
  /** Moves by one each time the details change, clearing included; 0 before any. */
20
20
  detailsVersion: number;
21
21
  }
22
+ /** A report as one ship's page reads it: with the size of its details, counted as their limit counts them; null without details. */
23
+ export type ShownReport = ShipReport & {
24
+ detailsBytes: number | null;
25
+ };
26
+ export declare function shownReportOf(report: ShipReport): ShownReport;
22
27
  export type ReportRefusal = DomainError<'INVALID_REPORT_STATE' | 'INVALID_REPORT_NOTE' | 'INVALID_REPORT_DETAILS' | 'REPORT_DETAILS_TOO_LARGE'>;
23
28
  /** What a report does to the details: sets them whole (null clears them), or applies a JSON Merge Patch to them. Left out, they stay. */
24
29
  export interface DetailsInput {
@@ -3,6 +3,9 @@ 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 { isSameJson, mergePatch } from './report-details.js';
6
+ export function shownReportOf(report) {
7
+ return { ...report, detailsBytes: report.details === null ? null : reportDetailsBytes(report.details) };
8
+ }
6
9
  /** The details after a report: set whole, merge-patched or kept, and at most 16 KB (decision 0028). */
7
10
  function detailsAfter(current, input) {
8
11
  if (input.details !== undefined && input.detailsPatch !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"ship-report.js","sourceRoot":"","sources":["../../../src/domain/registry/ship-report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ship-report.js","sourceRoot":"","sources":["../../../src/domain/registry/ship-report.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { type Err } from './result.js';
2
2
  /** Every reason the domain refuses a request. */
3
- export type DomainErrorKind = 'ASSIGNEE_NOT_ACTIVE' | 'CLEAR_REQUEST_LIMIT_REACHED' | 'CLEAR_REQUEST_NOT_FOUND' | 'CREW_REQUEST_ALREADY_ASSIGNED' | 'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER' | 'CREW_REQUEST_NOT_FOUND' | 'CREW_REQUEST_NOT_RELEASING' | 'CREW_REQUEST_RELEASING' | 'CREW_REQUEST_SETTINGS_TOO_LARGE' | 'DELIVERY_HELD_BY_ANOTHER_SHIP' | 'DELIVERY_NOT_FOUND' | 'DELIVERY_NOT_A_PING' | 'DELIVERY_NOT_IN_FLIGHT' | 'DELIVERY_NOT_OPEN' | 'DELIVERY_NOT_UNDELIVERABLE' | 'FLEET_ALREADY_EXISTS' | 'FLEET_LIMIT_REACHED' | 'FLEET_NOT_FOUND' | 'FLEET_HAS_NO_VIEWER' | 'NOTICE_NOT_FOUND' | 'NOTICE_NOT_DISMISSIBLE' | 'GUIDE_NOT_FOUND' | 'GUIDE_STEP_NOT_FOUND' | 'IDEMPOTENCY_KEY_REUSED' | 'IN_REPLY_TO_NOT_FOUND' | 'MESSAGE_LIMIT_REACHED' | 'MODEL_REQUIRED' | 'INVALID_HARNESS' | 'MODEL_FROM_ARGO' | 'INVALID_CONTENT_TYPE' | 'INVALID_EMAIL' | 'INVALID_FLEET_NAME' | 'INVALID_FOLLOW_MAX' | 'INVALID_FOLLOW_WAIT' | 'INVALID_IDEMPOTENCY_KEY' | 'INVALID_INBOX_WAIT' | 'INVALID_LABEL_KEY' | 'INVALID_LABEL_VALUE' | 'INVALID_LABEL_VALUES' | 'INVALID_LIMIT' | 'INVALID_LOCATION' | 'INVALID_PASSWORD' | 'INVALID_RECEIVE_MAX' | 'INVALID_CREW_REQUEST_REASON' | 'INVALID_REPORT_DETAILS' | 'INVALID_REPORT_NOTE' | 'INVALID_REPORT_STATE' | 'INVALID_SHIP_NAME' | 'INVALID_SHIP_NOTE' | 'INVALID_SHIP_TYPE' | 'LABEL_CARRIED' | 'LABEL_KEY_TAKEN' | 'LABEL_NOT_FOUND' | 'LABEL_ON_OWN_SHIP' | 'LABEL_VALUE_CARRIED' | 'LABEL_VALUE_NOT_FOUND' | 'LEASE_ENDED' | 'MESSAGE_NOT_FOUND' | 'NOT_A_TRIERARCH' | 'NOT_THE_LABEL_OWNER' | 'NOT_THE_OPERATOR_SHIP' | 'OPERATOR_EMAIL_TAKEN' | 'OPERATOR_HAS_NO_PASSWORD' | 'OPERATOR_SHIP_GETS_NO_STARTING_PROMPT' | 'OPERATOR_SHIP_HAS_NO_SECRET' | 'OPERATOR_SHIP_IS_NOT_PINGED' | 'OPERATOR_SHIP_IS_PERMANENT' | 'PAYLOAD_TOO_LARGE' | 'PING_NOT_RESENT' | 'REPORT_DETAILS_TOO_LARGE' | 'RESERVED_CONTENT_TYPE' | 'SHIP_ALREADY_RETIRED' | 'SHIP_NAME_RESERVED' | 'SHIP_NAME_TAKEN' | 'SHIP_NOT_AWAITING_CREW' | 'SHIP_NOT_CREWED' | 'SHIP_LABEL_LIMIT_REACHED' | 'SHIP_LIMIT_REACHED' | 'SHIP_NOT_FOUND' | 'SIGN_IN_TICKET_INVALID' | 'UNKNOWN_CREW_TOKEN' | 'UNRESOLVABLE_SELECTOR' | 'WRONG_EMAIL_OR_PASSWORD' | 'WRONG_SHIP_ID_OR_SECRET';
3
+ export type DomainErrorKind = 'ASSIGNEE_NOT_ACTIVE' | 'CLEAR_REQUEST_LIMIT_REACHED' | 'CLEAR_REQUEST_NOT_FOUND' | 'CREW_REQUEST_ALREADY_ASSIGNED' | 'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER' | 'CREW_REQUEST_NOT_FOUND' | 'CREW_REQUEST_NOT_RELEASING' | 'CREW_REQUEST_RELEASING' | 'CREW_REQUEST_FINAL' | 'CREW_REQUEST_SETTINGS_CHANGED' | 'CREW_REQUEST_SETTINGS_TOO_LARGE' | 'DELIVERY_HELD_BY_ANOTHER_SHIP' | 'DELIVERY_NOT_FOUND' | 'DELIVERY_NOT_A_PING' | 'DELIVERY_NOT_IN_FLIGHT' | 'DELIVERY_NOT_OPEN' | 'DELIVERY_NOT_UNDELIVERABLE' | 'FLEET_ALREADY_EXISTS' | 'FLEET_LIMIT_REACHED' | 'FLEET_NOT_FOUND' | 'FLEET_HAS_NO_VIEWER' | 'NOTICE_NOT_FOUND' | 'NOTICE_NOT_DISMISSIBLE' | 'GUIDE_NOT_FOUND' | 'GUIDE_STEP_NOT_FOUND' | 'IDEMPOTENCY_KEY_REUSED' | 'IN_REPLY_TO_NOT_FOUND' | 'MESSAGE_LIMIT_REACHED' | 'MODEL_REQUIRED' | 'INVALID_HARNESS' | 'MODEL_FROM_ARGO' | 'INVALID_CONTENT_TYPE' | 'INVALID_EMAIL' | 'INVALID_FLEET_NAME' | 'INVALID_FOLLOW_MAX' | 'INVALID_FOLLOW_WAIT' | 'INVALID_IDEMPOTENCY_KEY' | 'INVALID_INBOX_WAIT' | 'INVALID_LABEL_KEY' | 'INVALID_LABEL_VALUE' | 'INVALID_LABEL_VALUES' | 'INVALID_LIMIT' | 'INVALID_LOCATION' | 'INVALID_NETWORK_RULES' | 'INVALID_PASSWORD' | 'INVALID_RECEIVE_MAX' | 'INVALID_CREW_REQUEST_REASON' | 'INVALID_REPORT_DETAILS' | 'INVALID_REPORT_NOTE' | 'INVALID_REPORT_STATE' | 'INVALID_SHIP_NAME' | 'INVALID_SHIP_NOTE' | 'INVALID_SHIP_TYPE' | 'LABEL_CARRIED' | 'LABEL_KEY_TAKEN' | 'LABEL_NOT_FOUND' | 'LABEL_ON_OWN_SHIP' | 'LABEL_VALUE_CARRIED' | 'LABEL_VALUE_NOT_FOUND' | 'LEASE_ENDED' | 'MESSAGE_NOT_FOUND' | 'NOT_A_TRIERARCH' | 'NOT_THE_LABEL_OWNER' | 'NOT_REACHABLE' | 'NOT_THE_OPERATOR_SHIP' | 'OPERATOR_EMAIL_TAKEN' | 'OPERATOR_HAS_NO_PASSWORD' | 'OPERATOR_SHIP_GETS_NO_STARTING_PROMPT' | 'OPERATOR_SHIP_HAS_NO_SECRET' | 'OPERATOR_SHIP_IS_NOT_PINGED' | 'OPERATOR_SHIP_IS_PERMANENT' | 'PAYLOAD_TOO_LARGE' | 'PING_NOT_RESENT' | 'REPORT_DETAILS_TOO_LARGE' | 'RESERVED_CONTENT_TYPE' | 'SHIP_ALREADY_RETIRED' | 'SHIP_NAME_RESERVED' | 'SHIP_NAME_TAKEN' | 'SHIP_NOT_AWAITING_CREW' | 'SHIP_NOT_CREWED' | 'SHIP_LABEL_LIMIT_REACHED' | 'SHIP_LIMIT_REACHED' | 'SHIP_NOT_FOUND' | 'SIGN_IN_TICKET_INVALID' | 'UNKNOWN_CREW_TOKEN' | 'UNRESOLVABLE_SELECTOR' | 'WRONG_EMAIL_OR_PASSWORD' | 'WRONG_SHIP_ID_OR_SECRET';
4
4
  /**
5
5
  * Why the domain refused a request. Adapters map the kind to their own error
6
6
  * shape (a tRPC code, an exit code); the message is safe to show a caller.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/domain/shared/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,aAAa,CAAC;AAkG5C,qDAAqD;AACrD,MAAM,UAAU,MAAM,CAA4B,IAAO,EAAE,OAAe;IACxE,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/domain/shared/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,aAAa,CAAC;AAsG5C,qDAAqD;AACrD,MAAM,UAAU,MAAM,CAA4B,IAAO,EAAE,OAAe;IACxE,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAChC,CAAC"}
@@ -39,6 +39,23 @@ export interface TimelineEntry {
39
39
  } | null;
40
40
  details: EventDetails;
41
41
  }
42
+ /** A message as a read shows it: whether it is a ping, told by its content type, so no reader repeats that rule. */
43
+ export type WithPing<T extends {
44
+ contentType: string;
45
+ }> = T & {
46
+ isPing: boolean;
47
+ };
48
+ export declare function withPing<T extends {
49
+ contentType: string;
50
+ }>(message: T): WithPing<T>;
51
+ /** A timeline entry as the read answers it, its message telling whether it is a ping. */
52
+ export type ShownTimelineEntry = Omit<TimelineEntry, 'message'> & {
53
+ message: WithPing<NonNullable<TimelineEntry['message']>> | null;
54
+ };
55
+ /** An undeliverable delivery as Needs attention answers it, its message telling whether it is a ping. */
56
+ export type ShownUndeliverableEntry = Omit<UndeliverableEntry, 'message'> & {
57
+ message: WithPing<UndeliverableEntry['message']>;
58
+ };
42
59
  /** One message with its delivery as it stands. */
43
60
  export interface HistoryMessage {
44
61
  id: MessageId;
@@ -1,4 +1,7 @@
1
- import { DELIVERY_HISTORY_TYPES, } from '@aeolus-fleet/common';
1
+ import { DELIVERY_HISTORY_TYPES, isPingContentType, } from '@aeolus-fleet/common';
2
+ export function withPing(message) {
3
+ return { ...message, isPing: isPingContentType(message.contentType) };
4
+ }
2
5
  export function isDeliveryChangeType(type) {
3
6
  return DELIVERY_HISTORY_TYPES.some((change) => change === type);
4
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/domain/shared/history.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GASvB,MAAM,sBAAsB,CAAC;AAoD9B,MAAM,UAAU,oBAAoB,CAAC,IAAe;IAClD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AAClE,CAAC;AAoCD,+FAA+F;AAC/F,MAAM,UAAU,QAAQ,CAAC,MAAmB,EAAE,KAAoB;IAChE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW,CAAC;QACtD,KAAK,MAAM;YACT,OAAO,KAAK,KAAK,cAAc,CAAC;QAClC,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/domain/shared/history.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GASlB,MAAM,sBAAsB,CAAC;AAsC9B,MAAM,UAAU,QAAQ,CAAoC,OAAU;IACpE,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;AACxE,CAAC;AAyBD,MAAM,UAAU,oBAAoB,CAAC,IAAe;IAClD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AAClE,CAAC;AAoCD,+FAA+F;AAC/F,MAAM,UAAU,QAAQ,CAAC,MAAmB,EAAE,KAAoB;IAChE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW,CAAC;QACtD,KAAK,MAAM;YACT,OAAO,KAAK,KAAK,cAAc,CAAC;QAClC,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -1,10 +1,10 @@
1
1
  import type { Caller } from './caller.js';
2
- import type { ShipHistory, UndeliverableEntry } from './history.js';
3
- export type ReadNeedsAttention = (caller: Caller) => Promise<UndeliverableEntry[]>;
2
+ import { type ShipHistory, type ShownUndeliverableEntry } from './history.js';
3
+ export type ReadNeedsAttention = (caller: Caller) => Promise<ShownUndeliverableEntry[]>;
4
4
  /**
5
5
  * Use case: Needs attention, every undeliverable delivery of the caller's
6
- * fleet, oldest first, each with its whole message, for the operator to
7
- * resend or dismiss. Abandoned deliveries are never listed: they stay in the
6
+ * fleet, oldest first, each with its whole message, telling whether it is a
7
+ * ping, for the operator to resend or dismiss. Abandoned deliveries are never listed: they stay in the
8
8
  * timelines only. The caller's scope (fleet:read) is checked before this runs.
9
9
  */
10
10
  export declare function createReadNeedsAttention(deps: {
@@ -1,10 +1,11 @@
1
+ import { withPing } from './history.js';
1
2
  /**
2
3
  * Use case: Needs attention, every undeliverable delivery of the caller's
3
- * fleet, oldest first, each with its whole message, for the operator to
4
- * resend or dismiss. Abandoned deliveries are never listed: they stay in the
4
+ * fleet, oldest first, each with its whole message, telling whether it is a
5
+ * ping, for the operator to resend or dismiss. Abandoned deliveries are never listed: they stay in the
5
6
  * timelines only. The caller's scope (fleet:read) is checked before this runs.
6
7
  */
7
8
  export function createReadNeedsAttention(deps) {
8
- return (caller) => deps.history.undeliverable(caller.fleetId);
9
+ return async (caller) => (await deps.history.undeliverable(caller.fleetId)).map((entry) => ({ ...entry, message: withPing(entry.message) }));
9
10
  }
10
11
  //# sourceMappingURL=read-needs-attention.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"read-needs-attention.js","sourceRoot":"","sources":["../../../src/domain/shared/read-needs-attention.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAA8B;IACrE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"read-needs-attention.js","sourceRoot":"","sources":["../../../src/domain/shared/read-needs-attention.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAkD,MAAM,cAAc,CAAC;AAIxF;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAA8B;IACrE,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/I,CAAC"}
@@ -1,17 +1,18 @@
1
1
  import type { ShipId } from '@aeolus-fleet/common';
2
2
  import type { Caller } from './caller.js';
3
3
  import { type DomainError } from './errors.js';
4
- import type { ShipHistory, TimelineEntry } from './history.js';
4
+ import { type ShipHistory, type ShownTimelineEntry } from './history.js';
5
5
  import { type Result } from './result.js';
6
6
  /** The most events a timeline shows: the newest ones. */
7
7
  export declare const TIMELINE_LIMIT = 200;
8
8
  export type ReadShipTimeline = (caller: Caller, input: {
9
9
  shipId: ShipId;
10
- }) => Promise<Result<TimelineEntry[], DomainError<'SHIP_NOT_FOUND'>>>;
10
+ }) => Promise<Result<ShownTimelineEntry[], DomainError<'SHIP_NOT_FOUND'>>>;
11
11
  /**
12
12
  * Use case: every change to a ship, newest first: the events naming it and
13
- * the ones it caused, such as the messages it sent. The caller's scope
14
- * (fleet:read) is checked before this runs.
13
+ * the ones it caused, such as the messages it sent, each message telling
14
+ * whether it is a ping. The caller's scope (fleet:read) is checked before this
15
+ * runs.
15
16
  */
16
17
  export declare function createReadShipTimeline(deps: {
17
18
  history: ShipHistory;
@@ -1,16 +1,20 @@
1
1
  import { refuse } from './errors.js';
2
+ import { withPing } from './history.js';
2
3
  import { ok } from './result.js';
3
4
  /** The most events a timeline shows: the newest ones. */
4
5
  export const TIMELINE_LIMIT = 200;
5
6
  /**
6
7
  * Use case: every change to a ship, newest first: the events naming it and
7
- * the ones it caused, such as the messages it sent. The caller's scope
8
- * (fleet:read) is checked before this runs.
8
+ * the ones it caused, such as the messages it sent, each message telling
9
+ * whether it is a ping. The caller's scope (fleet:read) is checked before this
10
+ * runs.
9
11
  */
10
12
  export function createReadShipTimeline(deps) {
11
13
  return async (caller, { shipId }) => {
12
14
  const timeline = await deps.history.timeline(caller.fleetId, { shipId, limit: TIMELINE_LIMIT });
13
- return timeline ? ok(timeline) : refuse('SHIP_NOT_FOUND', `No ship ${shipId} in this fleet`);
15
+ return timeline
16
+ ? ok(timeline.map((entry) => ({ ...entry, message: entry.message === null ? null : withPing(entry.message) })))
17
+ : refuse('SHIP_NOT_FOUND', `No ship ${shipId} in this fleet`);
14
18
  };
15
19
  }
16
20
  //# sourceMappingURL=read-ship-timeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"read-ship-timeline.js","sourceRoot":"","sources":["../../../src/domain/shared/read-ship-timeline.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAe,MAAM,aAAa,CAAC;AAE9C,yDAAyD;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAOlC;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAA8B;IACnE,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAChG,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,WAAW,MAAM,gBAAgB,CAAC,CAAC;IAC/F,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"read-ship-timeline.js","sourceRoot":"","sources":["../../../src/domain/shared/read-ship-timeline.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,QAAQ,EAA6C,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,EAAE,EAAe,MAAM,aAAa,CAAC;AAE9C,yDAAyD;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAOlC;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAA8B;IACnE,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAChG,OAAO,QAAQ;YACb,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/G,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,WAAW,MAAM,gBAAgB,CAAC,CAAC;IAClE,CAAC,CAAC;AACJ,CAAC"}
package/dist/wiring.d.ts CHANGED
@@ -46,12 +46,15 @@ import { type RemoveCrewRequest } from './domain/registry/remove-crew-request.js
46
46
  import { type AssignCrew } from './domain/registry/assign-crew.js';
47
47
  import { type ReportCrewStatus } from './domain/registry/report-crew-status.js';
48
48
  import { type ConfirmCrewRelease } from './domain/registry/confirm-crew-release.js';
49
+ import { type GiveBack } from './domain/registry/give-back-crew-request.js';
49
50
  import { type ReadAssignedCrewRequests } from './domain/registry/read-assigned-crew-requests.js';
50
51
  import { type ConfirmWorktreeCleared } from './domain/registry/confirm-worktree-cleared.js';
51
52
  import { type ReadClearRequests } from './domain/registry/read-clear-requests.js';
52
53
  import { type RequestWorktreeClear } from './domain/registry/request-worktree-clear.js';
53
54
  import { type ExplainCrewRequest } from './domain/registry/explain-crew-request.js';
54
55
  import { type DefineLabel } from './domain/registry/define-label.js';
56
+ import { type ReadReachRefusals } from './domain/registry/read-reach-refusals.js';
57
+ import { type SetNetworkRules } from './domain/registry/set-network-rules.js';
55
58
  import { type ChangeLabelValues } from './domain/registry/change-label-values.js';
56
59
  import { type AssignLabel } from './domain/registry/assign-label.js';
57
60
  import { type UnassignLabel } from './domain/registry/unassign-label.js';
@@ -99,12 +102,15 @@ export interface UseCases {
99
102
  assignCrew: AssignCrew;
100
103
  reportCrewStatus: ReportCrewStatus;
101
104
  confirmCrewRelease: ConfirmCrewRelease;
105
+ giveBackCrewRequest: GiveBack;
102
106
  readAssignedCrewRequests: ReadAssignedCrewRequests;
103
107
  requestWorktreeClear: RequestWorktreeClear;
104
108
  readClearRequests: ReadClearRequests;
105
109
  confirmWorktreeCleared: ConfirmWorktreeCleared;
106
110
  explainCrewRequest: ExplainCrewRequest;
107
111
  defineLabel: DefineLabel;
112
+ setNetworkRules: SetNetworkRules;
113
+ readReachRefusals: ReadReachRefusals;
108
114
  changeLabelValues: ChangeLabelValues;
109
115
  assignLabel: AssignLabel;
110
116
  unassignLabel: UnassignLabel;
package/dist/wiring.js CHANGED
@@ -8,6 +8,7 @@ import { createPrismaFleetListing, createPrismaFleetRepository, createPrismaClea
8
8
  import { createPrismaGuideProgress, createPrismaNoticeDismissals, createPrismaOperatorAccountLookup } from './adapters/prisma/identity.js';
9
9
  import { createReceiverWakeups } from './adapters/prisma/receiver-wakeups.js';
10
10
  import { createPrismaFleetLimitReads, createPrismaGuideRepository, createPrismaInstallationFleets, createPrismaInstallationSettings, createPrismaNoticeRepository, } from './adapters/prisma/installation.js';
11
+ import { createPrismaReachRefusalRepository } from './adapters/prisma/network.js';
11
12
  import { createPrismaCallers, createPrismaUnitOfWork } from './adapters/prisma/unit-of-work.js';
12
13
  import { createAuthenticate } from './domain/identity/authenticate.js';
13
14
  import { createDismissNotice } from './domain/identity/dismiss-notice.js';
@@ -54,12 +55,15 @@ import { createRemoveCrewRequest } from './domain/registry/remove-crew-request.j
54
55
  import { createAssignCrew } from './domain/registry/assign-crew.js';
55
56
  import { createReportCrewStatus } from './domain/registry/report-crew-status.js';
56
57
  import { createConfirmCrewRelease } from './domain/registry/confirm-crew-release.js';
58
+ import { createGiveBackCrewRequest } from './domain/registry/give-back-crew-request.js';
57
59
  import { createReadAssignedCrewRequests } from './domain/registry/read-assigned-crew-requests.js';
58
60
  import { createConfirmWorktreeCleared } from './domain/registry/confirm-worktree-cleared.js';
59
61
  import { createReadClearRequests } from './domain/registry/read-clear-requests.js';
60
62
  import { createRequestWorktreeClear } from './domain/registry/request-worktree-clear.js';
61
63
  import { createExplainCrewRequest } from './domain/registry/explain-crew-request.js';
62
64
  import { createDefineLabel } from './domain/registry/define-label.js';
65
+ import { createReadReachRefusals } from './domain/registry/read-reach-refusals.js';
66
+ import { createSetNetworkRules } from './domain/registry/set-network-rules.js';
63
67
  import { createChangeLabelValues } from './domain/registry/change-label-values.js';
64
68
  import { createAssignLabel } from './domain/registry/assign-label.js';
65
69
  import { createUnassignLabel } from './domain/registry/unassign-label.js';
@@ -145,12 +149,15 @@ export function createUseCases(options) {
145
149
  assignCrew: createAssignCrew({ uow, clock, ids }),
146
150
  reportCrewStatus: createReportCrewStatus({ uow, clock, ids }),
147
151
  confirmCrewRelease: createConfirmCrewRelease({ uow, clock, ids }),
152
+ giveBackCrewRequest: createGiveBackCrewRequest({ uow, clock, ids }),
148
153
  readAssignedCrewRequests: createReadAssignedCrewRequests({ crewRequests: createPrismaCrewRequestRepository(prisma) }),
149
154
  explainCrewRequest: createExplainCrewRequest({ uow, clock, ids }),
150
155
  requestWorktreeClear: createRequestWorktreeClear({ uow, clock, ids }),
151
156
  readClearRequests: createReadClearRequests({ clearRequests: createPrismaClearRequestRepository(prisma) }),
152
157
  confirmWorktreeCleared: createConfirmWorktreeCleared({ uow, clock, ids }),
153
158
  defineLabel: createDefineLabel({ uow, clock, ids }),
159
+ setNetworkRules: createSetNetworkRules({ uow, clock, ids }),
160
+ readReachRefusals: createReadReachRefusals({ reachRefusals: createPrismaReachRefusalRepository(prisma) }),
154
161
  changeLabelValues: createChangeLabelValues({ uow, clock, ids }),
155
162
  assignLabel: createAssignLabel({ uow, clock, ids }),
156
163
  unassignLabel: createUnassignLabel({ uow, clock, ids }),