@aeolus-fleet/core 0.26.1 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/domain/registry/whoami.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/domain/registry/whoami.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAgBtD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAA6C;IACxE,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,MAAM,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAClG,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAC1J,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ConsoleSessionId, FleetId, LeaseId, Scope, ShipId, ShipKind } from '@aeolus-fleet/common';
|
|
1
|
+
import type { ConsoleSessionId, FleetId, LeaseId, Scope, ScopeName, ShipId, ShipKind } from '@aeolus-fleet/common';
|
|
2
2
|
/**
|
|
3
3
|
* Who is calling. Every caller is a ship (ADR 0012), resolved from its crew
|
|
4
4
|
* token or from a console session. Kind and scopes come from the server, never
|
|
@@ -8,9 +8,12 @@ export interface Caller {
|
|
|
8
8
|
shipId: ShipId;
|
|
9
9
|
fleetId: FleetId;
|
|
10
10
|
kind: ShipKind;
|
|
11
|
-
scopes
|
|
11
|
+
/** Core scopes and plugin scopes; core checks only its own (decision 0046). */
|
|
12
|
+
scopes: readonly ScopeName[];
|
|
12
13
|
/** Set when the caller signed in through the console rather than calling with a crew token. */
|
|
13
14
|
consoleSessionId?: ConsoleSessionId;
|
|
15
|
+
/** The plugin ship that reads on behalf of this ship, with this ship's read reach (decision 0034); absent for a ship's own call. */
|
|
16
|
+
askedBy?: ShipId;
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
19
|
* A caller that came with the crew token `register` gave it: one session
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caller.js","sourceRoot":"","sources":["../../../src/domain/shared/caller.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"caller.js","sourceRoot":"","sources":["../../../src/domain/shared/caller.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,KAAY;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,MAAM,CAAC,MAAc;IACnC,OAAO,SAAS,IAAI,MAAM,CAAC;AAC7B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Err } from './result.js';
|
|
2
2
|
/** Every reason the domain refuses a request. */
|
|
3
|
-
export type DomainErrorKind = 'ASSIGNEE_NOT_ACTIVE' | 'CLEAR_REQUEST_LIMIT_REACHED' | 'CLEAR_REQUEST_NOT_FOUND' | 'CREW_REQUEST_ALREADY_ASSIGNED' | 'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER' | 'CREW_REQUEST_NOT_FOUND' | 'CREW_REQUEST_NOT_RELEASING' | 'CREW_REQUEST_RELEASING' | 'CREW_REQUEST_FINAL' | 'CREW_REQUEST_SETTINGS_CHANGED' | 'CREW_REQUEST_SETTINGS_INVALID' | 'CREW_REQUEST_SETTINGS_TOO_LARGE' | 'DELIVERY_HANDED_ONCE_MORE' | 'DELIVERY_HELD_BY_ANOTHER_SHIP' | 'DELIVERY_NOT_FOUND' | 'DELIVERY_NOT_A_PING' | 'DELIVERY_NOT_ACKNOWLEDGED' | 'DELIVERY_NOT_HANDED_ONCE_MORE' | 'DELIVERY_NOT_IN_FLIGHT' | 'DELIVERY_NOT_OPEN' | 'DELIVERY_NOT_UNDELIVERABLE' | 'FLEET_ALREADY_EXISTS' | 'FLEET_LIMIT_REACHED' | 'FLEET_NOT_FOUND' | 'FLEET_HAS_NO_VIEWER' | 'NOTICE_NOT_FOUND' | 'NOTICE_NOT_DISMISSIBLE' | 'GUIDE_NOT_FOUND' | 'GUIDE_STEP_NOT_FOUND' | 'IDEMPOTENCY_KEY_REUSED' | 'IN_REPLY_TO_NOT_FOUND' | 'MESSAGE_LIMIT_REACHED' | 'MODEL_REQUIRED' | 'INVALID_HARNESS' | 'MODEL_FROM_ARGO' | 'INVALID_CONTENT_TYPE' | 'INVALID_EMAIL' | 'INVALID_FLEET_NAME' | 'INVALID_FOLLOW_MAX' | 'INVALID_FOLLOW_WAIT' | 'INVALID_IDEMPOTENCY_KEY' | 'INVALID_INBOX_WAIT' | 'INVALID_LABEL_KEY' | 'INVALID_LABEL_VALUE' | 'INVALID_LABEL_VALUES' | 'INVALID_LIMIT' | 'INVALID_LOCATION' | 'INVALID_NETWORK_RULES' | 'INVALID_PASSWORD' | 'INVALID_RECEIVE_MAX' | 'INVALID_CREW_REQUEST_REASON' | 'INVALID_REPORT_DETAILS' | 'INVALID_REPORT_NOTE' | 'INVALID_REPORT_STATE' | 'INVALID_SHIP_NAME' | 'INVALID_SHIP_NOTE' | 'INVALID_SHIP_TYPE' | 'LABEL_CARRIED' | 'LABEL_KEY_TAKEN' | 'LABEL_NOT_FOUND' | 'LABEL_VALUE_CARRIED' | 'LABEL_VALUE_NOT_FOUND' | 'LEASE_ENDED' | 'MESSAGE_NOT_FOUND' | 'NETWORK_PLUGIN_REGISTERED' | 'NOT_A_TRIERARCH' | 'NOT_THE_LABEL_OWNER' | 'NOT_REACHABLE' | 'NOT_THE_NETWORK_PLUGIN' | 'NOT_THE_OPERATOR_SHIP' | 'OPERATOR_EMAIL_TAKEN' | 'OPERATOR_HAS_NO_PASSWORD' | 'OPERATOR_SHIP_GETS_NO_STARTING_PROMPT' | 'OPERATOR_SHIP_HAS_NO_SECRET' | 'OPERATOR_SHIP_IS_NOT_PINGED' | 'OPERATOR_SHIP_IS_PERMANENT' | 'PAYLOAD_TOO_LARGE' | 'PING_NOT_RESENT' | 'REPORT_DETAILS_TOO_LARGE' | 'RESERVED_CONTENT_TYPE' | 'SHIP_ALREADY_RETIRED' | 'SHIP_NAME_RESERVED' | 'SHIP_NAME_TAKEN' | 'SHIP_NOT_AWAITING_CREW' | 'SHIP_NOT_CREWED' | 'SHIP_LABEL_LIMIT_REACHED' | 'SHIP_LIMIT_REACHED' | 'SHIP_NOT_FOUND' | 'SIGN_IN_TICKET_INVALID' | 'UNKNOWN_CREW_TOKEN' | 'UNRESOLVABLE_SELECTOR' | 'WRONG_EMAIL_OR_PASSWORD' | 'WRONG_SHIP_ID_OR_SECRET';
|
|
3
|
+
export type DomainErrorKind = 'ASSIGNEE_NOT_ACTIVE' | 'BASE_SCOPE' | 'CLEAR_REQUEST_LIMIT_REACHED' | 'CLEAR_REQUEST_NOT_FOUND' | 'CORE_NAMESPACE' | 'CREW_REQUEST_ALREADY_ASSIGNED' | 'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER' | 'CREW_REQUEST_NOT_FOUND' | 'CREW_REQUEST_NOT_RELEASING' | 'CREW_REQUEST_RELEASING' | 'CREW_REQUEST_FINAL' | 'CREW_REQUEST_SETTINGS_CHANGED' | 'CREW_REQUEST_SETTINGS_INVALID' | 'CREW_REQUEST_SETTINGS_TOO_LARGE' | 'DELIVERY_HANDED_ONCE_MORE' | 'DELIVERY_HELD_BY_ANOTHER_SHIP' | 'DELIVERY_NOT_FOUND' | 'DELIVERY_NOT_A_PING' | 'DELIVERY_NOT_ACKNOWLEDGED' | 'DELIVERY_NOT_HANDED_ONCE_MORE' | 'DELIVERY_NOT_IN_FLIGHT' | 'DELIVERY_NOT_OPEN' | 'DELIVERY_NOT_UNDELIVERABLE' | 'FLEET_ALREADY_EXISTS' | 'FLEET_LIMIT_REACHED' | 'FORCE_NOT_ALLOWED' | 'FLEET_NOT_FOUND' | 'FLEET_HAS_NO_VIEWER' | 'INVALID_SCOPE' | 'INVALID_SCOPE_DESCRIPTION' | 'NAMESPACE_TAKEN' | 'NOTICE_NOT_FOUND' | 'NOTICE_NOT_DISMISSIBLE' | 'GUIDE_NOT_FOUND' | 'GUIDE_STEP_NOT_FOUND' | 'IDEMPOTENCY_KEY_REUSED' | 'OWN_SHIP_SCOPES' | 'PLUGIN_SCOPE_NOT_YOURS' | 'SCOPE_HELD' | 'SCOPE_NOT_DECLARED' | 'SCOPE_NOT_HELD' | 'SECOND_NAMESPACE' | 'SHIP_HAS_NO_OWNER' | 'KIND_COMMISSIONED_BY_ARGO_ONLY' | 'IN_REPLY_TO_NOT_FOUND' | 'MESSAGE_LIMIT_REACHED' | 'MODEL_REQUIRED' | 'INVALID_HARNESS' | 'MODEL_FROM_ARGO' | 'MODEL_FROM_PERSON_OR_APP' | 'INVALID_CONTENT_TYPE' | 'INVALID_EMAIL' | 'INVALID_FLEET_NAME' | 'INVALID_FOLLOW_MAX' | 'INVALID_FOLLOW_WAIT' | 'INVALID_IDEMPOTENCY_KEY' | 'INVALID_INBOX_WAIT' | 'INVALID_LABEL_KEY' | 'INVALID_LABEL_VALUE' | 'INVALID_LABEL_VALUES' | 'INVALID_LIMIT' | 'INVALID_LOCATION' | 'INVALID_OWNER' | 'INVALID_NETWORK_RULES' | 'INVALID_PASSWORD' | 'INVALID_RECEIVE_MAX' | 'INVALID_CREW_REQUEST_REASON' | 'INVALID_REPORT_DETAILS' | 'INVALID_REPORT_NOTE' | 'INVALID_REPORT_STATE' | 'INVALID_SHIP_NAME' | 'INVALID_SHIP_NOTE' | 'INVALID_SHIP_TYPE' | 'LABEL_CARRIED' | 'LABEL_KEY_TAKEN' | 'LABEL_NOT_FOUND' | 'LABEL_VALUE_CARRIED' | 'LABEL_VALUE_NOT_FOUND' | 'LEASE_ENDED' | 'MESSAGE_NOT_FOUND' | 'NETWORK_PLUGIN_REGISTERED' | 'NOT_A_TRIERARCH' | 'NOT_THE_LABEL_OWNER' | 'NOT_YOUR_SHIP_TO_LABEL' | 'NOT_REACHABLE' | 'NOT_THE_NETWORK_PLUGIN' | 'BUILT_IN_RULE_FIXED' | 'NOT_THE_OPERATOR_SHIP' | 'OPERATOR_EMAIL_TAKEN' | 'OPERATOR_HAS_NO_PASSWORD' | 'OPERATOR_SHIP_GETS_NO_STARTING_PROMPT' | 'OPERATOR_SHIP_HAS_NO_SECRET' | 'OPERATOR_SHIP_IS_NOT_PINGED' | 'OPERATOR_SHIP_IS_PERMANENT' | 'PAYLOAD_TOO_LARGE' | 'PING_NOT_RESENT' | 'REPORT_DETAILS_TOO_LARGE' | 'RESERVED_CONTENT_TYPE' | 'SHIP_ALREADY_RETIRED' | 'SHIP_NAME_RESERVED' | 'SHIP_NAME_TAKEN' | 'SHIP_NOT_AWAITING_CREW' | 'SHIP_NOT_CREWED' | 'SHIP_LABEL_LIMIT_REACHED' | 'SHIP_LIMIT_REACHED' | 'SHIP_NOT_FOUND' | 'SHIP_NOT_READ_ON_BEHALF' | 'SHIP_SCOPES_FIXED' | 'SIGN_IN_TICKET_INVALID' | 'TOO_MANY_SCOPES' | 'UNKNOWN_CREW_TOKEN' | 'UNRESOLVABLE_SELECTOR' | 'WRONG_EMAIL_OR_PASSWORD' | 'WRONG_SHIP_ID_OR_SECRET';
|
|
4
4
|
/**
|
|
5
5
|
* Why the domain refused a request. Adapters map the kind to their own error
|
|
6
6
|
* shape (a tRPC code, an exit code); the message is safe to show a caller.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/domain/shared/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/domain/shared/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,aAAa,CAAC;AAgI5C,qDAAqD;AACrD,MAAM,UAAU,MAAM,CAA4B,IAAO,EAAE,OAAe;IACxE,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type ReadReach } from '../registry/public.js';
|
|
3
|
+
import type { SequencedEvent } from './events.js';
|
|
4
|
+
import type { ShipHistory } from './history.js';
|
|
5
|
+
/**
|
|
6
|
+
* The events a read reach reads (decision 0034): a message's through its
|
|
7
|
+
* parties, any other through the ship it concerns, one that concerns neither
|
|
8
|
+
* by every reader. In their order.
|
|
9
|
+
*/
|
|
10
|
+
export declare function eventsRead(deps: {
|
|
11
|
+
history: Pick<ShipHistory, 'messageParties'>;
|
|
12
|
+
}, read: {
|
|
13
|
+
fleetId: FleetId;
|
|
14
|
+
reach: ReadReach;
|
|
15
|
+
events: readonly SequencedEvent[];
|
|
16
|
+
}): Promise<SequencedEvent[]>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { readsEvent } from '../registry/public.js';
|
|
2
|
+
/**
|
|
3
|
+
* The events a read reach reads (decision 0034): a message's through its
|
|
4
|
+
* parties, any other through the ship it concerns, one that concerns neither
|
|
5
|
+
* by every reader. In their order.
|
|
6
|
+
*/
|
|
7
|
+
export async function eventsRead(deps, read) {
|
|
8
|
+
const { fleetId, reach, events } = read;
|
|
9
|
+
if (reach.kind === 'every') {
|
|
10
|
+
return [...events];
|
|
11
|
+
}
|
|
12
|
+
const parties = await deps.history.messageParties(fleetId, events.flatMap((event) => (event.messageId === undefined ? [] : [event.messageId])));
|
|
13
|
+
return events.filter((event) => readsEvent(reach, { type: event.type, shipId: event.shipId ?? null, message: (event.messageId === undefined ? undefined : parties.get(event.messageId)) ?? null }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=events-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events-read.js","sourceRoot":"","sources":["../../../src/domain/shared/events-read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAkB,MAAM,uBAAuB,CAAC;AAInE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAsD,EACtD,IAA+E;IAE/E,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAC/C,OAAO,EACP,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CACpF,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CACnK,CAAC;AACJ,CAAC"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
import type { ReadReachOf } from '../registry/public.js';
|
|
1
2
|
import type { Caller } from './caller.js';
|
|
2
3
|
import type { Clock } from './clock.js';
|
|
3
4
|
import { type DomainError } from './errors.js';
|
|
4
5
|
import type { FleetEventFeed, FleetEventWakeups, SequencedEvent } from './events.js';
|
|
6
|
+
import type { ShipHistory } from './history.js';
|
|
5
7
|
import { type Result } from './result.js';
|
|
6
8
|
export type FollowFleetRefusal = DomainError<'INVALID_FOLLOW_MAX' | 'INVALID_FOLLOW_WAIT'>;
|
|
7
9
|
export interface FleetFollowed {
|
|
8
10
|
/** The events after the position, oldest first. */
|
|
9
11
|
events: SequencedEvent[];
|
|
10
|
-
/** The number to follow from next: the last event's, the position itself when none came, or the newest without one. */
|
|
12
|
+
/** The number to follow from next: the last event's it went through, read or not, the position itself when none came, or the newest without one. */
|
|
11
13
|
lastSeq: number;
|
|
12
14
|
}
|
|
13
15
|
export type FollowFleet = (caller: Caller, input: {
|
|
@@ -23,10 +25,14 @@ export type FollowFleet = (caller: Caller, input: {
|
|
|
23
25
|
* wait, and nothing after the position, it watches its fleet's wake-ups and
|
|
24
26
|
* reads again on each until an event comes or the wait has passed; it starts
|
|
25
27
|
* watching before it reads a second time, so an event committed in between is
|
|
26
|
-
* answered.
|
|
28
|
+
* answered. It answers only the events the caller reads (decision 0034); one
|
|
29
|
+
* it does not read moves the position on and does not end a wait. The
|
|
30
|
+
* caller's scope is checked before this runs.
|
|
27
31
|
*/
|
|
28
32
|
export declare function createFollowFleet(deps: {
|
|
29
33
|
feed: FleetEventFeed;
|
|
30
34
|
clock: Clock;
|
|
31
35
|
wakeups: FleetEventWakeups;
|
|
36
|
+
history: Pick<ShipHistory, 'messageParties'>;
|
|
37
|
+
readReach: ReadReachOf;
|
|
32
38
|
}): FollowFleet;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FOLLOW_MAX_DEFAULT, FOLLOW_MAX_LIMIT, FOLLOW_WAIT_MAX_SECONDS } from '@aeolus-fleet/common';
|
|
2
2
|
import { refuse } from './errors.js';
|
|
3
|
+
import { eventsRead } from './events-read.js';
|
|
3
4
|
import { ok } from './result.js';
|
|
4
5
|
const SECOND_MS = 1_000;
|
|
5
6
|
function checkedMax(max) {
|
|
@@ -22,7 +23,9 @@ function checkedWaitMs(waitSeconds) {
|
|
|
22
23
|
* wait, and nothing after the position, it watches its fleet's wake-ups and
|
|
23
24
|
* reads again on each until an event comes or the wait has passed; it starts
|
|
24
25
|
* watching before it reads a second time, so an event committed in between is
|
|
25
|
-
* answered.
|
|
26
|
+
* answered. It answers only the events the caller reads (decision 0034); one
|
|
27
|
+
* it does not read moves the position on and does not end a wait. The
|
|
28
|
+
* caller's scope is checked before this runs.
|
|
26
29
|
*/
|
|
27
30
|
export function createFollowFleet(deps) {
|
|
28
31
|
return async (caller, input) => {
|
|
@@ -40,20 +43,27 @@ export function createFollowFleet(deps) {
|
|
|
40
43
|
return ok({ events: [], lastSeq: await deps.feed.lastSeq(fleetId) });
|
|
41
44
|
}
|
|
42
45
|
const until = deps.clock.now().getTime() + waitMs.value;
|
|
46
|
+
const reach = await deps.readReach(caller);
|
|
47
|
+
let position = afterSeq;
|
|
43
48
|
let watch;
|
|
44
49
|
try {
|
|
45
50
|
for (;;) {
|
|
46
|
-
const
|
|
51
|
+
const gone = await deps.feed.after(fleetId, { seq: position, limit: max.value });
|
|
52
|
+
position = gone.at(-1)?.seq ?? position;
|
|
53
|
+
const events = await eventsRead(deps, { fleetId, reach, events: gone });
|
|
47
54
|
const remainingMs = until - deps.clock.now().getTime();
|
|
48
55
|
if (events.length > 0 || remainingMs <= 0) {
|
|
49
|
-
return ok({ events, lastSeq:
|
|
56
|
+
return ok({ events, lastSeq: position });
|
|
57
|
+
}
|
|
58
|
+
if (gone.length > 0) {
|
|
59
|
+
continue;
|
|
50
60
|
}
|
|
51
61
|
if (watch === undefined) {
|
|
52
62
|
watch = deps.wakeups.watch(fleetId);
|
|
53
63
|
continue;
|
|
54
64
|
}
|
|
55
65
|
if ((await watch.next(remainingMs)) === 'timedOut') {
|
|
56
|
-
return ok({ events: [], lastSeq:
|
|
66
|
+
return ok({ events: [], lastSeq: position });
|
|
57
67
|
}
|
|
58
68
|
}
|
|
59
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follow-fleet.js","sourceRoot":"","sources":["../../../src/domain/shared/follow-fleet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"follow-fleet.js","sourceRoot":"","sources":["../../../src/domain/shared/follow-fleet.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,16 +5,18 @@
|
|
|
5
5
|
* hours. Facts read from the fleet's records, never stored.
|
|
6
6
|
*/
|
|
7
7
|
import { type FleetId, type ShipId } from '@aeolus-fleet/common';
|
|
8
|
+
import type { MessageParties } from '../registry/public.js';
|
|
8
9
|
import type { HistoryParty } from './history.js';
|
|
9
10
|
import { type FleetRecords, type StuckPlaceCount } from './stuck.js';
|
|
10
11
|
/** A machine: the trierarch a ship's crew request is assigned to, and when its crew last called. */
|
|
11
12
|
export interface Machine extends HistoryParty {
|
|
12
13
|
lastSeenAt: Date | null;
|
|
13
14
|
}
|
|
14
|
-
/** A delivery acknowledged in the window: when its message was sent and when it was acknowledged. */
|
|
15
|
+
/** A delivery acknowledged in the window: when its message was sent and when it was acknowledged, and its message's parties. */
|
|
15
16
|
export interface AcknowledgedDelivery {
|
|
16
17
|
sentAt: Date;
|
|
17
18
|
acknowledgedAt: Date;
|
|
19
|
+
message: MessageParties;
|
|
18
20
|
}
|
|
19
21
|
/** The deliveries acknowledged in the last 24 hours, the median from send to acknowledgement, and how many in each hour. */
|
|
20
22
|
export interface Acknowledged {
|
|
@@ -73,10 +75,15 @@ export declare function healthSince(now: Date): Date;
|
|
|
73
75
|
export declare function acknowledgedSince(now: Date): Date;
|
|
74
76
|
/** Counts the deliveries acknowledged in the 24 hours up to `now`, with their median wait and how many in each hour. */
|
|
75
77
|
export declare function acknowledgedOf(deliveries: readonly AcknowledgedDelivery[], now: Date): Acknowledged;
|
|
76
|
-
/**
|
|
78
|
+
/**
|
|
79
|
+
* Reads the fleet's health at `now`: its records over the trend's hours and
|
|
80
|
+
* its acknowledged in the last 24, counting only the deliveries whose message
|
|
81
|
+
* `reads` keeps, every one without it.
|
|
82
|
+
*/
|
|
77
83
|
export declare function readHealthOf(records: HealthRecords, read: {
|
|
78
84
|
fleetId: FleetId;
|
|
79
85
|
now: Date;
|
|
86
|
+
reads?: (message: MessageParties) => boolean;
|
|
80
87
|
}): Promise<Health>;
|
|
81
88
|
export declare function healthOf(facts: HealthFacts, read: {
|
|
82
89
|
acknowledged: Acknowledged;
|
|
@@ -36,10 +36,16 @@ export function acknowledgedOf(deliveries, now) {
|
|
|
36
36
|
});
|
|
37
37
|
return { count: inWindow.length, medianMs: medianOf(inWindow.map((delivery) => delivery.acknowledgedAt.getTime() - delivery.sentAt.getTime())), perHour };
|
|
38
38
|
}
|
|
39
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Reads the fleet's health at `now`: its records over the trend's hours and
|
|
41
|
+
* its acknowledged in the last 24, counting only the deliveries whose message
|
|
42
|
+
* `reads` keeps, every one without it.
|
|
43
|
+
*/
|
|
40
44
|
export async function readHealthOf(records, read) {
|
|
41
|
-
const
|
|
42
|
-
|
|
45
|
+
const { fleetId, now, reads = () => true } = read;
|
|
46
|
+
const [facts, acknowledged] = await Promise.all([records.read(fleetId, healthSince(now)), records.acknowledged(fleetId, acknowledgedSince(now))]);
|
|
47
|
+
const deliveries = facts.deliveries.filter(({ senderId, recipient, claimedBy }) => reads({ senderId, recipient, claimedBy }));
|
|
48
|
+
return healthOf({ ...facts, deliveries }, { acknowledged: acknowledgedOf(acknowledged.filter((delivery) => reads(delivery.message)), now), now });
|
|
43
49
|
}
|
|
44
50
|
export function healthOf(facts, read) {
|
|
45
51
|
const shown = (place) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/domain/shared/health.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAA6B,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/domain/shared/health.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAA6B,MAAM,sBAAsB,CAAC;AAIxG,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAA2C,MAAM,YAAY,CAAC;AAEzG,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAuD/B,gGAAgG;AAChG,MAAM,UAAU,WAAW,CAAC,GAAS;IACnC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,iBAAiB,GAAG,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,iBAAiB,CAAC,GAAS;IACzC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,kBAAkB,GAAG,OAAO,CAAC,CAAC;AAChE,CAAC;AAED,yEAAyE;AACzE,SAAS,QAAQ,CAAC,KAAwB;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AACtF,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,cAAc,CAAC,UAA2C,EAAE,GAAS;IACnF,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,cAAc,IAAI,GAAG,CAAC,CAAC;IACrI,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAC5E,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,QAAQ,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACxI,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;AAC5J,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAsB,EAAE,IAAmF;IAC5I,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClJ,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC9H,OAAO,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AACpJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAkB,EAAE,IAA+C;IAC1F,MAAM,KAAK,GAAG,CAAC,KAAwE,EAAmB,EAAE;QAC1G,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;QAC5F,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC;QACrG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC;IACrE,CAAC,CAAC;IACF,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClH,YAAY,EAAE,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;QAC3C,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DELIVERY_HISTORY_TYPES, type ComputerSide, type LeaseEndReason, type InboxFilter, type DeliveryId, type DeliveryState, type EventId, type EventType, type FleetId, type MessageId, type ShipId } from '@aeolus-fleet/common';
|
|
2
|
-
import type { OverdueClock
|
|
3
|
-
import type { Location } from '../registry/public.js';
|
|
2
|
+
import type { OverdueClock } from '../messaging/public.js';
|
|
3
|
+
import type { Location, MessageParties } from '../registry/public.js';
|
|
4
4
|
import type { StandingOverdue, WayCrew, WayLease } from './delivery-way.js';
|
|
5
5
|
import type { EventDetails } from './events.js';
|
|
6
6
|
/**
|
|
@@ -41,6 +41,11 @@ export interface TimelineEntry {
|
|
|
41
41
|
} | null;
|
|
42
42
|
details: EventDetails;
|
|
43
43
|
}
|
|
44
|
+
/** A message's parties as read reach sees them; for a type, `claimedBy` is the ship that claimed it, if one has. */
|
|
45
|
+
export declare function partiesOf(message: {
|
|
46
|
+
sender: HistoryParty;
|
|
47
|
+
recipient: HistoryRecipient;
|
|
48
|
+
}, claimedBy: HistoryParty | null): MessageParties;
|
|
44
49
|
/** A message as a read shows it: whether it is a ping, told by its content type, so no reader repeats that rule. */
|
|
45
50
|
export type WithPing<T extends {
|
|
46
51
|
contentType: string;
|
|
@@ -54,14 +59,6 @@ export declare function withPing<T extends {
|
|
|
54
59
|
export type ShownTimelineEntry = Omit<TimelineEntry, 'message'> & {
|
|
55
60
|
message: WithPing<NonNullable<TimelineEntry['message']>> | null;
|
|
56
61
|
};
|
|
57
|
-
/** A delivery no ship can take as it is answered, its message telling whether it is a ping. */
|
|
58
|
-
export type ShownNoShipCanTakeEntry = Omit<NoShipCanTakeEntry, 'message'> & {
|
|
59
|
-
message: WithPing<NoShipCanTakeEntry['message']>;
|
|
60
|
-
};
|
|
61
|
-
/** An overdue delivery as it is answered, its message telling whether it is a ping. */
|
|
62
|
-
export type ShownOverdueEntry = Omit<OverdueEntry, 'message'> & {
|
|
63
|
-
message: WithPing<OverdueEntry['message']>;
|
|
64
|
-
};
|
|
65
62
|
/** A delivery in Needs attention as it is answered, its message telling whether it is a ping. */
|
|
66
63
|
export type ShownNeedsAttentionEntry = Omit<NeedsAttentionEntry, 'message'> & {
|
|
67
64
|
message: WithPing<NeedsAttentionEntry['message']>;
|
|
@@ -168,30 +165,6 @@ export interface NeedsAttentionEntry {
|
|
|
168
165
|
}
|
|
169
166
|
/** The delivery states Needs attention lists, each waiting for the operator to resend or dismiss it. */
|
|
170
167
|
export type NeedsAttentionState = Extract<DeliveryState, 'undeliverable' | 'notHandled'>;
|
|
171
|
-
/**
|
|
172
|
-
* A delivery argo was told is overdue (decision 0040): the ship whose clock
|
|
173
|
-
* ran out, the state it waits in, which clock, when argo was told, and its
|
|
174
|
-
* whole message. Listed until it clears by itself.
|
|
175
|
-
*/
|
|
176
|
-
export interface OverdueEntry {
|
|
177
|
-
deliveryId: DeliveryId;
|
|
178
|
-
ship: HistoryParty;
|
|
179
|
-
state: WaitingState;
|
|
180
|
-
clock: OverdueClock;
|
|
181
|
-
minutes: number;
|
|
182
|
-
toldAt: Date;
|
|
183
|
-
message: Omit<HistoryMessage, 'delivery'>;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* A pending delivery to a type no active ship can take (decision 0041): none
|
|
187
|
-
* of the type is left, or none of the ships its sender may reach (decision
|
|
188
|
-
* 0034). Its type and its whole message; listed until a ship can take it.
|
|
189
|
-
*/
|
|
190
|
-
export interface NoShipCanTakeEntry {
|
|
191
|
-
deliveryId: DeliveryId;
|
|
192
|
-
type: string;
|
|
193
|
-
message: Omit<HistoryMessage, 'delivery'>;
|
|
194
|
-
}
|
|
195
168
|
/** A reply the inbox's ship sent to a message in its inbox. */
|
|
196
169
|
export interface InboxReply {
|
|
197
170
|
id: MessageId;
|
|
@@ -236,14 +209,6 @@ export interface ShipHistory {
|
|
|
236
209
|
message(fleetId: FleetId, messageId: MessageId): Promise<MessageRead | undefined>;
|
|
237
210
|
/** Every undeliverable or not handled delivery, oldest first by since when. */
|
|
238
211
|
needsAttention(fleetId: FleetId): Promise<NeedsAttentionEntry[]>;
|
|
239
|
-
/**
|
|
240
|
-
* Every delivery argo was told is overdue that still stands, oldest told
|
|
241
|
-
* first: still in the state it was told in, on the lease it was told on,
|
|
242
|
-
* which has not ended.
|
|
243
|
-
*/
|
|
244
|
-
overdue(fleetId: FleetId): Promise<OverdueEntry[]>;
|
|
245
|
-
/** Every pending delivery to a type no active ship can take, oldest sent first. */
|
|
246
|
-
noShipCanTake(fleetId: FleetId): Promise<NoShipCanTakeEntry[]>;
|
|
247
212
|
/** What the ship's side of the way is read from: the open lease of the session crewing it and what waits for it. */
|
|
248
213
|
shipWay(fleetId: FleetId, shipId: ShipId): Promise<ShipWayRead | undefined>;
|
|
249
214
|
/** The messages addressed to the ship itself that the filter keeps, newest first. */
|
|
@@ -251,4 +216,6 @@ export interface ShipHistory {
|
|
|
251
216
|
shipId: ShipId;
|
|
252
217
|
filter: InboxFilter;
|
|
253
218
|
}): Promise<InboxEntry[]>;
|
|
219
|
+
/** Each message's parties as read reach sees them, by id; a message the fleet does not have is left out. */
|
|
220
|
+
messageParties(fleetId: FleetId, messageIds: readonly MessageId[]): Promise<ReadonlyMap<MessageId, MessageParties>>;
|
|
254
221
|
}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { DELIVERY_HISTORY_TYPES, isPingContentType, } from '@aeolus-fleet/common';
|
|
2
|
+
/** A message's parties as read reach sees them; for a type, `claimedBy` is the ship that claimed it, if one has. */
|
|
3
|
+
export function partiesOf(message, claimedBy) {
|
|
4
|
+
const { sender, recipient } = message;
|
|
5
|
+
return {
|
|
6
|
+
senderId: sender.id,
|
|
7
|
+
recipient: recipient.kind === 'ship' ? { kind: 'ship', shipId: recipient.ship.id } : recipient,
|
|
8
|
+
claimedBy: claimedBy?.id ?? null,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
2
11
|
export function withPing(message) {
|
|
3
12
|
return { ...message, isPing: isPingContentType(message.contentType) };
|
|
4
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/domain/shared/history.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAWlB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/domain/shared/history.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAWlB,MAAM,sBAAsB,CAAC;AAqC9B,oHAAoH;AACpH,MAAM,UAAU,SAAS,CAAC,OAA8D,EAAE,SAA8B;IACtH,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACtC,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,SAAS,EAAE,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;QAC9F,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,IAAI;KACjC,CAAC;AACJ,CAAC;AAKD,MAAM,UAAU,QAAQ,CAAoC,OAAU;IACpE,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;AACxE,CAAC;AAgCD,MAAM,UAAU,oBAAoB,CAAC,IAAe;IAClD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AAClE,CAAC;AA2GD,+FAA+F;AAC/F,MAAM,UAAU,QAAQ,CAAC,MAAmB,EAAE,KAAoB;IAChE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,QAAQ,CAAC;QAC3E,KAAK,MAAM;YACT,OAAO,KAAK,KAAK,cAAc,CAAC;QAClC,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import type { ReadReachOf } from '../registry/public.js';
|
|
1
2
|
import type { Caller } from './caller.js';
|
|
2
3
|
import type { FleetEventFeed, SequencedEvent } from './events.js';
|
|
4
|
+
import type { ShipHistory } from './history.js';
|
|
3
5
|
/**
|
|
4
6
|
* The most missed events a browser is sent one by one. Further behind, loading
|
|
5
7
|
* the fleet again is cheaper than replaying its history.
|
|
@@ -13,6 +15,7 @@ export declare const REPLAY_LIMIT = 1000;
|
|
|
13
15
|
export type FleetEventsRead = {
|
|
14
16
|
kind: 'events';
|
|
15
17
|
events: SequencedEvent[];
|
|
18
|
+
lastSeq: number;
|
|
16
19
|
} | {
|
|
17
20
|
kind: 'resync';
|
|
18
21
|
seq: number;
|
|
@@ -21,9 +24,12 @@ export type ReadFleetEvents = (caller: Caller, afterSeq: number | undefined) =>
|
|
|
21
24
|
/**
|
|
22
25
|
* Use case: the caller's fleet events after a position, for the live fleet
|
|
23
26
|
* view. Without a position, or more than REPLAY_LIMIT behind, the browser is
|
|
24
|
-
* told to load the fleet again.
|
|
25
|
-
*
|
|
27
|
+
* told to load the fleet again. Only the events the caller reads (decision
|
|
28
|
+
* 0034), with the number of the last it went through, read or not, to follow
|
|
29
|
+
* from next. The caller's scope (fleet:read) is checked before this runs.
|
|
26
30
|
*/
|
|
27
31
|
export declare function createReadFleetEvents(deps: {
|
|
28
32
|
feed: FleetEventFeed;
|
|
33
|
+
history: Pick<ShipHistory, 'messageParties'>;
|
|
34
|
+
readReach: ReadReachOf;
|
|
29
35
|
}): ReadFleetEvents;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { eventsRead } from './events-read.js';
|
|
1
2
|
/**
|
|
2
3
|
* The most missed events a browser is sent one by one. Further behind, loading
|
|
3
4
|
* the fleet again is cheaper than replaying its history.
|
|
@@ -6,8 +7,9 @@ export const REPLAY_LIMIT = 1000;
|
|
|
6
7
|
/**
|
|
7
8
|
* Use case: the caller's fleet events after a position, for the live fleet
|
|
8
9
|
* view. Without a position, or more than REPLAY_LIMIT behind, the browser is
|
|
9
|
-
* told to load the fleet again.
|
|
10
|
-
*
|
|
10
|
+
* told to load the fleet again. Only the events the caller reads (decision
|
|
11
|
+
* 0034), with the number of the last it went through, read or not, to follow
|
|
12
|
+
* from next. The caller's scope (fleet:read) is checked before this runs.
|
|
11
13
|
*/
|
|
12
14
|
export function createReadFleetEvents(deps) {
|
|
13
15
|
const resync = async (caller) => ({
|
|
@@ -18,8 +20,12 @@ export function createReadFleetEvents(deps) {
|
|
|
18
20
|
if (afterSeq === undefined) {
|
|
19
21
|
return resync(caller);
|
|
20
22
|
}
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
+
const gone = await deps.feed.after(caller.fleetId, { seq: afterSeq, limit: REPLAY_LIMIT + 1 });
|
|
24
|
+
if (gone.length > REPLAY_LIMIT) {
|
|
25
|
+
return resync(caller);
|
|
26
|
+
}
|
|
27
|
+
const events = await eventsRead(deps, { fleetId: caller.fleetId, reach: await deps.readReach(caller), events: gone });
|
|
28
|
+
return { kind: 'events', events, lastSeq: gone.at(-1)?.seq ?? afterSeq };
|
|
23
29
|
};
|
|
24
30
|
}
|
|
25
31
|
//# sourceMappingURL=read-fleet-events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-fleet-events.js","sourceRoot":"","sources":["../../../src/domain/shared/read-fleet-events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-fleet-events.js","sourceRoot":"","sources":["../../../src/domain/shared/read-fleet-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAWjC;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAoG;IACxI,MAAM,MAAM,GAAG,KAAK,EAAE,MAAc,EAA4B,EAAE,CAAC,CAAC;QAClE,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;KAC7C,CAAC,CAAC;IAEH,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QAChC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACtH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC3E,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ReadReachOf } from '../registry/public.js';
|
|
1
2
|
import type { Caller } from './caller.js';
|
|
2
3
|
import type { Clock } from './clock.js';
|
|
3
4
|
import { type Health, type HealthRecords } from './health.js';
|
|
@@ -5,10 +6,12 @@ export type ReadHealth = (caller: Caller) => Promise<Health>;
|
|
|
5
6
|
/**
|
|
6
7
|
* Use case: the health of the caller's fleet (decision 0042), for the
|
|
7
8
|
* console's Health: its stuck deliveries by cause and place, the trend over
|
|
8
|
-
* the last 7 days and what was acknowledged in the last 24 hours
|
|
9
|
+
* the last 7 days and what was acknowledged in the last 24 hours, counting
|
|
10
|
+
* only the deliveries whose message the caller reads (decision 0034). The caller's
|
|
9
11
|
* scope (fleet:read) is checked before this runs.
|
|
10
12
|
*/
|
|
11
13
|
export declare function createReadHealth(deps: {
|
|
12
14
|
health: HealthRecords;
|
|
13
15
|
clock: Clock;
|
|
16
|
+
readReach: ReadReachOf;
|
|
14
17
|
}): ReadHealth;
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
import { readsMessage } from '../registry/public.js';
|
|
1
2
|
import { readHealthOf } from './health.js';
|
|
2
3
|
/**
|
|
3
4
|
* Use case: the health of the caller's fleet (decision 0042), for the
|
|
4
5
|
* console's Health: its stuck deliveries by cause and place, the trend over
|
|
5
|
-
* the last 7 days and what was acknowledged in the last 24 hours
|
|
6
|
+
* the last 7 days and what was acknowledged in the last 24 hours, counting
|
|
7
|
+
* only the deliveries whose message the caller reads (decision 0034). The caller's
|
|
6
8
|
* scope (fleet:read) is checked before this runs.
|
|
7
9
|
*/
|
|
8
10
|
export function createReadHealth(deps) {
|
|
9
|
-
return (caller) =>
|
|
11
|
+
return async (caller) => {
|
|
12
|
+
const reach = await deps.readReach(caller);
|
|
13
|
+
return readHealthOf(deps.health, { fleetId: caller.fleetId, now: deps.clock.now(), reads: (message) => readsMessage(reach, message) });
|
|
14
|
+
};
|
|
10
15
|
}
|
|
11
16
|
//# sourceMappingURL=read-health.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-health.js","sourceRoot":"","sources":["../../../src/domain/shared/read-health.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-health.js","sourceRoot":"","sources":["../../../src/domain/shared/read-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,uBAAuB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAmC,MAAM,aAAa,CAAC;AAI5E;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAqE;IACpG,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACzI,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { InboxFilter } from '@aeolus-fleet/common';
|
|
2
|
-
import type
|
|
2
|
+
import { type ReadReachOf, type ShipRepository } from '../registry/public.js';
|
|
3
3
|
import type { Caller } from './caller.js';
|
|
4
4
|
import type { InboxEntry, ShipHistory } from './history.js';
|
|
5
5
|
export type ReadInbox = (caller: Caller, input: {
|
|
@@ -11,10 +11,13 @@ export type ReadInbox = (caller: Caller, input: {
|
|
|
11
11
|
* keeps (open, done or all), newest first, each with when it was read, when
|
|
12
12
|
* and by which reply it was done, and its whole payload. Messages to its type
|
|
13
13
|
* are its type's queue, not its inbox. A viewer session, which receives
|
|
14
|
-
* nothing, reads argo's inbox instead, read-only (decision 0022)
|
|
15
|
-
*
|
|
14
|
+
* nothing, reads argo's inbox instead, read-only (decision 0022), and only the
|
|
15
|
+
* messages its read reach reads: none while argo has turned viewer reading
|
|
16
|
+
* off (decision 0034). The caller's scope (fleet:read) is checked before this
|
|
17
|
+
* runs.
|
|
16
18
|
*/
|
|
17
19
|
export declare function createReadInbox(deps: {
|
|
18
20
|
history: ShipHistory;
|
|
19
21
|
ships: Pick<ShipRepository, 'findOperatorShip'>;
|
|
22
|
+
readReach: ReadReachOf;
|
|
20
23
|
}): ReadInbox;
|
|
@@ -1,16 +1,26 @@
|
|
|
1
|
+
import { readsMessage } from '../registry/public.js';
|
|
1
2
|
/**
|
|
2
3
|
* Use case: the caller's own inbox, for the operator inbox of argo
|
|
3
4
|
* (docs/blueprint.md, "Inbox"): the messages addressed to it that the filter
|
|
4
5
|
* keeps (open, done or all), newest first, each with when it was read, when
|
|
5
6
|
* and by which reply it was done, and its whole payload. Messages to its type
|
|
6
7
|
* are its type's queue, not its inbox. A viewer session, which receives
|
|
7
|
-
* nothing, reads argo's inbox instead, read-only (decision 0022)
|
|
8
|
-
*
|
|
8
|
+
* nothing, reads argo's inbox instead, read-only (decision 0022), and only the
|
|
9
|
+
* messages its read reach reads: none while argo has turned viewer reading
|
|
10
|
+
* off (decision 0034). The caller's scope (fleet:read) is checked before this
|
|
11
|
+
* runs.
|
|
9
12
|
*/
|
|
10
13
|
export function createReadInbox(deps) {
|
|
11
14
|
return async (caller, { filter }) => {
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
if (caller.kind !== 'viewer') {
|
|
16
|
+
return deps.history.inbox(caller.fleetId, { shipId: caller.shipId, filter });
|
|
17
|
+
}
|
|
18
|
+
const argo = await deps.ships.findOperatorShip(caller.fleetId);
|
|
19
|
+
if (!argo) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
const [inbox, reach] = await Promise.all([deps.history.inbox(caller.fleetId, { shipId: argo.id, filter }), deps.readReach(caller)]);
|
|
23
|
+
return inbox.filter((entry) => readsMessage(reach, { senderId: entry.message.sender.id, recipient: { kind: 'ship', shipId: argo.id }, claimedBy: null }));
|
|
14
24
|
};
|
|
15
25
|
}
|
|
16
26
|
//# sourceMappingURL=read-inbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-inbox.js","sourceRoot":"","sources":["../../../src/domain/shared/read-inbox.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-inbox.js","sourceRoot":"","sources":["../../../src/domain/shared/read-inbox.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAyC,MAAM,uBAAuB,CAAC;AAM5F;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,IAAuG;IACrI,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpI,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5J,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -2,7 +2,8 @@ import type { MessageId } from '@aeolus-fleet/common';
|
|
|
2
2
|
import type { Caller } from './caller.js';
|
|
3
3
|
import { type DomainError } from './errors.js';
|
|
4
4
|
import { type DeliveryWay } from './delivery-way.js';
|
|
5
|
-
import
|
|
5
|
+
import { type ReadReachOf } from '../registry/public.js';
|
|
6
|
+
import { type DeliveryChange, type HistoryMessage, type HistoryReply, type ShipHistory } from './history.js';
|
|
6
7
|
import { type Result } from './result.js';
|
|
7
8
|
export type MessageDetail = HistoryMessage & {
|
|
8
9
|
replies: HistoryReply[];
|
|
@@ -18,8 +19,11 @@ export type ReadMessage = (caller: Caller, input: {
|
|
|
18
19
|
* Use case: one message of the caller's fleet: its envelope, its whole
|
|
19
20
|
* payload, its replies, and its delivery's way through: who holds it, since
|
|
20
21
|
* when, the clocks that speak for it and every step newest first, from the
|
|
21
|
-
* event log.
|
|
22
|
+
* event log. A message outside the caller's read reach is answered as none,
|
|
23
|
+
* so its existence does not show (decision 0034). The caller's scope
|
|
24
|
+
* (fleet:read) is checked before this runs.
|
|
22
25
|
*/
|
|
23
26
|
export declare function createReadMessage(deps: {
|
|
24
27
|
history: ShipHistory;
|
|
28
|
+
readReach: ReadReachOf;
|
|
25
29
|
}): ReadMessage;
|