@moltzap/client 2026.922.2 → 2026.930.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 +23 -7
- package/dist/client-runtime.d.ts.map +1 -1
- package/dist/client-runtime.js +28 -11
- package/dist/client-runtime.js.map +1 -1
- package/dist/contract.d.ts +440 -57
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +256 -18
- package/dist/contract.js.map +1 -1
- package/dist/contract.types-check.d.ts +109 -13
- package/dist/contract.types-check.d.ts.map +1 -1
- package/dist/contract.types-check.js +11 -3
- package/dist/contract.types-check.js.map +1 -1
- package/dist/daemon/runtime/activation.d.ts +1 -1
- package/dist/daemon/runtime/activation.d.ts.map +1 -1
- package/dist/daemon/runtime/controller.d.ts +1 -1
- package/dist/daemon/runtime/controller.d.ts.map +1 -1
- package/dist/daemon/runtime/controller.js +44 -10
- package/dist/daemon/runtime/controller.js.map +1 -1
- package/dist/daemon/runtime/history-export.d.ts +11 -1
- package/dist/daemon/runtime/history-export.d.ts.map +1 -1
- package/dist/daemon/runtime/history-export.js +4 -0
- package/dist/daemon/runtime/history-export.js.map +1 -1
- package/dist/daemon/runtime/index.d.ts.map +1 -1
- package/dist/daemon/runtime/index.js +1 -2
- package/dist/daemon/runtime/index.js.map +1 -1
- package/dist/daemon/runtime/pending-delivery.d.ts +49 -0
- package/dist/daemon/runtime/pending-delivery.d.ts.map +1 -0
- package/dist/daemon/runtime/pending-delivery.js +115 -0
- package/dist/daemon/runtime/pending-delivery.js.map +1 -0
- package/dist/daemon/runtime/protocol.d.ts +20 -5
- package/dist/daemon/runtime/protocol.d.ts.map +1 -1
- package/dist/daemon/runtime/protocol.js +58 -24
- package/dist/daemon/runtime/protocol.js.map +1 -1
- package/dist/endpoint/addressing/index.d.ts +22 -1
- package/dist/endpoint/addressing/index.d.ts.map +1 -1
- package/dist/endpoint/addressing/index.js +50 -26
- package/dist/endpoint/addressing/index.js.map +1 -1
- package/dist/endpoint/collective/operation.d.ts +123 -0
- package/dist/endpoint/collective/operation.d.ts.map +1 -0
- package/dist/endpoint/collective/operation.js +784 -0
- package/dist/endpoint/collective/operation.js.map +1 -0
- package/dist/endpoint/collective/shared-answers.d.ts +78 -0
- package/dist/endpoint/collective/shared-answers.d.ts.map +1 -0
- package/dist/endpoint/collective/shared-answers.js +62 -0
- package/dist/endpoint/collective/shared-answers.js.map +1 -0
- package/dist/endpoint/collective/validation.d.ts +49 -0
- package/dist/endpoint/collective/validation.d.ts.map +1 -0
- package/dist/endpoint/collective/validation.js +99 -0
- package/dist/endpoint/collective/validation.js.map +1 -0
- package/dist/endpoint/collective/wire.d.ts +176 -0
- package/dist/endpoint/collective/wire.d.ts.map +1 -0
- package/dist/endpoint/collective/wire.js +181 -0
- package/dist/endpoint/collective/wire.js.map +1 -0
- package/dist/endpoint/engine-durability.d.ts +3 -17
- package/dist/endpoint/engine-durability.d.ts.map +1 -1
- package/dist/endpoint/engine-durability.js +3 -14
- package/dist/endpoint/engine-durability.js.map +1 -1
- package/dist/endpoint/engine-send.d.ts +14 -16
- package/dist/endpoint/engine-send.d.ts.map +1 -1
- package/dist/endpoint/engine-send.js +16 -20
- package/dist/endpoint/engine-send.js.map +1 -1
- package/dist/endpoint/engine-types.d.ts +32 -15
- package/dist/endpoint/engine-types.d.ts.map +1 -1
- package/dist/endpoint/engine-types.js +1 -5
- package/dist/endpoint/engine-types.js.map +1 -1
- package/dist/endpoint/engine.d.ts +1 -1
- package/dist/endpoint/engine.d.ts.map +1 -1
- package/dist/endpoint/engine.js +17 -14
- package/dist/endpoint/engine.js.map +1 -1
- package/dist/endpoint/protocol/index.d.ts.map +1 -1
- package/dist/endpoint/protocol/index.js +5 -8
- package/dist/endpoint/protocol/index.js.map +1 -1
- package/dist/endpoint/recovery/index.js +2 -2
- package/dist/endpoint/recovery/index.js.map +1 -1
- package/dist/endpoint/recovery/reanchor/empty.js +1 -1
- package/dist/endpoint/recovery/reanchor/empty.js.map +1 -1
- package/dist/endpoint/recovery/store.d.ts +1 -1
- package/dist/endpoint/recovery/store.d.ts.map +1 -1
- package/dist/endpoint/recovery/store.js +9 -5
- package/dist/endpoint/recovery/store.js.map +1 -1
- package/dist/endpoint/representation-schemas.d.ts +2 -0
- package/dist/endpoint/representation-schemas.d.ts.map +1 -1
- package/dist/endpoint/representation-schemas.js +2 -2
- package/dist/endpoint/representation-schemas.js.map +1 -1
- package/dist/endpoint/representation.d.ts +1 -1
- package/dist/endpoint/representation.d.ts.map +1 -1
- package/dist/endpoint/representation.js +1 -1
- package/dist/endpoint/representation.js.map +1 -1
- package/dist/harness-mcp-contract.d.ts +189 -57
- package/dist/harness-mcp-contract.d.ts.map +1 -1
- package/dist/harness-mcp-contract.js +61 -9
- package/dist/harness-mcp-contract.js.map +1 -1
- package/dist/harness-mcp-wire.d.ts +3 -3
- package/dist/harness-mcp-wire.d.ts.map +1 -1
- package/dist/harness-mcp-wire.js +38 -28
- package/dist/harness-mcp-wire.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,42 +1,58 @@
|
|
|
1
1
|
/** @file Protocol acquisition, supervision, and pending-delivery reconciliation. */
|
|
2
2
|
import { Registry } from "@moltzap/identity/registry";
|
|
3
3
|
import { Router } from "@moltzap/router";
|
|
4
|
-
import { Cause, Deferred, Effect, Scope } from "effect";
|
|
4
|
+
import { Cause, Deferred, Effect, Schema, Scope } from "effect";
|
|
5
|
+
import { AgentAddress } from "../../contract.js";
|
|
6
|
+
import { makeCollectiveOperations, } from "../../endpoint/collective/operation.js";
|
|
5
7
|
import { decodeOuterBody } from "../../endpoint/representation.js";
|
|
6
8
|
import { RouterWorkerPayloadInvalidError, } from "../../endpoint/router-worker/index.js";
|
|
7
9
|
import { DaemonActivationError, DaemonRuntimeError, recoverPinnedSenderCards, } from "./activation.js";
|
|
10
|
+
import { mintLocalDeliveryToken, offerPendingMessages, } from "./pending-delivery.js";
|
|
8
11
|
const signStructurallyValidAction = () => Effect.succeed("sign");
|
|
9
12
|
const activationFailure = (reason) => new DaemonActivationError({ reason });
|
|
10
13
|
const runtimeFailure = (phase) => new DaemonRuntimeError({ phase });
|
|
11
14
|
const mapWorkerInitializationError = (error) => activationFailure(error._tag === "RouterWorkerTransportError" ? "upstream" : "representation");
|
|
12
15
|
/**
|
|
13
|
-
*
|
|
16
|
+
* What one pass reads and changes, from the active protocol and the
|
|
17
|
+
* controller's delivery state. Items are offered only to an attached
|
|
18
|
+
* subscriber.
|
|
19
|
+
*/
|
|
20
|
+
const pendingOffer = (environment, protocol) => {
|
|
21
|
+
const { state } = environment;
|
|
22
|
+
const handler = state.subscriptionActive ? state.handler : undefined;
|
|
23
|
+
return {
|
|
24
|
+
engine: protocol.engine,
|
|
25
|
+
classify: protocol.collectives.classify,
|
|
26
|
+
...(handler === undefined ? {} : { handler }),
|
|
27
|
+
historyExport: environment.historyExport,
|
|
28
|
+
publishedDeliveries: state.publishedDeliveries,
|
|
29
|
+
exportedDeliveries: state.exportedDeliveries,
|
|
30
|
+
classifiedItems: state.classifiedItems,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Classify newly durable deliveries and publish what a subscriber can take.
|
|
35
|
+
* The pass runs with or without a subscriber, so the collective layer
|
|
36
|
+
* consumes protocol posts even while no host is attached.
|
|
14
37
|
* @param environment Protocol resources and controller-owned delivery state.
|
|
15
38
|
* @param deliveryGate Serializes pending reads with subscription changes.
|
|
16
|
-
* @returns Completion after every
|
|
39
|
+
* @returns Completion after every current delivery is consumed or offered.
|
|
17
40
|
*/
|
|
18
41
|
export const publishPendingMessages = (environment, deliveryGate) => deliveryGate.withPermits(1)(Effect.suspend(() => {
|
|
19
42
|
const protocol = environment.state.activeProtocol;
|
|
20
|
-
if (
|
|
43
|
+
if (protocol === undefined) {
|
|
21
44
|
return Effect.void;
|
|
22
45
|
}
|
|
23
|
-
return protocol.engine.readPendingMessages().pipe(Effect.flatMap((messages) => Effect.
|
|
24
|
-
const handler = environment.state.handler;
|
|
25
|
-
if (handler === undefined) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
for (const pending of messages) {
|
|
29
|
-
if (environment.state.publishedDeliveries.has(pending.deliveryToken)) {
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
const event = pending;
|
|
33
|
-
if (!handler.publish(event)) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
environment.state.publishedDeliveries.add(pending.deliveryToken);
|
|
37
|
-
}
|
|
38
|
-
})), Effect.catchAll(() => Deferred.fail(environment.fatal, runtimeFailure("storage")).pipe(Effect.asVoid)));
|
|
46
|
+
return protocol.engine.readPendingMessages().pipe(Effect.flatMap((messages) => offerPendingMessages(pendingOffer(environment, protocol), messages, environment.state.localItems)), Effect.catchAll(() => Deferred.fail(environment.fatal, runtimeFailure("storage")).pipe(Effect.asVoid)));
|
|
39
47
|
}));
|
|
48
|
+
/**
|
|
49
|
+
* Queue an item the collective layer emitted and start a publication pass.
|
|
50
|
+
* The pass is forked because the layer can emit from inside one, which holds
|
|
51
|
+
* the delivery gate.
|
|
52
|
+
*/
|
|
53
|
+
const emitLocalItem = (environment, reconciler, item) => mintLocalDeliveryToken.pipe(Effect.tap((deliveryToken) => Effect.sync(() => {
|
|
54
|
+
environment.state.localItems.set(deliveryToken, item);
|
|
55
|
+
})), Effect.zipRight(Effect.forkIn(reconciler, environment.daemonScope)), Effect.asVoid);
|
|
40
56
|
/**
|
|
41
57
|
* Propagate interruption and convert other background failures to daemon failure.
|
|
42
58
|
* @param fatal Process-wide failure signal.
|
|
@@ -78,7 +94,6 @@ const acquireProtocolEngine = (environment, agentCard, worker) => environment.de
|
|
|
78
94
|
store: environment.store,
|
|
79
95
|
routerWorker: worker,
|
|
80
96
|
actionPolicy: signStructurallyValidAction,
|
|
81
|
-
historyExport: environment.historyExport,
|
|
82
97
|
})
|
|
83
98
|
.pipe(Scope.extend(environment.daemonScope), Effect.mapError(mapEngineInitializationError));
|
|
84
99
|
const checkExistingProtocol = (agentCard, activeProtocol) => {
|
|
@@ -91,8 +106,23 @@ const checkExistingProtocol = (agentCard, activeProtocol) => {
|
|
|
91
106
|
}
|
|
92
107
|
return Effect.succeed(true);
|
|
93
108
|
};
|
|
94
|
-
|
|
95
|
-
|
|
109
|
+
/**
|
|
110
|
+
* The collective layer for the active identity: it certifies posts through
|
|
111
|
+
* the engine and queues the items it emits for the next publication pass.
|
|
112
|
+
*/
|
|
113
|
+
const makeProtocolCollectives = (environment, reconciler, agentCard, engine) => makeCollectiveOperations({
|
|
114
|
+
self: Schema.decodeUnknownSync(AgentAddress)(`agent:${agentCard.agentName}`),
|
|
115
|
+
lookupMember: (member) => engine.resolveAddress(member),
|
|
116
|
+
sendPost: (input) => engine.send(input),
|
|
117
|
+
emit: (item) => emitLocalItem(environment, reconciler, item),
|
|
118
|
+
scope: environment.daemonScope,
|
|
119
|
+
});
|
|
120
|
+
/** Hold the active protocol with its collective layer for later operations. */
|
|
121
|
+
const retainActiveProtocol = (environment, reconciler, protocol) => {
|
|
122
|
+
environment.state.activeProtocol = {
|
|
123
|
+
...protocol,
|
|
124
|
+
collectives: makeProtocolCollectives(environment, reconciler, protocol.agentCard, protocol.engine),
|
|
125
|
+
};
|
|
96
126
|
};
|
|
97
127
|
/**
|
|
98
128
|
* Acquire and supervise the protocol resources for one immutable daemon identity.
|
|
@@ -123,7 +153,11 @@ export const initializeProtocol = (environment, activationGate, reconciler, agen
|
|
|
123
153
|
publishPending: reconciler,
|
|
124
154
|
});
|
|
125
155
|
const engine = yield* acquireProtocolEngine(environment, agentCard, worker);
|
|
126
|
-
retainActiveProtocol(environment
|
|
156
|
+
retainActiveProtocol(environment, reconciler, {
|
|
157
|
+
agentCard,
|
|
158
|
+
worker,
|
|
159
|
+
engine,
|
|
160
|
+
});
|
|
127
161
|
yield* Deferred.succeed(engineReady, engine);
|
|
128
162
|
yield* superviseBackground(environment, worker.run);
|
|
129
163
|
yield* superviseBackground(environment, engine.runOutbound);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/daemon/runtime/protocol.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAGpF,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAgB,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/daemon/runtime/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** @file Private address resolution from runtime names to immutable cards. */
|
|
2
2
|
import type { Registry } from "@moltzap/identity/registry";
|
|
3
|
-
import { type VerifiedAgentCard } from "@moltzap/identity";
|
|
3
|
+
import { AgentName, type VerifiedAgentCard } from "@moltzap/identity";
|
|
4
4
|
import { type Context, Effect } from "effect";
|
|
5
5
|
import { AgentAddress, GroupAddress, type MessageAddressInput, SendError } from "../../contract.js";
|
|
6
6
|
/** Minimal Registry capability required by address resolution. */
|
|
@@ -35,5 +35,26 @@ interface ResolveMessageAddressInput {
|
|
|
35
35
|
* @returns The canonical runtime address and AgentId-ordered verified cards.
|
|
36
36
|
*/
|
|
37
37
|
export declare function resolveMessageAddress(input: ResolveMessageAddressInput): Effect.Effect<ResolvedMessageAddress, SendError>;
|
|
38
|
+
/** A destination in canonical form, before any Registry lookup. */
|
|
39
|
+
export type CanonicalMessageAddress = {
|
|
40
|
+
readonly kind: "direct";
|
|
41
|
+
readonly address: AgentAddress;
|
|
42
|
+
readonly remoteName: AgentName;
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: "group";
|
|
45
|
+
readonly address: GroupAddress;
|
|
46
|
+
readonly memberNames: readonly AgentName[];
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Put one destination in canonical form, the rule every send shares. An
|
|
50
|
+
* `agent:` address names one other agent. A `group:` address names each agent
|
|
51
|
+
* once; the local agent is added when absent, and the complete group has 3 to
|
|
52
|
+
* 32 members in unsigned ASCII name order.
|
|
53
|
+
* @param to The validated destination input.
|
|
54
|
+
* @param localAgentName The local agent's Registry name.
|
|
55
|
+
* @returns The canonical address with its names, local agent included for a
|
|
56
|
+
* group, or `invalid-address` or `membership-invalid`.
|
|
57
|
+
*/
|
|
58
|
+
export declare function canonicalMessageAddress(to: MessageAddressInput, localAgentName: string): Effect.Effect<CanonicalMessageAddress, SendError>;
|
|
38
59
|
export {};
|
|
39
60
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/endpoint/addressing/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/endpoint/addressing/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACtD,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,mBAAmB,EACxB,SAAS,EACV,MAAM,mBAAmB,CAAC;AAO3B,kEAAkE;AAClE,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,QAAQ,CAAC,EACpC,QAAQ,CACT,CAAC;AAEF,kEAAkE;AAClE,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;CACvE;AAED,uEAAuE;AACvE,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,GAAG,iBAAiB,EAAE;KACvB,CAAC;CACH;AAED,8EAA8E;AAC9E,MAAM,MAAM,sBAAsB,GAC9B,qBAAqB,GACrB,oBAAoB,CAAC;AAEzB,UAAU,0BAA0B;IAClC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,EAAE,EAAE,mBAAmB,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,SAAS,CAAC,CASlD;AAED,mEAAmE;AACnE,MAAM,MAAM,uBAAuB,GAC/B;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;CAChC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,SAAS,EAAE,CAAC;CAC5C,CAAC;AAEN;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,mBAAmB,EACvB,cAAc,EAAE,MAAM,GACrB,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAInD"}
|
|
@@ -12,9 +12,24 @@ const MAXIMUM_GROUP_MEMBERS = 32;
|
|
|
12
12
|
* @returns The canonical runtime address and AgentId-ordered verified cards.
|
|
13
13
|
*/
|
|
14
14
|
export function resolveMessageAddress(input) {
|
|
15
|
-
return input.to.
|
|
16
|
-
? resolveDirect(input)
|
|
17
|
-
: resolveGroup(input);
|
|
15
|
+
return canonicalMessageAddress(input.to, input.localAgentCard.agentName).pipe(Effect.flatMap((canonical) => canonical.kind === "direct"
|
|
16
|
+
? resolveDirect(input, canonical)
|
|
17
|
+
: resolveGroup(input, canonical)));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Put one destination in canonical form, the rule every send shares. An
|
|
21
|
+
* `agent:` address names one other agent. A `group:` address names each agent
|
|
22
|
+
* once; the local agent is added when absent, and the complete group has 3 to
|
|
23
|
+
* 32 members in unsigned ASCII name order.
|
|
24
|
+
* @param to The validated destination input.
|
|
25
|
+
* @param localAgentName The local agent's Registry name.
|
|
26
|
+
* @returns The canonical address with its names, local agent included for a
|
|
27
|
+
* group, or `invalid-address` or `membership-invalid`.
|
|
28
|
+
*/
|
|
29
|
+
export function canonicalMessageAddress(to, localAgentName) {
|
|
30
|
+
return to.startsWith(AGENT_ADDRESS_PREFIX)
|
|
31
|
+
? canonicalDirect(to, localAgentName)
|
|
32
|
+
: canonicalGroup(to, localAgentName);
|
|
18
33
|
}
|
|
19
34
|
function invalidAddress() {
|
|
20
35
|
return new SendError({ reason: "invalid-address" });
|
|
@@ -57,41 +72,53 @@ function lookupCard(registry, agentName) {
|
|
|
57
72
|
: Effect.fail(new SendError({ reason: "unknown-agent" }));
|
|
58
73
|
}));
|
|
59
74
|
}
|
|
60
|
-
function
|
|
75
|
+
function canonicalDirect(to, localAgentName) {
|
|
76
|
+
return Effect.gen(function* () {
|
|
77
|
+
const remoteName = yield* decodeAgentName(to.slice(AGENT_ADDRESS_PREFIX.length));
|
|
78
|
+
if (remoteName === localAgentName) {
|
|
79
|
+
return yield* invalidMembership();
|
|
80
|
+
}
|
|
81
|
+
const address = yield* Schema.decodeUnknown(AgentAddress)(to).pipe(Effect.mapError(invalidAddress));
|
|
82
|
+
return { kind: "direct", address, remoteName };
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function canonicalGroup(to, localAgentName) {
|
|
61
86
|
return Effect.gen(function* () {
|
|
62
|
-
const
|
|
63
|
-
if (
|
|
87
|
+
const explicitNames = yield* Effect.forEach(to.slice(GROUP_ADDRESS_PREFIX.length).split(","), decodeAgentName, { concurrency: 1 });
|
|
88
|
+
if (new Set(explicitNames).size !== explicitNames.length) {
|
|
64
89
|
return yield* invalidMembership();
|
|
65
90
|
}
|
|
66
|
-
const
|
|
91
|
+
const localName = yield* decodeAgentName(localAgentName);
|
|
92
|
+
const memberNames = explicitNames.includes(localName)
|
|
93
|
+
? explicitNames.slice()
|
|
94
|
+
: [...explicitNames, localName];
|
|
95
|
+
if (memberNames.length < 3 || memberNames.length > MAXIMUM_GROUP_MEMBERS) {
|
|
96
|
+
return yield* invalidMembership();
|
|
97
|
+
}
|
|
98
|
+
memberNames.sort(compareAscii);
|
|
99
|
+
const address = yield* Schema.decodeUnknown(GroupAddress)(`${GROUP_ADDRESS_PREFIX}${memberNames.join(",")}`).pipe(Effect.mapError(invalidAddress));
|
|
100
|
+
return { kind: "group", address, memberNames };
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function resolveDirect(input, canonical) {
|
|
104
|
+
return Effect.gen(function* () {
|
|
105
|
+
const remoteCard = yield* lookupCard(input.registry, canonical.remoteName);
|
|
67
106
|
const ordered = orderMemberCards([input.localAgentCard, remoteCard]);
|
|
68
107
|
const first = ordered[0];
|
|
69
108
|
const second = ordered[1];
|
|
70
109
|
if (first === undefined || second === undefined) {
|
|
71
110
|
return yield* Effect.dieMessage("direct membership lost a member");
|
|
72
111
|
}
|
|
73
|
-
const address = yield* Schema.decodeUnknown(AgentAddress)(input.to).pipe(Effect.mapError(invalidAddress));
|
|
74
112
|
return {
|
|
75
113
|
kind: "direct",
|
|
76
|
-
address,
|
|
114
|
+
address: canonical.address,
|
|
77
115
|
memberCards: [first, second],
|
|
78
116
|
};
|
|
79
117
|
});
|
|
80
118
|
}
|
|
81
|
-
function resolveGroup(input) {
|
|
119
|
+
function resolveGroup(input, canonical) {
|
|
82
120
|
return Effect.gen(function* () {
|
|
83
|
-
const
|
|
84
|
-
if (new Set(explicitNames).size !== explicitNames.length) {
|
|
85
|
-
return yield* invalidMembership();
|
|
86
|
-
}
|
|
87
|
-
const completeNames = explicitNames.includes(input.localAgentCard.agentName)
|
|
88
|
-
? explicitNames
|
|
89
|
-
: [...explicitNames, input.localAgentCard.agentName];
|
|
90
|
-
if (completeNames.length < 3 ||
|
|
91
|
-
completeNames.length > MAXIMUM_GROUP_MEMBERS) {
|
|
92
|
-
return yield* invalidMembership();
|
|
93
|
-
}
|
|
94
|
-
const resolved = yield* Effect.forEach(completeNames, (agentName) => agentName === input.localAgentCard.agentName
|
|
121
|
+
const resolved = yield* Effect.forEach(canonical.memberNames, (agentName) => agentName === input.localAgentCard.agentName
|
|
95
122
|
? Effect.succeed(input.localAgentCard)
|
|
96
123
|
: lookupCard(input.registry, agentName), { concurrency: 1 });
|
|
97
124
|
const ordered = orderMemberCards(resolved);
|
|
@@ -101,12 +128,9 @@ function resolveGroup(input) {
|
|
|
101
128
|
if (first === undefined || second === undefined || third === undefined) {
|
|
102
129
|
return yield* Effect.dieMessage("group membership lost a member");
|
|
103
130
|
}
|
|
104
|
-
const canonicalNames = completeNames.slice();
|
|
105
|
-
canonicalNames.sort(compareAscii);
|
|
106
|
-
const address = yield* Schema.decodeUnknown(GroupAddress)(`${GROUP_ADDRESS_PREFIX}${canonicalNames.join(",")}`).pipe(Effect.mapError(invalidAddress));
|
|
107
131
|
return {
|
|
108
132
|
kind: "group",
|
|
109
|
-
address,
|
|
133
|
+
address: canonical.address,
|
|
110
134
|
memberCards: [first, second, third, ...ordered.slice(3)],
|
|
111
135
|
};
|
|
112
136
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/endpoint/addressing/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAG9E,OAAO,EAAE,SAAS,EAA0B,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAgB,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EACL,YAAY,EACZ,YAAY,EAEZ,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AACtC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AACtC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAsCjC;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAiC;IAEjC,OAAO,KAAK,CAAC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/endpoint/addressing/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Collective operations over the post envelope.
|
|
3
|
+
*
|
|
4
|
+
* The daemon holds one `CollectiveOperations` per active identity. It turns
|
|
5
|
+
* each send into the posts its operation certifies and each certified remote
|
|
6
|
+
* post into the item the subscriber receives, or consumes it. Every post an
|
|
7
|
+
* endpoint authors carries its operation as an explicit collective part, so
|
|
8
|
+
* each certified post says which operation it belongs to; a post without a
|
|
9
|
+
* collective part reads as multicast, the operation an omitted `op` names.
|
|
10
|
+
*
|
|
11
|
+
* Collective state lives in daemon memory: an operation open at a daemon
|
|
12
|
+
* restart is lost, and a request whose delivery the member already
|
|
13
|
+
* acknowledged can no longer be answered after one.
|
|
14
|
+
*
|
|
15
|
+
* ```mermaid
|
|
16
|
+
* sequenceDiagram
|
|
17
|
+
* participant RM as Requester host
|
|
18
|
+
* participant RE as Requester endpoint
|
|
19
|
+
* participant ME as Member endpoint
|
|
20
|
+
* participant MM as Member host
|
|
21
|
+
* RM->>RE: send gather to, question, deadline, schema
|
|
22
|
+
* RE->>RE: validate schema, mint id<br>deadline = now + duration
|
|
23
|
+
* RE->>ME: one request post per member
|
|
24
|
+
* alt a request post is refused
|
|
25
|
+
* RE-->>RM: error naming each unreachable member
|
|
26
|
+
* else every request post accepted
|
|
27
|
+
* RE-->>RM: operation id
|
|
28
|
+
* end
|
|
29
|
+
* ME->>MM: collectiveRequest item
|
|
30
|
+
* MM->>ME: send collectiveResponse id, action, content
|
|
31
|
+
* ME->>ME: validate content against the stored schema
|
|
32
|
+
* ME->>RE: response post in the direct conversation
|
|
33
|
+
* RE->>RE: consume, validate and record the answer
|
|
34
|
+
* Note over RE: complete when every member has an outcome<br>or at the deadline
|
|
35
|
+
* RE->>RM: collectiveResult item
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* An all_gather asks a group in its own conversation. Every member endpoint
|
|
39
|
+
* consumes the answers it sees there, so no model sees a peer's answer before
|
|
40
|
+
* the close, and builds its result from exactly the answers the requester's
|
|
41
|
+
* close lists.
|
|
42
|
+
*
|
|
43
|
+
* ```mermaid
|
|
44
|
+
* sequenceDiagram
|
|
45
|
+
* participant RM as Requester host
|
|
46
|
+
* participant RE as Requester endpoint
|
|
47
|
+
* participant ME as Member endpoints
|
|
48
|
+
* participant MM as Member hosts
|
|
49
|
+
* RM->>RE: send all_gather to group, question, deadline, schema
|
|
50
|
+
* RE->>ME: one request post to the group
|
|
51
|
+
* alt the group post is refused or not certified in time
|
|
52
|
+
* RE-->>RM: error naming each unreachable member
|
|
53
|
+
* else request post certified
|
|
54
|
+
* RE-->>RM: operation id
|
|
55
|
+
* end
|
|
56
|
+
* ME->>MM: collectiveRequest item
|
|
57
|
+
* MM->>ME: send collectiveResponse id, action, content
|
|
58
|
+
* ME->>ME: validate content against the stored schema
|
|
59
|
+
* ME->>RE: response post to the group
|
|
60
|
+
* ME->>ME: peer response posts, consumed and recorded by record hash
|
|
61
|
+
* Note over RE: complete when every member has an outcome<br>or at the deadline
|
|
62
|
+
* RE->>ME: close post listing the counted answers' record hashes
|
|
63
|
+
* RE->>RM: collectiveResult item once the close is certified
|
|
64
|
+
* ME->>ME: build the result from exactly the listed answers
|
|
65
|
+
* ME->>MM: collectiveResult item, the same outcomes
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
import { Duration, Effect, Option, type Scope } from "effect";
|
|
69
|
+
import type { EngineSendInput, EngineSentPost } from "../engine-types.js";
|
|
70
|
+
import type { RecordHash } from "../representation.js";
|
|
71
|
+
import { AgentAddress, CollectiveError, type FailureDelivery, type InboundItem, type InboundMessage, SendError, type SendInput, type SendResult } from "../../contract.js";
|
|
72
|
+
/** What the collective layer needs from the daemon around it. */
|
|
73
|
+
export interface CollectivePorts {
|
|
74
|
+
/** The local agent: a group gather or all_gather asks every member but this one. */
|
|
75
|
+
readonly self: AgentAddress;
|
|
76
|
+
/**
|
|
77
|
+
* Resolve one member's Registry card without sending. A refused all_gather
|
|
78
|
+
* group post names only the members that fail this lookup.
|
|
79
|
+
*/
|
|
80
|
+
readonly lookupMember: (member: AgentAddress) => Effect.Effect<void, SendError>;
|
|
81
|
+
/** Certify one post and complete once it is stored locally. */
|
|
82
|
+
readonly sendPost: (input: EngineSendInput) => Effect.Effect<EngineSentPost, SendError>;
|
|
83
|
+
/** Queue an item the layer emits itself: a result or a failure. */
|
|
84
|
+
readonly emit: (item: InboundItem) => Effect.Effect<void>;
|
|
85
|
+
/** Owns deadline timers and request sends that outlive their send call. */
|
|
86
|
+
readonly scope: Scope.Scope;
|
|
87
|
+
/** Overrides `REQUEST_SEND_WAIT`; tests bound the wait. */
|
|
88
|
+
readonly requestSendWait?: Duration.Duration;
|
|
89
|
+
}
|
|
90
|
+
/** One certified remote post with the hash of its certified record. */
|
|
91
|
+
interface CertifiedPost {
|
|
92
|
+
readonly message: InboundMessage;
|
|
93
|
+
readonly recordHash: RecordHash;
|
|
94
|
+
}
|
|
95
|
+
/** One completed send: the posts certified by its return, and a collective id. */
|
|
96
|
+
interface CollectiveSendOutcome extends SendResult {
|
|
97
|
+
readonly postIds: ReadonlyArray<EngineSentPost["postId"]>;
|
|
98
|
+
}
|
|
99
|
+
/** The daemon's collective layer for one active identity. */
|
|
100
|
+
export interface CollectiveOperations {
|
|
101
|
+
/**
|
|
102
|
+
* Perform one send. A gather completes once every request post is accepted
|
|
103
|
+
* and fails naming each member whose post was refused; an all_gather
|
|
104
|
+
* completes once its group post is certified. A response is validated
|
|
105
|
+
* against its request's schema and addressed to the request's conversation.
|
|
106
|
+
*/
|
|
107
|
+
readonly send: (input: SendInput, failureDelivery: FailureDelivery) => Effect.Effect<CollectiveSendOutcome, SendError | CollectiveError>;
|
|
108
|
+
/**
|
|
109
|
+
* Classify one certified remote post. Answers are recorded and consumed,
|
|
110
|
+
* every other protocol post is consumed, and each remaining post becomes
|
|
111
|
+
* one item. Classifying a post again yields the same result, so the daemon
|
|
112
|
+
* may run it on every pass over pending deliveries.
|
|
113
|
+
*/
|
|
114
|
+
readonly classify: (post: CertifiedPost) => Effect.Effect<Option.Option<InboundItem>>;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Build the collective layer for one active identity.
|
|
118
|
+
* @param ports The daemon's post sending, item queue, scope and identity.
|
|
119
|
+
* @returns Send and classification over state held in daemon memory.
|
|
120
|
+
*/
|
|
121
|
+
export declare const makeCollectiveOperations: (ports: CollectivePorts) => CollectiveOperations;
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../../src/endpoint/collective/operation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AAEH,OAAO,EAEL,QAAQ,EACR,MAAM,EAKN,MAAM,EAGN,KAAK,KAAK,EACX,MAAM,QAAQ,CAAC;AAEhB,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,YAAY,EACZ,eAAe,EAMf,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,cAAc,EAKnB,SAAS,EACT,KAAK,SAAS,EACd,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAoF3B,iEAAiE;AACjE,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,CACrB,MAAM,EAAE,YAAY,KACjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,eAAe,KACnB,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC9C,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1D,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;CAC9C;AAED,uEAAuE;AACvE,UAAU,aAAa;IACrB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED,kFAAkF;AAClF,UAAU,qBAAsB,SAAQ,UAAU;IAChD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;CAC3D;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,CACb,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE,eAAe,KAC7B,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,SAAS,GAAG,eAAe,CAAC,CAAC;IACvE;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,IAAI,EAAE,aAAa,KAChB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;CAChD;AAsED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,UAC5B,eAAe,KACrB,oBAiBF,CAAC"}
|