@aeolus-fleet/core 0.24.1 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/adapters/prisma/generated/browser.d.ts +15 -5
- package/dist/adapters/prisma/generated/client.d.ts +15 -5
- package/dist/adapters/prisma/generated/commonInputTypes.d.ts +60 -0
- package/dist/adapters/prisma/generated/enums.d.ts +15 -1
- package/dist/adapters/prisma/generated/enums.js +13 -1
- package/dist/adapters/prisma/generated/enums.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/class.d.ts +11 -0
- package/dist/adapters/prisma/generated/internal/class.js +4 -4
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +109 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +16 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +17 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +16 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/CrewRequest.d.ts +3 -2
- package/dist/adapters/prisma/generated/models/Delivery.d.ts +304 -4
- package/dist/adapters/prisma/generated/models/Fleet.d.ts +267 -0
- package/dist/adapters/prisma/generated/models/Lease.d.ts +332 -1
- package/dist/adapters/prisma/generated/models/OverdueDelivery.d.ts +1687 -0
- package/dist/adapters/prisma/generated/models/OverdueDelivery.js +2 -0
- package/dist/adapters/prisma/generated/models/OverdueDelivery.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Ship.d.ts +271 -0
- package/dist/adapters/prisma/generated/models.d.ts +1 -0
- package/dist/adapters/prisma/history.js +231 -46
- package/dist/adapters/prisma/history.js.map +1 -1
- package/dist/adapters/prisma/installation.js +30 -1
- package/dist/adapters/prisma/installation.js.map +1 -1
- package/dist/adapters/prisma/messaging.js +11 -7
- package/dist/adapters/prisma/messaging.js.map +1 -1
- package/dist/adapters/prisma/overdue.d.ts +4 -0
- package/dist/adapters/prisma/overdue.js +63 -0
- package/dist/adapters/prisma/overdue.js.map +1 -0
- package/dist/adapters/prisma/registry.js +32 -7
- package/dist/adapters/prisma/registry.js.map +1 -1
- package/dist/adapters/prisma/rows.d.ts +12 -1
- package/dist/adapters/prisma/rows.js +46 -1
- package/dist/adapters/prisma/rows.js.map +1 -1
- package/dist/adapters/prisma/unit-of-work.d.ts +2 -1
- package/dist/adapters/prisma/unit-of-work.js +2 -0
- package/dist/adapters/prisma/unit-of-work.js.map +1 -1
- package/dist/adapters/trpc/context.d.ts +16 -0
- package/dist/adapters/trpc/fleet.d.ts +233 -15
- package/dist/adapters/trpc/fleet.js +52 -8
- package/dist/adapters/trpc/fleet.js.map +1 -1
- package/dist/adapters/trpc/installation.d.ts +14 -0
- package/dist/adapters/trpc/installation.js +7 -1
- package/dist/adapters/trpc/installation.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +301 -9
- package/dist/adapters/trpc/ship-protocol.js +2 -2
- package/dist/adapters/trpc/ship-protocol.js.map +1 -1
- package/dist/adapters/trpc/ship.d.ts +87 -0
- package/dist/adapters/trpc/ship.js +96 -1
- package/dist/adapters/trpc/ship.js.map +1 -1
- package/dist/adapters/trpc/starting-prompt-text.d.ts +1 -1
- package/dist/adapters/trpc/starting-prompt-text.js +22 -25
- package/dist/adapters/trpc/starting-prompt-text.js.map +1 -1
- package/dist/adapters/trpc/trpc.js +5 -0
- package/dist/adapters/trpc/trpc.js.map +1 -1
- package/dist/app.d.ts +4 -2
- package/dist/app.js +21 -9
- package/dist/app.js.map +1 -1
- package/dist/domain/messaging/delivery.d.ts +88 -28
- package/dist/domain/messaging/delivery.js +213 -39
- package/dist/domain/messaging/delivery.js.map +1 -1
- package/dist/domain/messaging/dismiss-delivery.d.ts +1 -1
- package/dist/domain/messaging/dismiss-delivery.js +1 -1
- package/dist/domain/messaging/hand-over-delivery.d.ts +38 -0
- package/dist/domain/messaging/hand-over-delivery.js +46 -0
- package/dist/domain/messaging/hand-over-delivery.js.map +1 -0
- package/dist/domain/messaging/message.d.ts +12 -1
- package/dist/domain/messaging/message.js +2 -0
- package/dist/domain/messaging/message.js.map +1 -1
- package/dist/domain/messaging/overdue.d.ts +60 -0
- package/dist/domain/messaging/overdue.js +52 -0
- package/dist/domain/messaging/overdue.js.map +1 -0
- package/dist/domain/messaging/ports.d.ts +20 -0
- package/dist/domain/messaging/public.d.ts +1 -0
- package/dist/domain/messaging/public.js +2 -0
- package/dist/domain/messaging/public.js.map +1 -0
- package/dist/domain/messaging/push-receive-deliveries.d.ts +48 -0
- package/dist/domain/messaging/push-receive-deliveries.js +70 -0
- package/dist/domain/messaging/push-receive-deliveries.js.map +1 -0
- package/dist/domain/messaging/receive-deliveries.d.ts +39 -6
- package/dist/domain/messaging/receive-deliveries.js +80 -50
- package/dist/domain/messaging/receive-deliveries.js.map +1 -1
- package/dist/domain/messaging/report-handled.d.ts +22 -0
- package/dist/domain/messaging/report-handled.js +13 -0
- package/dist/domain/messaging/report-handled.js.map +1 -0
- package/dist/domain/messaging/report-not-handled.d.ts +22 -0
- package/dist/domain/messaging/report-not-handled.js +13 -0
- package/dist/domain/messaging/report-not-handled.js.map +1 -0
- package/dist/domain/messaging/report-turn-end.d.ts +29 -0
- package/dist/domain/messaging/report-turn-end.js +36 -0
- package/dist/domain/messaging/report-turn-end.js.map +1 -0
- package/dist/domain/messaging/resend-delivery.d.ts +1 -1
- package/dist/domain/messaging/resend-delivery.js +1 -1
- package/dist/domain/messaging/tell-overdue-deliveries.d.ts +25 -0
- package/dist/domain/messaging/tell-overdue-deliveries.js +30 -0
- package/dist/domain/messaging/tell-overdue-deliveries.js.map +1 -0
- package/dist/domain/registry/crew-request.d.ts +12 -6
- package/dist/domain/registry/crew-request.js +21 -3
- package/dist/domain/registry/crew-request.js.map +1 -1
- package/dist/domain/registry/installation-fleet.d.ts +3 -2
- package/dist/domain/registry/installation-fleet.js.map +1 -1
- package/dist/domain/registry/leases.d.ts +26 -0
- package/dist/domain/registry/leases.js +26 -1
- package/dist/domain/registry/leases.js.map +1 -1
- package/dist/domain/registry/ping-status.d.ts +2 -2
- package/dist/domain/registry/ping-status.js +7 -4
- package/dist/domain/registry/ping-status.js.map +1 -1
- package/dist/domain/registry/ports.d.ts +40 -0
- package/dist/domain/registry/public.d.ts +2 -2
- package/dist/domain/registry/public.js +1 -1
- package/dist/domain/registry/public.js.map +1 -1
- package/dist/domain/registry/report-turn.d.ts +28 -0
- package/dist/domain/registry/report-turn.js +28 -0
- package/dist/domain/registry/report-turn.js.map +1 -0
- package/dist/domain/registry/request-crew.d.ts +6 -2
- package/dist/domain/registry/request-crew.js +14 -3
- package/dist/domain/registry/request-crew.js.map +1 -1
- package/dist/domain/registry/turn.d.ts +25 -0
- package/dist/domain/registry/turn.js +30 -0
- package/dist/domain/registry/turn.js.map +1 -0
- package/dist/domain/shared/delivery-way.d.ts +83 -0
- package/dist/domain/shared/delivery-way.js +89 -0
- package/dist/domain/shared/delivery-way.js.map +1 -0
- package/dist/domain/shared/errors.d.ts +1 -1
- package/dist/domain/shared/errors.js.map +1 -1
- package/dist/domain/shared/history.d.ts +116 -19
- package/dist/domain/shared/history.js +1 -1
- package/dist/domain/shared/history.js.map +1 -1
- package/dist/domain/shared/read-message.d.ts +7 -3
- package/dist/domain/shared/read-message.js +7 -4
- package/dist/domain/shared/read-message.js.map +1 -1
- package/dist/domain/shared/read-needs-attention.d.ts +5 -5
- package/dist/domain/shared/read-needs-attention.js +4 -4
- package/dist/domain/shared/read-needs-attention.js.map +1 -1
- package/dist/domain/shared/read-no-ship-can-take.d.ts +13 -0
- package/dist/domain/shared/read-no-ship-can-take.js +12 -0
- package/dist/domain/shared/read-no-ship-can-take.js.map +1 -0
- package/dist/domain/shared/read-overdue.d.ts +13 -0
- package/dist/domain/shared/read-overdue.js +12 -0
- package/dist/domain/shared/read-overdue.js.map +1 -0
- package/dist/domain/shared/read-ship-messages.d.ts +4 -1
- package/dist/domain/shared/read-ship-messages.js +6 -1
- package/dist/domain/shared/read-ship-messages.js.map +1 -1
- package/dist/domain/shared/read-ship-way.d.ts +41 -0
- package/dist/domain/shared/read-ship-way.js +39 -0
- package/dist/domain/shared/read-ship-way.js.map +1 -0
- package/dist/repeating-pass.d.ts +15 -0
- package/dist/repeating-pass.js +31 -0
- package/dist/repeating-pass.js.map +1 -0
- package/dist/wiring.d.ts +19 -0
- package/dist/wiring.js +25 -0
- package/dist/wiring.js.map +1 -1
- package/package.json +2 -2
- package/src/adapters/prisma/migrations/20261012190000_delivery_handed/migration.sql +11 -0
- package/src/adapters/prisma/migrations/20261012210000_push_receive/migration.sql +7 -0
- package/src/adapters/prisma/migrations/20261013090000_handled/migration.sql +6 -0
- package/src/adapters/prisma/migrations/20261013100000_turn/migration.sql +6 -0
- package/src/adapters/prisma/migrations/20261013120000_overdue/migration.sql +28 -0
- package/src/adapters/prisma/migrations/20261013140000_delivery_state_index/migration.sql +4 -0
- package/src/adapters/prisma/schema.prisma +69 -6
|
@@ -0,0 +1,36 @@
|
|
|
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 { endTurn } from './delivery.js';
|
|
6
|
+
/**
|
|
7
|
+
* The unit of work of handled and not handled, which differ only in how the
|
|
8
|
+
* turn ended: hold the crew's lease, so a release waits for it and an ended
|
|
9
|
+
* lease is refused; lock the delivery, so two reports take turns; apply the
|
|
10
|
+
* report and write its event.
|
|
11
|
+
*/
|
|
12
|
+
export async function reportTurnEnd(deps, report) {
|
|
13
|
+
const { tx } = deps;
|
|
14
|
+
const { crew, deliveryId, end } = report;
|
|
15
|
+
const held = await holdLease(tx, crew);
|
|
16
|
+
if (!held.isOk) {
|
|
17
|
+
return held;
|
|
18
|
+
}
|
|
19
|
+
const delivery = await tx.deliveries.findForUpdate(crew.fleetId, deliveryId);
|
|
20
|
+
if (!delivery) {
|
|
21
|
+
return refuse('DELIVERY_NOT_FOUND', `Delivery ${deliveryId} does not exist`);
|
|
22
|
+
}
|
|
23
|
+
const ended = endTurn(delivery, { crew, end, at: deps.clock.now() });
|
|
24
|
+
if (!ended.isOk) {
|
|
25
|
+
return ended;
|
|
26
|
+
}
|
|
27
|
+
const { delivery: changed, events } = ended.value;
|
|
28
|
+
if (events.length > 0) {
|
|
29
|
+
await tx.deliveries.update(changed);
|
|
30
|
+
}
|
|
31
|
+
for (const event of events) {
|
|
32
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, event);
|
|
33
|
+
}
|
|
34
|
+
return ok(undefined);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=report-turn-end.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-turn-end.js","sourceRoot":"","sources":["../../../src/domain/messaging/report-turn-end.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;AACtD,OAAO,EAAE,OAAO,EAAqC,MAAM,eAAe,CAAC;AAU3E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAA6D,EAC7D,MAA4D;IAE5D,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,UAAU,iBAAiB,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;IAClD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -25,7 +25,7 @@ export type ResendDelivery = (caller: Caller, input: {
|
|
|
25
25
|
messageId: MessageId;
|
|
26
26
|
}, ResendDeliveryRefusal>>;
|
|
27
27
|
/**
|
|
28
|
-
* Use case: the operator resends an undeliverable delivery from Needs
|
|
28
|
+
* Use case: the operator resends an undeliverable or not handled delivery from Needs
|
|
29
29
|
* attention (docs/blueprint.md, "DeliveryUndeliverable"). Its scope
|
|
30
30
|
* (fleet:manage) is checked before this runs. A resend is a retry of the same
|
|
31
31
|
* delivery: a new message with the original's sender, selector, payload,
|
|
@@ -16,7 +16,7 @@ function resendKey(deliveryId) {
|
|
|
16
16
|
return `resend-${deliveryId}`;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Use case: the operator resends an undeliverable delivery from Needs
|
|
19
|
+
* Use case: the operator resends an undeliverable or not handled delivery from Needs
|
|
20
20
|
* attention (docs/blueprint.md, "DeliveryUndeliverable"). Its scope
|
|
21
21
|
* (fleet:manage) is checked before this runs. A resend is a retry of the same
|
|
22
22
|
* delivery: a new message with the original's sender, selector, payload,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { IdGenerator } from '@aeolus-fleet/common';
|
|
2
|
+
import type { FleetRepository } from '../registry/public.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type EventLog } from '../shared/events.js';
|
|
5
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
6
|
+
import type { OverdueDeliveryRepository, PushedCrews } from './ports.js';
|
|
7
|
+
export interface TellOverdueTx {
|
|
8
|
+
overdueDeliveries: OverdueDeliveryRepository;
|
|
9
|
+
events: EventLog;
|
|
10
|
+
}
|
|
11
|
+
export type TellOverdueDeliveries = () => Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Use case: one pass of the 10 and 60 minute clocks (#586, decision 0040),
|
|
14
|
+
* run by core, never through the API. For every fleet, each open pushed
|
|
15
|
+
* lease's oldest delivery whose clock ran out is told to argo: stored once
|
|
16
|
+
* per lease and delivery with DeliveryOverdue, in one unit of work. What is
|
|
17
|
+
* stored outlives the process, so a pass after a restart tells nothing again.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createTellOverdueDeliveries(deps: {
|
|
20
|
+
fleets: Pick<FleetRepository, 'list'>;
|
|
21
|
+
pushedCrews: PushedCrews;
|
|
22
|
+
uow: UnitOfWork<TellOverdueTx>;
|
|
23
|
+
clock: Clock;
|
|
24
|
+
ids: IdGenerator;
|
|
25
|
+
}): TellOverdueDeliveries;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { recordEvent } from '../shared/events.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { overdueDelivery, overdueEvent } from './overdue.js';
|
|
4
|
+
/**
|
|
5
|
+
* Use case: one pass of the 10 and 60 minute clocks (#586, decision 0040),
|
|
6
|
+
* run by core, never through the API. For every fleet, each open pushed
|
|
7
|
+
* lease's oldest delivery whose clock ran out is told to argo: stored once
|
|
8
|
+
* per lease and delivery with DeliveryOverdue, in one unit of work. What is
|
|
9
|
+
* stored outlives the process, so a pass after a restart tells nothing again.
|
|
10
|
+
*/
|
|
11
|
+
export function createTellOverdueDeliveries(deps) {
|
|
12
|
+
return async () => {
|
|
13
|
+
for (const fleet of await deps.fleets.list()) {
|
|
14
|
+
for (const crew of await deps.pushedCrews.waiting(fleet.id)) {
|
|
15
|
+
const now = deps.clock.now();
|
|
16
|
+
const overdue = overdueDelivery(crew, now);
|
|
17
|
+
if (!overdue) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
await deps.uow.run(async (tx) => {
|
|
21
|
+
if (await tx.overdueDeliveries.tell(overdue, now)) {
|
|
22
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, overdueEvent(overdue, now));
|
|
23
|
+
}
|
|
24
|
+
return ok(undefined);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=tell-overdue-deliveries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tell-overdue-deliveries.js","sourceRoot":"","sources":["../../../src/domain/messaging/tell-overdue-deliveries.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAU7D;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAM3C;IACC,OAAO,KAAK,IAAI,EAAE;QAChB,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;oBAC9B,IAAI,MAAM,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;wBAClD,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtF,CAAC;oBACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;gBACvB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CrewStatus, type FleetId, type Scope, type ShipId } from '@aeolus-fleet/common';
|
|
1
|
+
import { type CrewStatus, type FleetId, type LabelValueId, type Scope, type ShipId } from '@aeolus-fleet/common';
|
|
2
2
|
import { type Caller } from '../shared/caller.js';
|
|
3
3
|
import { type DomainError } from '../shared/errors.js';
|
|
4
4
|
import type { Actor, NewEvent } from '../shared/events.js';
|
|
@@ -8,8 +8,8 @@ import { type CrewRequestShipRefusal, type Ship } from './ship.js';
|
|
|
8
8
|
/**
|
|
9
9
|
* A standing request that a ship be kept crewed (docs/blueprint.md, "Crew
|
|
10
10
|
* request"; decision 0029): at most one per ship, in three parts with one
|
|
11
|
-
* writer each. The settings,
|
|
12
|
-
* requester with fleet:manage; the assignment, the trierarch ship that crews
|
|
11
|
+
* writer each. The settings, crew settings (decision 0027) the server checks but
|
|
12
|
+
* never acts on, by a requester with fleet:manage; the assignment, the trierarch ship that crews
|
|
13
13
|
* it, by a ship with crew:assign; the status, by the assigned trierarch.
|
|
14
14
|
* Removing an assigned request marks it releasing; it goes once its
|
|
15
15
|
* trierarch confirms.
|
|
@@ -47,18 +47,22 @@ export interface GiveBack {
|
|
|
47
47
|
type NotFound = DomainError<'CREW_REQUEST_NOT_FOUND'>;
|
|
48
48
|
type Releasing = DomainError<'CREW_REQUEST_RELEASING'>;
|
|
49
49
|
type NotTheCallers = DomainError<'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER'>;
|
|
50
|
-
export type RequestCrewRefusal = CrewRequestShipRefusal | Releasing | DomainError<'CREW_REQUEST_SETTINGS_TOO_LARGE'>;
|
|
50
|
+
export type RequestCrewRefusal = CrewRequestShipRefusal | Releasing | DomainError<'CREW_REQUEST_SETTINGS_TOO_LARGE'> | DomainError<'CREW_REQUEST_SETTINGS_INVALID'>;
|
|
51
51
|
/**
|
|
52
52
|
* A requester asks that the ship be kept crewed, with these settings: the
|
|
53
53
|
* request it holds now, replacing the settings of any it held and keeping its
|
|
54
54
|
* assignment and status, its crew not final until the new settings run, and
|
|
55
55
|
* CrewRequested with the settings version, never
|
|
56
56
|
* the settings. Never argo, the viewer ship or a retired ship; settings of at
|
|
57
|
-
* most 16 KB
|
|
57
|
+
* most 16 KB that are crew settings (decision 0027), as placement reads
|
|
58
|
+
* them, each machine label one of the fleet's label values (#811), so a
|
|
59
|
+
* request never waits for a machine no label lets match; never while the
|
|
60
|
+
* request is releasing.
|
|
58
61
|
*/
|
|
59
|
-
export declare function requestCrew({ ship, current }: {
|
|
62
|
+
export declare function requestCrew({ ship, current, labelValues }: {
|
|
60
63
|
ship: Ship;
|
|
61
64
|
current: CrewRequest | undefined;
|
|
65
|
+
labelValues: ReadonlySet<LabelValueId>;
|
|
62
66
|
}, input: {
|
|
63
67
|
settings: JsonObject;
|
|
64
68
|
at: Date;
|
|
@@ -67,6 +71,8 @@ export declare function requestCrew({ ship, current }: {
|
|
|
67
71
|
request: CrewRequest;
|
|
68
72
|
events: NewEvent[];
|
|
69
73
|
}, RequestCrewRefusal>;
|
|
74
|
+
/** The machine labels the settings name, to look up among the fleet's label values; none when they are not crew settings. */
|
|
75
|
+
export declare function machineLabelsOf(settings: JsonObject): readonly LabelValueId[];
|
|
70
76
|
/**
|
|
71
77
|
* A requester removes the ship's crew request. Unassigned, it goes at once,
|
|
72
78
|
* with CrewRequestRemoved. Assigned, it is marked releasing, with
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CREW_REQUEST_REASON_MAX_LENGTH, CREW_REQUEST_SETTINGS_MAX_BYTES, isOneLine, crewRequestSettingsBytes, } from '@aeolus-fleet/common';
|
|
1
|
+
import { CREW_REQUEST_REASON_MAX_LENGTH, CREW_REQUEST_SETTINGS_MAX_BYTES, isOneLine, readCrewSettings, crewRequestSettingsBytes, } from '@aeolus-fleet/common';
|
|
2
2
|
import { hasScope } from '../shared/caller.js';
|
|
3
3
|
import { refuse } from '../shared/errors.js';
|
|
4
4
|
import { ok } from '../shared/result.js';
|
|
@@ -18,9 +18,12 @@ function event(ship, change) {
|
|
|
18
18
|
* assignment and status, its crew not final until the new settings run, and
|
|
19
19
|
* CrewRequested with the settings version, never
|
|
20
20
|
* the settings. Never argo, the viewer ship or a retired ship; settings of at
|
|
21
|
-
* most 16 KB
|
|
21
|
+
* most 16 KB that are crew settings (decision 0027), as placement reads
|
|
22
|
+
* them, each machine label one of the fleet's label values (#811), so a
|
|
23
|
+
* request never waits for a machine no label lets match; never while the
|
|
24
|
+
* request is releasing.
|
|
22
25
|
*/
|
|
23
|
-
export function requestCrew({ ship, current }, input) {
|
|
26
|
+
export function requestCrew({ ship, current, labelValues }, input) {
|
|
24
27
|
const requestable = checkCanBeRequestedCrew(ship);
|
|
25
28
|
if (!requestable.isOk) {
|
|
26
29
|
return requestable;
|
|
@@ -32,6 +35,16 @@ export function requestCrew({ ship, current }, input) {
|
|
|
32
35
|
if (bytes > CREW_REQUEST_SETTINGS_MAX_BYTES) {
|
|
33
36
|
return refuse('CREW_REQUEST_SETTINGS_TOO_LARGE', `settings is ${String(bytes)} bytes, the limit is ${String(CREW_REQUEST_SETTINGS_MAX_BYTES)} (decision 0029)`);
|
|
34
37
|
}
|
|
38
|
+
// Read as placement reads them, so a request is never stored that no trierarch could take (#809).
|
|
39
|
+
const read = readCrewSettings(input.settings);
|
|
40
|
+
if ('refusal' in read) {
|
|
41
|
+
return refuse('CREW_REQUEST_SETTINGS_INVALID', read.refusal.reason);
|
|
42
|
+
}
|
|
43
|
+
for (const [index, valueId] of (read.settings.machineLabels ?? []).entries()) {
|
|
44
|
+
if (!labelValues.has(valueId)) {
|
|
45
|
+
return refuse('CREW_REQUEST_SETTINGS_INVALID', `settings are not valid crew settings: machineLabels.${String(index)}: The fleet has no label value ${valueId}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
35
48
|
const request = {
|
|
36
49
|
fleetId: ship.fleetId,
|
|
37
50
|
shipId: ship.id,
|
|
@@ -50,6 +63,11 @@ export function requestCrew({ ship, current }, input) {
|
|
|
50
63
|
};
|
|
51
64
|
return ok({ request, events: [event(ship, { at: input.at, actor: input.actor, type: 'CrewRequested', details: { settingsVersion: request.settingsVersion } })] });
|
|
52
65
|
}
|
|
66
|
+
/** The machine labels the settings name, to look up among the fleet's label values; none when they are not crew settings. */
|
|
67
|
+
export function machineLabelsOf(settings) {
|
|
68
|
+
const read = readCrewSettings(settings);
|
|
69
|
+
return 'settings' in read ? (read.settings.machineLabels ?? []) : [];
|
|
70
|
+
}
|
|
53
71
|
/**
|
|
54
72
|
* A requester removes the ship's crew request. Unassigned, it goes at once,
|
|
55
73
|
* with CrewRequestRemoved. Assigned, it is marked releasing, with
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crew-request.js","sourceRoot":"","sources":["../../../src/domain/registry/crew-request.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAC/B,SAAS,EACT,wBAAwB,
|
|
1
|
+
{"version":3,"file":"crew-request.js","sourceRoot":"","sources":["../../../src/domain/registry/crew-request.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
2
|
import { type FleetLimit, type InstallationSettings } from './limits.js';
|
|
3
|
-
import type { InstallationFleetFacts, InstallationFleetWindow } from './ports.js';
|
|
3
|
+
import type { FleetHealth, InstallationFleetFacts, InstallationFleetWindow } from './ports.js';
|
|
4
4
|
/** How far back an installation's fleet counts its messages, and over how many UTC days. */
|
|
5
5
|
export declare const MESSAGE_WINDOW_DAYS = 7;
|
|
6
6
|
export declare const MESSAGE_WINDOW_MS: number;
|
|
7
7
|
/**
|
|
8
8
|
* A fleet as the installation describes it (docs/blueprint.md,
|
|
9
9
|
* "Installation"): its facts and measures, its messages today and per UTC day
|
|
10
|
-
* of the last 7 days, today last,
|
|
10
|
+
* of the last 7 days, today last, the limits that apply to it and its health.
|
|
11
11
|
*/
|
|
12
12
|
export interface InstallationFleet {
|
|
13
13
|
fleetId: FleetId;
|
|
@@ -27,6 +27,7 @@ export interface InstallationFleet {
|
|
|
27
27
|
ships: FleetLimit;
|
|
28
28
|
dailyMessages: FleetLimit;
|
|
29
29
|
};
|
|
30
|
+
health: FleetHealth;
|
|
30
31
|
}
|
|
31
32
|
/** What a read at `now` counts over: the last 7 times 24 hours, and the last 7 UTC days from the first one's start. */
|
|
32
33
|
export declare function messageWindow(now: Date): InstallationFleetWindow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installation-fleet.js","sourceRoot":"","sources":["../../../src/domain/registry/installation-fleet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAA8C,MAAM,aAAa,CAAC;AAGxF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"installation-fleet.js","sourceRoot":"","sources":["../../../src/domain/registry/installation-fleet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAA8C,MAAM,aAAa,CAAC;AAGxF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,MAAM,CAAC;AAsB9D,gGAAgG;AAChG,SAAS,OAAO,CAAC,GAAS;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,mBAAmB,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAClK,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,aAAa,CAAC,GAAS;IACrC,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,QAAQ,gBAAgB,CAAC,EAAE,CAAC;AACjH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAA6B,EAAE,IAAuD;IACtH,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC3E,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1I,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACrI,OAAO,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC;AAC3J,CAAC"}
|
|
@@ -64,3 +64,29 @@ export declare function holdLease(tx: HoldLeaseTx, crew: {
|
|
|
64
64
|
fleetId: FleetId;
|
|
65
65
|
leaseId: LeaseId;
|
|
66
66
|
}): Promise<Result<Ship, LeaseEnded>>;
|
|
67
|
+
/**
|
|
68
|
+
* Marks the crew's lease pushed (decision 0040): from its first push receive
|
|
69
|
+
* until it ends, the computer side takes its deliveries and the agent's plain
|
|
70
|
+
* receive answers nothing. The first mark writes LeasePushed, caused by the
|
|
71
|
+
* crew's ship; a lease already pushed, or one that has ended, stays as it
|
|
72
|
+
* was. Call it first in the unit of work, before the lease is held.
|
|
73
|
+
*/
|
|
74
|
+
export declare function markLeasePushed(deps: {
|
|
75
|
+
tx: {
|
|
76
|
+
leases: Pick<LeaseRepository, 'markPushed'>;
|
|
77
|
+
events: EventLog;
|
|
78
|
+
};
|
|
79
|
+
ids: IdGenerator;
|
|
80
|
+
}, crew: {
|
|
81
|
+
fleetId: FleetId;
|
|
82
|
+
shipId: ShipId;
|
|
83
|
+
leaseId: LeaseId;
|
|
84
|
+
at: Date;
|
|
85
|
+
}): Promise<void>;
|
|
86
|
+
/** Whether the crew's lease is pushed: a push receive has marked it. */
|
|
87
|
+
export declare function isLeasePushed(tx: {
|
|
88
|
+
leases: Pick<LeaseRepository, 'isPushed'>;
|
|
89
|
+
}, crew: {
|
|
90
|
+
fleetId: FleetId;
|
|
91
|
+
leaseId: LeaseId;
|
|
92
|
+
}): Promise<boolean>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { refuse } from '../shared/errors.js';
|
|
2
|
-
import { recordEvent } from '../shared/events.js';
|
|
2
|
+
import { recordEvent, shipActor } from '../shared/events.js';
|
|
3
3
|
import { ok } from '../shared/result.js';
|
|
4
4
|
import { refuseEndedLease } from './lease.js';
|
|
5
5
|
/**
|
|
@@ -77,4 +77,29 @@ export async function holdLease(tx, crew) {
|
|
|
77
77
|
const ship = lease && (await tx.ships.find(crew.fleetId, lease.shipId));
|
|
78
78
|
return ship ? ok(ship) : refuseEndedLease();
|
|
79
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Marks the crew's lease pushed (decision 0040): from its first push receive
|
|
82
|
+
* until it ends, the computer side takes its deliveries and the agent's plain
|
|
83
|
+
* receive answers nothing. The first mark writes LeasePushed, caused by the
|
|
84
|
+
* crew's ship; a lease already pushed, or one that has ended, stays as it
|
|
85
|
+
* was. Call it first in the unit of work, before the lease is held.
|
|
86
|
+
*/
|
|
87
|
+
export async function markLeasePushed(deps, crew) {
|
|
88
|
+
const { tx, ids } = deps;
|
|
89
|
+
const { fleetId, shipId, leaseId, at } = crew;
|
|
90
|
+
if (await tx.leases.markPushed({ fleetId, leaseId, at })) {
|
|
91
|
+
await recordEvent({ events: tx.events, ids }, {
|
|
92
|
+
fleetId,
|
|
93
|
+
type: 'LeasePushed',
|
|
94
|
+
occurredAt: at,
|
|
95
|
+
actor: shipActor(shipId),
|
|
96
|
+
shipId,
|
|
97
|
+
details: { leaseId },
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Whether the crew's lease is pushed: a push receive has marked it. */
|
|
102
|
+
export async function isLeasePushed(tx, crew) {
|
|
103
|
+
return tx.leases.isPushed(crew.fleetId, crew.leaseId);
|
|
104
|
+
}
|
|
80
105
|
//# sourceMappingURL=leases.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leases.js","sourceRoot":"","sources":["../../../src/domain/registry/leases.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAA6B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"leases.js","sourceRoot":"","sources":["../../../src/domain/registry/leases.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,8 @@ export interface PingStatus {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* The status of a ship's last ping: waiting while its delivery is pending or
|
|
12
|
-
* in flight, answered once pong acknowledged it,
|
|
13
|
-
* did, and undeliverable once it was handed out again and again and never
|
|
12
|
+
* in flight, answered once pong acknowledged it, acknowledged when a plain ack
|
|
13
|
+
* did, and so on after its turn ended, handled or not, and undeliverable once it was handed out again and again and never
|
|
14
14
|
* acknowledged (it is in Needs attention too). A ping the operator dismissed,
|
|
15
15
|
* or one abandoned with a retired ship, shows none.
|
|
16
16
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The status of a ship's last ping: waiting while its delivery is pending or
|
|
3
|
-
* in flight, answered once pong acknowledged it,
|
|
4
|
-
* did, and undeliverable once it was handed out again and again and never
|
|
3
|
+
* in flight, answered once pong acknowledged it, acknowledged when a plain ack
|
|
4
|
+
* did, and so on after its turn ended, handled or not, and undeliverable once it was handed out again and again and never
|
|
5
5
|
* acknowledged (it is in Needs attention too). A ping the operator dismissed,
|
|
6
6
|
* or one abandoned with a retired ship, shows none.
|
|
7
7
|
*/
|
|
@@ -12,11 +12,14 @@ export function pingStatusOf(lastPing) {
|
|
|
12
12
|
const { sentAt, deliveryState, answeredWithPongAt } = lastPing;
|
|
13
13
|
switch (deliveryState) {
|
|
14
14
|
case 'pending':
|
|
15
|
-
case '
|
|
15
|
+
case 'received':
|
|
16
|
+
case 'handed':
|
|
16
17
|
return { state: 'waiting', sentAt, answeredAt: null };
|
|
17
18
|
case 'acknowledged':
|
|
19
|
+
case 'handled':
|
|
20
|
+
case 'notHandled':
|
|
18
21
|
return answeredWithPongAt === null
|
|
19
|
-
? { state: '
|
|
22
|
+
? { state: 'acknowledged', sentAt, answeredAt: null }
|
|
20
23
|
: { state: 'answered', sentAt, answeredAt: answeredWithPongAt };
|
|
21
24
|
case 'undeliverable':
|
|
22
25
|
return { state: 'undeliverable', sentAt, answeredAt: null };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ping-status.js","sourceRoot":"","sources":["../../../src/domain/registry/ping-status.ts"],"names":[],"mappings":"AAYA;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAA+B;IAC1D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,QAAQ,CAAC;IAC/D,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,SAAS,CAAC;QACf,KAAK,
|
|
1
|
+
{"version":3,"file":"ping-status.js","sourceRoot":"","sources":["../../../src/domain/registry/ping-status.ts"],"names":[],"mappings":"AAYA;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAA+B;IAC1D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,QAAQ,CAAC;IAC/D,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,SAAS,CAAC;QACf,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACxD,KAAK,cAAc,CAAC;QACpB,KAAK,SAAS,CAAC;QACf,KAAK,YAAY;YACf,OAAO,kBAAkB,KAAK,IAAI;gBAChC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE;gBACrD,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC;QACpE,KAAK,eAAe;YAClB,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC9D,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -12,6 +12,7 @@ import type { NetworkSettings } from './network-settings.js';
|
|
|
12
12
|
import type { ReachRefusal } from './reach-refusal.js';
|
|
13
13
|
import type { Ship } from './ship.js';
|
|
14
14
|
import type { ShipReport } from './ship-report.js';
|
|
15
|
+
import type { Turn } from './turn.js';
|
|
15
16
|
/** The crew a report speaks for: its ship and lease, in its fleet. */
|
|
16
17
|
export interface CrewOfLease {
|
|
17
18
|
fleetId: FleetId;
|
|
@@ -166,6 +167,15 @@ export interface LeaseRepository {
|
|
|
166
167
|
leaseId: LeaseId;
|
|
167
168
|
report: ShipReport;
|
|
168
169
|
}): Promise<void>;
|
|
170
|
+
/** The open lease's turn, locked until the unit of work ends, so two turn reports take turns; undefined once it has ended. */
|
|
171
|
+
findTurnForUpdate(fleetId: FleetId, leaseId: LeaseId): Promise<{
|
|
172
|
+
turn: Turn | null;
|
|
173
|
+
} | undefined>;
|
|
174
|
+
saveTurn(change: {
|
|
175
|
+
fleetId: FleetId;
|
|
176
|
+
leaseId: LeaseId;
|
|
177
|
+
turn: Turn;
|
|
178
|
+
}): Promise<void>;
|
|
169
179
|
/**
|
|
170
180
|
* The lease's report and the last report of the lease its ship held before
|
|
171
181
|
* it, the one that ended last; undefined once this lease has ended.
|
|
@@ -180,6 +190,18 @@ export interface LeaseRepository {
|
|
|
180
190
|
leaseId: LeaseId;
|
|
181
191
|
endedAt: Date;
|
|
182
192
|
}): Promise<Lease | undefined>;
|
|
193
|
+
/**
|
|
194
|
+
* Marks the open lease pushed from `at`, keeping an earlier mark, before
|
|
195
|
+
* anything else of the lease is locked: two marks take turns and never
|
|
196
|
+
* deadlock with the units of work holding it. True when this call marked it.
|
|
197
|
+
*/
|
|
198
|
+
markPushed(pushed: {
|
|
199
|
+
fleetId: FleetId;
|
|
200
|
+
leaseId: LeaseId;
|
|
201
|
+
at: Date;
|
|
202
|
+
}): Promise<boolean>;
|
|
203
|
+
/** Whether a push receive marked the lease pushed. */
|
|
204
|
+
isPushed(fleetId: FleetId, leaseId: LeaseId): Promise<boolean>;
|
|
183
205
|
}
|
|
184
206
|
/**
|
|
185
207
|
* Outbound port: crew requests, at most one per ship, always within one
|
|
@@ -396,6 +418,24 @@ export interface InstallationFleetFacts {
|
|
|
396
418
|
}[];
|
|
397
419
|
/** How its limits are set. */
|
|
398
420
|
limitSettings: FleetLimitSettings;
|
|
421
|
+
/** Whether its deliveries reach their ships. */
|
|
422
|
+
health: FleetHealth;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* A fleet's health as the installation reads it (#304): where its deliveries
|
|
426
|
+
* wait, read from their states and times, never their payloads.
|
|
427
|
+
*/
|
|
428
|
+
export interface FleetHealth {
|
|
429
|
+
/** When its oldest pending delivery was sent; null when none is pending. */
|
|
430
|
+
oldestPendingAt: Date | null;
|
|
431
|
+
/** Since when its oldest delivery in flight (received or handed) is in its state, as the overdue clocks read it; null when none is. */
|
|
432
|
+
oldestInFlightAt: Date | null;
|
|
433
|
+
/** Its pending deliveries to a type no active ship can take: none of the type, or none of the reachable ones (decision 0034). */
|
|
434
|
+
noShipCanTake: number;
|
|
435
|
+
/** Its undeliverable and not handled deliveries: what Needs attention lists for Resend or Dismiss. */
|
|
436
|
+
needsAttention: number;
|
|
437
|
+
/** The overdue deliveries argo was told of that still stand: what Needs attention shows as overdue. */
|
|
438
|
+
overdue: number;
|
|
399
439
|
}
|
|
400
440
|
/** What a read of the installation's fleets counts messages over: since a moment, and per UTC day from a first day. */
|
|
401
441
|
export interface InstallationFleetWindow {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { location, refuseEndedLease, type Lease, type LeaseEnded, type LeaseEndReason, type Location } from './lease.js';
|
|
2
|
-
export { endLease, holdLease, takeOverOperatorLease, type HoldLeaseTx, type LeaseTx } from './leases.js';
|
|
3
|
-
export type { InFlightDeliveries, LeaseRepository, ShipRepository } from './ports.js';
|
|
2
|
+
export { endLease, holdLease, isLeasePushed, markLeasePushed, takeOverOperatorLease, type HoldLeaseTx, type LeaseTx } from './leases.js';
|
|
3
|
+
export type { FleetRepository, InFlightDeliveries, LeaseRepository, ShipRepository } from './ports.js';
|
|
4
4
|
export { findPingableShip, type PingableShipTx, type UnpingableShip } from './pingable-ship.js';
|
|
5
5
|
export { checkReach, type CheckReachTx, type NotReachable } from './check-reach.js';
|
|
6
6
|
export { resolveSelector, type ResolveSelectorTx, type UnresolvableSelector } from './resolve-selector.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Registry's published surface: what other contexts may use. Use cases are not
|
|
2
2
|
// part of it; adapters import them from their own modules.
|
|
3
3
|
export { location, refuseEndedLease } from './lease.js';
|
|
4
|
-
export { endLease, holdLease, takeOverOperatorLease } from './leases.js';
|
|
4
|
+
export { endLease, holdLease, isLeasePushed, markLeasePushed, takeOverOperatorLease } from './leases.js';
|
|
5
5
|
export { findPingableShip } from './pingable-ship.js';
|
|
6
6
|
export { checkReach } from './check-reach.js';
|
|
7
7
|
export { resolveSelector } from './resolve-selector.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;
|
|
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,aAAa,EAAE,eAAe,EAAE,qBAAqB,EAAkC,MAAM,aAAa,CAAC;AAEzI,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,28 @@
|
|
|
1
|
+
import type { IdGenerator, TurnState } 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 ReportTurnTx {
|
|
10
|
+
leases: Pick<LeaseRepository, 'findTurnForUpdate' | 'saveTurn'>;
|
|
11
|
+
events: EventLog;
|
|
12
|
+
}
|
|
13
|
+
export type ReportTurn = (crew: Crew, input: {
|
|
14
|
+
turn: TurnState;
|
|
15
|
+
at: Date;
|
|
16
|
+
}) => Promise<Result<undefined, LeaseEnded>>;
|
|
17
|
+
/**
|
|
18
|
+
* Use case: a pushed ship's hooks report its session's turn (`turn`,
|
|
19
|
+
* decision 0040), idle or busy, with the time they saw it. No scope beyond
|
|
20
|
+
* being the crew: it speaks only for its own session. The turn is kept with
|
|
21
|
+
* the crew's lease, locked meanwhile, and TurnReported is written when it
|
|
22
|
+
* changed, in one unit of work. Refused once the lease has ended.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createReportTurn(deps: {
|
|
25
|
+
uow: UnitOfWork<ReportTurnTx>;
|
|
26
|
+
clock: Clock;
|
|
27
|
+
ids: IdGenerator;
|
|
28
|
+
}): ReportTurn;
|
|
@@ -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 { reportTurn } from './turn.js';
|
|
5
|
+
/**
|
|
6
|
+
* Use case: a pushed ship's hooks report its session's turn (`turn`,
|
|
7
|
+
* decision 0040), idle or busy, with the time they saw it. No scope beyond
|
|
8
|
+
* being the crew: it speaks only for its own session. The turn is kept with
|
|
9
|
+
* the crew's lease, locked meanwhile, and TurnReported is written when it
|
|
10
|
+
* changed, in one unit of work. Refused once the lease has ended.
|
|
11
|
+
*/
|
|
12
|
+
export function createReportTurn(deps) {
|
|
13
|
+
return (crew, input) => deps.uow.run(async (tx) => {
|
|
14
|
+
const held = await tx.leases.findTurnForUpdate(crew.fleetId, crew.leaseId);
|
|
15
|
+
if (!held) {
|
|
16
|
+
return refuseEndedLease();
|
|
17
|
+
}
|
|
18
|
+
const { turn, events } = reportTurn(held.turn, { crew, ...input, now: deps.clock.now() });
|
|
19
|
+
if (events.length > 0) {
|
|
20
|
+
await tx.leases.saveTurn({ fleetId: crew.fleetId, leaseId: crew.leaseId, turn });
|
|
21
|
+
}
|
|
22
|
+
for (const event of events) {
|
|
23
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, event);
|
|
24
|
+
}
|
|
25
|
+
return ok(undefined);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=report-turn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-turn.js","sourceRoot":"","sources":["../../../src/domain/registry/report-turn.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,UAAU,EAAE,MAAM,WAAW,CAAC;AASvC;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAuE;IACtG,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA0C,EAAE;QAChE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1F,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,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"}
|
|
@@ -6,11 +6,12 @@ import { type EventLog } from '../shared/events.js';
|
|
|
6
6
|
import { type Result } from '../shared/result.js';
|
|
7
7
|
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
8
8
|
import { type RequestCrewRefusal } from './crew-request.js';
|
|
9
|
-
import type { CrewRequestRepository, ShipRepository } from './ports.js';
|
|
9
|
+
import type { CrewRequestRepository, LabelRepository, ShipRepository } from './ports.js';
|
|
10
10
|
import type { JsonObject } from './report-details.js';
|
|
11
11
|
export interface RequestCrewTx {
|
|
12
12
|
ships: Pick<ShipRepository, 'findForUpdate'>;
|
|
13
13
|
crewRequests: CrewRequestRepository;
|
|
14
|
+
labels: Pick<LabelRepository, 'findByValueForShare'>;
|
|
14
15
|
events: EventLog;
|
|
15
16
|
}
|
|
16
17
|
export type RequestCrew = (caller: Caller, input: {
|
|
@@ -23,7 +24,10 @@ export type RequestCrew = (caller: Caller, input: {
|
|
|
23
24
|
* Use case: a requester asks that a ship be kept crewed, with these settings,
|
|
24
25
|
* replacing any request the ship holds. Its scope (fleet:manage) is checked
|
|
25
26
|
* before this runs. In one unit of work, locking the ship first, as a retire
|
|
26
|
-
* does, so a retire and a request never cross
|
|
27
|
+
* does, so a retire and a request never cross; then holding the label of
|
|
28
|
+
* each machine label, as an assignment does, so a change of its values waits
|
|
29
|
+
* and the request never names a value it removed: the request and
|
|
30
|
+
* CrewRequested.
|
|
27
31
|
*/
|
|
28
32
|
export declare function createRequestCrew(deps: {
|
|
29
33
|
uow: UnitOfWork<RequestCrewTx>;
|