@aeolus-fleet/core 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/adapters/http/request-credentials.d.ts +2 -9
- package/dist/adapters/http/request-credentials.js +8 -1
- package/dist/adapters/http/request-credentials.js.map +1 -1
- package/dist/adapters/http/server.js +2 -1
- package/dist/adapters/http/server.js.map +1 -1
- package/dist/adapters/mcp/mcp-endpoint.js +11 -1
- package/dist/adapters/mcp/mcp-endpoint.js.map +1 -1
- package/dist/adapters/prisma/generated/browser.d.ts +8 -0
- package/dist/adapters/prisma/generated/client.d.ts +8 -0
- package/dist/adapters/prisma/generated/enums.d.ts +2 -0
- package/dist/adapters/prisma/generated/enums.js +3 -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 +94 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +18 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +18 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +18 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/Delivery.d.ts +71 -1
- package/dist/adapters/prisma/generated/models/Fleet.d.ts +275 -0
- package/dist/adapters/prisma/generated/models/Lease.d.ts +113 -1
- package/dist/adapters/prisma/generated/models/NetworkSettings.d.ts +151 -19
- package/dist/adapters/prisma/generated/models/ReachRefusal.d.ts +71 -1
- package/dist/adapters/prisma/generated/models/ScopeNamespace.d.ts +1220 -0
- package/dist/adapters/prisma/generated/models/ScopeNamespace.js +2 -0
- package/dist/adapters/prisma/generated/models/ScopeNamespace.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Ship.d.ts +983 -55
- package/dist/adapters/prisma/generated/models.d.ts +1 -0
- package/dist/adapters/prisma/health.js +27 -7
- package/dist/adapters/prisma/health.js.map +1 -1
- package/dist/adapters/prisma/history.js +14 -70
- package/dist/adapters/prisma/history.js.map +1 -1
- package/dist/adapters/prisma/messaging.js +27 -34
- package/dist/adapters/prisma/messaging.js.map +1 -1
- package/dist/adapters/prisma/network.js +39 -12
- package/dist/adapters/prisma/network.js.map +1 -1
- package/dist/adapters/prisma/registry.js +65 -11
- package/dist/adapters/prisma/registry.js.map +1 -1
- package/dist/adapters/prisma/rows.d.ts +3 -0
- package/dist/adapters/prisma/rows.js +20 -7
- package/dist/adapters/prisma/rows.js.map +1 -1
- package/dist/adapters/prisma/scope-namespaces.d.ts +4 -0
- package/dist/adapters/prisma/scope-namespaces.js +39 -0
- package/dist/adapters/prisma/scope-namespaces.js.map +1 -0
- 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/rest/rest-api.js +2 -2
- package/dist/adapters/rest/rest-api.js.map +1 -1
- package/dist/adapters/trpc/console.d.ts +1 -1
- package/dist/adapters/trpc/console.js +6 -4
- package/dist/adapters/trpc/console.js.map +1 -1
- package/dist/adapters/trpc/context.d.ts +20 -4
- package/dist/adapters/trpc/fleet.d.ts +179 -82
- package/dist/adapters/trpc/fleet.js +117 -53
- package/dist/adapters/trpc/fleet.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +231 -80
- package/dist/adapters/trpc/ship-contract.js +4 -0
- package/dist/adapters/trpc/ship-contract.js.map +1 -1
- package/dist/adapters/trpc/ship-protocol.js +7 -5
- package/dist/adapters/trpc/ship-protocol.js.map +1 -1
- package/dist/adapters/trpc/ship.d.ts +71 -3
- package/dist/adapters/trpc/ship.js +42 -5
- package/dist/adapters/trpc/ship.js.map +1 -1
- package/dist/adapters/trpc/trpc.d.ts +6 -5
- package/dist/adapters/trpc/trpc.js +76 -21
- package/dist/adapters/trpc/trpc.js.map +1 -1
- package/dist/domain/messaging/check-inbox.d.ts +5 -5
- package/dist/domain/messaging/check-inbox.js +9 -7
- package/dist/domain/messaging/check-inbox.js.map +1 -1
- package/dist/domain/messaging/dismiss-delivery.d.ts +9 -4
- package/dist/domain/messaging/dismiss-delivery.js +26 -19
- package/dist/domain/messaging/dismiss-delivery.js.map +1 -1
- package/dist/domain/messaging/message.d.ts +11 -5
- package/dist/domain/messaging/message.js +11 -4
- package/dist/domain/messaging/message.js.map +1 -1
- package/dist/domain/messaging/ping-ship.d.ts +3 -3
- package/dist/domain/messaging/ping-ship.js +6 -2
- package/dist/domain/messaging/ping-ship.js.map +1 -1
- package/dist/domain/messaging/ports.d.ts +9 -3
- package/dist/domain/messaging/receive-deliveries.d.ts +2 -0
- package/dist/domain/messaging/receive-deliveries.js +1 -0
- package/dist/domain/messaging/receive-deliveries.js.map +1 -1
- package/dist/domain/messaging/resend-delivery.d.ts +5 -2
- package/dist/domain/messaging/resend-delivery.js +8 -4
- package/dist/domain/messaging/resend-delivery.js.map +1 -1
- package/dist/domain/messaging/send-message.d.ts +9 -2
- package/dist/domain/messaging/send-message.js +12 -2
- package/dist/domain/messaging/send-message.js.map +1 -1
- package/dist/domain/messaging/send-request.d.ts +3 -1
- package/dist/domain/messaging/send-request.js +4 -2
- package/dist/domain/messaging/send-request.js.map +1 -1
- package/dist/domain/registry/assign-label.d.ts +2 -1
- package/dist/domain/registry/assign-label.js +3 -2
- package/dist/domain/registry/assign-label.js.map +1 -1
- package/dist/domain/registry/check-reach.d.ts +63 -4
- package/dist/domain/registry/check-reach.js +107 -11
- package/dist/domain/registry/check-reach.js.map +1 -1
- package/dist/domain/registry/commission-ship.d.ts +17 -8
- package/dist/domain/registry/commission-ship.js +24 -10
- package/dist/domain/registry/commission-ship.js.map +1 -1
- package/dist/domain/registry/crew-request.d.ts +1 -1
- package/dist/domain/registry/declare-scopes.d.ts +38 -0
- package/dist/domain/registry/declare-scopes.js +34 -0
- package/dist/domain/registry/declare-scopes.js.map +1 -0
- package/dist/domain/registry/declared-network-rules.d.ts +2 -1
- package/dist/domain/registry/declared-network-rules.js +11 -5
- package/dist/domain/registry/declared-network-rules.js.map +1 -1
- package/dist/domain/registry/discover.d.ts +28 -0
- package/dist/domain/registry/discover.js +54 -0
- package/dist/domain/registry/discover.js.map +1 -0
- package/dist/domain/registry/explain-reach.d.ts +12 -12
- package/dist/domain/registry/explain-reach.js +35 -12
- package/dist/domain/registry/explain-reach.js.map +1 -1
- package/dist/domain/registry/get-ship.d.ts +11 -3
- package/dist/domain/registry/get-ship.js +8 -2
- package/dist/domain/registry/get-ship.js.map +1 -1
- package/dist/domain/registry/get-starting-prompt.d.ts +18 -2
- package/dist/domain/registry/get-starting-prompt.js +7 -7
- package/dist/domain/registry/get-starting-prompt.js.map +1 -1
- package/dist/domain/registry/grant-scopes.d.ts +34 -0
- package/dist/domain/registry/grant-scopes.js +35 -0
- package/dist/domain/registry/grant-scopes.js.map +1 -0
- package/dist/domain/registry/label.d.ts +12 -7
- package/dist/domain/registry/label.js +21 -4
- package/dist/domain/registry/label.js.map +1 -1
- package/dist/domain/registry/list-fleet.d.ts +19 -6
- package/dist/domain/registry/list-fleet.js +18 -3
- package/dist/domain/registry/list-fleet.js.map +1 -1
- package/dist/domain/registry/list-scopes.d.ts +24 -0
- package/dist/domain/registry/list-scopes.js +22 -0
- package/dist/domain/registry/list-scopes.js.map +1 -0
- package/dist/domain/registry/managed-or-assigned.d.ts +25 -0
- package/dist/domain/registry/managed-or-assigned.js +23 -0
- package/dist/domain/registry/managed-or-assigned.js.map +1 -0
- package/dist/domain/registry/named-namespaces.d.ts +19 -0
- package/dist/domain/registry/named-namespaces.js +19 -0
- package/dist/domain/registry/named-namespaces.js.map +1 -0
- package/dist/domain/registry/network-settings.d.ts +84 -24
- package/dist/domain/registry/network-settings.js +134 -45
- package/dist/domain/registry/network-settings.js.map +1 -1
- package/dist/domain/registry/ports.d.ts +63 -1
- package/dist/domain/registry/public.d.ts +3 -2
- package/dist/domain/registry/public.js +3 -2
- package/dist/domain/registry/public.js.map +1 -1
- package/dist/domain/registry/reach-refusal.d.ts +12 -4
- package/dist/domain/registry/read-assigned-crew-requests.d.ts +12 -3
- package/dist/domain/registry/read-assigned-crew-requests.js +8 -8
- package/dist/domain/registry/read-assigned-crew-requests.js.map +1 -1
- package/dist/domain/registry/read-built-in-rules.d.ts +20 -0
- package/dist/domain/registry/read-built-in-rules.js +23 -0
- package/dist/domain/registry/read-built-in-rules.js.map +1 -0
- package/dist/domain/registry/read-clear-requests.d.ts +5 -3
- package/dist/domain/registry/read-clear-requests.js +7 -5
- package/dist/domain/registry/read-clear-requests.js.map +1 -1
- package/dist/domain/registry/read-on-behalf.d.ts +20 -0
- package/dist/domain/registry/read-on-behalf.js +31 -0
- package/dist/domain/registry/read-on-behalf.js.map +1 -0
- package/dist/domain/registry/read-reach.d.ts +62 -0
- package/dist/domain/registry/read-reach.js +78 -0
- package/dist/domain/registry/read-reach.js.map +1 -0
- package/dist/domain/registry/recrew-ship.d.ts +3 -2
- package/dist/domain/registry/recrew-ship.js +6 -1
- package/dist/domain/registry/recrew-ship.js.map +1 -1
- package/dist/domain/registry/release-ship.d.ts +6 -3
- package/dist/domain/registry/release-ship.js +7 -7
- package/dist/domain/registry/release-ship.js.map +1 -1
- package/dist/domain/registry/remove-crew-request.d.ts +4 -3
- package/dist/domain/registry/remove-crew-request.js +6 -1
- package/dist/domain/registry/remove-crew-request.js.map +1 -1
- package/dist/domain/registry/rename-ship.d.ts +7 -5
- package/dist/domain/registry/rename-ship.js +9 -3
- package/dist/domain/registry/rename-ship.js.map +1 -1
- package/dist/domain/registry/request-crew.d.ts +5 -4
- package/dist/domain/registry/request-crew.js +6 -1
- package/dist/domain/registry/request-crew.js.map +1 -1
- package/dist/domain/registry/request-worktree-clear.d.ts +3 -2
- package/dist/domain/registry/request-worktree-clear.js +6 -1
- package/dist/domain/registry/request-worktree-clear.js.map +1 -1
- package/dist/domain/registry/retire-ship.d.ts +16 -7
- package/dist/domain/registry/retire-ship.js +46 -5
- package/dist/domain/registry/retire-ship.js.map +1 -1
- package/dist/domain/registry/scope-grant.d.ts +53 -0
- package/dist/domain/registry/scope-grant.js +74 -0
- package/dist/domain/registry/scope-grant.js.map +1 -0
- package/dist/domain/registry/scope-namespace.d.ts +68 -0
- package/dist/domain/registry/scope-namespace.js +82 -0
- package/dist/domain/registry/scope-namespace.js.map +1 -0
- package/dist/domain/registry/set-built-in-rule.d.ts +28 -0
- package/dist/domain/registry/set-built-in-rule.js +33 -0
- package/dist/domain/registry/set-built-in-rule.js.map +1 -0
- package/dist/domain/registry/set-network-rules.d.ts +3 -3
- package/dist/domain/registry/set-network-rules.js +2 -2
- package/dist/domain/registry/set-owner.d.ts +30 -0
- package/dist/domain/registry/set-owner.js +37 -0
- package/dist/domain/registry/set-owner.js.map +1 -0
- package/dist/domain/registry/set-statement.d.ts +27 -0
- package/dist/domain/registry/set-statement.js +28 -0
- package/dist/domain/registry/set-statement.js.map +1 -0
- package/dist/domain/registry/ship.d.ts +70 -10
- package/dist/domain/registry/ship.js +95 -10
- package/dist/domain/registry/ship.js.map +1 -1
- package/dist/domain/registry/statement.d.ts +32 -0
- package/dist/domain/registry/statement.js +39 -0
- package/dist/domain/registry/statement.js.map +1 -0
- package/dist/domain/registry/unassign-label.js +1 -1
- package/dist/domain/registry/unassign-label.js.map +1 -1
- package/dist/domain/registry/whoami.d.ts +5 -1
- package/dist/domain/registry/whoami.js +7 -4
- package/dist/domain/registry/whoami.js.map +1 -1
- package/dist/domain/shared/caller.d.ts +5 -2
- package/dist/domain/shared/caller.js.map +1 -1
- package/dist/domain/shared/errors.d.ts +1 -1
- package/dist/domain/shared/errors.js.map +1 -1
- package/dist/domain/shared/events-read.d.ts +16 -0
- package/dist/domain/shared/events-read.js +15 -0
- package/dist/domain/shared/events-read.js.map +1 -0
- package/dist/domain/shared/follow-fleet.d.ts +8 -2
- package/dist/domain/shared/follow-fleet.js +14 -4
- package/dist/domain/shared/follow-fleet.js.map +1 -1
- package/dist/domain/shared/health.d.ts +9 -2
- package/dist/domain/shared/health.js +9 -3
- package/dist/domain/shared/health.js.map +1 -1
- package/dist/domain/shared/history.d.ts +9 -42
- package/dist/domain/shared/history.js +9 -0
- package/dist/domain/shared/history.js.map +1 -1
- package/dist/domain/shared/read-fleet-events.d.ts +8 -2
- package/dist/domain/shared/read-fleet-events.js +10 -4
- package/dist/domain/shared/read-fleet-events.js.map +1 -1
- package/dist/domain/shared/read-health.d.ts +4 -1
- package/dist/domain/shared/read-health.js +7 -2
- package/dist/domain/shared/read-health.js.map +1 -1
- package/dist/domain/shared/read-inbox.d.ts +6 -3
- package/dist/domain/shared/read-inbox.js +14 -4
- package/dist/domain/shared/read-inbox.js.map +1 -1
- package/dist/domain/shared/read-message.d.ts +6 -2
- package/dist/domain/shared/read-message.js +6 -2
- package/dist/domain/shared/read-message.js.map +1 -1
- package/dist/domain/shared/read-needs-attention.d.ts +4 -1
- package/dist/domain/shared/read-needs-attention.js +8 -3
- package/dist/domain/shared/read-needs-attention.js.map +1 -1
- package/dist/domain/shared/read-ship-messages.d.ts +6 -2
- package/dist/domain/shared/read-ship-messages.js +7 -2
- package/dist/domain/shared/read-ship-messages.js.map +1 -1
- package/dist/domain/shared/read-ship-timeline.d.ts +5 -2
- package/dist/domain/shared/read-ship-timeline.js +11 -6
- package/dist/domain/shared/read-ship-timeline.js.map +1 -1
- package/dist/domain/shared/read-ship-way.d.ts +11 -4
- package/dist/domain/shared/read-ship-way.js +9 -2
- package/dist/domain/shared/read-ship-way.js.map +1 -1
- package/dist/domain/shared/stuck.d.ts +10 -1
- package/dist/domain/shared/stuck.js +1 -1
- package/dist/domain/shared/stuck.js.map +1 -1
- package/dist/wiring.d.ts +18 -4
- package/dist/wiring.js +37 -18
- package/dist/wiring.js.map +1 -1
- package/package.json +2 -2
- package/src/adapters/prisma/migrations/20261018100000_force_scope/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261018110000_forced_delivery/migration.sql +4 -0
- package/src/adapters/prisma/migrations/20261018120000_person_and_app_ships/migration.sql +3 -0
- package/src/adapters/prisma/migrations/20261018130000_owners/migration.sql +14 -0
- package/src/adapters/prisma/migrations/20261018140000_owners_on_reach_refusals/migration.sql +14 -0
- package/src/adapters/prisma/migrations/20261018150000_network_verbs/migration.sql +9 -0
- package/src/adapters/prisma/migrations/20261018160000_built_in_rules/migration.sql +13 -0
- package/src/adapters/prisma/migrations/20261018170000_network_rules_a_list/migration.sql +5 -0
- package/src/adapters/prisma/migrations/20261018180000_verb_on_reach_refusals/migration.sql +4 -0
- package/src/adapters/prisma/migrations/20261018200000_lease_statements/migration.sql +3 -0
- package/src/adapters/prisma/migrations/20261018210000_declare_and_grant_scopes/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261018220000_plugin_scopes/migration.sql +14 -0
- package/src/adapters/prisma/migrations/20261018230000_scope_namespaces/migration.sql +20 -0
- package/src/adapters/prisma/migrations/20261018240000_trierarch_plugin_crew_run/migration.sql +44 -0
- package/src/adapters/prisma/migrations/20261018250000_scope_catalogue/migration.sql +66 -0
- package/src/adapters/prisma/migrations/20261019090000_reach_refusal_asked_by/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261019100000_on_behalf_scope/migration.sql +59 -0
- package/src/adapters/prisma/migrations/20261019110000_events_fleet_id_occurred_at/migration.sql +2 -0
- package/src/adapters/prisma/schema.prisma +47 -2
- package/dist/domain/shared/read-no-ship-can-take.d.ts +0 -13
- package/dist/domain/shared/read-no-ship-can-take.js +0 -12
- package/dist/domain/shared/read-no-ship-can-take.js.map +0 -1
- package/dist/domain/shared/read-overdue.d.ts +0 -13
- package/dist/domain/shared/read-overdue.js +0 -12
- package/dist/domain/shared/read-overdue.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DeliveryId, IdGenerator } from '@aeolus-fleet/common';
|
|
2
|
+
import { type ReadReachOf } from '../registry/public.js';
|
|
2
3
|
import type { Caller } from '../shared/caller.js';
|
|
3
4
|
import type { Clock } from '../shared/clock.js';
|
|
4
5
|
import { type DomainError } from '../shared/errors.js';
|
|
@@ -6,9 +7,10 @@ import { type EventLog } from '../shared/events.js';
|
|
|
6
7
|
import { type Result } from '../shared/result.js';
|
|
7
8
|
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
8
9
|
import { type DismissRefusal } from './delivery.js';
|
|
9
|
-
import type { DeliveryRepository } from './ports.js';
|
|
10
|
+
import type { DeliveryRepository, MessageRepository } from './ports.js';
|
|
10
11
|
export interface DismissDeliveryTx {
|
|
11
12
|
deliveries: Pick<DeliveryRepository, 'findForUpdate' | 'update'>;
|
|
13
|
+
messages: Pick<MessageRepository, 'find'>;
|
|
12
14
|
events: EventLog;
|
|
13
15
|
}
|
|
14
16
|
export type DismissDeliveryRefusal = DomainError<'DELIVERY_NOT_FOUND'> | DismissRefusal;
|
|
@@ -17,12 +19,15 @@ export type DismissDelivery = (caller: Caller, input: {
|
|
|
17
19
|
}) => Promise<Result<undefined, DismissDeliveryRefusal>>;
|
|
18
20
|
/**
|
|
19
21
|
* Use case: the operator dismisses an undeliverable or not handled delivery from Needs
|
|
20
|
-
* attention. Its scope (
|
|
21
|
-
* delivery
|
|
22
|
-
*
|
|
22
|
+
* attention. Its scope (messages:resend) is checked before this runs. A
|
|
23
|
+
* delivery of a message outside the caller's read reach is answered as none,
|
|
24
|
+
* so its existence does not show (decision 0046). The delivery, locked,
|
|
25
|
+
* becomes dismissed with DeliveryDismissed in one unit of work, so a resend
|
|
26
|
+
* of the same delivery waits and then finds it dismissed.
|
|
23
27
|
*/
|
|
24
28
|
export declare function createDismissDelivery(deps: {
|
|
25
29
|
uow: UnitOfWork<DismissDeliveryTx>;
|
|
26
30
|
clock: Clock;
|
|
27
31
|
ids: IdGenerator;
|
|
32
|
+
readReach: ReadReachOf;
|
|
28
33
|
}): DismissDelivery;
|
|
@@ -1,29 +1,36 @@
|
|
|
1
|
+
import { readsMessage } from '../registry/public.js';
|
|
1
2
|
import { refuse } from '../shared/errors.js';
|
|
2
3
|
import { recordEvent } from '../shared/events.js';
|
|
3
4
|
import { ok } from '../shared/result.js';
|
|
4
5
|
import { dismissDelivery } from './delivery.js';
|
|
5
6
|
/**
|
|
6
7
|
* Use case: the operator dismisses an undeliverable or not handled delivery from Needs
|
|
7
|
-
* attention. Its scope (
|
|
8
|
-
* delivery
|
|
9
|
-
*
|
|
8
|
+
* attention. Its scope (messages:resend) is checked before this runs. A
|
|
9
|
+
* delivery of a message outside the caller's read reach is answered as none,
|
|
10
|
+
* so its existence does not show (decision 0046). The delivery, locked,
|
|
11
|
+
* becomes dismissed with DeliveryDismissed in one unit of work, so a resend
|
|
12
|
+
* of the same delivery waits and then finds it dismissed.
|
|
10
13
|
*/
|
|
11
14
|
export function createDismissDelivery(deps) {
|
|
12
|
-
return (caller, input) =>
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
15
|
+
return async (caller, input) => {
|
|
16
|
+
const reach = await deps.readReach(caller);
|
|
17
|
+
return deps.uow.run(async (tx) => {
|
|
18
|
+
const delivery = await tx.deliveries.findForUpdate(caller.fleetId, input.deliveryId);
|
|
19
|
+
const message = delivery && (await tx.messages.find(caller.fleetId, delivery.messageId));
|
|
20
|
+
if (!delivery || !message || !readsMessage(reach, { senderId: message.senderShipId, recipient: message.selector, claimedBy: delivery.claimedByShipId })) {
|
|
21
|
+
return refuse('DELIVERY_NOT_FOUND', `Delivery ${input.deliveryId} does not exist`);
|
|
22
|
+
}
|
|
23
|
+
const dismissed = dismissDelivery(delivery, { by: caller.shipId, at: deps.clock.now() });
|
|
24
|
+
if (!dismissed.isOk) {
|
|
25
|
+
return dismissed;
|
|
26
|
+
}
|
|
27
|
+
const { delivery: changed, events } = dismissed.value;
|
|
28
|
+
await tx.deliveries.update(changed);
|
|
29
|
+
for (const event of events) {
|
|
30
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, event);
|
|
31
|
+
}
|
|
32
|
+
return ok(undefined);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
28
35
|
}
|
|
29
36
|
//# sourceMappingURL=dismiss-delivery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dismiss-delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/dismiss-delivery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dismiss-delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/dismiss-delivery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAoB,MAAM,uBAAuB,CAAC;AAGvE,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAuB,MAAM,eAAe,CAAC;AAgBrE;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAKrC;IACC,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAsD,EAAE;YACnF,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YACrF,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;YACzF,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC;gBACxJ,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,KAAK,CAAC,UAAU,iBAAiB,CAAC,CAAC;YACrF,CAAC;YACD,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACpB,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;YACtD,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -60,6 +60,8 @@ export interface Delivery {
|
|
|
60
60
|
* (decision 0040): only once, so none until then.
|
|
61
61
|
*/
|
|
62
62
|
handedOnceMoreAt: Date | null;
|
|
63
|
+
/** Whether its message was forced (decision 0040): it comes first in receive and push receive. */
|
|
64
|
+
isForced: boolean;
|
|
63
65
|
/**
|
|
64
66
|
* For a type, under network rules: the ships of the type its sender may
|
|
65
67
|
* reach, fixed at send time; only they may claim it (decision 0034).
|
|
@@ -79,11 +81,13 @@ export interface MessageToAccept {
|
|
|
79
81
|
contentType: string;
|
|
80
82
|
/** The model the sender states; a resend carries the original's. */
|
|
81
83
|
model: string | undefined;
|
|
82
|
-
/**
|
|
84
|
+
/** The sender's kind, for the model rule (only an agent states one); a resend carries none, as it keeps the original's model. */
|
|
83
85
|
senderKind?: ShipKind;
|
|
84
86
|
idempotencyKey: string;
|
|
85
87
|
requestHash: string;
|
|
86
88
|
inReplyTo: MessageId | undefined;
|
|
89
|
+
/** A forced send (decision 0040): its delivery comes first. */
|
|
90
|
+
isForced: boolean;
|
|
87
91
|
/**
|
|
88
92
|
* For a resend: the message it resends and the ship that resent it, the
|
|
89
93
|
* operator. The sender stays the original one, so an answer goes back to
|
|
@@ -102,16 +106,18 @@ export type RepeatRefusal = DomainError<'IDEMPOTENCY_KEY_REUSED'>;
|
|
|
102
106
|
* refused, so one key never stands for two messages.
|
|
103
107
|
*/
|
|
104
108
|
export declare function repeatOf(original: Message, requestHash: string): Result<MessageId, RepeatRefusal>;
|
|
105
|
-
export type AcceptRefusal = DomainError<'IN_REPLY_TO_NOT_FOUND' | 'MODEL_REQUIRED' | 'MODEL_FROM_ARGO'>;
|
|
109
|
+
export type AcceptRefusal = DomainError<'IN_REPLY_TO_NOT_FOUND' | 'MODEL_REQUIRED' | 'MODEL_FROM_ARGO' | 'MODEL_FROM_PERSON_OR_APP'>;
|
|
106
110
|
/**
|
|
107
111
|
* Accepts a message: the message, its one pending delivery to the recipient
|
|
108
112
|
* its selector resolved to, and MessageAccepted, caused by the sender. A reply
|
|
109
113
|
* names a message of the same fleet: `repliedTo` is that message as the fleet
|
|
110
|
-
* holds it, if it does.
|
|
111
|
-
* runs (
|
|
114
|
+
* holds it, if it does. Only an agent ship states the model its session
|
|
115
|
+
* runs (decisions 0018 and 0044); argo, a person and an app state none. A resend carries the
|
|
112
116
|
* original message's model as it was, so it is not asked again; a ping is the
|
|
113
117
|
* fleet's question, not a session's message, so it carries none. A type
|
|
114
|
-
* delivery the network rules limit to some ships of the type keeps them.
|
|
118
|
+
* delivery the network rules limit to some ships of the type keeps them. A
|
|
119
|
+
* forced send's delivery records that it was forced, and MessageAccepted
|
|
120
|
+
* says so.
|
|
115
121
|
*/
|
|
116
122
|
export declare function acceptMessage(fleet: {
|
|
117
123
|
recipient: Recipient;
|
|
@@ -16,11 +16,13 @@ export function repeatOf(original, requestHash) {
|
|
|
16
16
|
* Accepts a message: the message, its one pending delivery to the recipient
|
|
17
17
|
* its selector resolved to, and MessageAccepted, caused by the sender. A reply
|
|
18
18
|
* names a message of the same fleet: `repliedTo` is that message as the fleet
|
|
19
|
-
* holds it, if it does.
|
|
20
|
-
* runs (
|
|
19
|
+
* holds it, if it does. Only an agent ship states the model its session
|
|
20
|
+
* runs (decisions 0018 and 0044); argo, a person and an app state none. A resend carries the
|
|
21
21
|
* original message's model as it was, so it is not asked again; a ping is the
|
|
22
22
|
* fleet's question, not a session's message, so it carries none. A type
|
|
23
|
-
* delivery the network rules limit to some ships of the type keeps them.
|
|
23
|
+
* delivery the network rules limit to some ships of the type keeps them. A
|
|
24
|
+
* forced send's delivery records that it was forced, and MessageAccepted
|
|
25
|
+
* says so.
|
|
24
26
|
*/
|
|
25
27
|
export function acceptMessage(fleet, send) {
|
|
26
28
|
const { recipient, repliedTo, reachableShipIds } = fleet;
|
|
@@ -32,7 +34,10 @@ export function acceptMessage(fleet, send) {
|
|
|
32
34
|
if (isStated && send.senderKind === 'operator' && send.model !== undefined) {
|
|
33
35
|
return refuse('MODEL_FROM_ARGO', 'argo states no model: send without one');
|
|
34
36
|
}
|
|
35
|
-
if (isStated && send.senderKind
|
|
37
|
+
if (isStated && (send.senderKind === 'person' || send.senderKind === 'app') && send.model !== undefined) {
|
|
38
|
+
return refuse('MODEL_FROM_PERSON_OR_APP', `A ${send.senderKind} ship states no model: send without one`);
|
|
39
|
+
}
|
|
40
|
+
if (isStated && send.senderKind === 'agent' && send.model === undefined) {
|
|
36
41
|
return refuse('MODEL_REQUIRED', 'send needs model: the exact model id this session runs, such as claude-opus-5-5');
|
|
37
42
|
}
|
|
38
43
|
const message = {
|
|
@@ -60,6 +65,7 @@ export function acceptMessage(fleet, send) {
|
|
|
60
65
|
attempts: 0,
|
|
61
66
|
handOverNumber: null,
|
|
62
67
|
handedOnceMoreAt: null,
|
|
68
|
+
isForced: send.isForced,
|
|
63
69
|
...(reachableShipIds && { reachableShipIds: [...reachableShipIds] }),
|
|
64
70
|
createdAt: at,
|
|
65
71
|
};
|
|
@@ -80,6 +86,7 @@ export function acceptMessage(fleet, send) {
|
|
|
80
86
|
recipientType: recipient.kind === 'type' ? recipient.type : null,
|
|
81
87
|
model: send.model ?? null,
|
|
82
88
|
...(resendOf && { resendOf: resendOf.messageId }),
|
|
89
|
+
...(send.isForced && { forced: true }),
|
|
83
90
|
},
|
|
84
91
|
},
|
|
85
92
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/domain/messaging/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA+G,MAAM,sBAAsB,CAAC;AAEtK,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/domain/messaging/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type IdGenerator, type MessageId, type ShipId } from '@aeolus-fleet/common';
|
|
2
|
-
import { type PingableShipTx, type UnpingableShip } from '../registry/public.js';
|
|
2
|
+
import { type CheckManageTx, type NotReachable, type PingableShipTx, type UnpingableShip } from '../registry/public.js';
|
|
3
3
|
import type { Caller } from '../shared/caller.js';
|
|
4
4
|
import type { Clock } from '../shared/clock.js';
|
|
5
5
|
import { type Result } from '../shared/result.js';
|
|
@@ -8,7 +8,7 @@ import type { RequestHasher } from './ports.js';
|
|
|
8
8
|
import { type SendMessageRefusal, type SendMessageTx } from './send-message.js';
|
|
9
9
|
/** What every ping says: the session answers it with pong, and does nothing else with it. */
|
|
10
10
|
export declare const PING_PAYLOAD = "Ping from argo: answer with pong(deliveryId).";
|
|
11
|
-
export type PingShipTx = SendMessageTx & PingableShipTx;
|
|
11
|
+
export type PingShipTx = SendMessageTx & PingableShipTx & CheckManageTx;
|
|
12
12
|
export interface PingSent {
|
|
13
13
|
/** The ship's open ping: the one this call sent, or the one already waiting. */
|
|
14
14
|
messageId: MessageId;
|
|
@@ -16,7 +16,7 @@ export interface PingSent {
|
|
|
16
16
|
/** Whether this call sent it. */
|
|
17
17
|
isNew: boolean;
|
|
18
18
|
}
|
|
19
|
-
export type PingShipRefusal = UnpingableShip | SendMessageRefusal;
|
|
19
|
+
export type PingShipRefusal = UnpingableShip | NotReachable | SendMessageRefusal;
|
|
20
20
|
export type PingShip = (caller: Caller, input: {
|
|
21
21
|
shipId: ShipId;
|
|
22
22
|
}) => Promise<Result<PingSent, PingShipRefusal>>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PING_CONTENT_TYPE } from '@aeolus-fleet/common';
|
|
2
|
-
import { findPingableShip } from '../registry/public.js';
|
|
2
|
+
import { checkManage, findPingableShip, keepingReachRefusal } from '../registry/public.js';
|
|
3
3
|
import { ok } from '../shared/result.js';
|
|
4
4
|
import { checkedSend, sendWithin } from './send-message.js';
|
|
5
5
|
/** What every ping says: the session answers it with pong, and does nothing else with it. */
|
|
@@ -15,12 +15,16 @@ export const PING_PAYLOAD = 'Ping from argo: answer with pong(deliveryId).';
|
|
|
15
15
|
* open ping, never by the key.
|
|
16
16
|
*/
|
|
17
17
|
export function createPingShip(deps) {
|
|
18
|
-
return (caller, input) => deps.uow
|
|
18
|
+
return (caller, input) => keepingReachRefusal(deps.uow, async (tx) => {
|
|
19
19
|
const { fleetId } = caller;
|
|
20
20
|
const ship = await findPingableShip(tx, { fleetId, shipId: input.shipId });
|
|
21
21
|
if (!ship.isOk) {
|
|
22
22
|
return ship;
|
|
23
23
|
}
|
|
24
|
+
const managed = await checkManage({ tx, ids: deps.ids }, { fleetId, managerShipId: caller.shipId, shipId: input.shipId, at: deps.clock.now() });
|
|
25
|
+
if (!managed.isOk) {
|
|
26
|
+
return managed;
|
|
27
|
+
}
|
|
24
28
|
const open = await tx.deliveries.findOpenPing(fleetId, input.shipId);
|
|
25
29
|
if (open) {
|
|
26
30
|
return ok({ messageId: open.id, sentAt: open.createdAt, isNew: false });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ping-ship.js","sourceRoot":"","sources":["../../../src/domain/messaging/ping-ship.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAiD,MAAM,sBAAsB,CAAC;AAExG,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"ping-ship.js","sourceRoot":"","sources":["../../../src/domain/messaging/ping-ship.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAiD,MAAM,sBAAsB,CAAC;AAExG,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAmF,MAAM,uBAAuB,CAAC;AAG5K,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAE,UAAU,EAA+C,MAAM,mBAAmB,CAAC;AAEzG,6FAA6F;AAC7F,MAAM,CAAC,MAAM,YAAY,GAAG,+CAA+C,CAAC;AAgB5E;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAK9B;IACC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAA8C,EAAE;QACrF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChJ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CACzB;YACE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;YAChD,OAAO,EAAE,YAAY;YACrB,WAAW,EAAE,iBAAiB;YAC9B,cAAc,EAAE,QAAQ,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;SAC9C,EACD,IAAI,CAAC,MAAM,CACZ,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACvH,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -48,6 +48,11 @@ export interface ClaimableDeliveries {
|
|
|
48
48
|
/** Deliveries this receive has already claimed, left out. */
|
|
49
49
|
excluding: readonly DeliveryId[];
|
|
50
50
|
}
|
|
51
|
+
/** How many deliveries wait for a crew, and how many of them are forced and not handed over yet. */
|
|
52
|
+
export interface ReceivableCount {
|
|
53
|
+
waiting: number;
|
|
54
|
+
forced: number;
|
|
55
|
+
}
|
|
51
56
|
/** A delivery a crew may claim, with the message it carries. */
|
|
52
57
|
export interface ClaimableDelivery {
|
|
53
58
|
delivery: Delivery;
|
|
@@ -66,10 +71,11 @@ export interface DeliveryRepository {
|
|
|
66
71
|
findClaimableForUpdate(query: ClaimableDeliveries): Promise<ClaimableDelivery[]>;
|
|
67
72
|
/**
|
|
68
73
|
* How many deliveries the crew's next receive would hand it: those in
|
|
69
|
-
* flight with its lease, and those pending for its ship or its type
|
|
70
|
-
*
|
|
74
|
+
* flight with its lease, and those pending for its ship or its type; and of
|
|
75
|
+
* those, the forced ones not handed over yet: pending, or received with its
|
|
76
|
+
* lease (decision 0040). Locks nothing and claims nothing.
|
|
71
77
|
*/
|
|
72
|
-
countReceivable(query: Omit<ClaimableDeliveries, 'limit' | 'excluding'>): Promise<
|
|
78
|
+
countReceivable(query: Omit<ClaimableDeliveries, 'limit' | 'excluding'>): Promise<ReceivableCount>;
|
|
73
79
|
/** The delivery, locked until the unit of work ends. */
|
|
74
80
|
findForUpdate(fleetId: FleetId, deliveryId: DeliveryId): Promise<Delivery | undefined>;
|
|
75
81
|
/** The one delivery a message has, read without a lock. */
|
|
@@ -32,6 +32,8 @@ export interface ReceivedDelivery {
|
|
|
32
32
|
sentAt: Date;
|
|
33
33
|
/** How many times the delivery has been handed over, this time included: its attempts. */
|
|
34
34
|
attempts: number;
|
|
35
|
+
/** Whether its message was sent forced (decision 0040). */
|
|
36
|
+
isForced: boolean;
|
|
35
37
|
}
|
|
36
38
|
export interface DeliveriesReceived {
|
|
37
39
|
/** None when the wait ended without a delivery. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receive-deliveries.js","sourceRoot":"","sources":["../../../src/domain/messaging/receive-deliveries.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAuF,MAAM,uBAAuB,CAAC;AAIhK,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"receive-deliveries.js","sourceRoot":"","sources":["../../../src/domain/messaging/receive-deliveries.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type DeliveryId, type IdGenerator, type MessageId } from '@aeolus-fleet/common';
|
|
2
|
-
import { type CheckReachTx, type NotReachable, type ResolveSelectorTx, type UnresolvableSelector } from '../registry/public.js';
|
|
2
|
+
import { type CheckReachTx, type ReadReachOf, type NotReachable, type ResolveSelectorTx, type UnresolvableSelector } from '../registry/public.js';
|
|
3
3
|
import type { Caller } from '../shared/caller.js';
|
|
4
4
|
import type { Clock } from '../shared/clock.js';
|
|
5
5
|
import { type DomainError } from '../shared/errors.js';
|
|
@@ -27,7 +27,9 @@ export type ResendDelivery = (caller: Caller, input: {
|
|
|
27
27
|
/**
|
|
28
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
|
+
* (messages:resend) is checked before this runs. A delivery of a message
|
|
31
|
+
* outside the caller's read reach is answered as none, so its existence does
|
|
32
|
+
* not show (decision 0046). A resend is a retry of the same
|
|
31
33
|
* delivery: a new message with the original's sender, selector, payload,
|
|
32
34
|
* content type and reply, naming the message it resends, so an answer goes
|
|
33
35
|
* back to whoever asked. In one unit of work it stores the message and its
|
|
@@ -52,4 +54,5 @@ export declare function createResendDelivery(deps: {
|
|
|
52
54
|
clock: Clock;
|
|
53
55
|
ids: IdGenerator;
|
|
54
56
|
hasher: RequestHasher;
|
|
57
|
+
readReach: ReadReachOf;
|
|
55
58
|
}): ResendDelivery;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isPingContentType } from '@aeolus-fleet/common';
|
|
2
|
-
import { checkReach, resolveSelector } from '../registry/public.js';
|
|
2
|
+
import { checkReach, readsMessage, resolveSelector } from '../registry/public.js';
|
|
3
3
|
import { refuse } from '../shared/errors.js';
|
|
4
4
|
import { recordEvent } from '../shared/events.js';
|
|
5
5
|
import { err, ok } from '../shared/result.js';
|
|
@@ -18,7 +18,9 @@ function resendKey(deliveryId) {
|
|
|
18
18
|
/**
|
|
19
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
|
+
* (messages:resend) is checked before this runs. A delivery of a message
|
|
22
|
+
* outside the caller's read reach is answered as none, so its existence does
|
|
23
|
+
* not show (decision 0046). A resend is a retry of the same
|
|
22
24
|
* delivery: a new message with the original's sender, selector, payload,
|
|
23
25
|
* content type and reply, naming the message it resends, so an answer goes
|
|
24
26
|
* back to whoever asked. In one unit of work it stores the message and its
|
|
@@ -40,11 +42,12 @@ function resendKey(deliveryId) {
|
|
|
40
42
|
*/
|
|
41
43
|
export function createResendDelivery(deps) {
|
|
42
44
|
return async (caller, input) => {
|
|
45
|
+
const readReach = await deps.readReach(caller);
|
|
43
46
|
const outcome = await deps.uow.run(async (tx) => {
|
|
44
47
|
const { fleetId } = caller;
|
|
45
48
|
const delivery = await tx.deliveries.findForUpdate(fleetId, input.deliveryId);
|
|
46
49
|
const original = delivery && (await tx.messages.find(fleetId, delivery.messageId));
|
|
47
|
-
if (!delivery || !original) {
|
|
50
|
+
if (!delivery || !original || !readsMessage(readReach, { senderId: original.senderShipId, recipient: original.selector, claimedBy: delivery.claimedByShipId })) {
|
|
48
51
|
return refuse('DELIVERY_NOT_FOUND', `Delivery ${input.deliveryId} does not exist`);
|
|
49
52
|
}
|
|
50
53
|
if (isPingContentType(original.contentType)) {
|
|
@@ -52,7 +55,7 @@ export function createResendDelivery(deps) {
|
|
|
52
55
|
}
|
|
53
56
|
const selector = original.selector;
|
|
54
57
|
const inReplyTo = original.inReplyToMessageId ?? undefined;
|
|
55
|
-
const requestHash = deps.hasher.hash(sendRequestText({ selector, payload: original.payload, contentType: original.contentType, inReplyTo }));
|
|
58
|
+
const requestHash = deps.hasher.hash(sendRequestText({ selector, payload: original.payload, contentType: original.contentType, inReplyTo, isForced: false }));
|
|
56
59
|
const senderKey = { fleetId, senderShipId: original.senderShipId, idempotencyKey: resendKey(delivery.id) };
|
|
57
60
|
await tx.messages.lockIdempotencyKey(senderKey);
|
|
58
61
|
const earlier = await tx.messages.findByIdempotencyKey(senderKey);
|
|
@@ -97,6 +100,7 @@ export function createResendDelivery(deps) {
|
|
|
97
100
|
idempotencyKey: senderKey.idempotencyKey,
|
|
98
101
|
requestHash,
|
|
99
102
|
inReplyTo,
|
|
103
|
+
isForced: false,
|
|
100
104
|
resendOf: { messageId: original.id, by: caller.shipId },
|
|
101
105
|
at,
|
|
102
106
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resend-delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/resend-delivery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAqD,MAAM,sBAAsB,CAAC;AAE5G,OAAO,EAAE,UAAU,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"resend-delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/resend-delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type IdGenerator, type MessageId } from '@aeolus-fleet/common';
|
|
2
2
|
import { type CheckReachTx, type NotReachable, type ResolveSelectorTx, type UnresolvableSelector } from '../registry/public.js';
|
|
3
|
-
import type
|
|
3
|
+
import { type Caller } from '../shared/caller.js';
|
|
4
4
|
import type { Clock } from '../shared/clock.js';
|
|
5
5
|
import { type DomainError } from '../shared/errors.js';
|
|
6
6
|
import { type EventLog } from '../shared/events.js';
|
|
@@ -28,12 +28,14 @@ export interface MessageToSend {
|
|
|
28
28
|
idempotencyKey: string;
|
|
29
29
|
/** The id of the message, in the same fleet, this one replies to. */
|
|
30
30
|
inReplyTo?: MessageId;
|
|
31
|
+
/** A forced send: act now (decision 0040). It needs messages:force, and its delivery comes first. */
|
|
32
|
+
isForced?: boolean;
|
|
31
33
|
}
|
|
32
34
|
export interface MessageSent {
|
|
33
35
|
/** The message's id: the original one when the sender used the idempotency key before. */
|
|
34
36
|
messageId: MessageId;
|
|
35
37
|
}
|
|
36
|
-
export type SendMessageRefusal = DomainError<'PAYLOAD_TOO_LARGE' | 'INVALID_CONTENT_TYPE' | 'INVALID_IDEMPOTENCY_KEY' | 'RESERVED_CONTENT_TYPE'> | RepeatRefusal | UnresolvableSelector | AcceptRefusal | NotReachable | DomainError<'MESSAGE_LIMIT_REACHED'>;
|
|
38
|
+
export type SendMessageRefusal = DomainError<'PAYLOAD_TOO_LARGE' | 'INVALID_CONTENT_TYPE' | 'INVALID_IDEMPOTENCY_KEY' | 'RESERVED_CONTENT_TYPE' | 'FORCE_NOT_ALLOWED'> | RepeatRefusal | UnresolvableSelector | AcceptRefusal | NotReachable | DomainError<'MESSAGE_LIMIT_REACHED'>;
|
|
37
39
|
export type SendMessage = (caller: Caller, input: MessageToSend) => Promise<Result<MessageSent, SendMessageRefusal>>;
|
|
38
40
|
/**
|
|
39
41
|
* Use case: the calling ship sends a message (`send`). The sender is always
|
|
@@ -61,6 +63,10 @@ export type SendMessage = (caller: Caller, input: MessageToSend) => Promise<Resu
|
|
|
61
63
|
* its unit of work commits only the refusal's record, and the sender gets a
|
|
62
64
|
* refusal without reasons. argo, and an answer to the sender of a message the
|
|
63
65
|
* ship received, always go through.
|
|
66
|
+
*
|
|
67
|
+
* A forced send (decision 0040) needs messages:force, checked before the unit
|
|
68
|
+
* of work starts, so a refusal stores nothing; it rides send reach as any
|
|
69
|
+
* send. Its delivery records that it was forced and comes first.
|
|
64
70
|
*/
|
|
65
71
|
export declare function createSendMessage(deps: {
|
|
66
72
|
uow: UnitOfWork<SendMessageTx>;
|
|
@@ -76,6 +82,7 @@ export interface CheckedSend {
|
|
|
76
82
|
model: string | undefined;
|
|
77
83
|
idempotencyKey: string;
|
|
78
84
|
inReplyTo: MessageId | undefined;
|
|
85
|
+
isForced: boolean;
|
|
79
86
|
requestHash: string;
|
|
80
87
|
}
|
|
81
88
|
/**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isPingContentType, PING_CONTENT_TYPE } from '@aeolus-fleet/common';
|
|
2
2
|
import { checkReach, resolveSelector } from '../registry/public.js';
|
|
3
|
+
import { hasScope } from '../shared/caller.js';
|
|
3
4
|
import { refuse } from '../shared/errors.js';
|
|
4
5
|
import { recordEvent } from '../shared/events.js';
|
|
5
6
|
import { err, ok } from '../shared/result.js';
|
|
@@ -36,12 +37,19 @@ import { sendRequestText } from './send-request.js';
|
|
|
36
37
|
* its unit of work commits only the refusal's record, and the sender gets a
|
|
37
38
|
* refusal without reasons. argo, and an answer to the sender of a message the
|
|
38
39
|
* ship received, always go through.
|
|
40
|
+
*
|
|
41
|
+
* A forced send (decision 0040) needs messages:force, checked before the unit
|
|
42
|
+
* of work starts, so a refusal stores nothing; it rides send reach as any
|
|
43
|
+
* send. Its delivery records that it was forced and comes first.
|
|
39
44
|
*/
|
|
40
45
|
export function createSendMessage(deps) {
|
|
41
46
|
return async (caller, input) => {
|
|
42
47
|
if (input.contentType !== undefined && isPingContentType(input.contentType)) {
|
|
43
48
|
return refuse('RESERVED_CONTENT_TYPE', `${PING_CONTENT_TYPE} is reserved for pings: ping a ship from the console`);
|
|
44
49
|
}
|
|
50
|
+
if (input.isForced === true && !hasScope(caller, 'messages:force')) {
|
|
51
|
+
return refuse('FORCE_NOT_ALLOWED', 'A forced send needs the messages:force scope');
|
|
52
|
+
}
|
|
45
53
|
const request = checkedSend(input, deps.hasher);
|
|
46
54
|
if (!request.isOk) {
|
|
47
55
|
return request;
|
|
@@ -76,8 +84,9 @@ export function checkedSend(input, hasher) {
|
|
|
76
84
|
return key;
|
|
77
85
|
}
|
|
78
86
|
const { selector, inReplyTo } = input;
|
|
79
|
-
const
|
|
80
|
-
|
|
87
|
+
const isForced = input.isForced === true;
|
|
88
|
+
const requestHash = hasher.hash(sendRequestText({ selector, payload: text.value, contentType: mediaType.value, inReplyTo, isForced }));
|
|
89
|
+
return ok({ selector, payload: text.value, contentType: mediaType.value, model: input.model, idempotencyKey: key.value, inReplyTo, isForced, requestHash });
|
|
81
90
|
}
|
|
82
91
|
/** Sends a checked request inside the caller's unit of work, as {@link createSendMessage} describes. */
|
|
83
92
|
export async function sendWithin(deps, send) {
|
|
@@ -124,6 +133,7 @@ export async function sendWithin(deps, send) {
|
|
|
124
133
|
idempotencyKey: send.request.idempotencyKey,
|
|
125
134
|
requestHash,
|
|
126
135
|
inReplyTo,
|
|
136
|
+
isForced: send.request.isForced,
|
|
127
137
|
at,
|
|
128
138
|
});
|
|
129
139
|
if (!accepted.isOk) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAoC,MAAM,sBAAsB,CAAC;AAE9G,OAAO,EAAE,UAAU,EAAE,eAAe,EAA2F,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,13 @@ export interface SendRequest {
|
|
|
6
6
|
payload: string;
|
|
7
7
|
contentType: string;
|
|
8
8
|
inReplyTo: MessageId | undefined;
|
|
9
|
+
isForced: boolean;
|
|
9
10
|
}
|
|
10
11
|
/**
|
|
11
12
|
* The request as one text, the same for the same request whatever order its
|
|
12
13
|
* fields came in: the selector as sent (one ship by id and by name are two
|
|
13
|
-
* requests), the payload, the content type
|
|
14
|
+
* requests), the payload, the content type, the message it replies to and,
|
|
15
|
+
* only when forced, the force, so a plain send keeps the text it always had.
|
|
14
16
|
* Its hash is kept with the message to tell a repeat from a reused key.
|
|
15
17
|
*/
|
|
16
18
|
export declare function sendRequestText(request: SendRequest): string;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The request as one text, the same for the same request whatever order its
|
|
3
3
|
* fields came in: the selector as sent (one ship by id and by name are two
|
|
4
|
-
* requests), the payload, the content type
|
|
4
|
+
* requests), the payload, the content type, the message it replies to and,
|
|
5
|
+
* only when forced, the force, so a plain send keeps the text it always had.
|
|
5
6
|
* Its hash is kept with the message to tell a repeat from a reused key.
|
|
6
7
|
*/
|
|
7
8
|
export function sendRequestText(request) {
|
|
8
|
-
|
|
9
|
+
const fields = [selectorFields(request.selector), request.payload, request.contentType, request.inReplyTo ?? null];
|
|
10
|
+
return JSON.stringify(request.isForced ? [...fields, 'forced'] : fields);
|
|
9
11
|
}
|
|
10
12
|
function selectorFields(selector) {
|
|
11
13
|
switch (selector.kind) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-request.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-request.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"send-request.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-request.ts"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAAoB;IAClD,MAAM,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;IACnH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,cAAc,CAAC,QAAkB;IACxC,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClG,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
|