@moltzap/protocol 2026.503.4 → 2026.504.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/brands.d.ts +11 -0
- package/dist/brands.d.ts.map +1 -0
- package/dist/brands.js +14 -0
- package/dist/brands.js.map +1 -0
- package/dist/helpers.d.ts +29 -26
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +34 -16
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/internal/ajv.d.ts +5 -0
- package/dist/internal/ajv.d.ts.map +1 -0
- package/dist/internal/ajv.js +22 -0
- package/dist/internal/ajv.js.map +1 -0
- package/dist/notification.d.ts +14 -0
- package/dist/notification.d.ts.map +1 -0
- package/dist/notification.js +11 -0
- package/dist/notification.js.map +1 -0
- package/dist/rpc-errors.d.ts +30 -0
- package/dist/rpc-errors.d.ts.map +1 -0
- package/dist/rpc-errors.js +23 -0
- package/dist/rpc-errors.js.map +1 -0
- package/dist/rpc-groups.d.ts +120 -0
- package/dist/rpc-groups.d.ts.map +1 -0
- package/dist/rpc-groups.js +131 -0
- package/dist/rpc-groups.js.map +1 -0
- package/dist/rpc-registry.d.ts +1238 -278
- package/dist/rpc-registry.d.ts.map +1 -1
- package/dist/rpc-registry.js +11 -22
- package/dist/rpc-registry.js.map +1 -1
- package/dist/rpc.d.ts +26 -5
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +21 -11
- package/dist/rpc.js.map +1 -1
- package/dist/schema/apps.d.ts +13 -23
- package/dist/schema/apps.d.ts.map +1 -1
- package/dist/schema/apps.js +2 -12
- package/dist/schema/apps.js.map +1 -1
- package/dist/schema/contacts.d.ts +6 -2
- package/dist/schema/contacts.d.ts.map +1 -1
- package/dist/schema/conversations.d.ts +15 -5
- package/dist/schema/conversations.d.ts.map +1 -1
- package/dist/schema/delivery.d.ts +9 -3
- package/dist/schema/delivery.d.ts.map +1 -1
- package/dist/schema/errors.d.ts +0 -4
- package/dist/schema/errors.d.ts.map +1 -1
- package/dist/schema/errors.js +0 -4
- package/dist/schema/errors.js.map +1 -1
- package/dist/schema/frames.d.ts +48 -51
- package/dist/schema/frames.d.ts.map +1 -1
- package/dist/schema/frames.js +28 -50
- package/dist/schema/frames.js.map +1 -1
- package/dist/schema/identity.d.ts +17 -9
- package/dist/schema/identity.d.ts.map +1 -1
- package/dist/schema/index.d.ts +3 -4
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +3 -4
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/internal-frames.d.ts +10 -0
- package/dist/schema/internal-frames.d.ts.map +1 -0
- package/dist/schema/internal-frames.js +5 -0
- package/dist/schema/internal-frames.js.map +1 -0
- package/dist/schema/invites.d.ts +6 -2
- package/dist/schema/invites.d.ts.map +1 -1
- package/dist/schema/json-rpc.d.ts +27 -0
- package/dist/schema/json-rpc.d.ts.map +1 -0
- package/dist/schema/json-rpc.js +32 -0
- package/dist/schema/json-rpc.js.map +1 -0
- package/dist/schema/messages.d.ts +15 -5
- package/dist/schema/messages.d.ts.map +1 -1
- package/dist/schema/methods/apps.d.ts +138 -85
- package/dist/schema/methods/apps.d.ts.map +1 -1
- package/dist/schema/methods/apps.js +4 -45
- package/dist/schema/methods/apps.js.map +1 -1
- package/dist/schema/methods/auth.d.ts +62 -34
- package/dist/schema/methods/auth.d.ts.map +1 -1
- package/dist/schema/methods/contacts.d.ts +27 -9
- package/dist/schema/methods/contacts.d.ts.map +1 -1
- package/dist/schema/methods/conversations.d.ts +91 -18
- package/dist/schema/methods/conversations.d.ts.map +1 -1
- package/dist/schema/methods/conversations.js +2 -2
- package/dist/schema/methods/conversations.js.map +1 -1
- package/dist/schema/methods/messages.d.ts +39 -13
- package/dist/schema/methods/messages.d.ts.map +1 -1
- package/dist/schema/methods/presence.d.ts +6 -2
- package/dist/schema/methods/presence.d.ts.map +1 -1
- package/dist/schema/notifications.d.ts +791 -0
- package/dist/schema/notifications.d.ts.map +1 -0
- package/dist/schema/notifications.js +173 -0
- package/dist/schema/notifications.js.map +1 -0
- package/dist/schema/presence.d.ts +3 -1
- package/dist/schema/presence.d.ts.map +1 -1
- package/dist/schema/primitives.d.ts +21 -5
- package/dist/schema/primitives.d.ts.map +1 -1
- package/dist/schema/primitives.js +6 -0
- package/dist/schema/primitives.js.map +1 -1
- package/dist/test-fixtures/seed-data.d.ts +0 -1388
- package/dist/test-fixtures/seed-data.d.ts.map +1 -1
- package/dist/test-fixtures/seed-data.js +0 -987
- package/dist/test-fixtures/seed-data.js.map +1 -1
- package/dist/testing/agent-registration.d.ts +3 -1
- package/dist/testing/agent-registration.d.ts.map +1 -1
- package/dist/testing/agent-registration.js +2 -14
- package/dist/testing/agent-registration.js.map +1 -1
- package/dist/testing/arbitraries/frames.d.ts +2 -2
- package/dist/testing/arbitraries/frames.d.ts.map +1 -1
- package/dist/testing/arbitraries/frames.js +7 -6
- package/dist/testing/arbitraries/frames.js.map +1 -1
- package/dist/testing/arbitraries/index.d.ts +1 -1
- package/dist/testing/arbitraries/index.d.ts.map +1 -1
- package/dist/testing/arbitraries/index.js +1 -1
- package/dist/testing/arbitraries/index.js.map +1 -1
- package/dist/testing/arbitraries/rpc.d.ts +3 -2
- package/dist/testing/arbitraries/rpc.d.ts.map +1 -1
- package/dist/testing/arbitraries/rpc.js +1 -0
- package/dist/testing/arbitraries/rpc.js.map +1 -1
- package/dist/testing/codec.d.ts +13 -11
- package/dist/testing/codec.d.ts.map +1 -1
- package/dist/testing/codec.js +30 -45
- package/dist/testing/codec.js.map +1 -1
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.d.ts.map +1 -1
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.js +10 -3
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.js.map +1 -1
- package/dist/testing/conformance/_helpers.d.ts +6 -6
- package/dist/testing/conformance/_helpers.d.ts.map +1 -1
- package/dist/testing/conformance/_helpers.js +6 -7
- package/dist/testing/conformance/_helpers.js.map +1 -1
- package/dist/testing/conformance/adversity.d.ts.map +1 -1
- package/dist/testing/conformance/adversity.js +14 -31
- package/dist/testing/conformance/adversity.js.map +1 -1
- package/dist/testing/conformance/boundary.d.ts +1 -1
- package/dist/testing/conformance/boundary.d.ts.map +1 -1
- package/dist/testing/conformance/boundary.js +13 -18
- package/dist/testing/conformance/boundary.js.map +1 -1
- package/dist/testing/conformance/client/_fixtures.d.ts +7 -5
- package/dist/testing/conformance/client/_fixtures.d.ts.map +1 -1
- package/dist/testing/conformance/client/_fixtures.js +17 -8
- package/dist/testing/conformance/client/_fixtures.js.map +1 -1
- package/dist/testing/conformance/client/adversity.d.ts.map +1 -1
- package/dist/testing/conformance/client/adversity.js +8 -7
- package/dist/testing/conformance/client/adversity.js.map +1 -1
- package/dist/testing/conformance/client/boundary.d.ts +2 -2
- package/dist/testing/conformance/client/boundary.d.ts.map +1 -1
- package/dist/testing/conformance/client/boundary.js +13 -12
- package/dist/testing/conformance/client/boundary.js.map +1 -1
- package/dist/testing/conformance/client/delivery.d.ts +5 -5
- package/dist/testing/conformance/client/delivery.d.ts.map +1 -1
- package/dist/testing/conformance/client/delivery.js +53 -55
- package/dist/testing/conformance/client/delivery.js.map +1 -1
- package/dist/testing/conformance/client/index.d.ts +2 -2
- package/dist/testing/conformance/client/index.d.ts.map +1 -1
- package/dist/testing/conformance/client/index.js +1 -1
- package/dist/testing/conformance/client/index.js.map +1 -1
- package/dist/testing/conformance/client/rpc-semantics.d.ts.map +1 -1
- package/dist/testing/conformance/client/rpc-semantics.js +13 -22
- package/dist/testing/conformance/client/rpc-semantics.js.map +1 -1
- package/dist/testing/conformance/client/runner.d.ts +25 -24
- package/dist/testing/conformance/client/runner.d.ts.map +1 -1
- package/dist/testing/conformance/client/runner.js +20 -22
- package/dist/testing/conformance/client/runner.js.map +1 -1
- package/dist/testing/conformance/client/schema-conformance.d.ts +8 -8
- package/dist/testing/conformance/client/schema-conformance.d.ts.map +1 -1
- package/dist/testing/conformance/client/schema-conformance.js +34 -34
- package/dist/testing/conformance/client/schema-conformance.js.map +1 -1
- package/dist/testing/conformance/client/suite.js +2 -2
- package/dist/testing/conformance/client/suite.js.map +1 -1
- package/dist/testing/conformance/delivery.d.ts.map +1 -1
- package/dist/testing/conformance/delivery.js +58 -53
- package/dist/testing/conformance/delivery.js.map +1 -1
- package/dist/testing/conformance/dispatcher-concurrency.js +12 -12
- package/dist/testing/conformance/dispatcher-concurrency.js.map +1 -1
- package/dist/testing/conformance/presence.d.ts.map +1 -1
- package/dist/testing/conformance/presence.js +32 -23
- package/dist/testing/conformance/presence.js.map +1 -1
- package/dist/testing/conformance/rpc-semantics.d.ts +12 -12
- package/dist/testing/conformance/rpc-semantics.d.ts.map +1 -1
- package/dist/testing/conformance/rpc-semantics.js +43 -41
- package/dist/testing/conformance/rpc-semantics.js.map +1 -1
- package/dist/testing/conformance/schema-conformance.d.ts +3 -40
- package/dist/testing/conformance/schema-conformance.d.ts.map +1 -1
- package/dist/testing/conformance/schema-conformance.js +38 -244
- package/dist/testing/conformance/schema-conformance.js.map +1 -1
- package/dist/testing/conformance/suite.d.ts.map +1 -1
- package/dist/testing/conformance/suite.js +5 -9
- package/dist/testing/conformance/suite.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/models/dispatch.d.ts +5 -5
- package/dist/testing/models/dispatch.d.ts.map +1 -1
- package/dist/testing/models/dispatch.js +1 -18
- package/dist/testing/models/dispatch.js.map +1 -1
- package/dist/testing/models/state.d.ts +2 -2
- package/dist/testing/models/state.d.ts.map +1 -1
- package/dist/testing/test-client.d.ts +36 -44
- package/dist/testing/test-client.d.ts.map +1 -1
- package/dist/testing/test-client.js +117 -105
- package/dist/testing/test-client.js.map +1 -1
- package/dist/testing/test-server.d.ts +5 -5
- package/dist/testing/test-server.d.ts.map +1 -1
- package/dist/testing/test-server.js +4 -4
- package/dist/testing/test-server.js.map +1 -1
- package/dist/types.d.ts +3 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validators.d.ts +366 -101
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +23 -30
- package/dist/validators.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/dist/schema/events.d.ts +0 -213
- package/dist/schema/events.d.ts.map +0 -1
- package/dist/schema/events.js +0 -122
- package/dist/schema/events.js.map +0 -1
- package/dist/schema/methods/push.d.ts +0 -21
- package/dist/schema/methods/push.d.ts.map +0 -1
- package/dist/schema/methods/push.js +0 -28
- package/dist/schema/methods/push.js.map +0 -1
- package/dist/schema/surfaces.d.ts +0 -55
- package/dist/schema/surfaces.d.ts.map +0 -1
- package/dist/schema/surfaces.js +0 -55
- package/dist/schema/surfaces.js.map +0 -1
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { Effect } from "effect";
|
|
11
11
|
import * as fc from "fast-check";
|
|
12
|
-
import {
|
|
12
|
+
import { MessageDeliveredNotificationDefinition } from "../../../schema/notifications.js";
|
|
13
|
+
import { brandNotificationFrame } from "../../../schema/internal-frames.js";
|
|
14
|
+
import { arbitraryNotificationFrame } from "../../arbitraries/frames.js";
|
|
13
15
|
import { registerProperty } from "../registry.js";
|
|
14
16
|
import { acquireFixture, collectTagged, invariant, subscribeAll, } from "./_fixtures.js";
|
|
15
17
|
const CATEGORY = "boundary";
|
|
@@ -17,28 +19,28 @@ const PROPERTY_BUDGET_MS = 12_000;
|
|
|
17
19
|
const DEFAULT_FUZZ_BURST_RUNS = 10;
|
|
18
20
|
const PROPERTY_SCHEMA_EXHAUSTIVE_FUZZ_CLIENT = "schema-exhaustive-fuzz-client";
|
|
19
21
|
/**
|
|
20
|
-
* E2 client half — TestServer emits arbitrary `
|
|
22
|
+
* E2 client half — TestServer emits arbitrary `NotificationFrame`s across
|
|
21
23
|
* many shapes to a real client. Properties interleave with a tagged
|
|
22
24
|
* liveness probe and a task-boundary assertion.
|
|
23
25
|
*
|
|
24
26
|
* Predicate (both must hold):
|
|
25
27
|
* 1. No crash — real client stays `ready`; no spurious closeSignal.
|
|
26
|
-
* 2. Liveness probe — a valid tagged
|
|
28
|
+
* 2. Liveness probe — a valid tagged notification emitted post-fuzz surfaces.
|
|
27
29
|
*/
|
|
28
30
|
export function registerSchemaExhaustiveFuzzClient(ctx) {
|
|
29
|
-
registerProperty(ctx, CATEGORY, PROPERTY_SCHEMA_EXHAUSTIVE_FUZZ_CLIENT, "real client absorbs arbitrary
|
|
31
|
+
registerProperty(ctx, CATEGORY, PROPERTY_SCHEMA_EXHAUSTIVE_FUZZ_CLIENT, "real client absorbs arbitrary NotificationFrames; liveness and boundary hold", Effect.scoped(Effect.gen(function* () {
|
|
30
32
|
const fx = yield* acquireFixture(ctx, CATEGORY, PROPERTY_SCHEMA_EXHAUSTIVE_FUZZ_CLIENT);
|
|
31
33
|
yield* subscribeAll(fx.handle);
|
|
32
34
|
// Fuzz burst: default 10 frames; stress mode scales with
|
|
33
35
|
// CONFORMANCE_NUM_RUNS through ctx.opts.numRuns.
|
|
34
36
|
const fuzzRuns = ctx.opts.numRuns ?? DEFAULT_FUZZ_BURST_RUNS;
|
|
35
|
-
const burst = fc.sample(
|
|
37
|
+
const burst = fc.sample(arbitraryNotificationFrame(), {
|
|
36
38
|
numRuns: fuzzRuns,
|
|
37
39
|
seed: ctx.seed,
|
|
38
40
|
});
|
|
39
41
|
for (const frame of burst) {
|
|
40
42
|
yield* fx.connection
|
|
41
|
-
.
|
|
43
|
+
.emitNotification(frame)
|
|
42
44
|
.pipe(Effect.orElseSucceed(() => undefined));
|
|
43
45
|
}
|
|
44
46
|
// (1) Real client still alive — closeSignal not fired.
|
|
@@ -48,14 +50,13 @@ export function registerSchemaExhaustiveFuzzClient(ctx) {
|
|
|
48
50
|
}
|
|
49
51
|
// (2) Liveness probe.
|
|
50
52
|
const tag = yield* fx.window.freshEmissionTag;
|
|
51
|
-
yield* fx.window.
|
|
53
|
+
yield* fx.window.emitTaggedNotification({
|
|
52
54
|
connection: fx.connection,
|
|
53
|
-
base: {
|
|
55
|
+
base: brandNotificationFrame({
|
|
54
56
|
jsonrpc: "2.0",
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
},
|
|
57
|
+
method: MessageDeliveredNotificationDefinition.name,
|
|
58
|
+
params: {},
|
|
59
|
+
}),
|
|
59
60
|
emissionTag: tag,
|
|
60
61
|
});
|
|
61
62
|
const observed = yield* collectTagged(fx.handle, (t) => t === tag, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundary.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"boundary.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/boundary.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ClientConformanceRunContext } from "./runner.js";
|
|
2
2
|
/**
|
|
3
|
-
* C1 client-side — TestServer emits N fan-out `
|
|
3
|
+
* C1 client-side — TestServer emits N fan-out `NotificationFrame`s (one
|
|
4
4
|
* per conversation participant position) to a real client subscribed
|
|
5
5
|
* to the conversation. All N carry the same `emissionTag` campaign;
|
|
6
6
|
* each carries a per-position `positionIndex` in the payload.
|
|
@@ -15,20 +15,20 @@ import type { ClientConformanceRunContext } from "./runner.js";
|
|
|
15
15
|
*/
|
|
16
16
|
export declare function registerFanOutCardinalityClient(ctx: ClientConformanceRunContext): void;
|
|
17
17
|
/**
|
|
18
|
-
* C3 client-side — TestServer emits a single `
|
|
18
|
+
* C3 client-side — TestServer emits a single `NotificationFrame` whose
|
|
19
19
|
* payload contains a distinct byte-sequence token; real client's
|
|
20
20
|
* subscriber surfaces a frame whose raw bytes still contain that
|
|
21
21
|
* token.
|
|
22
22
|
*
|
|
23
|
-
* Predicate (strict): the raw-bytes view of the surfaced
|
|
23
|
+
* Predicate (strict): the raw-bytes view of the surfaced notification
|
|
24
24
|
* includes the emitted token byte-for-byte. A client that routes
|
|
25
25
|
* payloads through a lossy re-serialization (e.g., key-reorder JSON
|
|
26
26
|
* stringify) fails.
|
|
27
27
|
*/
|
|
28
28
|
export declare function registerPayloadOpacityClient(ctx: ClientConformanceRunContext): void;
|
|
29
29
|
/**
|
|
30
|
-
* C4 client half — TestServer emits N task-A
|
|
31
|
-
* and M task-B
|
|
30
|
+
* C4 client half — TestServer emits N task-A notifications (tagged campaignA)
|
|
31
|
+
* and M task-B notifications (tagged campaignB) to a real client subscribed
|
|
32
32
|
* with a `conversationId` filter set to task-A. The client's task-A
|
|
33
33
|
* subscriber surfaces zero campaignB events.
|
|
34
34
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/delivery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/delivery.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAoB/D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,2BAA2B,GAC/B,IAAI,CAuEN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,2BAA2B,GAC/B,IAAI,CAuDN;AAED;;;;;;;GAOG;AACH,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,2BAA2B,GAC/B,IAAI,CA+GN;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,2BAA2B,GAC/B,IAAI,CAoEN"}
|
|
@@ -20,11 +20,13 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { Effect } from "effect";
|
|
22
22
|
import * as fc from "fast-check";
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
23
|
+
import { notificationFrame } from "../../../helpers.js";
|
|
24
|
+
import { ConversationArchivedNotificationDefinition, ConversationUnarchivedNotificationDefinition, MessageDeliveredNotificationDefinition, } from "../../../schema/notifications.js";
|
|
25
|
+
import { agentId, conversationId as toConversationId, } from "../../../schema/primitives.js";
|
|
26
|
+
import { brandNotificationFrame } from "../../../schema/internal-frames.js";
|
|
27
|
+
import { arbitraryNotificationFrame } from "../../arbitraries/frames.js";
|
|
26
28
|
import { registerProperty } from "../registry.js";
|
|
27
|
-
import { acquireFixture, collectTagged, invariant, subscribeAll, } from "./_fixtures.js";
|
|
29
|
+
import { acquireFixture, collectTagged, invariant, notificationParamsRecord, subscribeAll, } from "./_fixtures.js";
|
|
28
30
|
const CATEGORY = "delivery";
|
|
29
31
|
const PROPERTY_BUDGET_MS = 8_000;
|
|
30
32
|
const PROPERTY_FAN_OUT_CARDINALITY_CLIENT = "fan-out-cardinality-client";
|
|
@@ -33,14 +35,8 @@ const PROPERTY_TASK_BOUNDARY_ISOLATION_CLIENT = "task-boundary-isolation-client"
|
|
|
33
35
|
const PAYLOAD_TOKEN_RADIX = 36;
|
|
34
36
|
const TASK_BOUNDARY_EMISSION_COUNT = 3;
|
|
35
37
|
const LIFECYCLE_OBSERVATION_COUNT = 2;
|
|
36
|
-
function isStringKeyedRecord(value) {
|
|
37
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
38
|
-
}
|
|
39
|
-
function eventDataRecord(data) {
|
|
40
|
-
return isStringKeyedRecord(data) ? data : {};
|
|
41
|
-
}
|
|
42
38
|
/**
|
|
43
|
-
* C1 client-side — TestServer emits N fan-out `
|
|
39
|
+
* C1 client-side — TestServer emits N fan-out `NotificationFrame`s (one
|
|
44
40
|
* per conversation participant position) to a real client subscribed
|
|
45
41
|
* to the conversation. All N carry the same `emissionTag` campaign;
|
|
46
42
|
* each carries a per-position `positionIndex` in the payload.
|
|
@@ -54,10 +50,10 @@ function eventDataRecord(data) {
|
|
|
54
50
|
* drops one, or reorders the sequence fails.
|
|
55
51
|
*/
|
|
56
52
|
export function registerFanOutCardinalityClient(ctx) {
|
|
57
|
-
registerProperty(ctx, CATEGORY, PROPERTY_FAN_OUT_CARDINALITY_CLIENT, "N fan-out
|
|
53
|
+
registerProperty(ctx, CATEGORY, PROPERTY_FAN_OUT_CARDINALITY_CLIENT, "N fan-out notifications surface on real client in emission order, no drops, no dups", Effect.scoped(Effect.gen(function* () {
|
|
58
54
|
const fx = yield* acquireFixture(ctx, CATEGORY, PROPERTY_FAN_OUT_CARDINALITY_CLIENT);
|
|
59
55
|
yield* subscribeAll(fx.handle);
|
|
60
|
-
const base = fc.sample(
|
|
56
|
+
const base = fc.sample(arbitraryNotificationFrame(), {
|
|
61
57
|
numRuns: 1,
|
|
62
58
|
seed: ctx.seed,
|
|
63
59
|
})[0];
|
|
@@ -66,13 +62,13 @@ export function registerFanOutCardinalityClient(ctx) {
|
|
|
66
62
|
}
|
|
67
63
|
const N = 5;
|
|
68
64
|
const campaign = yield* fx.window.freshEmissionTag;
|
|
69
|
-
const
|
|
65
|
+
const baseParams = notificationParamsRecord(base.params);
|
|
70
66
|
for (let i = 0; i < N; i++) {
|
|
71
|
-
const positional = {
|
|
67
|
+
const positional = brandNotificationFrame({
|
|
72
68
|
...base,
|
|
73
|
-
|
|
74
|
-
};
|
|
75
|
-
yield* fx.window.
|
|
69
|
+
params: { ...baseParams, positionIndex: i },
|
|
70
|
+
});
|
|
71
|
+
yield* fx.window.emitTaggedNotification({
|
|
76
72
|
connection: fx.connection,
|
|
77
73
|
base: positional,
|
|
78
74
|
emissionTag: campaign,
|
|
@@ -82,7 +78,7 @@ export function registerFanOutCardinalityClient(ctx) {
|
|
|
82
78
|
if (observed.length !== N) {
|
|
83
79
|
return yield* Effect.fail(invariant(CATEGORY, PROPERTY_FAN_OUT_CARDINALITY_CLIENT, `expected ${N} observations, got ${observed.length}`));
|
|
84
80
|
}
|
|
85
|
-
const indices = observed.map((o) => o.
|
|
81
|
+
const indices = observed.map((o) => o.params.positionIndex);
|
|
86
82
|
// Strict ordering check against `[0..N)`.
|
|
87
83
|
for (let i = 0; i < N; i++) {
|
|
88
84
|
if (indices[i] !== i) {
|
|
@@ -92,12 +88,12 @@ export function registerFanOutCardinalityClient(ctx) {
|
|
|
92
88
|
})));
|
|
93
89
|
}
|
|
94
90
|
/**
|
|
95
|
-
* C3 client-side — TestServer emits a single `
|
|
91
|
+
* C3 client-side — TestServer emits a single `NotificationFrame` whose
|
|
96
92
|
* payload contains a distinct byte-sequence token; real client's
|
|
97
93
|
* subscriber surfaces a frame whose raw bytes still contain that
|
|
98
94
|
* token.
|
|
99
95
|
*
|
|
100
|
-
* Predicate (strict): the raw-bytes view of the surfaced
|
|
96
|
+
* Predicate (strict): the raw-bytes view of the surfaced notification
|
|
101
97
|
* includes the emitted token byte-for-byte. A client that routes
|
|
102
98
|
* payloads through a lossy re-serialization (e.g., key-reorder JSON
|
|
103
99
|
* stringify) fails.
|
|
@@ -107,14 +103,15 @@ export function registerPayloadOpacityClient(ctx) {
|
|
|
107
103
|
const fx = yield* acquireFixture(ctx, CATEGORY, PROPERTY_PAYLOAD_OPACITY_CLIENT);
|
|
108
104
|
yield* subscribeAll(fx.handle);
|
|
109
105
|
const token = `opq-${ctx.seed.toString(PAYLOAD_TOKEN_RADIX)}-${Date.now().toString(PAYLOAD_TOKEN_RADIX)}`;
|
|
110
|
-
const base = {
|
|
106
|
+
const base = brandNotificationFrame({
|
|
111
107
|
jsonrpc: "2.0",
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
108
|
+
method: MessageDeliveredNotificationDefinition.name,
|
|
109
|
+
params: {
|
|
110
|
+
opaqueToken: token,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
116
113
|
const tag = yield* fx.window.freshEmissionTag;
|
|
117
|
-
yield* fx.window.
|
|
114
|
+
yield* fx.window.emitTaggedNotification({
|
|
118
115
|
connection: fx.connection,
|
|
119
116
|
base,
|
|
120
117
|
emissionTag: tag,
|
|
@@ -134,36 +131,36 @@ export function registerPayloadOpacityClient(ctx) {
|
|
|
134
131
|
})));
|
|
135
132
|
}
|
|
136
133
|
/**
|
|
137
|
-
* C4 client half — TestServer emits N task-A
|
|
138
|
-
* and M task-B
|
|
134
|
+
* C4 client half — TestServer emits N task-A notifications (tagged campaignA)
|
|
135
|
+
* and M task-B notifications (tagged campaignB) to a real client subscribed
|
|
139
136
|
* with a `conversationId` filter set to task-A. The client's task-A
|
|
140
137
|
* subscriber surfaces zero campaignB events.
|
|
141
138
|
*
|
|
142
139
|
* Predicate: `observedCampaignB.length === 0`.
|
|
143
140
|
*/
|
|
144
141
|
export function registerTaskBoundaryIsolationClient(ctx) {
|
|
145
|
-
registerProperty(ctx, CATEGORY, PROPERTY_TASK_BOUNDARY_ISOLATION_CLIENT, "task-A subscriber does not surface task-B
|
|
142
|
+
registerProperty(ctx, CATEGORY, PROPERTY_TASK_BOUNDARY_ISOLATION_CLIENT, "task-A subscriber does not surface task-B notifications — no leakage", Effect.scoped(Effect.gen(function* () {
|
|
146
143
|
const fx = yield* acquireFixture(ctx, CATEGORY, PROPERTY_TASK_BOUNDARY_ISOLATION_CLIENT);
|
|
147
144
|
yield* subscribeAll(fx.handle);
|
|
148
|
-
const
|
|
145
|
+
const baseNotification = fc.sample(arbitraryNotificationFrame(), {
|
|
149
146
|
numRuns: 1,
|
|
150
147
|
seed: ctx.seed,
|
|
151
148
|
})[0];
|
|
152
|
-
if (
|
|
149
|
+
if (baseNotification === undefined) {
|
|
153
150
|
return yield* Effect.fail(invariant(CATEGORY, PROPERTY_TASK_BOUNDARY_ISOLATION_CLIENT, "sample failed"));
|
|
154
151
|
}
|
|
155
152
|
const campaignA = yield* fx.window.freshEmissionTag;
|
|
156
153
|
const campaignB = yield* fx.window.freshEmissionTag;
|
|
157
154
|
const taskA = `task-a-${ctx.seed}`;
|
|
158
155
|
const taskB = `task-b-${ctx.seed}`;
|
|
159
|
-
const
|
|
156
|
+
const baseParams = notificationParamsRecord(baseNotification.params);
|
|
160
157
|
// Emit task-A frames.
|
|
161
158
|
for (let i = 0; i < TASK_BOUNDARY_EMISSION_COUNT; i++) {
|
|
162
|
-
yield* fx.window.
|
|
159
|
+
yield* fx.window.emitTaggedNotification({
|
|
163
160
|
connection: fx.connection,
|
|
164
161
|
base: {
|
|
165
|
-
...
|
|
166
|
-
|
|
162
|
+
...baseNotification,
|
|
163
|
+
params: { ...baseParams, conversationId: taskA },
|
|
167
164
|
},
|
|
168
165
|
emissionTag: campaignA,
|
|
169
166
|
});
|
|
@@ -171,11 +168,11 @@ export function registerTaskBoundaryIsolationClient(ctx) {
|
|
|
171
168
|
// Emit task-B frames that must be filtered out by the client's
|
|
172
169
|
// subscription (via conversationId filter).
|
|
173
170
|
for (let i = 0; i < TASK_BOUNDARY_EMISSION_COUNT; i++) {
|
|
174
|
-
yield* fx.window.
|
|
171
|
+
yield* fx.window.emitTaggedNotification({
|
|
175
172
|
connection: fx.connection,
|
|
176
173
|
base: {
|
|
177
|
-
...
|
|
178
|
-
|
|
174
|
+
...baseNotification,
|
|
175
|
+
params: { ...baseParams, conversationId: taskB },
|
|
179
176
|
},
|
|
180
177
|
emissionTag: campaignB,
|
|
181
178
|
});
|
|
@@ -191,22 +188,20 @@ export function registerTaskBoundaryIsolationClient(ctx) {
|
|
|
191
188
|
// filter, the property is vacuous; architect O5 notes channel
|
|
192
189
|
// packages re-export a bare WS client so no server-side filter is
|
|
193
190
|
// inserted. To keep the predicate discriminating, require that
|
|
194
|
-
// every task-A-emitted
|
|
191
|
+
// every task-A-emitted notification carry the task-A conversationId on
|
|
195
192
|
// the surfaced raw frame (positive-path witness) — a
|
|
196
193
|
// cross-wiring bug in the client would route a task-B payload
|
|
197
194
|
// under a task-A campaign tag and fail this predicate.
|
|
198
195
|
const taggedA = yield* collectTagged(fx.handle, (t) => t === campaignA, { expected: 3, budgetMs: 0 });
|
|
199
196
|
for (const obs of taggedA) {
|
|
200
|
-
const cid = obs.
|
|
201
|
-
?.conversationId;
|
|
197
|
+
const cid = obs.params.conversationId;
|
|
202
198
|
if (cid !== taskA) {
|
|
203
199
|
return yield* Effect.fail(invariant(CATEGORY, PROPERTY_TASK_BOUNDARY_ISOLATION_CLIENT, `task-A emission surfaced with conversationId ${String(cid)}`));
|
|
204
200
|
}
|
|
205
201
|
}
|
|
206
202
|
const taggedB = yield* collectTagged(fx.handle, (t) => t === campaignB, { expected: 0, budgetMs: 0 });
|
|
207
203
|
for (const obs of taggedB) {
|
|
208
|
-
const cid = obs.
|
|
209
|
-
?.conversationId;
|
|
204
|
+
const cid = obs.params.conversationId;
|
|
210
205
|
if (cid !== taskB) {
|
|
211
206
|
return yield* Effect.fail(invariant(CATEGORY, PROPERTY_TASK_BOUNDARY_ISOLATION_CLIENT, `task-B emission surfaced with conversationId ${String(cid)} (cross-wiring)`));
|
|
212
207
|
}
|
|
@@ -220,25 +215,26 @@ export function registerTaskBoundaryIsolationClient(ctx) {
|
|
|
220
215
|
*/
|
|
221
216
|
export function registerArchiveLifecycleClient(ctx) {
|
|
222
217
|
const name = "archive-lifecycle-client";
|
|
223
|
-
registerProperty(ctx, CATEGORY, name, "archive/unarchive lifecycle
|
|
218
|
+
registerProperty(ctx, CATEGORY, name, "archive/unarchive lifecycle notifications surface on the real client in order", Effect.scoped(Effect.gen(function* () {
|
|
224
219
|
const fx = yield* acquireFixture(ctx, CATEGORY, name);
|
|
225
220
|
yield* subscribeAll(fx.handle);
|
|
226
|
-
const conversationId = "00000000-0000-4000-8000-000000000001";
|
|
221
|
+
const conversationId = toConversationId("00000000-0000-4000-8000-000000000001");
|
|
222
|
+
const by = agentId(fx.handle.agentId);
|
|
227
223
|
const tag = yield* fx.window.freshEmissionTag;
|
|
228
|
-
yield* fx.window.
|
|
224
|
+
yield* fx.window.emitTaggedNotification({
|
|
229
225
|
connection: fx.connection,
|
|
230
|
-
base:
|
|
226
|
+
base: notificationFrame(ConversationArchivedNotificationDefinition, {
|
|
231
227
|
conversationId,
|
|
232
228
|
archivedAt: new Date(0).toISOString(),
|
|
233
|
-
by
|
|
229
|
+
by,
|
|
234
230
|
}),
|
|
235
231
|
emissionTag: tag,
|
|
236
232
|
});
|
|
237
|
-
yield* fx.window.
|
|
233
|
+
yield* fx.window.emitTaggedNotification({
|
|
238
234
|
connection: fx.connection,
|
|
239
|
-
base:
|
|
235
|
+
base: notificationFrame(ConversationUnarchivedNotificationDefinition, {
|
|
240
236
|
conversationId,
|
|
241
|
-
by
|
|
237
|
+
by,
|
|
242
238
|
}),
|
|
243
239
|
emissionTag: tag,
|
|
244
240
|
});
|
|
@@ -249,9 +245,11 @@ export function registerArchiveLifecycleClient(ctx) {
|
|
|
249
245
|
if (observed.length !== LIFECYCLE_OBSERVATION_COUNT) {
|
|
250
246
|
return yield* Effect.fail(invariant(CATEGORY, name, `expected ${LIFECYCLE_OBSERVATION_COUNT} lifecycle observations, got ${observed.length}`));
|
|
251
247
|
}
|
|
252
|
-
if (observed[0]?.
|
|
253
|
-
|
|
254
|
-
|
|
248
|
+
if (observed[0]?.notificationName !==
|
|
249
|
+
ConversationArchivedNotificationDefinition.name ||
|
|
250
|
+
observed[1]?.notificationName !==
|
|
251
|
+
ConversationUnarchivedNotificationDefinition.name) {
|
|
252
|
+
return yield* Effect.fail(invariant(CATEGORY, name, `lifecycle order mismatch: ${observed.map((o) => o.notificationName).join(",")}`));
|
|
255
253
|
}
|
|
256
254
|
})));
|
|
257
255
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* `../suite.ts` (implement-staff scope) and by the stub entry
|
|
7
7
|
* `runClientConformanceSuite` in `./suite.ts`.
|
|
8
8
|
*/
|
|
9
|
-
export { type ClientConformanceRunContext, type ClientConformanceRunOptions, type
|
|
9
|
+
export { type ClientConformanceRunContext, type ClientConformanceRunOptions, type ObservedNotification, type RealClientCloseEvent, type RealClientNotificationFilter, type RealClientNotificationSubscriber, type RealClientHandle, type RealClientRpcCaller, type RealClientSubscription, ClientHandshakeWindow, RealClientLifecycleError, RealClientRpcError, acquireClientRunContext, makeClientHandshakeWindow, } from "./runner.js";
|
|
10
10
|
export { type ClientConformanceSuiteOptions, type JointConformanceSuiteOptions, registerAllClientProperties, runClientConformanceSuite, } from "./suite.js";
|
|
11
|
-
export {
|
|
11
|
+
export { registerNotificationWellFormednessClient, registerMalformedFrameHandlingClient, } from "./schema-conformance.js";
|
|
12
12
|
export { registerModelEquivalenceClient, registerRequestIdUniquenessClient, } from "./rpc-semantics.js";
|
|
13
13
|
export { registerArchiveLifecycleClient, registerFanOutCardinalityClient, registerPayloadOpacityClient, registerTaskBoundaryIsolationClient, } from "./delivery.js";
|
|
14
14
|
export { registerLatencyResilienceClient, registerResetPeerRecoveryClient, registerSlicerFramingClient, registerSlowCloseCleanupClient, registerTimeoutSurfaceClient, } from "./adversity.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,gCAAgC,EACrC,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EACjC,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,wCAAwC,EACxC,oCAAoC,GACrC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,EAC5B,mCAAmC,GACpC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kCAAkC,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
export { ClientHandshakeWindow, RealClientLifecycleError, RealClientRpcError, acquireClientRunContext, makeClientHandshakeWindow, } from "./runner.js";
|
|
10
10
|
export { registerAllClientProperties, runClientConformanceSuite, } from "./suite.js";
|
|
11
|
-
export {
|
|
11
|
+
export { registerNotificationWellFormednessClient, registerMalformedFrameHandlingClient, } from "./schema-conformance.js";
|
|
12
12
|
export { registerModelEquivalenceClient, registerRequestIdUniquenessClient, } from "./rpc-semantics.js";
|
|
13
13
|
export { registerArchiveLifecycleClient, registerFanOutCardinalityClient, registerPayloadOpacityClient, registerTaskBoundaryIsolationClient, } from "./delivery.js";
|
|
14
14
|
export { registerLatencyResilienceClient, registerResetPeerRecoveryClient, registerSlicerFramingClient, registerSlowCloseCleanupClient, registerTimeoutSurfaceClient, } from "./adversity.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAUL,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAUL,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,wCAAwC,EACxC,oCAAoC,GACrC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,EAC5B,mCAAmC,GACpC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kCAAkC,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-semantics.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/rpc-semantics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rpc-semantics.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/rpc-semantics.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAY/D;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,2BAA2B,GAC/B,IAAI,CA4EN;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,2BAA2B,GAC/B,IAAI,CAiGN"}
|
|
@@ -14,8 +14,11 @@
|
|
|
14
14
|
* asserts set equality — no typed-error involvement.
|
|
15
15
|
*/
|
|
16
16
|
import { Effect } from "effect";
|
|
17
|
+
import { responseFrame } from "../../../helpers.js";
|
|
18
|
+
import { isJsonRpcStringId, jsonRpcStringId, } from "../../../schema/json-rpc.js";
|
|
17
19
|
import { registerProperty } from "../registry.js";
|
|
18
20
|
import { acquireFixture, invariant } from "./_fixtures.js";
|
|
21
|
+
import { isRequestFrame } from "../../codec.js";
|
|
19
22
|
import { AgentsList } from "../../../schema/methods/auth.js";
|
|
20
23
|
const CATEGORY = "rpc-semantics";
|
|
21
24
|
const CALL_BUDGET_MS = 5_000;
|
|
@@ -44,15 +47,11 @@ export function registerModelEquivalenceClient(ctx) {
|
|
|
44
47
|
for (const entry of snap) {
|
|
45
48
|
if (entry.kind === "inbound" &&
|
|
46
49
|
entry.frame !== null &&
|
|
47
|
-
entry.frame
|
|
50
|
+
isRequestFrame(entry.frame) &&
|
|
48
51
|
entry.frame.method === AgentsList.name) {
|
|
49
|
-
const response = {
|
|
50
|
-
jsonrpc: "2.0",
|
|
51
|
-
type: "response",
|
|
52
|
-
direction: "c2s",
|
|
53
|
-
id: entry.frame.id,
|
|
52
|
+
const response = responseFrame(entry.frame.id, {
|
|
54
53
|
result: { agents: {} },
|
|
55
|
-
};
|
|
54
|
+
});
|
|
56
55
|
yield* fx.window.emitTaggedResponse({
|
|
57
56
|
connection: fx.connection,
|
|
58
57
|
base: response,
|
|
@@ -70,7 +69,7 @@ export function registerModelEquivalenceClient(ctx) {
|
|
|
70
69
|
}), Effect.mapError((e) => "_tag" in e && e._tag === "RealClientRpcError"
|
|
71
70
|
? invariant(CATEGORY, PROPERTY_MODEL_EQUIVALENCE_CLIENT, `agents/list rejected: ${e.kind} (${e.documentedErrorTag ?? "null"})`)
|
|
72
71
|
: e));
|
|
73
|
-
if (result
|
|
72
|
+
if (!("result" in result)) {
|
|
74
73
|
return yield* Effect.fail(invariant(CATEGORY, PROPERTY_MODEL_EQUIVALENCE_CLIENT, "real client surfaced non-response frame"));
|
|
75
74
|
}
|
|
76
75
|
})));
|
|
@@ -94,13 +93,9 @@ export function registerRequestIdUniquenessClient(ctx) {
|
|
|
94
93
|
// Emit a spurious response with an id the client never sent.
|
|
95
94
|
const spuriousId = "spurious-id-that-was-never-requested";
|
|
96
95
|
yield* fx.connection
|
|
97
|
-
.emitResponse({
|
|
98
|
-
jsonrpc: "2.0",
|
|
99
|
-
type: "response",
|
|
100
|
-
direction: "c2s",
|
|
101
|
-
id: spuriousId,
|
|
96
|
+
.emitResponse(responseFrame(jsonRpcStringId(spuriousId), {
|
|
102
97
|
result: { agents: {} },
|
|
103
|
-
})
|
|
98
|
+
}))
|
|
104
99
|
.pipe(Effect.orElseSucceed(() => undefined));
|
|
105
100
|
// Fork a responder that correctly routes the matching response.
|
|
106
101
|
yield* Effect.forkScoped(Effect.gen(function* () {
|
|
@@ -111,16 +106,12 @@ export function registerRequestIdUniquenessClient(ctx) {
|
|
|
111
106
|
for (const entry of snap) {
|
|
112
107
|
if (entry.kind === "inbound" &&
|
|
113
108
|
entry.frame !== null &&
|
|
114
|
-
entry.frame
|
|
109
|
+
isRequestFrame(entry.frame) &&
|
|
115
110
|
entry.frame.method === AgentsList.name) {
|
|
116
111
|
yield* fx.connection
|
|
117
|
-
.emitResponse({
|
|
118
|
-
jsonrpc: "2.0",
|
|
119
|
-
type: "response",
|
|
120
|
-
direction: "c2s",
|
|
121
|
-
id: entry.frame.id,
|
|
112
|
+
.emitResponse(responseFrame(entry.frame.id, {
|
|
122
113
|
result: { agents: {} },
|
|
123
|
-
})
|
|
114
|
+
}))
|
|
124
115
|
.pipe(Effect.orElseSucceed(() => undefined));
|
|
125
116
|
responded = true;
|
|
126
117
|
break;
|
|
@@ -135,7 +126,7 @@ export function registerRequestIdUniquenessClient(ctx) {
|
|
|
135
126
|
}), Effect.mapError((e) => "_tag" in e && e._tag === "RealClientRpcError"
|
|
136
127
|
? invariant(CATEGORY, PROPERTY_REQUEST_ID_UNIQUENESS_CLIENT, `agents/list rejected: ${e.kind}`)
|
|
137
128
|
: e));
|
|
138
|
-
if (result.id
|
|
129
|
+
if ("id" in result && isJsonRpcStringId(result.id)) {
|
|
139
130
|
// Inspect: the resolved id must appear in the outboundIdFeed —
|
|
140
131
|
// any resolution via the spurious id is a cross-wiring bug.
|
|
141
132
|
const outbound = yield* fx.handle.call.outboundIdFeed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-semantics.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/rpc-semantics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"rpc-semantics.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/rpc-semantics.ts"],"names":[],"mappings":"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"}
|