@moltzap/client 2026.511.1 → 2026.518.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.
Files changed (194) hide show
  1. package/dist/auth.d.ts +12 -6
  2. package/dist/auth.d.ts.map +1 -1
  3. package/dist/auth.js +67 -29
  4. package/dist/auth.js.map +1 -1
  5. package/dist/auth.test.js +113 -76
  6. package/dist/auth.test.js.map +1 -1
  7. package/dist/channel-core-context.test.d.ts +2 -0
  8. package/dist/channel-core-context.test.d.ts.map +1 -0
  9. package/dist/channel-core-context.test.js +334 -0
  10. package/dist/channel-core-context.test.js.map +1 -0
  11. package/dist/channel-core-dispatch.test.d.ts +2 -0
  12. package/dist/channel-core-dispatch.test.d.ts.map +1 -0
  13. package/dist/channel-core-dispatch.test.js +550 -0
  14. package/dist/channel-core-dispatch.test.js.map +1 -0
  15. package/dist/channel-core-enrichment.d.ts +8 -0
  16. package/dist/channel-core-enrichment.d.ts.map +1 -0
  17. package/dist/channel-core-enrichment.js +134 -0
  18. package/dist/channel-core-enrichment.js.map +1 -0
  19. package/dist/channel-core-errors.d.ts +20 -0
  20. package/dist/channel-core-errors.d.ts.map +1 -0
  21. package/dist/channel-core-errors.js +12 -0
  22. package/dist/channel-core-errors.js.map +1 -0
  23. package/dist/channel-core-test-support.d.ts +48 -0
  24. package/dist/channel-core-test-support.d.ts.map +1 -0
  25. package/dist/channel-core-test-support.js +111 -0
  26. package/dist/channel-core-test-support.js.map +1 -0
  27. package/dist/channel-core.d.ts +30 -7
  28. package/dist/channel-core.d.ts.map +1 -1
  29. package/dist/channel-core.js +214 -237
  30. package/dist/channel-core.js.map +1 -1
  31. package/dist/channel-core.test.js +216 -1082
  32. package/dist/channel-core.test.js.map +1 -1
  33. package/dist/cli/__tests__/cli-multi-agent.int.test.js +129 -23
  34. package/dist/cli/__tests__/cli-multi-agent.int.test.js.map +1 -1
  35. package/dist/cli/commands/conversations-v2.test.js +64 -54
  36. package/dist/cli/commands/conversations-v2.test.js.map +1 -1
  37. package/dist/cli/commands/conversations.d.ts +5 -5
  38. package/dist/cli/commands/conversations.d.ts.map +1 -1
  39. package/dist/cli/commands/conversations.js +43 -36
  40. package/dist/cli/commands/conversations.js.map +1 -1
  41. package/dist/cli/commands/messages.d.ts +4 -4
  42. package/dist/cli/commands/messages.d.ts.map +1 -1
  43. package/dist/cli/commands/messages.js +4 -4
  44. package/dist/cli/commands/messages.js.map +1 -1
  45. package/dist/cli/commands/messages.test.js +61 -49
  46. package/dist/cli/commands/messages.test.js.map +1 -1
  47. package/dist/cli/commands/ping.d.ts +0 -9
  48. package/dist/cli/commands/ping.d.ts.map +1 -1
  49. package/dist/cli/commands/ping.js +1 -1
  50. package/dist/cli/commands/ping.js.map +1 -1
  51. package/dist/cli/commands/presence.d.ts +1 -1
  52. package/dist/cli/commands/presence.js +1 -1
  53. package/dist/cli/commands/register.d.ts +2 -2
  54. package/dist/cli/commands/register.d.ts.map +1 -1
  55. package/dist/cli/commands/register.js +98 -77
  56. package/dist/cli/commands/register.js.map +1 -1
  57. package/dist/cli/commands/register.test.js +63 -39
  58. package/dist/cli/commands/register.test.js.map +1 -1
  59. package/dist/cli/commands/send.d.ts +6 -6
  60. package/dist/cli/commands/send.js +6 -6
  61. package/dist/cli/commands/send.test.js +32 -28
  62. package/dist/cli/commands/send.test.js.map +1 -1
  63. package/dist/cli/commands/status.d.ts.map +1 -1
  64. package/dist/cli/commands/status.js +3 -4
  65. package/dist/cli/commands/status.js.map +1 -1
  66. package/dist/cli/config.d.ts +0 -2
  67. package/dist/cli/config.d.ts.map +1 -1
  68. package/dist/cli/config.js +86 -76
  69. package/dist/cli/config.js.map +1 -1
  70. package/dist/cli/config.test.js +80 -42
  71. package/dist/cli/config.test.js.map +1 -1
  72. package/dist/cli/index.d.ts +1 -16
  73. package/dist/cli/index.d.ts.map +1 -1
  74. package/dist/cli/index.js +50 -113
  75. package/dist/cli/index.js.map +1 -1
  76. package/dist/cli/process-argv.d.ts +2 -0
  77. package/dist/cli/process-argv.d.ts.map +1 -0
  78. package/dist/cli/process-argv.js +2 -0
  79. package/dist/cli/process-argv.js.map +1 -0
  80. package/dist/cli/profile.d.ts +3 -10
  81. package/dist/cli/profile.d.ts.map +1 -1
  82. package/dist/cli/profile.js +105 -104
  83. package/dist/cli/profile.js.map +1 -1
  84. package/dist/cli/profile.test.js +338 -232
  85. package/dist/cli/profile.test.js.map +1 -1
  86. package/dist/cli/runtime.d.ts +5 -17
  87. package/dist/cli/runtime.d.ts.map +1 -1
  88. package/dist/cli/runtime.js +6 -59
  89. package/dist/cli/runtime.js.map +1 -1
  90. package/dist/cli/socket-client.d.ts +10 -15
  91. package/dist/cli/socket-client.d.ts.map +1 -1
  92. package/dist/cli/socket-client.js +74 -89
  93. package/dist/cli/socket-client.js.map +1 -1
  94. package/dist/cli/transport.d.ts +9 -5
  95. package/dist/cli/transport.d.ts.map +1 -1
  96. package/dist/cli/transport.js +45 -42
  97. package/dist/cli/transport.js.map +1 -1
  98. package/dist/cli/transport.test.js +227 -133
  99. package/dist/cli/transport.test.js.map +1 -1
  100. package/dist/index.d.ts +4 -1
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +3 -0
  103. package/dist/index.js.map +1 -1
  104. package/dist/local-daemon-rpc.d.ts +13 -0
  105. package/dist/local-daemon-rpc.d.ts.map +1 -0
  106. package/dist/local-daemon-rpc.js +17 -0
  107. package/dist/local-daemon-rpc.js.map +1 -0
  108. package/dist/local-paths.d.ts +7 -0
  109. package/dist/local-paths.d.ts.map +1 -0
  110. package/dist/local-paths.js +20 -0
  111. package/dist/local-paths.js.map +1 -0
  112. package/dist/runtime/close-info.d.ts +3 -12
  113. package/dist/runtime/close-info.d.ts.map +1 -1
  114. package/dist/runtime/close-info.js +28 -39
  115. package/dist/runtime/close-info.js.map +1 -1
  116. package/dist/runtime/close-info.test.js +77 -70
  117. package/dist/runtime/close-info.test.js.map +1 -1
  118. package/dist/runtime/errors.test.js +42 -28
  119. package/dist/runtime/errors.test.js.map +1 -1
  120. package/dist/runtime/frame.d.ts +4 -31
  121. package/dist/runtime/frame.d.ts.map +1 -1
  122. package/dist/runtime/frame.js +7 -116
  123. package/dist/runtime/frame.js.map +1 -1
  124. package/dist/runtime/frame.test.js +41 -54
  125. package/dist/runtime/frame.test.js.map +1 -1
  126. package/dist/runtime/index.d.ts +7 -0
  127. package/dist/runtime/index.d.ts.map +1 -1
  128. package/dist/runtime/index.js +7 -11
  129. package/dist/runtime/index.js.map +1 -1
  130. package/dist/runtime/local-history.d.ts +67 -0
  131. package/dist/runtime/local-history.d.ts.map +1 -0
  132. package/dist/runtime/local-history.js +77 -0
  133. package/dist/runtime/local-history.js.map +1 -0
  134. package/dist/runtime/local-service-commands.d.ts +19 -0
  135. package/dist/runtime/local-service-commands.d.ts.map +1 -1
  136. package/dist/runtime/local-service-commands.js +23 -0
  137. package/dist/runtime/local-service-commands.js.map +1 -1
  138. package/dist/runtime/local-socket-server.d.ts +20 -0
  139. package/dist/runtime/local-socket-server.d.ts.map +1 -0
  140. package/dist/runtime/local-socket-server.js +94 -0
  141. package/dist/runtime/local-socket-server.js.map +1 -0
  142. package/dist/runtime/refs.d.ts +1 -1
  143. package/dist/runtime/refs.js +1 -1
  144. package/dist/runtime/runtime.test.js +29 -21
  145. package/dist/runtime/runtime.test.js.map +1 -1
  146. package/dist/runtime/service-helpers.d.ts +32 -0
  147. package/dist/runtime/service-helpers.d.ts.map +1 -0
  148. package/dist/runtime/service-helpers.js +85 -0
  149. package/dist/runtime/service-helpers.js.map +1 -0
  150. package/dist/runtime/subscribers.d.ts +13 -17
  151. package/dist/runtime/subscribers.d.ts.map +1 -1
  152. package/dist/runtime/subscribers.js +37 -32
  153. package/dist/runtime/subscribers.js.map +1 -1
  154. package/dist/runtime/subscribers.test.js +139 -131
  155. package/dist/runtime/subscribers.test.js.map +1 -1
  156. package/dist/service-socket-path.test.d.ts +2 -0
  157. package/dist/service-socket-path.test.d.ts.map +1 -0
  158. package/dist/service-socket-path.test.js +87 -0
  159. package/dist/service-socket-path.test.js.map +1 -0
  160. package/dist/service.d.ts +23 -20
  161. package/dist/service.d.ts.map +1 -1
  162. package/dist/service.js +192 -340
  163. package/dist/service.js.map +1 -1
  164. package/dist/service.test.js +652 -653
  165. package/dist/service.test.js.map +1 -1
  166. package/dist/test/index.d.ts +30 -14
  167. package/dist/test/index.d.ts.map +1 -1
  168. package/dist/test/index.js +25 -21
  169. package/dist/test/index.js.map +1 -1
  170. package/dist/test-utils/channel-service-fixture.d.ts +1 -0
  171. package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
  172. package/dist/test-utils/channel-service-fixture.js +139 -98
  173. package/dist/test-utils/channel-service-fixture.js.map +1 -1
  174. package/dist/test-utils/conformance-adapter.d.ts.map +1 -1
  175. package/dist/test-utils/conformance-adapter.js +145 -124
  176. package/dist/test-utils/conformance-adapter.js.map +1 -1
  177. package/dist/test-utils/fake-service.d.ts.map +1 -1
  178. package/dist/test-utils/fake-service.js +3 -3
  179. package/dist/test-utils/fake-service.js.map +1 -1
  180. package/dist/test-utils/index.d.ts +25 -0
  181. package/dist/test-utils/index.d.ts.map +1 -1
  182. package/dist/test-utils/index.js +25 -8
  183. package/dist/test-utils/index.js.map +1 -1
  184. package/dist/ws-client-test-support.d.ts +180 -0
  185. package/dist/ws-client-test-support.d.ts.map +1 -0
  186. package/dist/ws-client-test-support.js +399 -0
  187. package/dist/ws-client-test-support.js.map +1 -0
  188. package/dist/ws-client.d.ts +59 -32
  189. package/dist/ws-client.d.ts.map +1 -1
  190. package/dist/ws-client.js +272 -321
  191. package/dist/ws-client.js.map +1 -1
  192. package/dist/ws-client.test.js +388 -800
  193. package/dist/ws-client.test.js.map +1 -1
  194. package/package.json +14 -10
@@ -0,0 +1,180 @@
1
+ import { Cause, Duration, Effect, Fiber, Scope, TestClock } from "effect";
2
+ import { MoltZapWsClient, RPC_TIMEOUT_MS, type CloseInfo } from "./ws-client.js";
3
+ import { ForbiddenError, RpcTimeoutError, type ParamsOf } from "@moltzap/protocol";
4
+ import { AgentsLookupByName, DispatchAuthorize, ConversationsList, MessagesSend, MessageReceivedNotificationDefinition, type NotificationFrame, type RequestFrame, type RpcDefinition } from "@moltzap/protocol";
5
+ import { JSON_RPC_VERSION, validateResponseFrame } from "@moltzap/protocol/testing";
6
+ declare const effectTest: (name: string, effect: () => Effect.Effect<unknown, unknown>, timeout?: number) => void;
7
+ declare const scopedEffectTest: import("@effect/vitest").Vitest.Tester<import("effect/TestServices").TestServices | Scope.Scope>;
8
+ declare const SESSION_A = "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa";
9
+ declare const SESSION_B = "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb";
10
+ declare const dispatchRequestParams: (taskId: string) => {
11
+ taskId: string;
12
+ appId: string;
13
+ conversationId: string;
14
+ recipient: {
15
+ agentId: string;
16
+ ownerId: string;
17
+ };
18
+ message: {
19
+ id: string;
20
+ senderAgentId: string;
21
+ parts: {
22
+ type: "text";
23
+ text: string;
24
+ }[];
25
+ };
26
+ attempt: number;
27
+ };
28
+ type DispatchRequestParams = ReturnType<typeof dispatchRequestParams>;
29
+ declare const LOCALHOST_HOST = "127.0.0.1";
30
+ declare const TEST_AGENT_ID: string & import("effect/Brand").Brand<"AgentId">;
31
+ declare const RECONNECT_AGENT_ID: string & import("effect/Brand").Brand<"AgentId">;
32
+ declare const NORMAL_CLOSE_CODE = 1000;
33
+ declare const SERVER_ERROR_CLOSE_CODE = 1011;
34
+ declare const CONNECT_FAILURE_MAX_MS = 3000;
35
+ declare const REFUSED_CONNECT_MAX_MS = 15000;
36
+ declare const REFUSED_CONNECT_TEST_TIMEOUT_MS = 20000;
37
+ declare const REALTIME_POLL_TIMEOUT_MS = 2000;
38
+ declare const POST_TIMEOUT_SETTLE_MS = 50;
39
+ declare const MALFORMED_FRAME_FLUSH_MS = 300;
40
+ declare const CLIENT_DRAIN_COUNT = 10;
41
+ declare const CLOSE_PROPAGATION_TIMEOUT_MS = 1000;
42
+ declare const STALE_PORT_TEST_TIMEOUT_MS = 15000;
43
+ declare const CLOSE_INFO_WAIT_MS = 2000;
44
+ declare const HANDLER_REJECTION_CODE = -32001;
45
+ declare const NORMAL_CLOSE_REASON = "normal";
46
+ declare const SERVER_ERROR_REASON = "boom";
47
+ declare const SERVER_TEST_REQUEST_ID = "srv-test-1";
48
+ declare const SERVER_ERROR_REQUEST_ID = "srv-err-1";
49
+ declare const GRANT_DECISION = "grant";
50
+ declare const DOMAIN_REJECTED_MESSAGE = "domain-rejected";
51
+ declare const DOMAIN_REJECTED_REASON = "test";
52
+ declare const DUPLICATE_HANDLER_ERROR_TAG = "DuplicateServerRpcHandlerError";
53
+ declare const TEST_CONVERSATION_ID: string & import("effect/Brand").Brand<"ConversationId">;
54
+ declare const messageReceivedFrame: () => {
55
+ params?: unknown;
56
+ method: string & import("effect/Brand").Brand<"JsonRpcMethod">;
57
+ jsonrpc: "2.0";
58
+ };
59
+ /**
60
+ * Per-connection context exposed to a handler so tests can inspect and
61
+ * manipulate the live server-side socket.
62
+ */
63
+ interface TestServerConnection {
64
+ /** Send a raw string frame to this client. */
65
+ readonly send: (raw: string) => Effect.Effect<void>;
66
+ /** Close this client's connection (CloseEvent code 1000 = clean). */
67
+ readonly close: (code?: number, reason?: string) => Effect.Effect<void>;
68
+ /** Every frame received from this client, in order. */
69
+ readonly received: ReadonlyArray<string>;
70
+ }
71
+ /**
72
+ * Handler invoked once per accepted server-side connection. Receives
73
+ * (serverConn, rawFrame) per inbound frame. Return the raw string to respond,
74
+ * `null` to drop, or throw a CloseEvent via `serverConn.close(code)`.
75
+ */
76
+ type ServerHandler = (conn: TestServerConnection, raw: string) => Effect.Effect<void>;
77
+ interface MutableRef<A> {
78
+ current: A;
79
+ }
80
+ interface TestServer {
81
+ readonly url: string;
82
+ /**
83
+ * Accumulates every TestServerConnection ever accepted. Tests assert on
84
+ * it to check e.g. no reconnect happened (length === 1).
85
+ */
86
+ readonly connections: ReadonlyArray<TestServerConnection>;
87
+ }
88
+ declare const ClosedLocalPortError_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]; }>) => Cause.YieldableError & {
89
+ readonly _tag: "ClosedLocalPortError";
90
+ } & Readonly<A>;
91
+ declare class ClosedLocalPortError extends ClosedLocalPortError_base<{
92
+ readonly cause: unknown;
93
+ }> {
94
+ }
95
+ declare const WaitForTimeoutError_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]; }>) => Cause.YieldableError & {
96
+ readonly _tag: "WaitForTimeoutError";
97
+ } & Readonly<A>;
98
+ declare class WaitForTimeoutError extends WaitForTimeoutError_base<{
99
+ readonly timeoutMs: number;
100
+ }> {
101
+ }
102
+ declare function findResponseRaw(server: TestServer, id: string): string | undefined;
103
+ declare function waitForResponseRaw(server: TestServer, id: string): Effect.Effect<string | undefined, WaitForTimeoutError>;
104
+ declare function waitForErrorResponse(server: TestServer, id: string): Effect.Effect<void, WaitForTimeoutError>;
105
+ /**
106
+ * Spin up an in-process `@effect/platform` WS server on `127.0.0.1:0`.
107
+ * Caller owns the provided scope; when it closes, the server shuts down.
108
+ */
109
+ declare const startTestServer: (handler: ServerHandler) => Effect.Effect<TestServer, unknown, Scope.Scope>;
110
+ declare const findClosedLocalPort: () => Effect.Effect<number, ClosedLocalPortError>;
111
+ interface MakeClientOverrides {
112
+ readonly onNotification?: (evt: NotificationFrame) => void;
113
+ readonly onDisconnect?: (close: CloseInfo) => void;
114
+ readonly onReconnect?: (hello: unknown) => void;
115
+ }
116
+ declare const connectClient: (client: MoltZapWsClient) => Effect.Effect<{
117
+ protocolVersion: string;
118
+ agentId: string & import("effect/Brand").Brand<"AgentId">;
119
+ policy: {
120
+ maxMessageBytes: number;
121
+ maxPartsPerMessage: number;
122
+ maxTextLength: number;
123
+ maxGroupParticipants: number;
124
+ heartbeatIntervalMs: number;
125
+ rateLimits: {
126
+ messagesPerMinute: number;
127
+ requestsPerMinute: number;
128
+ };
129
+ };
130
+ }, import("@moltzap/protocol").RpcCallError | RpcTimeoutError, never>;
131
+ declare const sendRpcEffect: <D extends RpcDefinition<string, any, any>>(client: MoltZapWsClient, definition: D, params: ParamsOf<D>) => Effect.Effect<import("@moltzap/protocol").ResultOf<D>, import("@moltzap/protocol").RpcCallError | RpcTimeoutError, never>;
132
+ declare function expectEffectFailure<A, E, R>(effect: Effect.Effect<A, E, R>, pattern: RegExp): Effect.Effect<void, never, R>;
133
+ declare const closeClient: (client: MoltZapWsClient) => Effect.Effect<void, never>;
134
+ /**
135
+ * Start a server whose handler auto-responds to `network/connect` and forwards
136
+ * everything else to the test's `handler`. Useful for tests that only care
137
+ * about post-handshake behaviour.
138
+ */
139
+ declare const startHandshakingServer: (handler: (conn: TestServerConnection, raw: string, frame: RequestFrame) => Effect.Effect<void>) => Effect.Effect<TestServer, unknown, Scope.Scope>;
140
+ declare function startDispatchAuthorizeServer(requestId: string, params: DispatchRequestParams): Effect.Effect<TestServer, unknown, Scope.Scope>;
141
+ declare const setRef: <A>(ref: MutableRef<A>) => (value: A) => void;
142
+ declare function startReconnectServer(authResponses: MutableRef<number>): Effect.Effect<TestServer, unknown, Scope.Scope>;
143
+ declare function sendMalformedFramesAndResponse(conn: TestServerConnection, _raw: string, frame: RequestFrame): Effect.Effect<void>;
144
+ declare function sendPaddedNotificationAndResponse(conn: TestServerConnection, _raw: string, frame: RequestFrame): Effect.Effect<void>;
145
+ declare function sendMalformedFrameBurst(conn: TestServerConnection): Effect.Effect<void>;
146
+ declare function startAgentsLookupByNameServer(captured: MutableRef<RequestFrame | null>): Effect.Effect<TestServer, unknown, Scope.Scope>;
147
+ declare function connectClientForServer(url: string): Effect.Effect<MoltZapWsClient, Effect.Effect.Error<ReturnType<typeof connectClient>>>;
148
+ declare function grantDispatchAuthorizeHandler(observedTaskId: MutableRef<string | null>): (params: ParamsOf<typeof DispatchAuthorize>) => Effect.Effect<{
149
+ admission: {
150
+ decision: "grant";
151
+ };
152
+ }, never, never>;
153
+ /**
154
+ * Promise-returning wrapper that both runs a test Effect and keeps the scope
155
+ * alive until the Effect completes. Tests that need a server scope should
156
+ * use `withTestServer` rather than mutating a Scope manually.
157
+ */
158
+ declare const withTestServer: <A, E>(effect: Effect.Effect<A, E, Scope.Scope>) => Effect.Effect<A, E>;
159
+ /**
160
+ * Poll until `pred()` is true or `maxMs` elapses. The legacy test file used a
161
+ * microtask-based loop; we keep that cadence to match the legacy behaviour
162
+ * when synchronisation is driven by wall-clock timing in the test harness.
163
+ */
164
+ declare function waitFor(pred: () => boolean, { maxMs }?: {
165
+ maxMs?: number;
166
+ }): Effect.Effect<void, WaitForTimeoutError>;
167
+ declare const realSleep: (ms: number) => Effect.Effect<void>;
168
+ declare const closeWaitSocketOutput: Effect.Effect<string, never, never>;
169
+ /**
170
+ * Build a `MoltZapWsClient`. Spec #222 OQ-4 deletion: `onNotification` is no
171
+ * longer a constructor option; tests that previously stashed an
172
+ * `onNotification` callback now register a `subscribe({}, …)` subscription
173
+ * post-construction. The helper accepts the same `onNotification` callback as
174
+ * a convenience and wires it through the new subscription registry,
175
+ * keeping migration noise local to the helper.
176
+ */
177
+ declare function makeClient(url: string, overrides?: MakeClientOverrides): MoltZapWsClient;
178
+ export { AgentsLookupByName, ConversationsList, DispatchAuthorize, Duration, Fiber, ForbiddenError, MessageReceivedNotificationDefinition, MessagesSend, MoltZapWsClient, RpcTimeoutError, TestClock, closeClient, connectClient, connectClientForServer, dispatchRequestParams, effectTest, scopedEffectTest, expectEffectFailure, findClosedLocalPort, findResponseRaw, grantDispatchAuthorizeHandler, makeClient, messageReceivedFrame, sendMalformedFrameBurst, sendMalformedFramesAndResponse, sendPaddedNotificationAndResponse, sendRpcEffect, setRef, startAgentsLookupByNameServer, startDispatchAuthorizeServer, startHandshakingServer, startReconnectServer, startTestServer, validateResponseFrame, waitFor, realSleep, waitForErrorResponse, waitForResponseRaw, withTestServer, closeWaitSocketOutput, JSON_RPC_VERSION, RPC_TIMEOUT_MS, LOCALHOST_HOST, TEST_AGENT_ID, RECONNECT_AGENT_ID, SESSION_A, SESSION_B, NORMAL_CLOSE_CODE, SERVER_ERROR_CLOSE_CODE, CONNECT_FAILURE_MAX_MS, REFUSED_CONNECT_MAX_MS, REFUSED_CONNECT_TEST_TIMEOUT_MS, REALTIME_POLL_TIMEOUT_MS, POST_TIMEOUT_SETTLE_MS, MALFORMED_FRAME_FLUSH_MS, CLIENT_DRAIN_COUNT, CLOSE_PROPAGATION_TIMEOUT_MS, STALE_PORT_TEST_TIMEOUT_MS, CLOSE_INFO_WAIT_MS, HANDLER_REJECTION_CODE, NORMAL_CLOSE_REASON, SERVER_ERROR_REASON, SERVER_TEST_REQUEST_ID, SERVER_ERROR_REQUEST_ID, GRANT_DECISION, DOMAIN_REJECTED_MESSAGE, DOMAIN_REJECTED_REASON, DUPLICATE_HANDLER_ERROR_TAG, TEST_CONVERSATION_ID, };
179
+ export type { CloseInfo, MutableRef, RequestFrame };
180
+ //# sourceMappingURL=ws-client-test-support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-client-test-support.d.ts","sourceRoot":"","sources":["../src/ws-client-test-support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,399 @@
1
+ /**
2
+ * Tests for `ws-client.ts` — now running against a real in-process
3
+ * `@effect/platform` WebSocket server instead of a `vi.mock("ws")` fake.
4
+ *
5
+ * Setup: each test spins up a fresh `NodeSocketServer.makeWebSocket` bound to
6
+ * `127.0.0.1:0` (OS-assigned port). An explicit host is required — omitting
7
+ * it binds `::` which `server.address()` returns verbatim, yielding a
8
+ * non-dialable `ws://:::PORT` URL on Linux/macOS (gotcha §4.11).
9
+ *
10
+ * Coverage matches the §5 invariants + the typed-manifest + malformed-frame
11
+ * cadence tests from the legacy suite. Reconnect-backoff uses real wall-clock
12
+ * timing because the reconnect loop runs on the client's internal
13
+ * `ManagedRuntime`, whose default Clock is out of reach of a test-fiber's
14
+ * `TestClock` (see the `describe("reconnect backoff")` block for details).
15
+ */
16
+ import { createServer } from "node:net";
17
+ import { expect, it } from "vitest";
18
+ import { it as itEffect } from "@effect/vitest";
19
+ import { Cause, Data, Duration, Effect, Exit, Fiber, Option, Scope, TestClock, } from "effect";
20
+ import * as NodeSocketServer from "@effect/platform-node/NodeSocketServer";
21
+ import * as NodeCommandExecutor from "@effect/platform-node/NodeCommandExecutor";
22
+ import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem";
23
+ import * as Command from "@effect/platform/Command";
24
+ import * as Socket from "@effect/platform/Socket";
25
+ import { MoltZapWsClient, RPC_TIMEOUT_MS, } from "./ws-client.js";
26
+ import { ForbiddenError, RpcTimeoutError, } from "@moltzap/protocol";
27
+ import { AgentsLookupByName, DispatchAuthorize, Connect, ConversationsList, MessagesSend, MessageReceivedNotificationDefinition, PROTOCOL_VERSION, } from "@moltzap/protocol";
28
+ import { agentId, conversationId, messageId, JSON_RPC_VERSION, validateRequestFrame, validateResponseFrame, } from "@moltzap/protocol/testing";
29
+ const effectTest = (name, effect, timeout) => {
30
+ const run = () => {
31
+ expect.hasAssertions();
32
+ return Effect.runPromise(effect());
33
+ };
34
+ if (timeout === undefined) {
35
+ it(name, run);
36
+ return;
37
+ }
38
+ it(name, run, timeout);
39
+ };
40
+ const scopedEffectTest = itEffect.scoped;
41
+ // Test fixtures for dispatch/authorize round-trip tests below. The
42
+ // previous partitioned-dispatcher harness provided these via
43
+ // `app-callback-test-requests.ts`; that file was deleted in the
44
+ // cutover. The simpler global-queue topology only needs valid
45
+ // `dispatch/authorize` params shaped to the descriptor.
46
+ const DISPATCH_TASK_A_UUID = "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa";
47
+ const DISPATCH_TASK_B_UUID = "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb";
48
+ const DISPATCH_CONV_UUID = "cccccccc-cccc-4ccc-8ccc-cccccccccccc";
49
+ const DISPATCH_RECIPIENT_UUID = "dddddddd-dddd-4ddd-8ddd-dddddddddddd";
50
+ const DISPATCH_SENDER_UUID = "eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee";
51
+ const DISPATCH_MESSAGE_UUID = "11111111-1111-4111-8111-111111111111";
52
+ const SESSION_A = DISPATCH_TASK_A_UUID;
53
+ const SESSION_B = DISPATCH_TASK_B_UUID;
54
+ const dispatchRequestParams = (taskId) => ({
55
+ taskId,
56
+ appId: "app-test",
57
+ conversationId: DISPATCH_CONV_UUID,
58
+ recipient: { agentId: DISPATCH_RECIPIENT_UUID, ownerId: "owner-test" },
59
+ message: {
60
+ id: DISPATCH_MESSAGE_UUID,
61
+ senderAgentId: DISPATCH_SENDER_UUID,
62
+ parts: [{ type: "text", text: "hello" }],
63
+ },
64
+ attempt: 0,
65
+ });
66
+ // ── Test server helpers ────────────────────────────────────────────────
67
+ const LOCALHOST_HOST = "127.0.0.1";
68
+ const SS_COMMAND = "/usr/bin/ss";
69
+ const TEST_AGENT_ID = agentId("11111111-1111-4111-8111-111111111111");
70
+ const RECONNECT_AGENT_ID = agentId("22222222-2222-4222-8222-222222222222");
71
+ const TEST_MESSAGE_ID = messageId("44444444-4444-4444-8444-444444444444");
72
+ const NORMAL_CLOSE_CODE = 1000;
73
+ const SERVER_ERROR_CLOSE_CODE = 1011;
74
+ const WAIT_FOR_DEFAULT_TIMEOUT_MS = 2_000;
75
+ const CONNECT_FAILURE_MAX_MS = 3_000;
76
+ const REFUSED_CONNECT_MAX_MS = 15_000;
77
+ const REFUSED_CONNECT_TEST_TIMEOUT_MS = 20_000;
78
+ const REALTIME_POLL_TIMEOUT_MS = 2_000;
79
+ const POST_TIMEOUT_SETTLE_MS = 50;
80
+ const MALFORMED_FRAME_COUNT = 101;
81
+ const MALFORMED_FRAME_FLUSH_MS = 300;
82
+ const CLIENT_DRAIN_COUNT = 10;
83
+ const CLOSE_PROPAGATION_TIMEOUT_MS = 1_000;
84
+ const STALE_PORT_TEST_TIMEOUT_MS = 15_000;
85
+ const CLOSE_INFO_WAIT_MS = 2_000;
86
+ const HANDLER_REJECTION_CODE = ForbiddenError.code;
87
+ const WAIT_FOR_POLL_INTERVAL_MS = 5;
88
+ const NORMAL_CLOSE_REASON = "normal";
89
+ const SERVER_ERROR_REASON = "boom";
90
+ const SERVER_TEST_REQUEST_ID = "srv-test-1";
91
+ const SERVER_ERROR_REQUEST_ID = "srv-err-1";
92
+ const GRANT_DECISION = "grant";
93
+ const DOMAIN_REJECTED_MESSAGE = "domain-rejected";
94
+ const DOMAIN_REJECTED_REASON = "test";
95
+ const DUPLICATE_HANDLER_ERROR_TAG = "DuplicateServerRpcHandlerError";
96
+ const TEST_CONVERSATION_ID = conversationId("33333333-3333-4333-8333-333333333333");
97
+ const TEST_POLICY = {
98
+ maxMessageBytes: 1_000_000,
99
+ maxPartsPerMessage: 10,
100
+ maxTextLength: 32_768,
101
+ maxGroupParticipants: 100,
102
+ heartbeatIntervalMs: 30_000,
103
+ rateLimits: {
104
+ messagesPerMinute: 60,
105
+ requestsPerMinute: 120,
106
+ },
107
+ };
108
+ const helloOk = (agentId = TEST_AGENT_ID) => ({
109
+ protocolVersion: PROTOCOL_VERSION,
110
+ agentId,
111
+ policy: TEST_POLICY,
112
+ });
113
+ const TEST_MESSAGE = {
114
+ id: TEST_MESSAGE_ID,
115
+ conversationId: TEST_CONVERSATION_ID,
116
+ senderId: TEST_AGENT_ID,
117
+ parts: [{ type: "text", text: "hello" }],
118
+ createdAt: "2026-05-03T00:00:00.000Z",
119
+ };
120
+ const messageReceivedFrame = () => MessageReceivedNotificationDefinition.encode({
121
+ message: TEST_MESSAGE,
122
+ });
123
+ class ClosedLocalPortError extends Data.TaggedError("ClosedLocalPortError") {
124
+ }
125
+ class WaitForTimeoutError extends Data.TaggedError("WaitForTimeoutError") {
126
+ }
127
+ function rawSocketDataToString(data) {
128
+ return typeof data === "string"
129
+ ? data
130
+ : new TextDecoder("utf-8").decode(data);
131
+ }
132
+ function handleTestServerRawData(conn, receivedList, handler, data) {
133
+ const raw = rawSocketDataToString(data);
134
+ receivedList.push(raw);
135
+ return handler(conn, raw);
136
+ }
137
+ const parseJsonOption = (raw) => Effect.runSync(Effect.try({
138
+ try: () => JSON.parse(raw),
139
+ catch: (cause) => cause,
140
+ }).pipe(Effect.option));
141
+ function responseFrameHasId(raw, id) {
142
+ const parsed = parseJsonOption(raw);
143
+ return (Option.isSome(parsed) &&
144
+ validateResponseFrame(parsed.value) &&
145
+ parsed.value.id === id);
146
+ }
147
+ function errorResponseFrameHasId(raw, id) {
148
+ const parsed = parseJsonOption(raw);
149
+ return (Option.isSome(parsed) &&
150
+ validateResponseFrame(parsed.value) &&
151
+ parsed.value.id === id &&
152
+ "error" in parsed.value);
153
+ }
154
+ function firstConnection(server) {
155
+ return server.connections[0];
156
+ }
157
+ function findResponseRaw(server, id) {
158
+ return firstConnection(server).received.find((raw) => responseFrameHasId(raw, id));
159
+ }
160
+ function waitForResponseRaw(server, id) {
161
+ return waitFor(() => findResponseRaw(server, id) !== undefined, {
162
+ maxMs: CLOSE_INFO_WAIT_MS,
163
+ }).pipe(Effect.map(() => findResponseRaw(server, id)));
164
+ }
165
+ function waitForErrorResponse(server, id) {
166
+ return waitFor(() => firstConnection(server).received.some((raw) => errorResponseFrameHasId(raw, id)), { maxMs: CLOSE_INFO_WAIT_MS });
167
+ }
168
+ function makeTestServerConnection(write, receivedList) {
169
+ return {
170
+ send: (raw) => write(raw).pipe(Effect.ignore),
171
+ close: (code = NORMAL_CLOSE_CODE, reason = "test close") => write(new Socket.CloseEvent(code, reason)).pipe(Effect.ignore),
172
+ get received() {
173
+ return receivedList;
174
+ },
175
+ };
176
+ }
177
+ function runTestServerSocket(connections, handler, serverSock) {
178
+ return Effect.gen(function* () {
179
+ const write = yield* serverSock.writer;
180
+ const receivedList = [];
181
+ const conn = makeTestServerConnection(write, receivedList);
182
+ connections.push(conn);
183
+ yield* serverSock.runRaw((data) => handleTestServerRawData(conn, receivedList, handler, data));
184
+ });
185
+ }
186
+ /**
187
+ * Spin up an in-process `@effect/platform` WS server on `127.0.0.1:0`.
188
+ * Caller owns the provided scope; when it closes, the server shuts down.
189
+ */
190
+ const startTestServer = (handler) => Effect.gen(function* () {
191
+ const server = yield* NodeSocketServer.makeWebSocket({
192
+ port: 0,
193
+ host: LOCALHOST_HOST,
194
+ });
195
+ const addr = server.address;
196
+ if (addr._tag !== "TcpAddress") {
197
+ return yield* Effect.die("expected TcpAddress");
198
+ }
199
+ const connections = [];
200
+ yield* Effect.forkScoped(server
201
+ .run((serverSock) => runTestServerSocket(connections, handler, serverSock))
202
+ .pipe(Effect.ignore));
203
+ return {
204
+ url: `http://${LOCALHOST_HOST}:${addr.port}`,
205
+ get connections() {
206
+ return connections;
207
+ },
208
+ };
209
+ });
210
+ const findClosedLocalPort = () => Effect.async((resume) => {
211
+ const server = createServer();
212
+ const fail = (cause) => {
213
+ resume(Effect.fail(new ClosedLocalPortError({ cause })));
214
+ };
215
+ server.once("error", fail);
216
+ server.listen(0, LOCALHOST_HOST, () => {
217
+ const address = server.address();
218
+ if (address === null || typeof address === "string") {
219
+ server.close();
220
+ fail("expected TCP server address");
221
+ return;
222
+ }
223
+ server.close((err) => {
224
+ if (err) {
225
+ fail(err);
226
+ return;
227
+ }
228
+ resume(Effect.succeed(address.port));
229
+ });
230
+ });
231
+ });
232
+ const ignoreDisconnect = (_close) => undefined;
233
+ const ignoreReconnect = (_hello) => undefined;
234
+ const notificationHandler = (cb) => (frame) => Effect.sync(() => cb(frame));
235
+ const connectClient = (client) => client.connect();
236
+ const sendRpcEffect = (client, definition, params) => client.sendRpc(definition, params);
237
+ function expectEffectFailure(effect, pattern) {
238
+ return Effect.gen(function* () {
239
+ const exit = yield* Effect.exit(effect);
240
+ expect(Exit.isFailure(exit)).toBe(true);
241
+ if (Exit.isFailure(exit)) {
242
+ const failure = Cause.failureOption(exit.cause);
243
+ expect(Option.isSome(failure)).toBe(true);
244
+ if (Option.isSome(failure)) {
245
+ expect(String(failure.value)).toMatch(pattern);
246
+ }
247
+ }
248
+ });
249
+ }
250
+ const closeClient = (client) => client.close();
251
+ /**
252
+ * Start a server whose handler auto-responds to `network/connect` and forwards
253
+ * everything else to the test's `handler`. Useful for tests that only care
254
+ * about post-handshake behaviour.
255
+ */
256
+ const startHandshakingServer = (handler) => startTestServer((conn, raw) => Effect.gen(function* () {
257
+ const parsed = JSON.parse(raw);
258
+ if (!validateRequestFrame(parsed)) {
259
+ return yield* Effect.die("expected JSON-RPC request frame");
260
+ }
261
+ const frame = parsed;
262
+ if (frame.method === Connect.name) {
263
+ yield* conn.send(JSON.stringify(Connect.encodeResponse(frame.id, helloOk())));
264
+ return;
265
+ }
266
+ yield* handler(conn, raw, frame);
267
+ }));
268
+ function sendDispatchAuthorizeAfterConnect(conn, raw, requestId, params) {
269
+ return Effect.gen(function* () {
270
+ const parsed = JSON.parse(raw);
271
+ if (!validateRequestFrame(parsed)) {
272
+ return yield* Effect.die("expected JSON-RPC request frame");
273
+ }
274
+ const frame = parsed;
275
+ if (frame.method === Connect.name) {
276
+ yield* conn.send(JSON.stringify(Connect.encodeResponse(frame.id, helloOk())));
277
+ yield* conn.send(JSON.stringify(DispatchAuthorize.encodeRequest(requestId, params)));
278
+ }
279
+ });
280
+ }
281
+ function startDispatchAuthorizeServer(requestId, params) {
282
+ return startTestServer((conn, raw) => sendDispatchAuthorizeAfterConnect(conn, raw, requestId, params));
283
+ }
284
+ const setRef = (ref) => (value) => {
285
+ ref.current = value;
286
+ };
287
+ function startReconnectServer(authResponses) {
288
+ return startTestServer((conn, raw) => Effect.gen(function* () {
289
+ const parsed = JSON.parse(raw);
290
+ if (!validateRequestFrame(parsed)) {
291
+ return yield* Effect.die("expected JSON-RPC request frame");
292
+ }
293
+ const frame = parsed;
294
+ if (frame.method === Connect.name) {
295
+ authResponses.current += 1;
296
+ yield* conn.send(JSON.stringify(Connect.encodeResponse(frame.id, helloOk(RECONNECT_AGENT_ID))));
297
+ }
298
+ }));
299
+ }
300
+ function sendMalformedFramesAndResponse(conn, _raw, frame) {
301
+ return Effect.gen(function* () {
302
+ if (frame.method !== ConversationsList.name)
303
+ return;
304
+ yield* conn.send("not json at all");
305
+ yield* conn.send(JSON.stringify({ jsonrpc: JSON_RPC_VERSION, result: {} }));
306
+ yield* conn.send(JSON.stringify({ jsonrpc: JSON_RPC_VERSION, id: frame.id }));
307
+ yield* conn.send(JSON.stringify(ConversationsList.encodeResponse(frame.id, {
308
+ conversations: [],
309
+ })));
310
+ });
311
+ }
312
+ function sendPaddedNotificationAndResponse(conn, _raw, frame) {
313
+ if (frame.method !== ConversationsList.name)
314
+ return Effect.void;
315
+ return conn.send(JSON.stringify(messageReceivedFrame()) +
316
+ "\u0000" +
317
+ JSON.stringify(ConversationsList.encodeResponse(frame.id, {
318
+ conversations: [],
319
+ })));
320
+ }
321
+ function sendMalformedFrameBurst(conn) {
322
+ return Effect.gen(function* () {
323
+ for (let i = 0; i < MALFORMED_FRAME_COUNT; i++) {
324
+ yield* conn.send("definitely not json " + i);
325
+ }
326
+ });
327
+ }
328
+ function startAgentsLookupByNameServer(captured) {
329
+ return startHandshakingServer((conn, _raw, frame) => Effect.gen(function* () {
330
+ captured.current = frame;
331
+ yield* conn.send(JSON.stringify(AgentsLookupByName.encodeResponse(frame.id, { agents: [] })));
332
+ }));
333
+ }
334
+ function connectClientForServer(url) {
335
+ const client = makeClient(url);
336
+ return connectClient(client).pipe(Effect.map(() => client));
337
+ }
338
+ function grantDispatchAuthorizeHandler(observedTaskId) {
339
+ return (params) => Effect.sync(() => {
340
+ observedTaskId.current = params.taskId;
341
+ return { admission: { decision: GRANT_DECISION } };
342
+ });
343
+ }
344
+ /**
345
+ * Promise-returning wrapper that both runs a test Effect and keeps the scope
346
+ * alive until the Effect completes. Tests that need a server scope should
347
+ * use `withTestServer` rather than mutating a Scope manually.
348
+ */
349
+ const withTestServer = (effect) => Effect.scoped(effect);
350
+ /**
351
+ * Poll until `pred()` is true or `maxMs` elapses. The legacy test file used a
352
+ * microtask-based loop; we keep that cadence to match the legacy behaviour
353
+ * when synchronisation is driven by wall-clock timing in the test harness.
354
+ */
355
+ function waitFor(pred, { maxMs = WAIT_FOR_DEFAULT_TIMEOUT_MS } = {}) {
356
+ const deadline = Date.now() + maxMs;
357
+ return Effect.async((resume) => {
358
+ const tick = () => {
359
+ if (pred()) {
360
+ resume(Effect.void);
361
+ return;
362
+ }
363
+ if (Date.now() > deadline) {
364
+ resume(Effect.fail(new WaitForTimeoutError({ timeoutMs: maxMs })));
365
+ return;
366
+ }
367
+ setTimeout(tick, WAIT_FOR_POLL_INTERVAL_MS);
368
+ };
369
+ tick();
370
+ });
371
+ }
372
+ const realSleep = (ms) => Effect.async((resume) => {
373
+ const timer = setTimeout(() => resume(Effect.void), ms);
374
+ return Effect.sync(() => clearTimeout(timer));
375
+ });
376
+ const closeWaitSocketOutput = Command.make(SS_COMMAND, "-tn", "state", "CLOSE-WAIT").pipe(Command.string, Effect.catchAll(() => Effect.succeed("")), Effect.provide(NodeCommandExecutor.layer), Effect.provide(NodeFileSystem.layer));
377
+ /**
378
+ * Build a `MoltZapWsClient`. Spec #222 OQ-4 deletion: `onNotification` is no
379
+ * longer a constructor option; tests that previously stashed an
380
+ * `onNotification` callback now register a `subscribe({}, …)` subscription
381
+ * post-construction. The helper accepts the same `onNotification` callback as
382
+ * a convenience and wires it through the new subscription registry,
383
+ * keeping migration noise local to the helper.
384
+ */
385
+ function makeClient(url, overrides = {}) {
386
+ const { onNotification, onDisconnect = ignoreDisconnect, onReconnect = ignoreReconnect, } = overrides;
387
+ const client = new MoltZapWsClient({
388
+ serverUrl: url,
389
+ agentKey: "test-key",
390
+ onDisconnect,
391
+ onReconnect,
392
+ });
393
+ if (onNotification !== undefined) {
394
+ Effect.runSync(client.subscribe({}, notificationHandler(onNotification)));
395
+ }
396
+ return client;
397
+ }
398
+ export { AgentsLookupByName, ConversationsList, DispatchAuthorize, Duration, Fiber, ForbiddenError, MessageReceivedNotificationDefinition, MessagesSend, MoltZapWsClient, RpcTimeoutError, TestClock, closeClient, connectClient, connectClientForServer, dispatchRequestParams, effectTest, scopedEffectTest, expectEffectFailure, findClosedLocalPort, findResponseRaw, grantDispatchAuthorizeHandler, makeClient, messageReceivedFrame, sendMalformedFrameBurst, sendMalformedFramesAndResponse, sendPaddedNotificationAndResponse, sendRpcEffect, setRef, startAgentsLookupByNameServer, startDispatchAuthorizeServer, startHandshakingServer, startReconnectServer, startTestServer, validateResponseFrame, waitFor, realSleep, waitForErrorResponse, waitForResponseRaw, withTestServer, closeWaitSocketOutput, JSON_RPC_VERSION, RPC_TIMEOUT_MS, LOCALHOST_HOST, TEST_AGENT_ID, RECONNECT_AGENT_ID, SESSION_A, SESSION_B, NORMAL_CLOSE_CODE, SERVER_ERROR_CLOSE_CODE, CONNECT_FAILURE_MAX_MS, REFUSED_CONNECT_MAX_MS, REFUSED_CONNECT_TEST_TIMEOUT_MS, REALTIME_POLL_TIMEOUT_MS, POST_TIMEOUT_SETTLE_MS, MALFORMED_FRAME_FLUSH_MS, CLIENT_DRAIN_COUNT, CLOSE_PROPAGATION_TIMEOUT_MS, STALE_PORT_TEST_TIMEOUT_MS, CLOSE_INFO_WAIT_MS, HANDLER_REJECTION_CODE, NORMAL_CLOSE_REASON, SERVER_ERROR_REASON, SERVER_TEST_REQUEST_ID, SERVER_ERROR_REQUEST_ID, GRANT_DECISION, DOMAIN_REJECTED_MESSAGE, DOMAIN_REJECTED_REASON, DUPLICATE_HANDLER_ERROR_TAG, TEST_CONVERSATION_ID, };
399
+ //# sourceMappingURL=ws-client-test-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-client-test-support.js","sourceRoot":"","sources":["../src/ws-client-test-support.ts"],"names":[],"mappings":"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"}