@aeolus-fleet/core 0.20.5 → 0.22.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/dist/adapters/http/server.d.ts +2 -0
- package/dist/adapters/http/server.js +11 -0
- package/dist/adapters/http/server.js.map +1 -1
- package/dist/adapters/prisma/client.d.ts +2 -0
- package/dist/adapters/prisma/client.js +19 -1
- package/dist/adapters/prisma/client.js.map +1 -1
- package/dist/adapters/prisma/fleet-busy.d.ts +2 -0
- package/dist/adapters/prisma/fleet-busy.js +26 -0
- package/dist/adapters/prisma/fleet-busy.js.map +1 -0
- package/dist/adapters/prisma/generated/browser.d.ts +7 -0
- package/dist/adapters/prisma/generated/client.d.ts +7 -0
- 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 +83 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +6 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +7 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +6 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/DeclaredNetworkRules.d.ts +1195 -0
- package/dist/adapters/prisma/generated/models/DeclaredNetworkRules.js +2 -0
- package/dist/adapters/prisma/generated/models/DeclaredNetworkRules.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Fleet.d.ts +259 -0
- package/dist/adapters/prisma/generated/models/Ship.d.ts +263 -0
- package/dist/adapters/prisma/generated/models.d.ts +1 -0
- package/dist/adapters/prisma/migrate.js +17 -4
- package/dist/adapters/prisma/migrate.js.map +1 -1
- package/dist/adapters/prisma/network.d.ts +3 -1
- package/dist/adapters/prisma/network.js +23 -0
- package/dist/adapters/prisma/network.js.map +1 -1
- package/dist/adapters/prisma/registry.js +2 -0
- package/dist/adapters/prisma/registry.js.map +1 -1
- package/dist/adapters/prisma/unit-of-work.d.ts +2 -1
- package/dist/adapters/prisma/unit-of-work.js +2 -1
- package/dist/adapters/prisma/unit-of-work.js.map +1 -1
- package/dist/adapters/trpc/console.d.ts +2 -1
- package/dist/adapters/trpc/console.js +6 -2
- package/dist/adapters/trpc/console.js.map +1 -1
- package/dist/adapters/trpc/context.d.ts +9 -1
- package/dist/adapters/trpc/fleet.d.ts +46 -3
- package/dist/adapters/trpc/fleet.js +34 -6
- package/dist/adapters/trpc/fleet.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +52 -3
- package/dist/adapters/trpc/ship-contract.js +2 -0
- package/dist/adapters/trpc/ship-contract.js.map +1 -1
- package/dist/adapters/trpc/ship-protocol.js +2 -2
- package/dist/adapters/trpc/ship-protocol.js.map +1 -1
- package/dist/adapters/trpc/system.d.ts +15 -0
- package/dist/adapters/trpc/system.js +10 -1
- package/dist/adapters/trpc/system.js.map +1 -1
- package/dist/adapters/trpc/trpc.d.ts +11 -0
- package/dist/adapters/trpc/trpc.js +26 -10
- package/dist/adapters/trpc/trpc.js.map +1 -1
- package/dist/app.js +2 -1
- package/dist/app.js.map +1 -1
- package/dist/domain/registry/check-reach.d.ts +15 -0
- package/dist/domain/registry/check-reach.js +4 -4
- package/dist/domain/registry/check-reach.js.map +1 -1
- package/dist/domain/registry/declare-network-rules.d.ts +33 -0
- package/dist/domain/registry/declare-network-rules.js +30 -0
- package/dist/domain/registry/declare-network-rules.js.map +1 -0
- package/dist/domain/registry/declared-network-rules.d.ts +60 -0
- package/dist/domain/registry/declared-network-rules.js +70 -0
- package/dist/domain/registry/declared-network-rules.js.map +1 -0
- package/dist/domain/registry/explain-reach.d.ts +34 -0
- package/dist/domain/registry/explain-reach.js +42 -0
- package/dist/domain/registry/explain-reach.js.map +1 -0
- package/dist/domain/registry/label.d.ts +8 -10
- package/dist/domain/registry/label.js +4 -16
- package/dist/domain/registry/label.js.map +1 -1
- package/dist/domain/registry/network-settings.d.ts +26 -13
- package/dist/domain/registry/network-settings.js +68 -31
- package/dist/domain/registry/network-settings.js.map +1 -1
- package/dist/domain/registry/ports.d.ts +12 -0
- package/dist/domain/registry/read-assigned-crew-requests.d.ts +2 -2
- package/dist/domain/registry/read-assigned-crew-requests.js +2 -1
- package/dist/domain/registry/read-assigned-crew-requests.js.map +1 -1
- package/dist/domain/registry/read-declared-network-rules.d.ts +16 -0
- package/dist/domain/registry/read-declared-network-rules.js +9 -0
- package/dist/domain/registry/read-declared-network-rules.js.map +1 -0
- package/dist/domain/registry/retire-ship.d.ts +4 -2
- package/dist/domain/registry/retire-ship.js +10 -1
- package/dist/domain/registry/retire-ship.js.map +1 -1
- package/dist/domain/registry/set-network-rules.d.ts +4 -2
- package/dist/domain/registry/set-network-rules.js +4 -2
- package/dist/domain/registry/set-network-rules.js.map +1 -1
- package/dist/domain/registry/unassign-label.js +1 -1
- package/dist/domain/registry/unassign-label.js.map +1 -1
- package/dist/domain/shared/errors.d.ts +1 -1
- package/dist/domain/shared/errors.js.map +1 -1
- package/dist/wiring.d.ts +6 -0
- package/dist/wiring.js +7 -1
- package/dist/wiring.js.map +1 -1
- package/package.json +3 -2
- package/src/adapters/prisma/migrations/20261010110000_network_rules_through_plugin/migration.sql +4 -0
- package/src/adapters/prisma/migrations/20261010130000_cleared_network_rules_on_record/migration.sql +57 -0
- package/src/adapters/prisma/migrations/20261010210000_declared_network_rules/migration.sql +16 -0
- package/src/adapters/prisma/schema.prisma +17 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IdGenerator } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Caller } from '../shared/caller.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type EventLog } from '../shared/events.js';
|
|
5
|
+
import { type Result } from '../shared/result.js';
|
|
6
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
7
|
+
import { type DeclareNetworkRulesRefusal } from './declared-network-rules.js';
|
|
8
|
+
import type { NetworkRule } from './network-settings.js';
|
|
9
|
+
import type { DeclaredNetworkRulesRepository, LabelRepository, ShipRepository } from './ports.js';
|
|
10
|
+
export interface DeclareNetworkRulesTx {
|
|
11
|
+
labels: Pick<LabelRepository, 'find' | 'findByValueForShare'>;
|
|
12
|
+
ships: Pick<ShipRepository, 'find'>;
|
|
13
|
+
declaredNetworkRules: Pick<DeclaredNetworkRulesRepository, 'save'>;
|
|
14
|
+
events: EventLog;
|
|
15
|
+
}
|
|
16
|
+
export type DeclareNetworkRules = (caller: Caller, input: {
|
|
17
|
+
rules: readonly NetworkRule[];
|
|
18
|
+
}) => Promise<Result<{
|
|
19
|
+
rules: number;
|
|
20
|
+
}, DeclareNetworkRulesRefusal>>;
|
|
21
|
+
/**
|
|
22
|
+
* Use case: a ship declares the network rules it needs on the labels it owns,
|
|
23
|
+
* its whole list, or none to withdraw them (decision 0037). Its scope
|
|
24
|
+
* (labels:define) is checked before this runs. In one unit of work: the
|
|
25
|
+
* labels its terms name as the fleet has them now, its list in place of the
|
|
26
|
+
* one before, and NetworkRulesDeclared. Nothing comes in force here: the
|
|
27
|
+
* networking plugin adds them to argo's rules when it supplies the list.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createDeclareNetworkRules(deps: {
|
|
30
|
+
uow: UnitOfWork<DeclareNetworkRulesTx>;
|
|
31
|
+
clock: Clock;
|
|
32
|
+
ids: IdGenerator;
|
|
33
|
+
}): DeclareNetworkRules;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { recordEvent, shipActor } from '../shared/events.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { declareNetworkRules, namedInRules } from './declared-network-rules.js';
|
|
4
|
+
/**
|
|
5
|
+
* Use case: a ship declares the network rules it needs on the labels it owns,
|
|
6
|
+
* its whole list, or none to withdraw them (decision 0037). Its scope
|
|
7
|
+
* (labels:define) is checked before this runs. In one unit of work: the
|
|
8
|
+
* labels its terms name as the fleet has them now, its list in place of the
|
|
9
|
+
* one before, and NetworkRulesDeclared. Nothing comes in force here: the
|
|
10
|
+
* networking plugin adds them to argo's rules when it supplies the list.
|
|
11
|
+
*/
|
|
12
|
+
export function createDeclareNetworkRules(deps) {
|
|
13
|
+
return (caller, input) => deps.uow.run(async (tx) => {
|
|
14
|
+
const { fleetId, shipId } = caller;
|
|
15
|
+
const { labelIds, valueIds } = namedInRules(input.rules);
|
|
16
|
+
const found = await Promise.all([...labelIds.map((labelId) => tx.labels.find(fleetId, labelId)), ...valueIds.map((valueId) => tx.labels.findByValueForShare(fleetId, valueId))]);
|
|
17
|
+
const labels = found.filter((label) => label !== undefined);
|
|
18
|
+
const ownerNames = new Map(await Promise.all(labels.map(async (label) => [label.ownerShipId, (await tx.ships.find(fleetId, label.ownerShipId))?.name ?? label.ownerShipId])));
|
|
19
|
+
const declared = declareNetworkRules({ labels, ownerNameOf: (ownerShipId) => ownerNames.get(ownerShipId) ?? ownerShipId }, { fleetId, shipId, rules: input.rules, at: deps.clock.now(), actor: shipActor(shipId) });
|
|
20
|
+
if (!declared.isOk) {
|
|
21
|
+
return declared;
|
|
22
|
+
}
|
|
23
|
+
await tx.declaredNetworkRules.save(declared.value.declared);
|
|
24
|
+
for (const event of declared.value.events) {
|
|
25
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, event);
|
|
26
|
+
}
|
|
27
|
+
return ok({ rules: declared.value.declared.rules.length });
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=declare-network-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declare-network-rules.js","sourceRoot":"","sources":["../../../src/domain/registry/declare-network-rules.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAmC,MAAM,6BAA6B,CAAC;AAcjH;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAgF;IACxH,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAkE,EAAE;QACxF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QACnC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACjL,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAkB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,WAAW,CAAU,CAAC,CAAC,CAAC,CAAC;QACvL,MAAM,QAAQ,GAAG,mBAAmB,CAClC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW,EAAE,EACpF,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CACxF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The network rules a ship declares on the labels it owns (decision 0037),
|
|
3
|
+
* such as a plugin's for the ships it labels. Declared, they are not in
|
|
4
|
+
* force: the fleet's networking plugin adds them to argo's rules when it
|
|
5
|
+
* supplies the list. Only rules on labels the ship owns keep them safe: only
|
|
6
|
+
* it assigns those labels, so its rules reach no ship it did not label.
|
|
7
|
+
*/
|
|
8
|
+
import { type FleetId, type LabelId, type LabelValueId, type ShipId } from '@aeolus-fleet/common';
|
|
9
|
+
import { type DomainError } from '../shared/errors.js';
|
|
10
|
+
import type { Actor, NewEvent } from '../shared/events.js';
|
|
11
|
+
import { type Result } from '../shared/result.js';
|
|
12
|
+
import type { Label } from './label.js';
|
|
13
|
+
import { type NetworkRule } from './network-settings.js';
|
|
14
|
+
/** One ship's declared rules, its whole list; a ship that declares none holds none. */
|
|
15
|
+
export interface DeclaredNetworkRules {
|
|
16
|
+
fleetId: FleetId;
|
|
17
|
+
shipId: ShipId;
|
|
18
|
+
rules: readonly NetworkRule[];
|
|
19
|
+
}
|
|
20
|
+
export type DeclareNetworkRulesRefusal = DomainError<'INVALID_NETWORK_RULES' | 'NOT_THE_LABEL_OWNER' | 'LABEL_NOT_FOUND' | 'LABEL_VALUE_NOT_FOUND'>;
|
|
21
|
+
/** The labels a declaration's terms name, as the fleet has them now, with each owner's name for a refusal. */
|
|
22
|
+
export interface NamedLabels {
|
|
23
|
+
labels: readonly Label[];
|
|
24
|
+
ownerNameOf: (shipId: ShipId) => string;
|
|
25
|
+
}
|
|
26
|
+
/** Every label and every exact value the rules' terms name, each once: what the caller looks up before declaring. */
|
|
27
|
+
export declare function namedInRules(rules: readonly NetworkRule[]): {
|
|
28
|
+
labelIds: LabelId[];
|
|
29
|
+
valueIds: LabelValueId[];
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* The ship declares its whole list from now on, replacing what it declared
|
|
33
|
+
* before; an empty list withdraws them. At most 20, each rule within
|
|
34
|
+
* decision 0034's own limits, and every term on a label the ship owns: an
|
|
35
|
+
* exact value's label, and the label of a term of any or the same value. An
|
|
36
|
+
* id the fleet does not have is refused, as its owner cannot be checked.
|
|
37
|
+
* NetworkRulesDeclared names the ship and the number of rules, never them.
|
|
38
|
+
*/
|
|
39
|
+
export declare function declareNetworkRules(named: NamedLabels, change: {
|
|
40
|
+
fleetId: FleetId;
|
|
41
|
+
shipId: ShipId;
|
|
42
|
+
rules: readonly NetworkRule[];
|
|
43
|
+
at: Date;
|
|
44
|
+
actor: Actor;
|
|
45
|
+
}): Result<{
|
|
46
|
+
declared: DeclaredNetworkRules;
|
|
47
|
+
events: NewEvent[];
|
|
48
|
+
}, DeclareNetworkRulesRefusal>;
|
|
49
|
+
/**
|
|
50
|
+
* The retired ship's declared rules go with it, as its labels do (decision
|
|
51
|
+
* 0031): none from now on, with NetworkRulesDeclared of none. A ship that
|
|
52
|
+
* declared none changes nothing.
|
|
53
|
+
*/
|
|
54
|
+
export declare function withdrawWithRetiredShip(current: DeclaredNetworkRules | undefined, change: {
|
|
55
|
+
at: Date;
|
|
56
|
+
actor: Actor;
|
|
57
|
+
}): {
|
|
58
|
+
declared: DeclaredNetworkRules;
|
|
59
|
+
events: NewEvent[];
|
|
60
|
+
} | undefined;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The network rules a ship declares on the labels it owns (decision 0037),
|
|
3
|
+
* such as a plugin's for the ships it labels. Declared, they are not in
|
|
4
|
+
* force: the fleet's networking plugin adds them to argo's rules when it
|
|
5
|
+
* supplies the list. Only rules on labels the ship owns keep them safe: only
|
|
6
|
+
* it assigns those labels, so its rules reach no ship it did not label.
|
|
7
|
+
*/
|
|
8
|
+
import { DECLARED_NETWORK_RULES_MAX } from '@aeolus-fleet/common';
|
|
9
|
+
import { refuse } from '../shared/errors.js';
|
|
10
|
+
import { ok } from '../shared/result.js';
|
|
11
|
+
import { copyOfRule, invalidRule } from './network-settings.js';
|
|
12
|
+
/** Every label and every exact value the rules' terms name, each once: what the caller looks up before declaring. */
|
|
13
|
+
export function namedInRules(rules) {
|
|
14
|
+
const terms = rules.flatMap((rule) => [...rule.from, ...rule.to]);
|
|
15
|
+
return {
|
|
16
|
+
labelIds: [...new Set(terms.flatMap((term) => (typeof term === 'string' ? [] : [term.labelId])))],
|
|
17
|
+
valueIds: [...new Set(terms.flatMap((term) => (typeof term === 'string' ? [term] : [])))],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The ship declares its whole list from now on, replacing what it declared
|
|
22
|
+
* before; an empty list withdraws them. At most 20, each rule within
|
|
23
|
+
* decision 0034's own limits, and every term on a label the ship owns: an
|
|
24
|
+
* exact value's label, and the label of a term of any or the same value. An
|
|
25
|
+
* id the fleet does not have is refused, as its owner cannot be checked.
|
|
26
|
+
* NetworkRulesDeclared names the ship and the number of rules, never them.
|
|
27
|
+
*/
|
|
28
|
+
export function declareNetworkRules(named, change) {
|
|
29
|
+
const { fleetId, shipId, rules } = change;
|
|
30
|
+
if (rules.length > DECLARED_NETWORK_RULES_MAX) {
|
|
31
|
+
return refuse('INVALID_NETWORK_RULES', `A ship declares at most ${String(DECLARED_NETWORK_RULES_MAX)} network rules (decision 0037)`);
|
|
32
|
+
}
|
|
33
|
+
const invalid = rules.map(invalidRule).find((broken) => broken !== undefined);
|
|
34
|
+
if (invalid !== undefined) {
|
|
35
|
+
return refuse('INVALID_NETWORK_RULES', `${invalid} (decision 0034)`);
|
|
36
|
+
}
|
|
37
|
+
for (const term of rules.flatMap((rule) => [...rule.from, ...rule.to])) {
|
|
38
|
+
const owned = checkOwnedTerm(named, { term, shipId });
|
|
39
|
+
if (!owned.isOk) {
|
|
40
|
+
return owned;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return ok({ declared: { fleetId, shipId, rules: rules.map(copyOfRule) }, events: [declaredEvent({ fleetId, shipId, rules: rules.length, at: change.at, actor: change.actor })] });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The retired ship's declared rules go with it, as its labels do (decision
|
|
47
|
+
* 0031): none from now on, with NetworkRulesDeclared of none. A ship that
|
|
48
|
+
* declared none changes nothing.
|
|
49
|
+
*/
|
|
50
|
+
export function withdrawWithRetiredShip(current, change) {
|
|
51
|
+
if (current === undefined) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const { fleetId, shipId } = current;
|
|
55
|
+
return { declared: { fleetId, shipId, rules: [] }, events: [declaredEvent({ fleetId, shipId, rules: 0, ...change })] };
|
|
56
|
+
}
|
|
57
|
+
function declaredEvent(declared) {
|
|
58
|
+
return { type: 'NetworkRulesDeclared', fleetId: declared.fleetId, occurredAt: declared.at, actor: declared.actor, shipId: declared.shipId, details: { rules: declared.rules } };
|
|
59
|
+
}
|
|
60
|
+
function checkOwnedTerm(named, declaring) {
|
|
61
|
+
const { term, shipId } = declaring;
|
|
62
|
+
const label = typeof term === 'string' ? named.labels.find((each) => each.values.some((value) => value.id === term)) : named.labels.find((each) => each.id === term.labelId);
|
|
63
|
+
if (label === undefined) {
|
|
64
|
+
return typeof term === 'string' ? refuse('LABEL_VALUE_NOT_FOUND', `The fleet has no label value ${term}`) : refuse('LABEL_NOT_FOUND', `The fleet has no label ${term.labelId}`);
|
|
65
|
+
}
|
|
66
|
+
return label.ownerShipId === shipId
|
|
67
|
+
? ok(undefined)
|
|
68
|
+
: refuse('NOT_THE_LABEL_OWNER', `The label ${label.key} is owned by ${named.ownerNameOf(label.ownerShipId)}: only its owner declares rules on it (decision 0037)`);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=declared-network-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declared-network-rules.js","sourceRoot":"","sources":["../../../src/domain/registry/declared-network-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Caller } from '../shared/caller.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type DomainError } from '../shared/errors.js';
|
|
5
|
+
import { type Result } from '../shared/result.js';
|
|
6
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
7
|
+
import { type CheckReachTx } from './check-reach.js';
|
|
8
|
+
import type { ShipRepository } from './ports.js';
|
|
9
|
+
export interface ExplainReachTx {
|
|
10
|
+
networkSettings: CheckReachTx['networkSettings'];
|
|
11
|
+
ships: Pick<ShipRepository, 'find' | 'listActive'>;
|
|
12
|
+
labels: CheckReachTx['labels'];
|
|
13
|
+
leases: CheckReachTx['leases'];
|
|
14
|
+
}
|
|
15
|
+
export type ExplainReachFailure = DomainError<'NOT_THE_OPERATOR_SHIP' | 'SHIP_NOT_FOUND'>;
|
|
16
|
+
export type ExplainReach = (caller: Caller, input: {
|
|
17
|
+
fromShipId: ShipId;
|
|
18
|
+
toShipId?: ShipId;
|
|
19
|
+
}) => Promise<Result<{
|
|
20
|
+
reachableShipIds: ShipId[];
|
|
21
|
+
}, ExplainReachFailure>>;
|
|
22
|
+
/**
|
|
23
|
+
* Use case: argo asks which ships a ship reaches now, or whether it reaches
|
|
24
|
+
* one ship (design points 11 and 12 on #260). It answers as a send would be
|
|
25
|
+
* checked at this moment: the rules in force, what the networking plugin
|
|
26
|
+
* declared while it does not respond, argo both ways. There is no message, so
|
|
27
|
+
* no answer to a sender. It answers the ships, never the rules or the reasons,
|
|
28
|
+
* and records nothing: an explain is not a send. Only argo; the viewer ship
|
|
29
|
+
* receives nothing, so it is never reached.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createExplainReach(deps: {
|
|
32
|
+
uow: UnitOfWork<ExplainReachTx>;
|
|
33
|
+
clock: Clock;
|
|
34
|
+
}): ExplainReach;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { reaching, rulesInForceAt, shipAsItIs } from './check-reach.js';
|
|
4
|
+
import { allowsReach } from './network-settings.js';
|
|
5
|
+
/**
|
|
6
|
+
* Use case: argo asks which ships a ship reaches now, or whether it reaches
|
|
7
|
+
* one ship (design points 11 and 12 on #260). It answers as a send would be
|
|
8
|
+
* checked at this moment: the rules in force, what the networking plugin
|
|
9
|
+
* declared while it does not respond, argo both ways. There is no message, so
|
|
10
|
+
* no answer to a sender. It answers the ships, never the rules or the reasons,
|
|
11
|
+
* and records nothing: an explain is not a send. Only argo; the viewer ship
|
|
12
|
+
* receives nothing, so it is never reached.
|
|
13
|
+
*/
|
|
14
|
+
export function createExplainReach(deps) {
|
|
15
|
+
return (caller, input) => deps.uow.run(async (tx) => {
|
|
16
|
+
if (caller.kind !== 'operator') {
|
|
17
|
+
return refuse('NOT_THE_OPERATOR_SHIP', 'Only argo explains reach');
|
|
18
|
+
}
|
|
19
|
+
const { fleetId } = caller;
|
|
20
|
+
const from = await tx.ships.find(fleetId, input.fromShipId);
|
|
21
|
+
if (from?.retiredAt !== null) {
|
|
22
|
+
return refuse('SHIP_NOT_FOUND', 'The fleet has no active ship with this id to explain from');
|
|
23
|
+
}
|
|
24
|
+
const active = await tx.ships.listActive(fleetId);
|
|
25
|
+
const others = active.filter((ship) => ship.id !== from.id && (input.toShipId === undefined || ship.id === input.toShipId));
|
|
26
|
+
if (input.toShipId !== undefined && others.length === 0 && input.toShipId !== from.id) {
|
|
27
|
+
return refuse('SHIP_NOT_FOUND', 'The fleet has no active ship with this id to explain reach to');
|
|
28
|
+
}
|
|
29
|
+
const settings = await tx.networkSettings.findForShare(fleetId);
|
|
30
|
+
const inForce = await rulesInForceAt(tx, { settings, now: deps.clock.now() });
|
|
31
|
+
const sender = reaching(await shipAsItIs(tx, from));
|
|
32
|
+
const reachableShipIds = [];
|
|
33
|
+
for (const ship of others) {
|
|
34
|
+
const recipient = reaching(await shipAsItIs(tx, ship));
|
|
35
|
+
if (allowsReach(inForce, { sender, recipient, isAnswerToSender: false })) {
|
|
36
|
+
reachableShipIds.push(ship.id);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return ok({ reachableShipIds });
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=explain-reach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain-reach.js","sourceRoot":"","sources":["../../../src/domain/registry/explain-reach.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAqB,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAiBpD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuD;IACxF,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAwE,EAAE;QAC9F,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,IAAI,EAAE,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,gBAAgB,EAAE,2DAA2D,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5H,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACtF,OAAO,MAAM,CAAC,gBAAgB,EAAE,+DAA+D,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACpD,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YACvD,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBACzE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -12,8 +12,8 @@ export interface LabelValue {
|
|
|
12
12
|
* A label (docs/blueprint.md, "Label"; decision 0031): a key with a defined
|
|
13
13
|
* set of values, each with its own id, owned by the ship that defined it.
|
|
14
14
|
* Ids are for machines, key and value texts for people. Only its owner
|
|
15
|
-
* changes its values and assigns them,
|
|
16
|
-
* owner.
|
|
15
|
+
* changes its values and assigns them, to any ship, its own included. It
|
|
16
|
+
* retires with its owner.
|
|
17
17
|
*/
|
|
18
18
|
export interface Label {
|
|
19
19
|
fleetId: FleetId;
|
|
@@ -128,14 +128,13 @@ export declare function deleteLabel({ label, ownerName, carrierNames }: {
|
|
|
128
128
|
}): Result<{
|
|
129
129
|
events: NewEvent[];
|
|
130
130
|
}, DeleteLabelRefusal>;
|
|
131
|
-
type
|
|
132
|
-
export type AssignLabelRefusal = NotTheOwner | OwnShip | DomainError<'SHIP_ALREADY_RETIRED' | 'SHIP_LABEL_LIMIT_REACHED'>;
|
|
131
|
+
export type AssignLabelRefusal = NotTheOwner | DomainError<'SHIP_ALREADY_RETIRED' | 'SHIP_LABEL_LIMIT_REACHED'>;
|
|
133
132
|
/**
|
|
134
133
|
* The owner gives a ship one of its label's values, by its id: the ship
|
|
135
134
|
* holds a set of values, so it may carry several of one label. A value it
|
|
136
|
-
* carries changes nothing.
|
|
137
|
-
* argo and the viewer ship as any other (decision 0016). A ship
|
|
138
|
-
* most 20 values. LabelAssigned names the ship, with the label and the value.
|
|
135
|
+
* carries changes nothing. Any ship, the owner's own included, but never a
|
|
136
|
+
* retired ship; argo and the viewer ship as any other (decision 0016). A ship
|
|
137
|
+
* carries at most 20 values. LabelAssigned names the ship, with the label and the value.
|
|
139
138
|
*/
|
|
140
139
|
export declare function assignLabel({ label, ownerName, ship, carried, }: {
|
|
141
140
|
label: Label;
|
|
@@ -151,16 +150,15 @@ export declare function assignLabel({ label, ownerName, ship, carried, }: {
|
|
|
151
150
|
assignment: ShipLabel | undefined;
|
|
152
151
|
events: NewEvent[];
|
|
153
152
|
}, AssignLabelRefusal>;
|
|
154
|
-
export type UnassignLabelRefusal = NotTheOwner
|
|
153
|
+
export type UnassignLabelRefusal = NotTheOwner;
|
|
155
154
|
/**
|
|
156
155
|
* The owner takes one value of its label off a ship. A ship that does not
|
|
157
156
|
* carry it changes nothing. LabelUnassigned names the ship, with the label
|
|
158
157
|
* and the value it carried.
|
|
159
158
|
*/
|
|
160
|
-
export declare function unassignLabel({ label, ownerName,
|
|
159
|
+
export declare function unassignLabel({ label, ownerName, carried, }: {
|
|
161
160
|
label: Label;
|
|
162
161
|
ownerName: string;
|
|
163
|
-
ship: Ship;
|
|
164
162
|
carried: readonly ShipLabel[];
|
|
165
163
|
}, input: {
|
|
166
164
|
callerShipId: ShipId;
|
|
@@ -173,26 +173,18 @@ function assignmentEvent({ label, assignment }, change) {
|
|
|
173
173
|
},
|
|
174
174
|
};
|
|
175
175
|
}
|
|
176
|
-
/** No ship labels itself: that would let it enforce a plugin's policy on its own (decision 0031). */
|
|
177
|
-
function checkNotOwnShip(label, ship) {
|
|
178
|
-
return ship.id === label.ownerShipId ? refuse('LABEL_ON_OWN_SHIP', `No ship labels itself: ${label.key} is your own ship's label`) : ok(undefined);
|
|
179
|
-
}
|
|
180
176
|
/**
|
|
181
177
|
* The owner gives a ship one of its label's values, by its id: the ship
|
|
182
178
|
* holds a set of values, so it may carry several of one label. A value it
|
|
183
|
-
* carries changes nothing.
|
|
184
|
-
* argo and the viewer ship as any other (decision 0016). A ship
|
|
185
|
-
* most 20 values. LabelAssigned names the ship, with the label and the value.
|
|
179
|
+
* carries changes nothing. Any ship, the owner's own included, but never a
|
|
180
|
+
* retired ship; argo and the viewer ship as any other (decision 0016). A ship
|
|
181
|
+
* carries at most 20 values. LabelAssigned names the ship, with the label and the value.
|
|
186
182
|
*/
|
|
187
183
|
export function assignLabel({ label, ownerName, ship, carried, }, input) {
|
|
188
184
|
const owned = checkOwner({ label, ownerName }, { shipId: input.callerShipId, act: 'assigns' });
|
|
189
185
|
if (!owned.isOk) {
|
|
190
186
|
return owned;
|
|
191
187
|
}
|
|
192
|
-
const notOwn = checkNotOwnShip(label, ship);
|
|
193
|
-
if (!notOwn.isOk) {
|
|
194
|
-
return notOwn;
|
|
195
|
-
}
|
|
196
188
|
if (ship.retiredAt !== null) {
|
|
197
189
|
return refuse('SHIP_ALREADY_RETIRED', `${ship.name} is retired`);
|
|
198
190
|
}
|
|
@@ -218,15 +210,11 @@ export function assignLabel({ label, ownerName, ship, carried, }, input) {
|
|
|
218
210
|
* carry it changes nothing. LabelUnassigned names the ship, with the label
|
|
219
211
|
* and the value it carried.
|
|
220
212
|
*/
|
|
221
|
-
export function unassignLabel({ label, ownerName,
|
|
213
|
+
export function unassignLabel({ label, ownerName, carried, }, input) {
|
|
222
214
|
const owned = checkOwner({ label, ownerName }, { shipId: input.callerShipId, act: 'unassigns' });
|
|
223
215
|
if (!owned.isOk) {
|
|
224
216
|
return owned;
|
|
225
217
|
}
|
|
226
|
-
const notOwn = checkNotOwnShip(label, ship);
|
|
227
|
-
if (!notOwn.isOk) {
|
|
228
|
-
return notOwn;
|
|
229
|
-
}
|
|
230
218
|
const current = carried.find((each) => each.valueId === input.valueId);
|
|
231
219
|
if (!current) {
|
|
232
220
|
return ok({ unassigned: undefined, events: [] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../../src/domain/registry/label.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../../src/domain/registry/label.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
* fleet holds its rules, or none (all-to-all), with a version that moves on
|
|
6
6
|
* every set, so a refusal names the settings that refused it.
|
|
7
7
|
*/
|
|
8
|
-
import { type FleetId, type LabelValueId, type NetworkPluginDeclaration, type ShipId, type ShipKind, type WhileUnavailable } from '@aeolus-fleet/common';
|
|
8
|
+
import { type FleetId, type LabelId, type LabelValueId, type NetworkPluginDeclaration, type SelectorTerm, type ShipId, type ShipKind, type WhileUnavailable } from '@aeolus-fleet/common';
|
|
9
9
|
import { type DomainError } from '../shared/errors.js';
|
|
10
10
|
import type { Actor, NewEvent } from '../shared/events.js';
|
|
11
11
|
import { type Result } from '../shared/result.js';
|
|
12
|
-
/** The ships
|
|
12
|
+
/** The ships for which every term of `from` holds may send to the ships for which every term of `to` holds. */
|
|
13
13
|
export interface NetworkRule {
|
|
14
|
-
from: readonly
|
|
15
|
-
to: readonly
|
|
14
|
+
from: readonly SelectorTerm[];
|
|
15
|
+
to: readonly SelectorTerm[];
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* The fleet's networking plugin (decision 0035): the ship that alone sets the
|
|
@@ -27,7 +27,7 @@ export interface NetworkSettings {
|
|
|
27
27
|
rules: readonly NetworkRule[] | null;
|
|
28
28
|
/** 0 until the fleet first changes its settings; one more on every change. */
|
|
29
29
|
version: number;
|
|
30
|
-
/** The fleet's networking plugin, or none: then
|
|
30
|
+
/** The fleet's networking plugin, or none: then the fleet has no rules, and nobody sets them. */
|
|
31
31
|
plugin: NetworkPlugin | null;
|
|
32
32
|
}
|
|
33
33
|
/** A fleet that never set rules: none, at version 0, without a plugin. */
|
|
@@ -37,8 +37,8 @@ export type SetNetworkRulesRefusal = DomainError<'INVALID_NETWORK_RULES'> | NotT
|
|
|
37
37
|
export type RegisterNetworkPluginRefusal = DomainError<'NETWORK_PLUGIN_REGISTERED'>;
|
|
38
38
|
/**
|
|
39
39
|
* The ship becomes the fleet's networking plugin, with what it declared, at
|
|
40
|
-
* the next version, with NetworkPluginRegistered.
|
|
41
|
-
* supplies its own. The plugin may register again, replacing what it
|
|
40
|
+
* the next version, with NetworkPluginRegistered. A fleet without a plugin
|
|
41
|
+
* has no rules, so the plugin starts from none until it supplies its own. The plugin may register again, replacing what it
|
|
42
42
|
* declared; another ship is refused until it unregisters: one owner of the
|
|
43
43
|
* rules, as a label has one.
|
|
44
44
|
*/
|
|
@@ -66,14 +66,18 @@ export declare function unregisterNetworkPlugin(current: NetworkSettings, change
|
|
|
66
66
|
}, NotTheNetworkPlugin>;
|
|
67
67
|
/**
|
|
68
68
|
* The fleet's rules from now on, replacing the ones it had, at the next
|
|
69
|
-
* version, with NetworkRulesSet. The rules are within the
|
|
70
|
-
* at most 200
|
|
71
|
-
*
|
|
72
|
-
* as
|
|
73
|
-
*
|
|
69
|
+
* version, with NetworkRulesSet. The rules are within the decisions' limits:
|
|
70
|
+
* at most 200 of argo's plus every rule the fleet's ships declared, which the
|
|
71
|
+
* plugin adds to argo's when it supplies them (decision 0037); each selector
|
|
72
|
+
* at most 20 terms, as a ship carries no more label values, each term once, and a term of the same value on a label on
|
|
73
|
+
* both sides of its rule, as it binds that label there. An id need not
|
|
74
|
+
* exist: an unknown one matches no ship, as in label selection. Only the
|
|
75
|
+
* fleet's registered networking plugin sets them, argo included: rules exist
|
|
76
|
+
* only through a plugin (decision 0035).
|
|
74
77
|
*/
|
|
75
78
|
export declare function setNetworkRules(current: NetworkSettings, change: {
|
|
76
79
|
rules: readonly NetworkRule[] | null;
|
|
80
|
+
declaredRules: number;
|
|
77
81
|
shipId: ShipId;
|
|
78
82
|
at: Date;
|
|
79
83
|
actor: Actor;
|
|
@@ -81,6 +85,10 @@ export declare function setNetworkRules(current: NetworkSettings, change: {
|
|
|
81
85
|
settings: NetworkSettings;
|
|
82
86
|
events: NewEvent[];
|
|
83
87
|
}, SetNetworkRulesRefusal>;
|
|
88
|
+
/** What breaks a rule's own limits, said for the caller, or undefined when it keeps them (decision 0034). */
|
|
89
|
+
export declare function invalidRule(rule: NetworkRule): string | undefined;
|
|
90
|
+
/** A copy of the rule, so what is kept never changes with what was given. */
|
|
91
|
+
export declare function copyOfRule(rule: NetworkRule): NetworkRule;
|
|
84
92
|
/**
|
|
85
93
|
* Whether the plugin responds at `now` (decision 0035): its ship holds a
|
|
86
94
|
* lease whose crew called the fleet no longer ago than it declared. Its last
|
|
@@ -103,10 +111,15 @@ export interface RulesInForce {
|
|
|
103
111
|
* supplied last.
|
|
104
112
|
*/
|
|
105
113
|
export declare function rulesInForce(settings: NetworkSettings, isPluginResponding: boolean): RulesInForce;
|
|
114
|
+
/** A label value a ship carries, with the label it is of, so a term of any or the same value finds it. */
|
|
115
|
+
export interface ReachingLabel {
|
|
116
|
+
labelId: LabelId;
|
|
117
|
+
valueId: LabelValueId;
|
|
118
|
+
}
|
|
106
119
|
/** A ship as a send's check sees it: its kind, for the argo exception, and the label values it carries. */
|
|
107
120
|
export interface ReachingShip {
|
|
108
121
|
kind: ShipKind;
|
|
109
|
-
labels: readonly
|
|
122
|
+
labels: readonly ReachingLabel[];
|
|
110
123
|
}
|
|
111
124
|
/**
|
|
112
125
|
* Whether the settings let the sender reach the recipient. With no rules,
|