@moltzap/protocol 2026.503.3 → 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 +34 -990
- 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 +6 -15
- 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 +9 -7
- package/dist/testing/arbitraries/frames.js.map +1 -1
- package/dist/testing/arbitraries/from-typebox.d.ts.map +1 -1
- package/dist/testing/arbitraries/from-typebox.js +19 -10
- package/dist/testing/arbitraries/from-typebox.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 +13 -3
- package/dist/testing/arbitraries/rpc.js.map +1 -1
- package/dist/testing/captures.d.ts.map +1 -1
- package/dist/testing/captures.js +4 -3
- package/dist/testing/captures.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 +43 -50
- 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 +15 -5
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.js.map +1 -1
- package/dist/testing/conformance/_helpers.d.ts +12 -7
- package/dist/testing/conformance/_helpers.d.ts.map +1 -1
- package/dist/testing/conformance/_helpers.js +30 -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 +83 -90
- 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 +55 -50
- 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 +28 -22
- 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 +19 -16
- 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 +77 -73
- 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 +31 -37
- package/dist/testing/conformance/client/rpc-semantics.js.map +1 -1
- package/dist/testing/conformance/client/runner.d.ts +38 -32
- package/dist/testing/conformance/client/runner.d.ts.map +1 -1
- package/dist/testing/conformance/client/runner.js +36 -45
- 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 +37 -35
- package/dist/testing/conformance/client/schema-conformance.js.map +1 -1
- package/dist/testing/conformance/client/suite.d.ts.map +1 -1
- package/dist/testing/conformance/client/suite.js +4 -3
- 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 +127 -140
- 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/env.d.ts +9 -0
- package/dist/testing/conformance/env.d.ts.map +1 -1
- package/dist/testing/conformance/env.js +16 -3
- package/dist/testing/conformance/env.js.map +1 -1
- package/dist/testing/conformance/presence.d.ts.map +1 -1
- package/dist/testing/conformance/presence.js +35 -24
- package/dist/testing/conformance/presence.js.map +1 -1
- package/dist/testing/conformance/registry.d.ts +1 -1
- package/dist/testing/conformance/registry.d.ts.map +1 -1
- package/dist/testing/conformance/registry.js +1 -1
- package/dist/testing/conformance/registry.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 +131 -90
- package/dist/testing/conformance/rpc-semantics.js.map +1 -1
- package/dist/testing/conformance/runner.d.ts +2 -2
- package/dist/testing/conformance/runner.d.ts.map +1 -1
- package/dist/testing/conformance/runner.js +5 -10
- package/dist/testing/conformance/runner.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 +75 -235
- package/dist/testing/conformance/schema-conformance.js.map +1 -1
- package/dist/testing/conformance/suite.d.ts +1 -1
- package/dist/testing/conformance/suite.d.ts.map +1 -1
- package/dist/testing/conformance/suite.js +17 -18
- 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 +50 -59
- package/dist/testing/models/dispatch.js.map +1 -1
- package/dist/testing/models/state.d.ts +5 -5
- package/dist/testing/models/state.d.ts.map +1 -1
- package/dist/testing/models/state.js +14 -1
- package/dist/testing/models/state.js.map +1 -1
- package/dist/testing/test-client.d.ts +51 -40
- package/dist/testing/test-client.d.ts.map +1 -1
- package/dist/testing/test-client.js +154 -122
- 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 +11 -15
- package/dist/testing/test-server.js.map +1 -1
- package/dist/testing/toxics/client.d.ts.map +1 -1
- package/dist/testing/toxics/client.js +9 -3
- package/dist/testing/toxics/client.js.map +1 -1
- package/dist/testing/toxics/profile.d.ts.map +1 -1
- package/dist/testing/toxics/profile.js +4 -1
- package/dist/testing/toxics/profile.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
|
@@ -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,10 +14,16 @@
|
|
|
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";
|
|
22
|
+
import { AgentsList } from "../../../schema/methods/auth.js";
|
|
19
23
|
const CATEGORY = "rpc-semantics";
|
|
20
24
|
const CALL_BUDGET_MS = 5_000;
|
|
25
|
+
const PROPERTY_MODEL_EQUIVALENCE_CLIENT = "model-equivalence-client";
|
|
26
|
+
const PROPERTY_REQUEST_ID_UNIQUENESS_CLIENT = "request-id-uniqueness-client";
|
|
21
27
|
/**
|
|
22
28
|
* B1 client half — property issues `realClient.call("agents/list", {})`;
|
|
23
29
|
* TestServer captures the inbound request id and emits a well-shaped
|
|
@@ -28,8 +34,8 @@ const CALL_BUDGET_MS = 5_000;
|
|
|
28
34
|
* never resolve within the budget.
|
|
29
35
|
*/
|
|
30
36
|
export function registerModelEquivalenceClient(ctx) {
|
|
31
|
-
registerProperty(ctx, CATEGORY,
|
|
32
|
-
const fx = yield* acquireFixture(ctx, CATEGORY,
|
|
37
|
+
registerProperty(ctx, CATEGORY, PROPERTY_MODEL_EQUIVALENCE_CLIENT, "scripted response to sampled RPC resolves the real client's pending call", Effect.scoped(Effect.gen(function* () {
|
|
38
|
+
const fx = yield* acquireFixture(ctx, CATEGORY, PROPERTY_MODEL_EQUIVALENCE_CLIENT);
|
|
33
39
|
// Fork a background responder that watches inbound requests and
|
|
34
40
|
// replies with an empty-agents-list result as soon as the sampled
|
|
35
41
|
// call lands.
|
|
@@ -41,15 +47,11 @@ export function registerModelEquivalenceClient(ctx) {
|
|
|
41
47
|
for (const entry of snap) {
|
|
42
48
|
if (entry.kind === "inbound" &&
|
|
43
49
|
entry.frame !== null &&
|
|
44
|
-
entry.frame
|
|
45
|
-
entry.frame.method ===
|
|
46
|
-
const response = {
|
|
47
|
-
jsonrpc: "2.0",
|
|
48
|
-
type: "response",
|
|
49
|
-
direction: "c2s",
|
|
50
|
-
id: entry.frame.id,
|
|
50
|
+
isRequestFrame(entry.frame) &&
|
|
51
|
+
entry.frame.method === AgentsList.name) {
|
|
52
|
+
const response = responseFrame(entry.frame.id, {
|
|
51
53
|
result: { agents: {} },
|
|
52
|
-
};
|
|
54
|
+
});
|
|
53
55
|
yield* fx.window.emitTaggedResponse({
|
|
54
56
|
connection: fx.connection,
|
|
55
57
|
base: response,
|
|
@@ -61,14 +63,14 @@ export function registerModelEquivalenceClient(ctx) {
|
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
65
|
}));
|
|
64
|
-
const result = yield* fx.handle.call.call(
|
|
66
|
+
const result = yield* fx.handle.call.call(AgentsList.name, {}).pipe(Effect.timeoutFail({
|
|
65
67
|
duration: `${CALL_BUDGET_MS} millis`,
|
|
66
|
-
onTimeout: () => invariant(CATEGORY,
|
|
68
|
+
onTimeout: () => invariant(CATEGORY, PROPERTY_MODEL_EQUIVALENCE_CLIENT, `agents/list call did not resolve within ${CALL_BUDGET_MS}ms`),
|
|
67
69
|
}), Effect.mapError((e) => "_tag" in e && e._tag === "RealClientRpcError"
|
|
68
|
-
? invariant(CATEGORY,
|
|
70
|
+
? invariant(CATEGORY, PROPERTY_MODEL_EQUIVALENCE_CLIENT, `agents/list rejected: ${e.kind} (${e.documentedErrorTag ?? "null"})`)
|
|
69
71
|
: e));
|
|
70
|
-
if (result
|
|
71
|
-
return yield* Effect.fail(invariant(CATEGORY,
|
|
72
|
+
if (!("result" in result)) {
|
|
73
|
+
return yield* Effect.fail(invariant(CATEGORY, PROPERTY_MODEL_EQUIVALENCE_CLIENT, "real client surfaced non-response frame"));
|
|
72
74
|
}
|
|
73
75
|
})));
|
|
74
76
|
}
|
|
@@ -86,18 +88,14 @@ export function registerModelEquivalenceClient(ctx) {
|
|
|
86
88
|
* response frame regardless of id mis-routes.
|
|
87
89
|
*/
|
|
88
90
|
export function registerRequestIdUniquenessClient(ctx) {
|
|
89
|
-
registerProperty(ctx, CATEGORY,
|
|
90
|
-
const fx = yield* acquireFixture(ctx, CATEGORY,
|
|
91
|
+
registerProperty(ctx, CATEGORY, PROPERTY_REQUEST_ID_UNIQUENESS_CLIENT, "spurious response ids don't resolve pending calls; matching ids do", Effect.scoped(Effect.gen(function* () {
|
|
92
|
+
const fx = yield* acquireFixture(ctx, CATEGORY, PROPERTY_REQUEST_ID_UNIQUENESS_CLIENT);
|
|
91
93
|
// Emit a spurious response with an id the client never sent.
|
|
92
94
|
const spuriousId = "spurious-id-that-was-never-requested";
|
|
93
95
|
yield* fx.connection
|
|
94
|
-
.emitResponse({
|
|
95
|
-
jsonrpc: "2.0",
|
|
96
|
-
type: "response",
|
|
97
|
-
direction: "c2s",
|
|
98
|
-
id: spuriousId,
|
|
96
|
+
.emitResponse(responseFrame(jsonRpcStringId(spuriousId), {
|
|
99
97
|
result: { agents: {} },
|
|
100
|
-
})
|
|
98
|
+
}))
|
|
101
99
|
.pipe(Effect.orElseSucceed(() => undefined));
|
|
102
100
|
// Fork a responder that correctly routes the matching response.
|
|
103
101
|
yield* Effect.forkScoped(Effect.gen(function* () {
|
|
@@ -108,16 +106,12 @@ export function registerRequestIdUniquenessClient(ctx) {
|
|
|
108
106
|
for (const entry of snap) {
|
|
109
107
|
if (entry.kind === "inbound" &&
|
|
110
108
|
entry.frame !== null &&
|
|
111
|
-
entry.frame
|
|
112
|
-
entry.frame.method ===
|
|
109
|
+
isRequestFrame(entry.frame) &&
|
|
110
|
+
entry.frame.method === AgentsList.name) {
|
|
113
111
|
yield* fx.connection
|
|
114
|
-
.emitResponse({
|
|
115
|
-
jsonrpc: "2.0",
|
|
116
|
-
type: "response",
|
|
117
|
-
direction: "c2s",
|
|
118
|
-
id: entry.frame.id,
|
|
112
|
+
.emitResponse(responseFrame(entry.frame.id, {
|
|
119
113
|
result: { agents: {} },
|
|
120
|
-
})
|
|
114
|
+
}))
|
|
121
115
|
.pipe(Effect.orElseSucceed(() => undefined));
|
|
122
116
|
responded = true;
|
|
123
117
|
break;
|
|
@@ -126,21 +120,21 @@ export function registerRequestIdUniquenessClient(ctx) {
|
|
|
126
120
|
}
|
|
127
121
|
}));
|
|
128
122
|
// Issue the RPC: must resolve via the matching id, not the spurious one.
|
|
129
|
-
const result = yield* fx.handle.call.call(
|
|
123
|
+
const result = yield* fx.handle.call.call(AgentsList.name, {}).pipe(Effect.timeoutFail({
|
|
130
124
|
duration: `${CALL_BUDGET_MS} millis`,
|
|
131
|
-
onTimeout: () => invariant(CATEGORY,
|
|
125
|
+
onTimeout: () => invariant(CATEGORY, PROPERTY_REQUEST_ID_UNIQUENESS_CLIENT, `agents/list did not resolve within ${CALL_BUDGET_MS}ms despite matching response`),
|
|
132
126
|
}), Effect.mapError((e) => "_tag" in e && e._tag === "RealClientRpcError"
|
|
133
|
-
? invariant(CATEGORY,
|
|
127
|
+
? invariant(CATEGORY, PROPERTY_REQUEST_ID_UNIQUENESS_CLIENT, `agents/list rejected: ${e.kind}`)
|
|
134
128
|
: e));
|
|
135
|
-
if (result.id
|
|
129
|
+
if ("id" in result && isJsonRpcStringId(result.id)) {
|
|
136
130
|
// Inspect: the resolved id must appear in the outboundIdFeed —
|
|
137
131
|
// any resolution via the spurious id is a cross-wiring bug.
|
|
138
132
|
const outbound = yield* fx.handle.call.outboundIdFeed;
|
|
139
133
|
if (!outbound.includes(result.id)) {
|
|
140
|
-
return yield* Effect.fail(invariant(CATEGORY,
|
|
134
|
+
return yield* Effect.fail(invariant(CATEGORY, PROPERTY_REQUEST_ID_UNIQUENESS_CLIENT, `resolved id ${result.id} absent from outboundIdFeed (cross-wire)`));
|
|
141
135
|
}
|
|
142
136
|
if (result.id === spuriousId) {
|
|
143
|
-
return yield* Effect.fail(invariant(CATEGORY,
|
|
137
|
+
return yield* Effect.fail(invariant(CATEGORY, PROPERTY_REQUEST_ID_UNIQUENESS_CLIENT, "pending call resolved via spurious id"));
|
|
144
138
|
}
|
|
145
139
|
}
|
|
146
140
|
})));
|
|
@@ -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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"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* factory shape.
|
|
18
18
|
*/
|
|
19
19
|
import { Context, Effect, Ref, type Scope } from "effect";
|
|
20
|
-
import type {
|
|
20
|
+
import type { NotificationFrame, ResponseFrame } from "../../../schema/frames.js";
|
|
21
21
|
import { type TestServer, type TestServerConnection } from "../../test-server.js";
|
|
22
22
|
import { type ToxiproxyClient } from "../../toxics/client.js";
|
|
23
23
|
import { RealServerAcquireError, TransportIoError, type ToxicControlError } from "../../errors.js";
|
|
@@ -40,18 +40,18 @@ export interface RealClientHandle {
|
|
|
40
40
|
readonly agentId: string;
|
|
41
41
|
/**
|
|
42
42
|
* Fully-connected promise — resolves after the handshake completes and
|
|
43
|
-
* the client is ready to receive
|
|
43
|
+
* the client is ready to receive notifications. Property bodies await this
|
|
44
44
|
* before scripting TestServer emissions so the handshake-noise guard
|
|
45
45
|
* window is closed (see `ClientHandshakeWindow`).
|
|
46
46
|
*/
|
|
47
47
|
readonly ready: Effect.Effect<void, RealClientLifecycleError>;
|
|
48
48
|
/**
|
|
49
|
-
* Real client's public
|
|
49
|
+
* Real client's public notification-subscriber surface. Every captured notification
|
|
50
50
|
* is tagged with the property-authored `emissionId` when the property
|
|
51
|
-
* uses `ClientHandshakeWindow.
|
|
51
|
+
* uses `ClientHandshakeWindow.emitTaggedNotification`; predicates filter by
|
|
52
52
|
* that tag to exclude handshake-noise frames.
|
|
53
53
|
*/
|
|
54
|
-
readonly
|
|
54
|
+
readonly notifications: RealClientNotificationSubscriber;
|
|
55
55
|
/**
|
|
56
56
|
* Real client's documented RPC caller. B1 / B4 / D5 predicates invoke
|
|
57
57
|
* this and assert on the returned promise's resolution / rejection.
|
|
@@ -70,40 +70,41 @@ export interface RealClientHandle {
|
|
|
70
70
|
readonly close: Effect.Effect<void, RealClientLifecycleError>;
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
|
-
* Real client's public
|
|
73
|
+
* Real client's public notification-subscriber surface. Property bodies `subscribe`
|
|
74
74
|
* once per fixture and drain via `snapshot`. Concrete shape is per-consumer
|
|
75
|
-
* (packages/client's `
|
|
75
|
+
* (packages/client's `waitForNotification` + `onNotification`, channel packages' native
|
|
76
76
|
* event pipe); the wrapper adapts it to this interface.
|
|
77
77
|
*/
|
|
78
|
-
export interface
|
|
79
|
-
readonly subscribe: (filter:
|
|
80
|
-
readonly snapshot: Effect.Effect<ReadonlyArray<
|
|
78
|
+
export interface RealClientNotificationSubscriber {
|
|
79
|
+
readonly subscribe: (filter: RealClientNotificationFilter) => Effect.Effect<RealClientSubscription, RealClientLifecycleError>;
|
|
80
|
+
readonly snapshot: Effect.Effect<ReadonlyArray<ObservedNotification>>;
|
|
81
81
|
}
|
|
82
82
|
export interface RealClientSubscription {
|
|
83
83
|
readonly id: string;
|
|
84
84
|
readonly unsubscribe: Effect.Effect<void>;
|
|
85
85
|
}
|
|
86
|
-
export interface
|
|
86
|
+
export interface RealClientNotificationFilter {
|
|
87
87
|
/**
|
|
88
88
|
* Property-authored emission tag. The real client surfaces only
|
|
89
|
-
*
|
|
89
|
+
* notifications whose payload carries this tag, excluding handshake-noise.
|
|
90
90
|
* Implementations match on the event payload's `__emissionId` field
|
|
91
|
-
* (set by `ClientHandshakeWindow.
|
|
91
|
+
* (set by `ClientHandshakeWindow.emitTaggedNotification`).
|
|
92
92
|
*/
|
|
93
93
|
readonly emissionTag?: string;
|
|
94
94
|
/** Restrict to a specific conversation / task. */
|
|
95
95
|
readonly conversationId?: string;
|
|
96
|
-
/** Restrict to a specific
|
|
97
|
-
readonly
|
|
96
|
+
/** Restrict to a specific notification-name family. */
|
|
97
|
+
readonly notificationNamePrefix?: string;
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
|
-
* Observed
|
|
100
|
+
* Observed notification after the real client has surfaced it on its public
|
|
101
101
|
* subscriber API. `rawBytes` carries the payload byte-for-byte (C3);
|
|
102
|
-
* `decoded` is
|
|
102
|
+
* `decoded` is unknown because divergence proofs intentionally model clients
|
|
103
|
+
* that surface malformed notifications.
|
|
103
104
|
*/
|
|
104
|
-
export interface
|
|
105
|
+
export interface ObservedNotification {
|
|
105
106
|
readonly emissionTag: string | null;
|
|
106
|
-
readonly decoded:
|
|
107
|
+
readonly decoded: unknown;
|
|
107
108
|
readonly rawBytes: Uint8Array;
|
|
108
109
|
readonly observedAtMs: number;
|
|
109
110
|
}
|
|
@@ -115,27 +116,31 @@ export interface ObservedEvent {
|
|
|
115
116
|
* property can assert ID-set equality (B4, O7 idempotence).
|
|
116
117
|
*/
|
|
117
118
|
export interface RealClientRpcCaller {
|
|
118
|
-
readonly call: (method: string, params: unknown) => Effect.Effect<ResponseFrame, RealClientRpcError>;
|
|
119
|
+
readonly call: (method: string, params: unknown) => Effect.Effect<ResponseFrame | NotificationFrame, RealClientRpcError>;
|
|
119
120
|
/** Stream of outbound request IDs the real client has minted. */
|
|
120
121
|
readonly outboundIdFeed: Effect.Effect<ReadonlyArray<string>>;
|
|
121
122
|
}
|
|
123
|
+
declare const RealClientLifecycleError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
124
|
+
readonly _tag: "RealClientLifecycleError";
|
|
125
|
+
} & Readonly<A>;
|
|
122
126
|
/**
|
|
123
127
|
* Real-client lifecycle error tag. All three cover the Principle 3 error
|
|
124
128
|
* channel; no raw throws escape the factory's Scope.
|
|
125
129
|
*/
|
|
126
|
-
export declare class RealClientLifecycleError {
|
|
130
|
+
export declare class RealClientLifecycleError extends RealClientLifecycleError_base<{
|
|
127
131
|
readonly cause: unknown;
|
|
128
|
-
|
|
129
|
-
constructor(cause: unknown);
|
|
132
|
+
}> {
|
|
130
133
|
}
|
|
134
|
+
declare const RealClientRpcError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
135
|
+
readonly _tag: "RealClientRpcError";
|
|
136
|
+
} & Readonly<A>;
|
|
131
137
|
/** Typed error surface for real-client RPC calls (D5 predicate target). */
|
|
132
|
-
export declare class RealClientRpcError {
|
|
138
|
+
export declare class RealClientRpcError extends RealClientRpcError_base<{
|
|
139
|
+
readonly cause: unknown;
|
|
140
|
+
readonly documentedErrorTag: string | null;
|
|
133
141
|
readonly kind: "timeout" | "server-error" | "malformed-response" | "disconnected";
|
|
134
142
|
readonly method: string;
|
|
135
|
-
|
|
136
|
-
readonly cause: unknown;
|
|
137
|
-
readonly _tag = "RealClientRpcError";
|
|
138
|
-
constructor(kind: "timeout" | "server-error" | "malformed-response" | "disconnected", method: string, documentedErrorTag: string | null, cause: unknown);
|
|
143
|
+
}> {
|
|
139
144
|
}
|
|
140
145
|
/** Close-event shape surfaced by `RealClientHandle.closeSignal`. */
|
|
141
146
|
export interface RealClientCloseEvent {
|
|
@@ -153,18 +158,18 @@ export interface RealClientCloseEvent {
|
|
|
153
158
|
*
|
|
154
159
|
* Every client-side property that observes frames requests a
|
|
155
160
|
* `ClientHandshakeWindow` on its fixture and emits via
|
|
156
|
-
* `
|
|
161
|
+
* `emitTaggedNotification` / `emitTaggedResponse`. The window stamps each
|
|
157
162
|
* emission with a property-authored `emissionTag`; the
|
|
158
|
-
* `
|
|
163
|
+
* `RealClientNotificationSubscriber` filter drops untagged notifications.
|
|
159
164
|
*
|
|
160
165
|
* D6 is the only client-side property exempt (observes lifecycle
|
|
161
166
|
* signals, not frames).
|
|
162
167
|
*/
|
|
163
168
|
export interface ClientHandshakeWindow {
|
|
164
169
|
readonly freshEmissionTag: Effect.Effect<string>;
|
|
165
|
-
readonly
|
|
170
|
+
readonly emitTaggedNotification: (opts: {
|
|
166
171
|
readonly connection: TestServerConnection;
|
|
167
|
-
readonly base:
|
|
172
|
+
readonly base: NotificationFrame;
|
|
168
173
|
readonly emissionTag: string;
|
|
169
174
|
}) => Effect.Effect<string>;
|
|
170
175
|
readonly emitTaggedResponse: (opts: {
|
|
@@ -255,4 +260,5 @@ export declare function freshTag(window: ClientHandshakeWindow): Effect.Effect<s
|
|
|
255
260
|
* indefinitely.
|
|
256
261
|
*/
|
|
257
262
|
export declare function awaitConnection(testServer: TestServer, timeoutMs?: number): Effect.Effect<TestServerConnection, TransportIoError>;
|
|
263
|
+
export {};
|
|
258
264
|
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,36 +16,31 @@
|
|
|
16
16
|
* export (see §4 O5 resolution in the design doc) that returns the same
|
|
17
17
|
* factory shape.
|
|
18
18
|
*/
|
|
19
|
-
import { Context, Effect, Ref } from "effect";
|
|
19
|
+
import { Config, ConfigProvider, Context, Data, Effect, Ref, } from "effect";
|
|
20
|
+
import { responseFrame } from "../../../helpers.js";
|
|
21
|
+
import { brandNotificationFrame } from "../../../schema/internal-frames.js";
|
|
22
|
+
import { isJsonRpcStringId } from "../../../schema/json-rpc.js";
|
|
23
|
+
import { isRequestFrame } from "../../codec.js";
|
|
20
24
|
import { makeTestServer, } from "../../test-server.js";
|
|
21
25
|
import { makeToxiproxyClient, } from "../../toxics/client.js";
|
|
22
26
|
import { RealServerAcquireError, TransportIoError, } from "../../errors.js";
|
|
23
27
|
import { conformanceNumRunsFromEnv } from "../env.js";
|
|
24
28
|
import { PROTOCOL_VERSION } from "../../../version.js";
|
|
29
|
+
import { Connect } from "../../../schema/methods/auth.js";
|
|
30
|
+
const DEFAULT_ACCEPT_TIMEOUT_MS = 5_000;
|
|
31
|
+
const RANDOM_TAG_RADIX = 36;
|
|
32
|
+
const RANDOM_TAG_SLICE_END = 10;
|
|
33
|
+
const RANDOM_TAG_SLICE_START = 2;
|
|
34
|
+
const REPLAY_SEED_MASK = 0x7fffffff;
|
|
35
|
+
const loadFastCheckSeed = Config.integer("FC_SEED").pipe(Effect.withConfigProvider(ConfigProvider.fromEnv()), Effect.orElseSucceed(() => Date.now() & REPLAY_SEED_MASK));
|
|
25
36
|
/**
|
|
26
37
|
* Real-client lifecycle error tag. All three cover the Principle 3 error
|
|
27
38
|
* channel; no raw throws escape the factory's Scope.
|
|
28
39
|
*/
|
|
29
|
-
export class RealClientLifecycleError {
|
|
30
|
-
cause;
|
|
31
|
-
_tag = "RealClientLifecycleError";
|
|
32
|
-
constructor(cause) {
|
|
33
|
-
this.cause = cause;
|
|
34
|
-
}
|
|
40
|
+
export class RealClientLifecycleError extends Data.TaggedError("RealClientLifecycleError") {
|
|
35
41
|
}
|
|
36
42
|
/** Typed error surface for real-client RPC calls (D5 predicate target). */
|
|
37
|
-
export class RealClientRpcError {
|
|
38
|
-
kind;
|
|
39
|
-
method;
|
|
40
|
-
documentedErrorTag;
|
|
41
|
-
cause;
|
|
42
|
-
_tag = "RealClientRpcError";
|
|
43
|
-
constructor(kind, method, documentedErrorTag, cause) {
|
|
44
|
-
this.kind = kind;
|
|
45
|
-
this.method = method;
|
|
46
|
-
this.documentedErrorTag = documentedErrorTag;
|
|
47
|
-
this.cause = cause;
|
|
48
|
-
}
|
|
43
|
+
export class RealClientRpcError extends Data.TaggedError("RealClientRpcError") {
|
|
49
44
|
}
|
|
50
45
|
export const ClientHandshakeWindow = Context.GenericTag("@moltzap/protocol/testing/ClientHandshakeWindow");
|
|
51
46
|
/**
|
|
@@ -65,8 +60,7 @@ export function acquireClientRunContext(opts) {
|
|
|
65
60
|
...opts,
|
|
66
61
|
numRuns: opts.numRuns ?? conformanceNumRunsFromEnv(),
|
|
67
62
|
};
|
|
68
|
-
const seed = effectiveOpts.replaySeed ??
|
|
69
|
-
Number(process.env.FC_SEED ?? Date.now() & 0x7fffffff);
|
|
63
|
+
const seed = effectiveOpts.replaySeed ?? (yield* loadFastCheckSeed);
|
|
70
64
|
const artifacts = yield* Ref.make([]);
|
|
71
65
|
// Bind the TestServer under the ambient Scope. Server-close on teardown.
|
|
72
66
|
const testServer = yield* makeTestServer({
|
|
@@ -92,8 +86,10 @@ export function acquireClientRunContext(opts) {
|
|
|
92
86
|
// The context carries the initial no-op shape so type-system contracts
|
|
93
87
|
// hold; each property body still binds a per-handle window.
|
|
94
88
|
const handshakeWindow = {
|
|
95
|
-
freshEmissionTag: Effect.sync(() => `tag-${Math.random()
|
|
96
|
-
|
|
89
|
+
freshEmissionTag: Effect.sync(() => `tag-${Math.random()
|
|
90
|
+
.toString(RANDOM_TAG_RADIX)
|
|
91
|
+
.slice(RANDOM_TAG_SLICE_START, RANDOM_TAG_SLICE_END)}`),
|
|
92
|
+
emitTaggedNotification: ({ connection, base, emissionTag }) => emitTaggedNotificationDefault(connection, base, emissionTag),
|
|
97
93
|
emitTaggedResponse: ({ connection, base, emissionTag }) => emitTaggedResponseDefault(connection, base, emissionTag),
|
|
98
94
|
awaitHandshakeComplete: Effect.void,
|
|
99
95
|
};
|
|
@@ -109,31 +105,32 @@ export function acquireClientRunContext(opts) {
|
|
|
109
105
|
});
|
|
110
106
|
}
|
|
111
107
|
/**
|
|
112
|
-
* Default tagged-
|
|
108
|
+
* Default tagged-notification emission: stamp the notification payload with the
|
|
113
109
|
* caller's `emissionTag` under the reserved `__emissionTag` key, then
|
|
114
|
-
* forward to the connection's real `
|
|
110
|
+
* forward to the connection's real `emitNotification`. Returns the tag so the
|
|
115
111
|
* caller can filter subscriber observations by the same string.
|
|
116
112
|
*
|
|
117
|
-
* `
|
|
113
|
+
* `NotificationFrame.params` is `Type.Optional(Type.Unknown())`; injecting an
|
|
118
114
|
* object field is schema-valid. The real clients under test are
|
|
119
115
|
* payload-opaque (C3 predicate), so the extra field round-trips cleanly.
|
|
120
116
|
*/
|
|
121
|
-
function
|
|
122
|
-
const
|
|
123
|
-
const tagged = {
|
|
117
|
+
function emitTaggedNotificationDefault(connection, base, emissionTag) {
|
|
118
|
+
const baseParams = isStringKeyedRecord(base.params) ? base.params : {};
|
|
119
|
+
const tagged = brandNotificationFrame({
|
|
124
120
|
...base,
|
|
125
|
-
|
|
126
|
-
};
|
|
127
|
-
return connection.
|
|
121
|
+
params: { ...baseParams, __emissionTag: emissionTag },
|
|
122
|
+
});
|
|
123
|
+
return connection.emitNotification(tagged).pipe(Effect.orElseSucceed(() => undefined), Effect.as(emissionTag));
|
|
128
124
|
}
|
|
129
125
|
function isStringKeyedRecord(value) {
|
|
130
126
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
131
127
|
}
|
|
132
128
|
function emitTaggedResponseDefault(connection, base, _emissionTag) {
|
|
133
|
-
// Response frames don't carry a free-form `
|
|
129
|
+
// Response frames don't carry a free-form `params` field; responses are
|
|
134
130
|
// correlated by `id` instead — the response's `id` IS its emission tag
|
|
135
131
|
// from the property's perspective (see B1 / B4 / D5 predicates).
|
|
136
|
-
|
|
132
|
+
const tag = isJsonRpcStringId(base.id) ? base.id : _emissionTag;
|
|
133
|
+
return connection.emitResponse(base).pipe(Effect.orElseSucceed(() => undefined), Effect.as(tag));
|
|
137
134
|
}
|
|
138
135
|
/**
|
|
139
136
|
* Build a `ClientHandshakeWindow` from a real-client handle. Returns a
|
|
@@ -146,7 +143,7 @@ export function makeClientHandshakeWindow(handle) {
|
|
|
146
143
|
const tagCounter = yield* Ref.make(0);
|
|
147
144
|
return {
|
|
148
145
|
freshEmissionTag: Ref.updateAndGet(tagCounter, (n) => n + 1).pipe(Effect.map((n) => `emit-${handle.agentId}-${n}`)),
|
|
149
|
-
|
|
146
|
+
emitTaggedNotification: ({ connection, base, emissionTag }) => emitTaggedNotificationDefault(connection, base, emissionTag),
|
|
150
147
|
emitTaggedResponse: ({ connection, base, emissionTag }) => emitTaggedResponseDefault(connection, base, emissionTag),
|
|
151
148
|
awaitHandshakeComplete: handle.ready,
|
|
152
149
|
};
|
|
@@ -172,8 +169,8 @@ export function runAutoHandshakeResponder(connection, agentId) {
|
|
|
172
169
|
for (const entry of snap) {
|
|
173
170
|
if (entry.kind === "inbound" &&
|
|
174
171
|
entry.frame !== null &&
|
|
175
|
-
entry.frame
|
|
176
|
-
entry.frame.method ===
|
|
172
|
+
isRequestFrame(entry.frame) &&
|
|
173
|
+
entry.frame.method === Connect.name) {
|
|
177
174
|
const helloOk = {
|
|
178
175
|
protocolVersion: PROTOCOL_VERSION,
|
|
179
176
|
agentId,
|
|
@@ -192,13 +189,7 @@ export function runAutoHandshakeResponder(connection, agentId) {
|
|
|
192
189
|
},
|
|
193
190
|
};
|
|
194
191
|
yield* connection
|
|
195
|
-
.emitResponse({
|
|
196
|
-
jsonrpc: "2.0",
|
|
197
|
-
type: "response",
|
|
198
|
-
direction: "c2s",
|
|
199
|
-
id: entry.frame.id,
|
|
200
|
-
result: helloOk,
|
|
201
|
-
})
|
|
192
|
+
.emitResponse(responseFrame(entry.frame.id, { result: helloOk }))
|
|
202
193
|
.pipe(Effect.orElseSucceed(() => undefined));
|
|
203
194
|
handshakeHandled = true;
|
|
204
195
|
break;
|
|
@@ -220,7 +211,7 @@ export function freshTag(window) {
|
|
|
220
211
|
* never-connecting real client doesn't block the property body
|
|
221
212
|
* indefinitely.
|
|
222
213
|
*/
|
|
223
|
-
export function awaitConnection(testServer, timeoutMs =
|
|
214
|
+
export function awaitConnection(testServer, timeoutMs = DEFAULT_ACCEPT_TIMEOUT_MS) {
|
|
224
215
|
return testServer.accept.pipe(Effect.timeoutFail({
|
|
225
216
|
duration: `${timeoutMs} millis`,
|
|
226
217
|
onTimeout: () => new TransportIoError({
|