@moltzap/client 2026.511.0 → 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 +46 -20
  161. package/dist/service.d.ts.map +1 -1
  162. package/dist/service.js +243 -340
  163. package/dist/service.js.map +1 -1
  164. package/dist/service.test.js +650 -571
  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,20 @@
1
+ import { Effect, Scope } from "effect";
2
+ import { type LocalDaemonParams } from "../local-daemon-rpc.js";
3
+ interface LocalSocketServerOptions {
4
+ readonly socketPath: string;
5
+ readonly defaultSocketPath: string;
6
+ readonly handleRequest: (method: string, params: LocalDaemonParams) => Effect.Effect<unknown, unknown>;
7
+ }
8
+ export interface RunningLocalSocketServer {
9
+ readonly socketScope: Scope.CloseableScope;
10
+ readonly socketPath: string;
11
+ }
12
+ interface StopLocalSocketServerOptions {
13
+ readonly socketScope: Scope.CloseableScope | null;
14
+ readonly socketPath: string;
15
+ readonly defaultSocketPath: string;
16
+ }
17
+ export declare function startLocalSocketServer(options: LocalSocketServerOptions): Effect.Effect<RunningLocalSocketServer, unknown, never>;
18
+ export declare function stopLocalSocketServer(options: StopLocalSocketServerOptions): Effect.Effect<void, never>;
19
+ export {};
20
+ //# sourceMappingURL=local-socket-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-socket-server.d.ts","sourceRoot":"","sources":["../../src/runtime/local-socket-server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAuB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAMhC,UAAU,wBAAwB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,CACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,KACtB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,4BAA4B;IACpC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAsGD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,wBAAwB,GAChC,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,OAAO,EAAE,KAAK,CAAC,CAazD;AAqCD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAc5B"}
@@ -0,0 +1,94 @@
1
+ import { FileSystem, Path } from "@effect/platform";
2
+ import * as SocketServer from "@effect/platform/SocketServer";
3
+ import { NodeContext } from "@effect/platform-node";
4
+ import * as NodeSocketServer from "@effect/platform-node/NodeSocketServer";
5
+ import { RpcSerialization, RpcServer } from "@effect/rpc";
6
+ import { Effect, Either, Exit, Layer, Scope } from "effect";
7
+ import { LocalDaemonRpcs, } from "../local-daemon-rpc.js";
8
+ const SOCKET_FILE_MODE = 0o600;
9
+ function logFileSystemIssue(level, message, error) {
10
+ return (level === "warn" ? Effect.logWarning : Effect.logInfo)(message, error);
11
+ }
12
+ const errorMessage = (error) => error instanceof Error ? error.message : String(error);
13
+ function closeScope(scope) {
14
+ return Scope.close(scope, Exit.succeed(undefined));
15
+ }
16
+ function prepareSocketPath(socketPath) {
17
+ return Effect.gen(function* () {
18
+ const fileSystem = yield* FileSystem.FileSystem;
19
+ const path = yield* Path.Path;
20
+ yield* fileSystem
21
+ .remove(socketPath, { force: true })
22
+ .pipe(Effect.catchAll((error) => logFileSystemIssue("warn", "unlink existing socket failed", error)));
23
+ yield* fileSystem.makeDirectory(path.dirname(socketPath), {
24
+ recursive: true,
25
+ });
26
+ });
27
+ }
28
+ function makeSocketServer(socketPath, socketScope) {
29
+ return NodeSocketServer.make({ path: socketPath }).pipe(Scope.extend(socketScope), Effect.tapError(() => closeScope(socketScope)));
30
+ }
31
+ function buildHandlerLayer(options) {
32
+ return LocalDaemonRpcs.toLayer({
33
+ LocalDaemonCall: ({ method, params }) => options.handleRequest(method, params).pipe(Effect.mapError(errorMessage)),
34
+ });
35
+ }
36
+ function buildSocketRpcLayer(server, socketScope, options) {
37
+ const rpcLayer = RpcServer.layer(LocalDaemonRpcs).pipe(Layer.provide(buildHandlerLayer(options)), Layer.provide(RpcServer.layerProtocolSocketServer), Layer.provide(RpcSerialization.layerNdjson), Layer.provide(Layer.succeed(SocketServer.SocketServer, server)));
38
+ return Layer.build(rpcLayer).pipe(Scope.extend(socketScope), Effect.tapError(() => closeScope(socketScope)));
39
+ }
40
+ function chmodSocketPath(socketPath) {
41
+ return FileSystem.FileSystem.pipe(Effect.flatMap((fileSystem) => fileSystem.chmod(socketPath, SOCKET_FILE_MODE)), Effect.catchAll((error) => logFileSystemIssue("warn", "chmod 0600 on socket failed", error)));
42
+ }
43
+ function installDefaultSocketSymlink(options) {
44
+ return Effect.gen(function* () {
45
+ const fileSystem = yield* FileSystem.FileSystem;
46
+ yield* fileSystem
47
+ .remove(options.defaultSocketPath, { force: true })
48
+ .pipe(Effect.catchAll((error) => logFileSystemIssue("info", "unlink default socket symlink", error)));
49
+ yield* fileSystem
50
+ .symlink(options.socketPath, options.defaultSocketPath)
51
+ .pipe(Effect.catchAll((error) => logFileSystemIssue("warn", "symlink default socket failed", error)));
52
+ });
53
+ }
54
+ export function startLocalSocketServer(options) {
55
+ return Effect.gen(function* () {
56
+ yield* prepareSocketPath(options.socketPath);
57
+ const socketScope = yield* Scope.make();
58
+ const server = yield* makeSocketServer(options.socketPath, socketScope);
59
+ yield* buildSocketRpcLayer(server, socketScope, options);
60
+ yield* chmodSocketPath(options.socketPath);
61
+ yield* installDefaultSocketSymlink(options);
62
+ return { socketScope, socketPath: options.socketPath };
63
+ }).pipe(Effect.withSpan("startLocalSocketServer"), Effect.provide(NodeContext.layer));
64
+ }
65
+ function removeSocketPath(socketPath) {
66
+ return FileSystem.FileSystem.pipe(Effect.flatMap((fileSystem) => fileSystem.remove(socketPath, { force: true })), Effect.catchAll((error) => logFileSystemIssue("info", "unlink socket path", error)));
67
+ }
68
+ function removeDefaultSocketSymlinkIfOwned(options) {
69
+ return Effect.gen(function* () {
70
+ const fileSystem = yield* FileSystem.FileSystem;
71
+ const target = yield* fileSystem
72
+ .readLink(options.defaultSocketPath)
73
+ .pipe(Effect.either);
74
+ const shouldRemoveDefaultSocket = Either.match(target, {
75
+ onLeft: () => false,
76
+ onRight: (value) => value === options.socketPath,
77
+ });
78
+ if (!shouldRemoveDefaultSocket)
79
+ return;
80
+ yield* fileSystem
81
+ .remove(options.defaultSocketPath, { force: true })
82
+ .pipe(Effect.catchAll((error) => logFileSystemIssue("info", "cleanup default symlink", error)));
83
+ });
84
+ }
85
+ export function stopLocalSocketServer(options) {
86
+ return Effect.gen(function* () {
87
+ if (options.socketScope !== null) {
88
+ yield* closeScope(options.socketScope);
89
+ }
90
+ yield* removeSocketPath(options.socketPath);
91
+ yield* removeDefaultSocketSymlinkIfOwned(options);
92
+ }).pipe(Effect.withSpan("stopLocalSocketServer"), Effect.provide(NodeContext.layer), Effect.catchAll((error) => logFileSystemIssue("info", "cleanup default symlink", error)));
93
+ }
94
+ //# sourceMappingURL=local-socket-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-socket-server.js","sourceRoot":"","sources":["../../src/runtime/local-socket-server.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { HashMap, Ref } from "effect";
2
2
  /**
3
3
  * Read a `Ref` synchronously outside an Effect scope. Only safe for `Ref`s
4
- * that never fiber-park (the stock `Ref.Ref<A>` never does). Use from
4
+ * that never fiber-park (the stock `Ref.Ref&lt;A>` never does). Use from
5
5
  * object methods or sync code paths that hold a `Ref` set up at construction.
6
6
  */
7
7
  export declare const snapshot: <A>(ref: Ref.Ref<A>) => A;
@@ -1,7 +1,7 @@
1
1
  import { Effect, HashMap, Option, Ref } from "effect";
2
2
  /**
3
3
  * Read a `Ref` synchronously outside an Effect scope. Only safe for `Ref`s
4
- * that never fiber-park (the stock `Ref.Ref<A>` never does). Use from
4
+ * that never fiber-park (the stock `Ref.Ref&lt;A>` never does). Use from
5
5
  * object methods or sync code paths that hold a `Ref` set up at construction.
6
6
  */
7
7
  export const snapshot = (ref) => Effect.runSync(Ref.get(ref));
@@ -1,29 +1,37 @@
1
- import { it } from "@effect/vitest";
2
- import { Effect, Exit } from "effect";
3
- import { expect, it as itSync } from "vitest";
1
+ import { Cause, Effect, Exit, Option } from "effect";
2
+ import { expect, it } from "vitest";
4
3
  import { MessagesSend, NotConnectedError, RpcServerError, RpcTimeoutError, } from "@moltzap/protocol";
5
- it.effect("tagged errors discriminate by _tag", () => Effect.gen(function* () {
6
- const exit = yield* Effect.exit(Effect.fail(new RpcTimeoutError({ method: MessagesSend.name, timeoutMs: 30_000 })));
7
- if (Exit.isFailure(exit) && exit.cause._tag === "Fail") {
8
- const err = exit.cause.error;
9
- expect(err._tag).toBe("RpcTimeoutError");
10
- expect(err.method).toBe(MessagesSend.name);
4
+ const RPC_TIMEOUT_MS = 30_000;
5
+ const NOT_FOUND_CODE = -32002;
6
+ const RPC_TIMEOUT_TAG = "RpcTimeoutError";
7
+ const NOT_FOUND_MESSAGE = "Not found";
8
+ const SOCKET_CLOSED_MESSAGE = "socket closed";
9
+ it("tagged errors discriminate by _tag", () => Effect.runPromise(Effect.gen(function* () {
10
+ const exit = yield* Effect.exit(Effect.fail(new RpcTimeoutError({
11
+ method: MessagesSend.name,
12
+ timeoutMs: RPC_TIMEOUT_MS,
13
+ })));
14
+ expect(Exit.isFailure(exit)).toBe(true);
15
+ if (Exit.isFailure(exit)) {
16
+ const err = Option.getOrNull(Cause.failureOption(exit.cause));
17
+ expect(err).toBeInstanceOf(RpcTimeoutError);
18
+ if (err instanceof RpcTimeoutError) {
19
+ expect(err._tag).toBe(RPC_TIMEOUT_TAG);
20
+ expect(err.method).toBe(MessagesSend.name);
21
+ }
11
22
  }
12
- else {
13
- throw new Error("expected failure");
14
- }
15
- }));
16
- itSync("RpcServerError preserves wire fields", () => {
23
+ })));
24
+ it("RpcServerError preserves wire fields", () => {
17
25
  const err = new RpcServerError({
18
- code: -32002,
19
- message: "Not found",
26
+ code: NOT_FOUND_CODE,
27
+ message: NOT_FOUND_MESSAGE,
20
28
  });
21
- expect(err.code).toBe(-32002);
22
- expect(err.message).toBe("Not found");
29
+ expect(err.code).toBe(NOT_FOUND_CODE);
30
+ expect(err.message).toBe(NOT_FOUND_MESSAGE);
23
31
  expect(err.data).toBeUndefined();
24
32
  });
25
- itSync("NotConnectedError compiles and carries message", () => {
26
- const err = new NotConnectedError({ message: "socket closed" });
27
- expect(err.message).toBe("socket closed");
33
+ it("NotConnectedError compiles and carries message", () => {
34
+ const err = new NotConnectedError({ message: SOCKET_CLOSED_MESSAGE });
35
+ expect(err.message).toBe(SOCKET_CLOSED_MESSAGE);
28
36
  });
29
37
  //# sourceMappingURL=runtime.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.test.js","sourceRoot":"","sources":["../../src/runtime/runtime.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,EAAE,CAAC,MAAM,CAAC,oCAAoC,EAAE,GAAG,EAAE,CACnD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAC7B,MAAM,CAAC,IAAI,CACT,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CACtE,CACF,CAAC;IACF,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;AACH,CAAC,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,sCAAsC,EAAE,GAAG,EAAE;IAClD,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC;QAC7B,IAAI,EAAE,CAAC,KAAK;QACZ,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC5D,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"runtime.test.js","sourceRoot":"","sources":["../../src/runtime/runtime.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC;AAC9B,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAC1C,MAAM,iBAAiB,GAAG,WAAW,CAAC;AACtC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAE9C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE,CAC5C,MAAM,CAAC,UAAU,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAC7B,MAAM,CAAC,IAAI,CACT,IAAI,eAAe,CAAC;QAClB,MAAM,EAAE,YAAY,CAAC,IAAI;QACzB,SAAS,EAAE,cAAc;KAC1B,CAAC,CACH,CACF,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAC5C,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CACH,CAAC,CAAC;AAEL,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;IAC9C,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC;QAC7B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,iBAAiB;KAC3B,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;IACxD,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type AnyNotificationDefinition, type DecodedNotification, type Message, type Part } from "@moltzap/protocol";
2
+ import { HashMap } from "effect";
3
+ import type { ConversationMeta, CrossConversationEntry } from "../service.js";
4
+ declare const ServiceInputError_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 & {
5
+ readonly _tag: "ServiceInputError";
6
+ } & Readonly<A>;
7
+ export declare class ServiceInputError extends ServiceInputError_base<{
8
+ readonly message: string;
9
+ }> {
10
+ }
11
+ export interface CrossConvState {
12
+ readonly messagesMap: HashMap.HashMap<string, ReadonlyArray<Message>>;
13
+ readonly conversationsMap: HashMap.HashMap<string, ConversationMeta>;
14
+ readonly agentNamesMap: HashMap.HashMap<string, string>;
15
+ readonly viewMarkers: HashMap.HashMap<string, string>;
16
+ }
17
+ export interface ContextCandidate {
18
+ readonly convId: string;
19
+ readonly newMsgs: ReadonlyArray<Message>;
20
+ readonly lastTs: number;
21
+ }
22
+ interface BuiltContextEntries {
23
+ readonly entries: CrossConversationEntry[];
24
+ readonly pendingAdvances: ReadonlyArray<readonly [string, string]>;
25
+ }
26
+ export declare const renderPart: (part: Part) => string;
27
+ export declare function newMessagesForConversation(convId: string, messages: ReadonlyArray<Message>, viewMarkers: HashMap.HashMap<string, string>, currentConvId: string): ReadonlyArray<Message>;
28
+ export declare function makeContextCandidate(convId: string, newMsgs: ReadonlyArray<Message>): ContextCandidate;
29
+ export declare function buildContextEntries(candidates: ReadonlyArray<ContextCandidate>, state: CrossConvState, maxMessagesPerConv: number): BuiltContextEntries;
30
+ export declare function notificationTraceRecord(notification: DecodedNotification<AnyNotificationDefinition>, agentId: string | undefined): Record<string, unknown>;
31
+ export {};
32
+ //# sourceMappingURL=service-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-helpers.d.ts","sourceRoot":"","sources":["../../src/runtime/service-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,IAAI,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAQ,OAAO,EAAiB,MAAM,QAAQ,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;;;;AAK9E,qBAAa,iBAAkB,SAAQ,uBAAsC;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACrE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpE;AAwBD,eAAO,MAAM,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAMxC,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAChC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5C,aAAa,EAAE,MAAM,GACpB,aAAa,CAAC,OAAO,CAAC,CAQxB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,GAC9B,gBAAgB,CAOlB;AAyCD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,aAAa,CAAC,gBAAgB,CAAC,EAC3C,KAAK,EAAE,cAAc,EACrB,kBAAkB,EAAE,MAAM,GACzB,mBAAmB,CAarB;AAQD,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,EAC5D,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
@@ -0,0 +1,85 @@
1
+ import {} from "@moltzap/protocol";
2
+ import { Data, HashMap, Match, Option } from "effect";
3
+ import { getOr } from "./refs.js";
4
+ const MILLISECONDS_PER_MINUTE = 60_000;
5
+ export class ServiceInputError extends Data.TaggedError("ServiceInputError") {
6
+ }
7
+ const isPlainRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
8
+ const recordOrEmpty = (value) => isPlainRecord(value) ? value : {};
9
+ const recordProperty = (record, key) => {
10
+ const value = record[key];
11
+ return isPlainRecord(value) ? value : undefined;
12
+ };
13
+ const stringProperty = (record, key) => {
14
+ const value = record[key];
15
+ return typeof value === "string" ? value : undefined;
16
+ };
17
+ export const renderPart = Match.type().pipe(Match.discriminatorsExhaustive("type")({
18
+ text: (text) => text.text,
19
+ image: () => "[image]",
20
+ file: (file) => `[file: ${file.name}]`,
21
+ }));
22
+ export function newMessagesForConversation(convId, messages, viewMarkers, currentConvId) {
23
+ if (convId === currentConvId || messages.length === 0)
24
+ return [];
25
+ const lastSeenId = Option.getOrUndefined(HashMap.get(viewMarkers, convId));
26
+ const lastSeenIndex = lastSeenId !== undefined
27
+ ? messages.findIndex((message) => message.id === lastSeenId)
28
+ : -1;
29
+ return messages.slice(lastSeenIndex + 1);
30
+ }
31
+ export function makeContextCandidate(convId, newMsgs) {
32
+ const last = newMsgs[newMsgs.length - 1];
33
+ return {
34
+ convId,
35
+ newMsgs,
36
+ lastTs: new Date(last.createdAt).getTime(),
37
+ };
38
+ }
39
+ function minutesSince(timestamp) {
40
+ return Math.max(0, Math.round((Date.now() - new Date(timestamp).getTime()) / MILLISECONDS_PER_MINUTE));
41
+ }
42
+ function contextEntryForCandidate(candidate, state, maxMessagesPerConv) {
43
+ const reportable = candidate.newMsgs.slice(-maxMessagesPerConv);
44
+ const last = reportable[reportable.length - 1];
45
+ const senderName = getOr(state.agentNamesMap, last.senderId, () => last.senderId);
46
+ return {
47
+ entry: {
48
+ conversationId: candidate.convId,
49
+ conversationName: Option.getOrUndefined(HashMap.get(state.conversationsMap, candidate.convId))?.name,
50
+ senderName,
51
+ text: last.parts.map(renderPart).join(" "),
52
+ minutesAgo: minutesSince(last.createdAt),
53
+ count: reportable.length,
54
+ },
55
+ advance: [candidate.convId, last.id],
56
+ };
57
+ }
58
+ export function buildContextEntries(candidates, state, maxMessagesPerConv) {
59
+ const entries = [];
60
+ const pendingAdvances = [];
61
+ for (const candidate of candidates) {
62
+ const { entry, advance } = contextEntryForCandidate(candidate, state, maxMessagesPerConv);
63
+ entries.push(entry);
64
+ pendingAdvances.push(advance);
65
+ }
66
+ return { entries, pendingAdvances };
67
+ }
68
+ const traceConversationId = (conversation, fallback) => conversation === undefined ? fallback : (conversation["id"] ?? fallback);
69
+ export function notificationTraceRecord(notification, agentId) {
70
+ const params = recordOrEmpty(notification.params);
71
+ const message = recordProperty(params, "message");
72
+ const conversation = recordProperty(params, "conversation");
73
+ const notificationConversationId = stringProperty(params, "conversationId");
74
+ return {
75
+ ts: new Date().toISOString(),
76
+ agentId: agentId ?? "unknown",
77
+ notification: notification.method,
78
+ messageId: message?.["id"],
79
+ messageConversationId: message?.["conversationId"],
80
+ messageSenderId: message?.["senderId"],
81
+ conversationId: traceConversationId(conversation, notificationConversationId),
82
+ conversationName: conversation?.["name"],
83
+ };
84
+ }
85
+ //# sourceMappingURL=service-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-helpers.js","sourceRoot":"","sources":["../../src/runtime/service-helpers.ts"],"names":[],"mappings":"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"}
@@ -24,10 +24,10 @@
24
24
  * unsubscribed state.
25
25
  *
26
26
  * Error channel: handlers are invoked inside a defect-catcher; a throw is
27
- * logged via the client's injected `WsClientLogger` and swallowed
28
- * (matching the prior `onNotification` contract at `ws-client.ts:650-655`
29
- * pre-deletion). The registry itself has no typed error surface —
30
- * `register`, `dispatch`, and `closeAll` are `Effect<T, never>`.
27
+ * logged through Effect logging and swallowed (matching the prior
28
+ * `onNotification` contract at `ws-client.ts:650-655` pre-deletion). The
29
+ * registry itself has no typed error surface — `register`, `dispatch`, and
30
+ * `closeAll` are `Effect&lt;T, never>`.
31
31
  */
32
32
  import { Brand, Effect } from "effect";
33
33
  import type { AnyNotificationDefinition, DecodedNotification } from "@moltzap/protocol";
@@ -37,7 +37,6 @@ interface FilterableNotificationFrame {
37
37
  }
38
38
  /** Branded identifier for a subscription handle. Minted by `register`. */
39
39
  export type SubscriptionId = string & Brand.Brand<"SubscriptionId">;
40
- export declare const SubscriptionId: Brand.Brand.Constructor<SubscriptionId>;
41
40
  /**
42
41
  * Filter grammar for `subscribe`. A notification is delivered to a subscription
43
42
  * iff it matches **every** field that is set on the filter. Unset fields
@@ -70,7 +69,7 @@ export interface SubscriptionFilter {
70
69
  * holds the handle for its subscription's lifetime and runs
71
70
  * `unsubscribe` to stop delivery.
72
71
  *
73
- * `unsubscribe` is `Effect<void, never>`: it is idempotent and total.
72
+ * `unsubscribe` is `Effect&lt;void, never>`: it is idempotent and total.
74
73
  * Calling `unsubscribe` a second time, or after `closeAll`, is a no-op.
75
74
  */
76
75
  export interface NotificationSubscription {
@@ -79,13 +78,13 @@ export interface NotificationSubscription {
79
78
  }
80
79
  /**
81
80
  * Per-subscription handler signature. Runs inside the registry's
82
- * dispatch fiber. Must not throw — throws are caught by the registry,
83
- * logged via the injected logger, and swallowed.
81
+ * dispatch fiber. Must not throw — throws are caught by the registry, logged,
82
+ * and swallowed.
84
83
  *
85
84
  * The frame is a known-descriptor `DecodedNotification` (post-S9
86
85
  * fail-close: malformed / unknown-method frames are rejected before
87
86
  * dispatch). Handlers receive validated `params` typed as
88
- * `NotificationParamsOf<D>` for the matching definition.
87
+ * `NotificationParamsOf&lt;D>` for the matching definition.
89
88
  *
90
89
  * Returning an `Effect` (not a plain `void`) lets handlers compose with
91
90
  * Effect-native downstream code without an extra runSync shim. The
@@ -117,9 +116,9 @@ export interface SubscriberRegistry {
117
116
  * live-subscription list at the start of dispatch so
118
117
  * unsubscribe-during-dispatch observes next-frame semantics (OQ-3 A).
119
118
  *
120
- * Frames are pre-validation (`DecodedNotification<AnyNotificationDefinition>` union) — the
119
+ * Frames are pre-validation (`DecodedNotification&lt;AnyNotificationDefinition>` union) — the
121
120
  * type-system contract that subscribers see RAW frames, not the lifted
122
- * `DecodedNotification<D>` shape that typed handlers see.
121
+ * `DecodedNotification&lt;D>` shape that typed handlers see.
123
122
  *
124
123
  * Dispatch order: registration order, iterated sequentially; slow
125
124
  * handlers block later subscriptions for this frame but never
@@ -134,11 +133,10 @@ export interface SubscriberRegistry {
134
133
  }
135
134
  /**
136
135
  * Construct an empty registry. Called once from the `MoltZapWsClient`
137
- * constructor. Takes a logger so registry-internal error logs reach the
138
- * same sink as the rest of the client.
136
+ * constructor.
139
137
  *
140
138
  * Implementation notes:
141
- * - Live subscriptions are stored in a `Ref<ReadonlyArray<…>>` keyed
139
+ * - Live subscriptions are stored in a `Ref&lt;ReadonlyArray&lt;…>>` keyed
142
140
  * by registration order. Append-on-register, filter-on-unsubscribe
143
141
  * keeps the dispatch path O(N) with N = live subscription count.
144
142
  * Bigger structures aren't justified at the expected sub count
@@ -151,9 +149,7 @@ export interface SubscriberRegistry {
151
149
  * surfaces as a defect; we log + swallow to match the pre-deletion
152
150
  * `onNotification` contract.
153
151
  */
154
- export declare function makeSubscriberRegistry(logger: {
155
- readonly warn: (...args: ReadonlyArray<unknown>) => void;
156
- }): Effect.Effect<SubscriberRegistry, never>;
152
+ export declare function makeSubscriberRegistry(): Effect.Effect<SubscriberRegistry, never>;
157
153
  /**
158
154
  * Pure filter-match predicate. Exposed for unit testing so executable
159
155
  * client-side divergence proofs can force known-bad subscription
@@ -1 +1 @@
1
- {"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,UAAU,2BAA2B;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACpE,eAAO,MAAM,cAAc,yCAAkC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAClD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,KAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,iBAAiB,KACvB,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAEpD;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,KAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAC/C;AAcD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CAC1D,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CA8C3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAmBT"}
1
+ {"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,UAAU,2BAA2B;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAGpE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAClD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,KAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,iBAAiB,KACvB,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAEpD;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,KAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAC/C;AAiDD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,CACrD,kBAAkB,EAClB,KAAK,CACN,CAoCA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAiBT"}
@@ -24,23 +24,34 @@
24
24
  * unsubscribed state.
25
25
  *
26
26
  * Error channel: handlers are invoked inside a defect-catcher; a throw is
27
- * logged via the client's injected `WsClientLogger` and swallowed
28
- * (matching the prior `onNotification` contract at `ws-client.ts:650-655`
29
- * pre-deletion). The registry itself has no typed error surface —
30
- * `register`, `dispatch`, and `closeAll` are `Effect<T, never>`.
27
+ * logged through Effect logging and swallowed (matching the prior
28
+ * `onNotification` contract at `ws-client.ts:650-655` pre-deletion). The
29
+ * registry itself has no typed error surface — `register`, `dispatch`, and
30
+ * `closeAll` are `Effect&lt;T, never>`.
31
31
  */
32
32
  import { Brand, Effect, Ref } from "effect";
33
- export const SubscriptionId = Brand.nominal();
33
+ const SubscriptionIdBrand = Brand.nominal();
34
+ function nextSubscriptionId(counterRef) {
35
+ return Ref.updateAndGet(counterRef, (count) => count + 1).pipe(Effect.map((count) => SubscriptionIdBrand(`sub-${count}`)));
36
+ }
37
+ function appendSubscription(subsRef, live) {
38
+ return Ref.update(subsRef, (subscriptions) => [...subscriptions, live]);
39
+ }
40
+ function removeSubscription(subsRef, id) {
41
+ return Ref.update(subsRef, (subscriptions) => subscriptions.filter((subscription) => subscription.id !== id));
42
+ }
43
+ function dispatchToSubscriber(sub, frame) {
44
+ return Effect.suspend(() => sub.handler(frame)).pipe(Effect.catchAllDefect((err) => Effect.logWarning("subscriber handler threw", err)));
45
+ }
34
46
  function isNotificationParamsRecord(value) {
35
47
  return typeof value === "object" && value !== null && !Array.isArray(value);
36
48
  }
37
49
  /**
38
50
  * Construct an empty registry. Called once from the `MoltZapWsClient`
39
- * constructor. Takes a logger so registry-internal error logs reach the
40
- * same sink as the rest of the client.
51
+ * constructor.
41
52
  *
42
53
  * Implementation notes:
43
- * - Live subscriptions are stored in a `Ref<ReadonlyArray<…>>` keyed
54
+ * - Live subscriptions are stored in a `Ref&lt;ReadonlyArray&lt;…>>` keyed
44
55
  * by registration order. Append-on-register, filter-on-unsubscribe
45
56
  * keeps the dispatch path O(N) with N = live subscription count.
46
57
  * Bigger structures aren't justified at the expected sub count
@@ -53,16 +64,15 @@ function isNotificationParamsRecord(value) {
53
64
  * surfaces as a defect; we log + swallow to match the pre-deletion
54
65
  * `onNotification` contract.
55
66
  */
56
- export function makeSubscriberRegistry(logger) {
67
+ export function makeSubscriberRegistry() {
57
68
  return Effect.gen(function* () {
58
69
  const subsRef = yield* Ref.make([]);
59
70
  const counterRef = yield* Ref.make(0);
60
71
  const register = (filter, handler) => Effect.gen(function* () {
61
- const n = yield* Ref.updateAndGet(counterRef, (c) => c + 1);
62
- const id = SubscriptionId(`sub-${n}`);
72
+ const id = yield* nextSubscriptionId(counterRef);
63
73
  const live = { id, filter, handler };
64
- yield* Ref.update(subsRef, (xs) => [...xs, live]);
65
- const unsubscribe = Ref.update(subsRef, (xs) => xs.filter((s) => s.id !== id));
74
+ yield* appendSubscription(subsRef, live);
75
+ const unsubscribe = removeSubscription(subsRef, id);
66
76
  return { id, unsubscribe };
67
77
  });
68
78
  const dispatch = (frame) => Effect.gen(function* () {
@@ -80,14 +90,12 @@ export function makeSubscriberRegistry(logger) {
80
90
  // Handlers must not throw; we catch defects defensively so
81
91
  // one buggy subscriber can't kill the dispatch loop or break
82
92
  // the reader fiber.
83
- yield* Effect.suspend(() => sub.handler(frame)).pipe(Effect.catchAllDefect((err) => Effect.sync(() => {
84
- logger.warn("subscriber handler threw", err);
85
- })));
93
+ yield* dispatchToSubscriber(sub, frame);
86
94
  }
87
95
  });
88
96
  const closeAll = Ref.set(subsRef, []);
89
97
  return { register, dispatch, closeAll };
90
- });
98
+ }).pipe(Effect.withSpan("makeSubscriberRegistry"));
91
99
  }
92
100
  /**
93
101
  * Pure filter-match predicate. Exposed for unit testing so executable
@@ -101,23 +109,20 @@ export function makeSubscriberRegistry(logger) {
101
109
  * Unset filter fields are wildcards.
102
110
  */
103
111
  export function matchesFilter(filter, frame) {
104
- if (filter.notificationNamePrefix !== undefined) {
105
- if (!frame.method.startsWith(filter.notificationNamePrefix))
106
- return false;
107
- }
112
+ const methodPrefix = filter.notificationNamePrefix;
113
+ if (methodPrefix !== undefined &&
114
+ !matchesMethodPrefix(methodPrefix, frame.method))
115
+ return false;
108
116
  const params = isNotificationParamsRecord(frame.params)
109
117
  ? frame.params
110
118
  : null;
111
- if (filter.emissionTag !== undefined) {
112
- const tag = params?.["__emissionTag"];
113
- if (tag !== filter.emissionTag)
114
- return false;
115
- }
116
- if (filter.conversationId !== undefined) {
117
- const cid = params?.["conversationId"];
118
- if (cid !== filter.conversationId)
119
- return false;
120
- }
121
- return true;
119
+ return (matchesPayloadValue(params, "__emissionTag", filter.emissionTag) &&
120
+ matchesPayloadValue(params, "conversationId", filter.conversationId));
121
+ }
122
+ function matchesMethodPrefix(prefix, method) {
123
+ return method.startsWith(prefix);
124
+ }
125
+ function matchesPayloadValue(params, key, expected) {
126
+ return expected === undefined || params?.[key] === expected;
122
127
  }
123
128
  //# sourceMappingURL=subscribers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"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"}