@moltzap/client 2026.503.4 → 2026.504.1
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/channel-core.d.ts +1 -4
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +0 -9
- package/dist/channel-core.js.map +1 -1
- package/dist/channel-core.test.js +90 -71
- package/dist/channel-core.test.js.map +1 -1
- package/dist/cli/commands/agents.js +2 -2
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/apps.d.ts +2 -24
- package/dist/cli/commands/apps.d.ts.map +1 -1
- package/dist/cli/commands/apps.js +22 -47
- package/dist/cli/commands/apps.js.map +1 -1
- package/dist/cli/commands/apps.test.js +59 -72
- package/dist/cli/commands/apps.test.js.map +1 -1
- package/dist/cli/commands/contacts.d.ts +1 -5
- package/dist/cli/commands/contacts.d.ts.map +1 -1
- package/dist/cli/commands/contacts.js +11 -26
- package/dist/cli/commands/contacts.js.map +1 -1
- package/dist/cli/commands/conversations-v2.test.js +30 -26
- package/dist/cli/commands/conversations-v2.test.js.map +1 -1
- package/dist/cli/commands/conversations.d.ts.map +1 -1
- package/dist/cli/commands/conversations.js +48 -33
- package/dist/cli/commands/conversations.js.map +1 -1
- package/dist/cli/commands/messages.d.ts.map +1 -1
- package/dist/cli/commands/messages.js +11 -8
- package/dist/cli/commands/messages.js.map +1 -1
- package/dist/cli/commands/messages.test.js +28 -30
- package/dist/cli/commands/messages.test.js.map +1 -1
- package/dist/cli/commands/presence.d.ts.map +1 -1
- package/dist/cli/commands/presence.js +5 -4
- package/dist/cli/commands/presence.js.map +1 -1
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +20 -11
- package/dist/cli/commands/send.js.map +1 -1
- package/dist/cli/commands/send.test.js +11 -9
- package/dist/cli/commands/send.test.js.map +1 -1
- package/dist/cli/commands/status.js +2 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/test-transport.d.ts +10 -0
- package/dist/cli/commands/test-transport.d.ts.map +1 -0
- package/dist/cli/commands/test-transport.js +29 -0
- package/dist/cli/commands/test-transport.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +0 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/socket-client.d.ts +9 -4
- package/dist/cli/socket-client.d.ts.map +1 -1
- package/dist/cli/socket-client.js +27 -12
- package/dist/cli/socket-client.js.map +1 -1
- package/dist/cli/transport.d.ts +3 -2
- package/dist/cli/transport.d.ts.map +1 -1
- package/dist/cli/transport.js +6 -6
- package/dist/cli/transport.js.map +1 -1
- package/dist/cli/transport.test.js +4 -4
- package/dist/cli/transport.test.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/__tests__/app-callback-partition-key.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partition-key.test.d.ts.map +1 -0
- package/dist/internal/__tests__/app-callback-partition-key.test.js +33 -0
- package/dist/internal/__tests__/app-callback-partition-key.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partition-worker.test.d.ts.map +1 -0
- package/dist/internal/__tests__/{s2c-partition-worker.test.js → app-callback-partition-worker.test.js} +6 -9
- package/dist/internal/__tests__/app-callback-partition-worker.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.d.ts.map +1 -0
- package/dist/internal/__tests__/{s2c-partitioned-dispatcher-real-ws.test.js → app-callback-partitioned-dispatcher-real-ws.test.js} +69 -94
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts +2 -0
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.d.ts.map +1 -0
- package/dist/internal/__tests__/{s2c-partitioned-dispatcher.test.js → app-callback-partitioned-dispatcher.test.js} +35 -69
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js.map +1 -0
- package/dist/internal/__tests__/app-callback-test-requests.d.ts +43 -0
- package/dist/internal/__tests__/app-callback-test-requests.d.ts.map +1 -0
- package/dist/internal/__tests__/app-callback-test-requests.js +101 -0
- package/dist/internal/__tests__/app-callback-test-requests.js.map +1 -0
- package/dist/internal/{s2c-dispatcher-errors.d.ts → app-callback-dispatcher-errors.d.ts} +5 -21
- package/dist/internal/app-callback-dispatcher-errors.d.ts.map +1 -0
- package/dist/internal/{s2c-dispatcher-errors.js → app-callback-dispatcher-errors.js} +3 -13
- package/dist/internal/app-callback-dispatcher-errors.js.map +1 -0
- package/dist/internal/app-callback-partition-key.d.ts +68 -0
- package/dist/internal/app-callback-partition-key.d.ts.map +1 -0
- package/dist/internal/app-callback-partition-key.js +90 -0
- package/dist/internal/app-callback-partition-key.js.map +1 -0
- package/dist/internal/{s2c-partition-worker.d.ts → app-callback-partition-worker.d.ts} +5 -5
- package/dist/internal/app-callback-partition-worker.d.ts.map +1 -0
- package/dist/internal/{s2c-partition-worker.js → app-callback-partition-worker.js} +5 -5
- package/dist/internal/app-callback-partition-worker.js.map +1 -0
- package/dist/internal/{s2c-partitioned-dispatcher.d.ts → app-callback-partitioned-dispatcher.d.ts} +9 -10
- package/dist/internal/app-callback-partitioned-dispatcher.d.ts.map +1 -0
- package/dist/internal/{s2c-partitioned-dispatcher.js → app-callback-partitioned-dispatcher.js} +12 -19
- package/dist/internal/app-callback-partitioned-dispatcher.js.map +1 -0
- package/dist/runtime/errors.d.ts +2 -28
- package/dist/runtime/errors.d.ts.map +1 -1
- package/dist/runtime/errors.js +0 -9
- package/dist/runtime/errors.js.map +1 -1
- package/dist/runtime/errors.test.js +2 -2
- package/dist/runtime/errors.test.js.map +1 -1
- package/dist/runtime/frame.d.ts +17 -18
- package/dist/runtime/frame.d.ts.map +1 -1
- package/dist/runtime/frame.js +83 -31
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/frame.test.js +15 -11
- package/dist/runtime/frame.test.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/local-service-commands.d.ts +7 -0
- package/dist/runtime/local-service-commands.d.ts.map +1 -0
- package/dist/runtime/local-service-commands.js +6 -0
- package/dist/runtime/local-service-commands.js.map +1 -0
- package/dist/runtime/runtime.test.js +1 -2
- package/dist/runtime/runtime.test.js.map +1 -1
- package/dist/runtime/subscribers.d.ts +34 -29
- package/dist/runtime/subscribers.d.ts.map +1 -1
- package/dist/runtime/subscribers.js +19 -19
- package/dist/runtime/subscribers.js.map +1 -1
- package/dist/runtime/subscribers.test.js +50 -31
- package/dist/runtime/subscribers.test.js.map +1 -1
- package/dist/service.d.ts +24 -39
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +165 -161
- package/dist/service.js.map +1 -1
- package/dist/service.test.js +111 -170
- package/dist/service.test.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +1 -2
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js +28 -20
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/test-utils/conformance-adapter.d.ts +2 -2
- package/dist/test-utils/conformance-adapter.d.ts.map +1 -1
- package/dist/test-utils/conformance-adapter.js +33 -26
- package/dist/test-utils/conformance-adapter.js.map +1 -1
- package/dist/test-utils/fake-service.d.ts +14 -39
- package/dist/test-utils/fake-service.d.ts.map +1 -1
- package/dist/test-utils/fake-service.js +33 -39
- package/dist/test-utils/fake-service.js.map +1 -1
- package/dist/test-utils/ids.d.ts +9 -0
- package/dist/test-utils/ids.d.ts.map +1 -0
- package/dist/test-utils/ids.js +52 -0
- package/dist/test-utils/ids.js.map +1 -0
- package/dist/test-utils/index.d.ts +10 -2
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +12 -5
- package/dist/test-utils/index.js.map +1 -1
- package/dist/ws-client.d.ts +58 -64
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +151 -133
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-client.test.js +157 -167
- package/dist/ws-client.test.js.map +1 -1
- package/package.json +3 -3
- package/dist/cli/commands/permissions.d.ts +0 -70
- package/dist/cli/commands/permissions.d.ts.map +0 -1
- package/dist/cli/commands/permissions.js +0 -100
- package/dist/cli/commands/permissions.js.map +0 -1
- package/dist/cli/commands/permissions.test.d.ts +0 -2
- package/dist/cli/commands/permissions.test.d.ts.map +0 -1
- package/dist/cli/commands/permissions.test.js +0 -127
- package/dist/cli/commands/permissions.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partition-key.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partition-key.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partition-key.test.js +0 -231
- package/dist/internal/__tests__/s2c-partition-key.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partition-worker.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partition-worker.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partition-worker.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher-real-ws.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partitioned-dispatcher-real-ws.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher-real-ws.test.js.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher.test.d.ts +0 -2
- package/dist/internal/__tests__/s2c-partitioned-dispatcher.test.d.ts.map +0 -1
- package/dist/internal/__tests__/s2c-partitioned-dispatcher.test.js.map +0 -1
- package/dist/internal/s2c-dispatcher-errors.d.ts.map +0 -1
- package/dist/internal/s2c-dispatcher-errors.js.map +0 -1
- package/dist/internal/s2c-partition-key.d.ts +0 -79
- package/dist/internal/s2c-partition-key.d.ts.map +0 -1
- package/dist/internal/s2c-partition-key.js +0 -146
- package/dist/internal/s2c-partition-key.js.map +0 -1
- package/dist/internal/s2c-partition-worker.d.ts.map +0 -1
- package/dist/internal/s2c-partition-worker.js.map +0 -1
- package/dist/internal/s2c-partitioned-dispatcher.d.ts.map +0 -1
- package/dist/internal/s2c-partitioned-dispatcher.js.map +0 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-subscription
|
|
2
|
+
* Per-subscription notification registry for `MoltZapWsClient`.
|
|
3
3
|
*
|
|
4
4
|
* Responsibility: own the list of live `subscribe()` handles and fan each
|
|
5
|
-
* inbound
|
|
5
|
+
* inbound JSON-RPC notification out to every subscription whose filter matches.
|
|
6
6
|
* Implements spec #222 §5.3 (C4 + the `RealClientEventSubscriber.subscribe`
|
|
7
7
|
* filter stub). Lives as an internal collaborator of `MoltZapWsClient`;
|
|
8
|
-
* the public types (`SubscriptionFilter`, `
|
|
8
|
+
* the public types (`SubscriptionFilter`, `NotificationSubscription`,
|
|
9
9
|
* `SubscriptionId`) re-export from the package barrel.
|
|
10
10
|
*
|
|
11
|
-
* Dispatch ordering (Invariant 6 —
|
|
11
|
+
* Dispatch ordering (Invariant 6 — notifications delivered in arrival order):
|
|
12
12
|
* 1. Inbound frames are handed to the registry in arrival order.
|
|
13
13
|
* 2. Within a single frame, subscriptions are notified in registration
|
|
14
14
|
* order.
|
|
15
|
-
* 3. There is no separate legacy `
|
|
16
|
-
* resolved by DELETING `MoltZapWsClientOptions.
|
|
17
|
-
* that want
|
|
15
|
+
* 3. There is no separate legacy `onNotification` fanout — spec #222 OQ-4 is
|
|
16
|
+
* resolved by DELETING `MoltZapWsClientOptions.onNotification`. Callers
|
|
17
|
+
* that want every notification register `subscribe({}, handler)` after
|
|
18
18
|
* construction and before `connect()`.
|
|
19
19
|
*
|
|
20
20
|
* Unsubscribe semantics (OQ-3 A): `unsubscribe` takes effect on the next
|
|
@@ -25,19 +25,23 @@
|
|
|
25
25
|
*
|
|
26
26
|
* Error channel: handlers are invoked inside a defect-catcher; a throw is
|
|
27
27
|
* logged via the client's injected `WsClientLogger` and swallowed
|
|
28
|
-
* (matching the prior `
|
|
28
|
+
* (matching the prior `onNotification` contract at `ws-client.ts:650-655`
|
|
29
29
|
* pre-deletion). The registry itself has no typed error surface —
|
|
30
30
|
* `register`, `dispatch`, and `closeAll` are `Effect<T, never>`.
|
|
31
31
|
*/
|
|
32
32
|
import { Brand, Effect } from "effect";
|
|
33
|
-
import type {
|
|
33
|
+
import type { DecodedNotification } from "./frame.js";
|
|
34
|
+
interface FilterableNotificationFrame {
|
|
35
|
+
readonly method: string;
|
|
36
|
+
readonly params?: unknown;
|
|
37
|
+
}
|
|
34
38
|
/** Branded identifier for a subscription handle. Minted by `register`. */
|
|
35
39
|
export type SubscriptionId = string & Brand.Brand<"SubscriptionId">;
|
|
36
40
|
export declare const SubscriptionId: Brand.Brand.Constructor<SubscriptionId>;
|
|
37
41
|
/**
|
|
38
|
-
* Filter grammar for `subscribe`.
|
|
42
|
+
* Filter grammar for `subscribe`. A notification is delivered to a subscription
|
|
39
43
|
* iff it matches **every** field that is set on the filter. Unset fields
|
|
40
|
-
* are wildcards; the empty filter `{}` matches every
|
|
44
|
+
* are wildcards; the empty filter `{}` matches every notification.
|
|
41
45
|
*
|
|
42
46
|
* OQ-2 resolution (A): exactly these three fields, no free-form
|
|
43
47
|
* predicate, no schema-derived matcher. Matches the existing
|
|
@@ -46,20 +50,20 @@ export declare const SubscriptionId: Brand.Brand.Constructor<SubscriptionId>;
|
|
|
46
50
|
* one-for-one.
|
|
47
51
|
*
|
|
48
52
|
* - `emissionTag` — exact match against the canonical payload key
|
|
49
|
-
* `frame.
|
|
53
|
+
* `frame.params.__emissionTag`. (The adapter reads the same key at
|
|
50
54
|
* `packages/client/src/test-utils/conformance-adapter.ts:77-79`;
|
|
51
55
|
* `emitTaggedEventDefault` writes it at `runner.ts:343-357`. The
|
|
52
56
|
* `__emissionId` string in the `runner.ts:108` doc comment is a
|
|
53
57
|
* known doc-bug — architect files a follow-up issue against
|
|
54
58
|
* protocol to correct the comment; it is not the canonical name.)
|
|
55
|
-
* - `conversationId` — exact match against `frame.
|
|
56
|
-
* when set on the
|
|
57
|
-
* - `
|
|
59
|
+
* - `conversationId` — exact match against `frame.params.conversationId`
|
|
60
|
+
* when set on the notification payload.
|
|
61
|
+
* - `notificationNamePrefix` — `frame.method.startsWith(prefix)`.
|
|
58
62
|
*/
|
|
59
63
|
export interface SubscriptionFilter {
|
|
60
64
|
readonly emissionTag?: string;
|
|
61
65
|
readonly conversationId?: string;
|
|
62
|
-
readonly
|
|
66
|
+
readonly notificationNamePrefix?: string;
|
|
63
67
|
}
|
|
64
68
|
/**
|
|
65
69
|
* Handle returned by `register` / `MoltZapWsClient.subscribe`. Caller
|
|
@@ -69,7 +73,7 @@ export interface SubscriptionFilter {
|
|
|
69
73
|
* `unsubscribe` is `Effect<void, never>`: it is idempotent and total.
|
|
70
74
|
* Calling `unsubscribe` a second time, or after `closeAll`, is a no-op.
|
|
71
75
|
*/
|
|
72
|
-
export interface
|
|
76
|
+
export interface NotificationSubscription {
|
|
73
77
|
readonly id: SubscriptionId;
|
|
74
78
|
readonly unsubscribe: Effect.Effect<void, never>;
|
|
75
79
|
}
|
|
@@ -85,7 +89,7 @@ export interface EventSubscription {
|
|
|
85
89
|
* handler on subscription A does not reorder frames seen by
|
|
86
90
|
* subscription B across frames.
|
|
87
91
|
*/
|
|
88
|
-
export type SubscriberHandler = (frame:
|
|
92
|
+
export type SubscriberHandler = (frame: DecodedNotification) => Effect.Effect<void, never>;
|
|
89
93
|
/**
|
|
90
94
|
* Subscriber registry. One instance per `MoltZapWsClient`, created at
|
|
91
95
|
* construction time and owned by the client. Not exported from the
|
|
@@ -97,13 +101,13 @@ export interface SubscriberRegistry {
|
|
|
97
101
|
* Add a subscription. Returns the handle immediately; delivery starts
|
|
98
102
|
* with the next frame passed to `dispatch`. Does not await any
|
|
99
103
|
* connection state — subscribe is legal pre-connect (spec §5.3 +
|
|
100
|
-
* Assumption 1 deletion: post-delete of `
|
|
101
|
-
* only pre-connect
|
|
104
|
+
* Assumption 1 deletion: post-delete of `onNotification`, subscribe is the
|
|
105
|
+
* only pre-connect notification hook).
|
|
102
106
|
*/
|
|
103
|
-
readonly register: (filter: SubscriptionFilter, handler: SubscriberHandler) => Effect.Effect<
|
|
107
|
+
readonly register: (filter: SubscriptionFilter, handler: SubscriberHandler) => Effect.Effect<NotificationSubscription, never>;
|
|
104
108
|
/**
|
|
105
|
-
* Fan an inbound
|
|
106
|
-
* `MoltZapWsClient.handleIncoming` at the existing
|
|
109
|
+
* Fan an inbound notification out to every matching subscription. Called by
|
|
110
|
+
* `MoltZapWsClient.handleIncoming` at the existing notification-dispatch
|
|
107
111
|
* point (`ws-client.ts:649-685`). Implementation snapshots the
|
|
108
112
|
* live-subscription list at the start of dispatch so
|
|
109
113
|
* unsubscribe-during-dispatch observes next-frame semantics (OQ-3 A).
|
|
@@ -112,7 +116,7 @@ export interface SubscriberRegistry {
|
|
|
112
116
|
* handlers block later subscriptions for this frame but never
|
|
113
117
|
* reorder frame N relative to frame N+1.
|
|
114
118
|
*/
|
|
115
|
-
readonly dispatch: (frame:
|
|
119
|
+
readonly dispatch: (frame: DecodedNotification) => Effect.Effect<void, never>;
|
|
116
120
|
/**
|
|
117
121
|
* Drop every live subscription. Called from `MoltZapWsClient.close`
|
|
118
122
|
* so handlers stop firing once the client is torn down. Idempotent.
|
|
@@ -136,7 +140,7 @@ export interface SubscriberRegistry {
|
|
|
136
140
|
* - Handler exceptions are caught with `Effect.catchAllDefect` after
|
|
137
141
|
* the handler Effect. Sync `throw` from a `(frame) => …` body
|
|
138
142
|
* surfaces as a defect; we log + swallow to match the pre-deletion
|
|
139
|
-
* `
|
|
143
|
+
* `onNotification` contract.
|
|
140
144
|
*/
|
|
141
145
|
export declare function makeSubscriberRegistry(logger: {
|
|
142
146
|
readonly warn: (...args: ReadonlyArray<unknown>) => void;
|
|
@@ -147,10 +151,11 @@ export declare function makeSubscriberRegistry(logger: {
|
|
|
147
151
|
* behavior without bypassing the production dispatch path.
|
|
148
152
|
*
|
|
149
153
|
* Returns `true` iff `frame` matches every set field on `filter`:
|
|
150
|
-
* - `filter.emissionTag === frame.
|
|
151
|
-
* - `filter.conversationId === frame.
|
|
152
|
-
* - `frame.
|
|
154
|
+
* - `filter.emissionTag === frame.params.__emissionTag` (strict ===)
|
|
155
|
+
* - `filter.conversationId === frame.params.conversationId` (strict ===)
|
|
156
|
+
* - `frame.method.startsWith(filter.notificationNamePrefix)`
|
|
153
157
|
* Unset filter fields are wildcards.
|
|
154
158
|
*/
|
|
155
|
-
export declare function matchesFilter(filter: SubscriptionFilter, frame:
|
|
159
|
+
export declare function matchesFilter(filter: SubscriptionFilter, frame: FilterableNotificationFrame): boolean;
|
|
160
|
+
export {};
|
|
156
161
|
//# sourceMappingURL=subscribers.d.ts.map
|
|
@@ -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,EAAE,UAAU,EAAE,MAAM,
|
|
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,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,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;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,mBAAmB,KACvB,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;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE9E;;;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,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-subscription
|
|
2
|
+
* Per-subscription notification registry for `MoltZapWsClient`.
|
|
3
3
|
*
|
|
4
4
|
* Responsibility: own the list of live `subscribe()` handles and fan each
|
|
5
|
-
* inbound
|
|
5
|
+
* inbound JSON-RPC notification out to every subscription whose filter matches.
|
|
6
6
|
* Implements spec #222 §5.3 (C4 + the `RealClientEventSubscriber.subscribe`
|
|
7
7
|
* filter stub). Lives as an internal collaborator of `MoltZapWsClient`;
|
|
8
|
-
* the public types (`SubscriptionFilter`, `
|
|
8
|
+
* the public types (`SubscriptionFilter`, `NotificationSubscription`,
|
|
9
9
|
* `SubscriptionId`) re-export from the package barrel.
|
|
10
10
|
*
|
|
11
|
-
* Dispatch ordering (Invariant 6 —
|
|
11
|
+
* Dispatch ordering (Invariant 6 — notifications delivered in arrival order):
|
|
12
12
|
* 1. Inbound frames are handed to the registry in arrival order.
|
|
13
13
|
* 2. Within a single frame, subscriptions are notified in registration
|
|
14
14
|
* order.
|
|
15
|
-
* 3. There is no separate legacy `
|
|
16
|
-
* resolved by DELETING `MoltZapWsClientOptions.
|
|
17
|
-
* that want
|
|
15
|
+
* 3. There is no separate legacy `onNotification` fanout — spec #222 OQ-4 is
|
|
16
|
+
* resolved by DELETING `MoltZapWsClientOptions.onNotification`. Callers
|
|
17
|
+
* that want every notification register `subscribe({}, handler)` after
|
|
18
18
|
* construction and before `connect()`.
|
|
19
19
|
*
|
|
20
20
|
* Unsubscribe semantics (OQ-3 A): `unsubscribe` takes effect on the next
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
*
|
|
26
26
|
* Error channel: handlers are invoked inside a defect-catcher; a throw is
|
|
27
27
|
* logged via the client's injected `WsClientLogger` and swallowed
|
|
28
|
-
* (matching the prior `
|
|
28
|
+
* (matching the prior `onNotification` contract at `ws-client.ts:650-655`
|
|
29
29
|
* pre-deletion). The registry itself has no typed error surface —
|
|
30
30
|
* `register`, `dispatch`, and `closeAll` are `Effect<T, never>`.
|
|
31
31
|
*/
|
|
32
32
|
import { Brand, Effect, Ref } from "effect";
|
|
33
33
|
export const SubscriptionId = Brand.nominal();
|
|
34
|
-
function
|
|
34
|
+
function isNotificationParamsRecord(value) {
|
|
35
35
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
@@ -51,7 +51,7 @@ function isEventDataRecord(value) {
|
|
|
51
51
|
* - Handler exceptions are caught with `Effect.catchAllDefect` after
|
|
52
52
|
* the handler Effect. Sync `throw` from a `(frame) => …` body
|
|
53
53
|
* surfaces as a defect; we log + swallow to match the pre-deletion
|
|
54
|
-
* `
|
|
54
|
+
* `onNotification` contract.
|
|
55
55
|
*/
|
|
56
56
|
export function makeSubscriberRegistry(logger) {
|
|
57
57
|
return Effect.gen(function* () {
|
|
@@ -95,26 +95,26 @@ export function makeSubscriberRegistry(logger) {
|
|
|
95
95
|
* behavior without bypassing the production dispatch path.
|
|
96
96
|
*
|
|
97
97
|
* Returns `true` iff `frame` matches every set field on `filter`:
|
|
98
|
-
* - `filter.emissionTag === frame.
|
|
99
|
-
* - `filter.conversationId === frame.
|
|
100
|
-
* - `frame.
|
|
98
|
+
* - `filter.emissionTag === frame.params.__emissionTag` (strict ===)
|
|
99
|
+
* - `filter.conversationId === frame.params.conversationId` (strict ===)
|
|
100
|
+
* - `frame.method.startsWith(filter.notificationNamePrefix)`
|
|
101
101
|
* Unset filter fields are wildcards.
|
|
102
102
|
*/
|
|
103
103
|
export function matchesFilter(filter, frame) {
|
|
104
|
-
if (filter.
|
|
105
|
-
if (!frame.
|
|
104
|
+
if (filter.notificationNamePrefix !== undefined) {
|
|
105
|
+
if (!frame.method.startsWith(filter.notificationNamePrefix))
|
|
106
106
|
return false;
|
|
107
107
|
}
|
|
108
|
-
const
|
|
109
|
-
? frame.
|
|
108
|
+
const params = isNotificationParamsRecord(frame.params)
|
|
109
|
+
? frame.params
|
|
110
110
|
: null;
|
|
111
111
|
if (filter.emissionTag !== undefined) {
|
|
112
|
-
const tag =
|
|
112
|
+
const tag = params?.["__emissionTag"];
|
|
113
113
|
if (tag !== filter.emissionTag)
|
|
114
114
|
return false;
|
|
115
115
|
}
|
|
116
116
|
if (filter.conversationId !== undefined) {
|
|
117
|
-
const cid =
|
|
117
|
+
const cid = params?.["conversationId"];
|
|
118
118
|
if (cid !== filter.conversationId)
|
|
119
119
|
return false;
|
|
120
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,48 +16,67 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { describe, expect, it, vi } from "vitest";
|
|
18
18
|
import { Effect, Ref } from "effect";
|
|
19
|
+
import { AppSessionFailedNotificationDefinition, ConversationArchivedNotificationDefinition, agentId, appSessionId, conversationId, decodeNotification, notificationGroup, notificationFrame as makeNotificationFrame, } from "@moltzap/protocol";
|
|
19
20
|
import { makeSubscriberRegistry, matchesFilter } from "./subscribers.js";
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
const SESSION_ID = appSessionId("11111111-1111-4111-8111-111111111111");
|
|
22
|
+
const CONV_1 = conversationId("22222222-2222-4222-8222-222222222222");
|
|
23
|
+
const CONV_2 = conversationId("33333333-3333-4333-8333-333333333333");
|
|
24
|
+
const AGENT_ID = agentId("44444444-4444-4444-8444-444444444444");
|
|
25
|
+
const filterableNotification = (method, params) => ({
|
|
26
|
+
method,
|
|
27
|
+
params,
|
|
28
|
+
});
|
|
29
|
+
const decodedNotification = (definition, params) => {
|
|
30
|
+
const decoded = Effect.runSync(decodeNotification(notificationGroup, makeNotificationFrame(definition, params)));
|
|
31
|
+
return { _tag: "Notification", ...decoded };
|
|
32
|
+
};
|
|
33
|
+
const sessionFailedNotification = () => decodedNotification(AppSessionFailedNotificationDefinition, {
|
|
34
|
+
sessionId: SESSION_ID,
|
|
35
|
+
});
|
|
36
|
+
const conversationArchivedNotification = (conv) => decodedNotification(ConversationArchivedNotificationDefinition, {
|
|
37
|
+
conversationId: conv,
|
|
38
|
+
archivedAt: "2026-05-03T00:00:00Z",
|
|
39
|
+
by: AGENT_ID,
|
|
25
40
|
});
|
|
26
41
|
const noopLogger = { warn: vi.fn() };
|
|
27
42
|
describe("matchesFilter", () => {
|
|
28
43
|
it("empty filter matches every frame", () => {
|
|
29
|
-
expect(matchesFilter({},
|
|
44
|
+
expect(matchesFilter({}, filterableNotification("any", { x: 1 }))).toBe(true);
|
|
30
45
|
});
|
|
31
46
|
it("emissionTag matches on `__emissionTag` key", () => {
|
|
32
|
-
const frame =
|
|
47
|
+
const frame = filterableNotification("e", { __emissionTag: "tag-1" });
|
|
33
48
|
expect(matchesFilter({ emissionTag: "tag-1" }, frame)).toBe(true);
|
|
34
49
|
expect(matchesFilter({ emissionTag: "tag-other" }, frame)).toBe(false);
|
|
35
50
|
});
|
|
36
51
|
it("conversationId matches on `conversationId` key", () => {
|
|
37
|
-
const frame =
|
|
52
|
+
const frame = filterableNotification("e", { conversationId: "c-1" });
|
|
38
53
|
expect(matchesFilter({ conversationId: "c-1" }, frame)).toBe(true);
|
|
39
54
|
expect(matchesFilter({ conversationId: "c-2" }, frame)).toBe(false);
|
|
40
55
|
});
|
|
41
|
-
it("
|
|
42
|
-
const frame =
|
|
43
|
-
expect(matchesFilter({
|
|
44
|
-
expect(matchesFilter({
|
|
56
|
+
it("notificationNamePrefix uses startsWith", () => {
|
|
57
|
+
const frame = filterableNotification("messages/received", {});
|
|
58
|
+
expect(matchesFilter({ notificationNamePrefix: "messages/" }, frame)).toBe(true);
|
|
59
|
+
expect(matchesFilter({ notificationNamePrefix: "presence/" }, frame)).toBe(false);
|
|
45
60
|
});
|
|
46
61
|
it("AND semantics: all set fields must match", () => {
|
|
47
|
-
const frame =
|
|
62
|
+
const frame = filterableNotification("messages/received", {
|
|
48
63
|
__emissionTag: "tag-1",
|
|
49
64
|
conversationId: "c-1",
|
|
50
65
|
});
|
|
51
|
-
expect(matchesFilter({
|
|
66
|
+
expect(matchesFilter({
|
|
67
|
+
emissionTag: "tag-1",
|
|
68
|
+
conversationId: "c-1",
|
|
69
|
+
notificationNamePrefix: "m",
|
|
70
|
+
}, frame)).toBe(true);
|
|
52
71
|
// conversationId mismatch → reject even when other fields match.
|
|
53
72
|
expect(matchesFilter({ emissionTag: "tag-1", conversationId: "c-other" }, frame)).toBe(false);
|
|
54
73
|
});
|
|
55
|
-
it("non-record `
|
|
56
|
-
const stringData =
|
|
74
|
+
it("non-record `params` cannot satisfy payload-key filters", () => {
|
|
75
|
+
const stringData = filterableNotification("e", "string-payload");
|
|
57
76
|
expect(matchesFilter({ emissionTag: "x" }, stringData)).toBe(false);
|
|
58
77
|
expect(matchesFilter({ conversationId: "x" }, stringData)).toBe(false);
|
|
59
|
-
// …but
|
|
60
|
-
expect(matchesFilter({
|
|
78
|
+
// …but a notification-name-prefix filter still applies.
|
|
79
|
+
expect(matchesFilter({ notificationNamePrefix: "e" }, stringData)).toBe(true);
|
|
61
80
|
});
|
|
62
81
|
});
|
|
63
82
|
describe("SubscriberRegistry", () => {
|
|
@@ -66,7 +85,7 @@ describe("SubscriberRegistry", () => {
|
|
|
66
85
|
const order = [];
|
|
67
86
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void order.push("a"))));
|
|
68
87
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void order.push("b"))));
|
|
69
|
-
await Effect.runPromise(registry.dispatch(
|
|
88
|
+
await Effect.runPromise(registry.dispatch(sessionFailedNotification()));
|
|
70
89
|
expect(order).toEqual(["a", "b"]);
|
|
71
90
|
});
|
|
72
91
|
it("unsubscribe stops delivery for the next frame (OQ-3 A snapshot)", async () => {
|
|
@@ -87,9 +106,9 @@ describe("SubscriberRegistry", () => {
|
|
|
87
106
|
unsubA = handleA.unsubscribe;
|
|
88
107
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void bCalls.push(frameIdx))));
|
|
89
108
|
frameIdx = 0;
|
|
90
|
-
await Effect.runPromise(registry.dispatch(
|
|
109
|
+
await Effect.runPromise(registry.dispatch(sessionFailedNotification()));
|
|
91
110
|
frameIdx = 1;
|
|
92
|
-
await Effect.runPromise(registry.dispatch(
|
|
111
|
+
await Effect.runPromise(registry.dispatch(sessionFailedNotification()));
|
|
93
112
|
expect(aCalls).toEqual([0]); // a saw frame 0, not frame 1.
|
|
94
113
|
expect(bCalls).toEqual([0, 1]); // b saw both — snapshot at start of frame 0 still included a; b is unaffected by a's unsub.
|
|
95
114
|
});
|
|
@@ -97,14 +116,14 @@ describe("SubscriberRegistry", () => {
|
|
|
97
116
|
const registry = await Effect.runPromise(makeSubscriberRegistry(noopLogger));
|
|
98
117
|
const seenByConv1 = [];
|
|
99
118
|
const seenByConv2 = [];
|
|
100
|
-
await Effect.runPromise(registry.register({ conversationId:
|
|
101
|
-
await Effect.runPromise(registry.register({ conversationId:
|
|
102
|
-
await Effect.runPromise(registry.dispatch(
|
|
103
|
-
await Effect.runPromise(registry.dispatch(
|
|
119
|
+
await Effect.runPromise(registry.register({ conversationId: CONV_1 }, (frame) => Effect.sync(() => void seenByConv1.push(frame))));
|
|
120
|
+
await Effect.runPromise(registry.register({ conversationId: CONV_2 }, (frame) => Effect.sync(() => void seenByConv2.push(frame))));
|
|
121
|
+
await Effect.runPromise(registry.dispatch(conversationArchivedNotification(CONV_1)));
|
|
122
|
+
await Effect.runPromise(registry.dispatch(conversationArchivedNotification(CONV_2)));
|
|
104
123
|
expect(seenByConv1).toHaveLength(1);
|
|
105
124
|
expect(seenByConv2).toHaveLength(1);
|
|
106
|
-
expect(seenByConv1[0].
|
|
107
|
-
expect(seenByConv2[0].
|
|
125
|
+
expect(seenByConv1[0].params.conversationId).toBe(CONV_1);
|
|
126
|
+
expect(seenByConv2[0].params.conversationId).toBe(CONV_2);
|
|
108
127
|
});
|
|
109
128
|
it("handler exceptions are caught + logged via the injected logger", async () => {
|
|
110
129
|
const warn = vi.fn();
|
|
@@ -114,7 +133,7 @@ describe("SubscriberRegistry", () => {
|
|
|
114
133
|
throw new Error("subscriber blew up");
|
|
115
134
|
})));
|
|
116
135
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void otherCalls.push(1))));
|
|
117
|
-
await Effect.runPromise(registry.dispatch(
|
|
136
|
+
await Effect.runPromise(registry.dispatch(sessionFailedNotification()));
|
|
118
137
|
expect(warn).toHaveBeenCalledTimes(1);
|
|
119
138
|
expect(otherCalls).toEqual([1]); // other subscribers still fire.
|
|
120
139
|
});
|
|
@@ -126,7 +145,7 @@ describe("SubscriberRegistry", () => {
|
|
|
126
145
|
throw new Error("construction-time throw");
|
|
127
146
|
}));
|
|
128
147
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void otherCalls.push(1))));
|
|
129
|
-
await Effect.runPromise(registry.dispatch(
|
|
148
|
+
await Effect.runPromise(registry.dispatch(sessionFailedNotification()));
|
|
130
149
|
expect(warn).toHaveBeenCalledTimes(1);
|
|
131
150
|
expect(otherCalls).toEqual([1]); // subsequent subscribers still fire.
|
|
132
151
|
});
|
|
@@ -135,7 +154,7 @@ describe("SubscriberRegistry", () => {
|
|
|
135
154
|
const calls = [];
|
|
136
155
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void calls.push(1))));
|
|
137
156
|
await Effect.runPromise(registry.closeAll);
|
|
138
|
-
await Effect.runPromise(registry.dispatch(
|
|
157
|
+
await Effect.runPromise(registry.dispatch(sessionFailedNotification()));
|
|
139
158
|
expect(calls).toEqual([]);
|
|
140
159
|
});
|
|
141
160
|
it("Ref-make composition works: register inside an Effect.gen", async () => {
|
|
@@ -146,7 +165,7 @@ describe("SubscriberRegistry", () => {
|
|
|
146
165
|
const registry = yield* makeSubscriberRegistry(noopLogger);
|
|
147
166
|
const counter = yield* Ref.make(0);
|
|
148
167
|
yield* registry.register({}, () => Ref.update(counter, (n) => n + 1));
|
|
149
|
-
yield* registry.dispatch(
|
|
168
|
+
yield* registry.dispatch(sessionFailedNotification());
|
|
150
169
|
return yield* Ref.get(counter);
|
|
151
170
|
}));
|
|
152
171
|
expect(result).toBe(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.test.js","sourceRoot":"","sources":["../../src/runtime/subscribers.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"subscribers.test.js","sourceRoot":"","sources":["../../src/runtime/subscribers.test.ts"],"names":[],"mappings":"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"}
|
package/dist/service.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type HelloOk, type AnyNotificationDefinition, type DecodedNotification, type Message, type ConversationArchivedNotification, type ConversationUnarchivedNotification, NotConnectedError, RpcServerError, RpcTimeoutError, type RpcDefinition, type ParamsOf, type ResultOf, type TSchema } from "@moltzap/protocol";
|
|
2
2
|
import { Effect } from "effect";
|
|
3
3
|
import { type RpcCallOptions, type WsClientLogger } from "./ws-client.js";
|
|
4
|
-
import { AgentNotFoundError
|
|
4
|
+
import { AgentNotFoundError } from "./runtime/errors.js";
|
|
5
5
|
import type { DispatchAdmissionDecision, DispatchAdmissionRequest } from "./channel-core.js";
|
|
6
6
|
/**
|
|
7
7
|
* Errors that can surface from the Effect-based service API. Matches the
|
|
@@ -44,20 +44,16 @@ export interface ServiceOptions {
|
|
|
44
44
|
agentKey: string;
|
|
45
45
|
logger?: WsClientLogger;
|
|
46
46
|
}
|
|
47
|
-
type
|
|
48
|
-
interface
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
type: string;
|
|
56
|
-
id: string;
|
|
57
|
-
}>;
|
|
58
|
-
}>;
|
|
59
|
-
unreadCounts?: Record<string, number>;
|
|
47
|
+
type NotificationHandler<T> = (data: T) => void;
|
|
48
|
+
interface ServiceHandlerPayloads {
|
|
49
|
+
readonly message: Message;
|
|
50
|
+
readonly rawNotification: DecodedNotification<AnyNotificationDefinition>;
|
|
51
|
+
readonly disconnect: void;
|
|
52
|
+
readonly reconnect: HelloOk;
|
|
53
|
+
readonly conversationArchived: ConversationArchivedNotification;
|
|
54
|
+
readonly conversationUnarchived: ConversationUnarchivedNotification;
|
|
60
55
|
}
|
|
56
|
+
type ServiceHandlerName = keyof ServiceHandlerPayloads;
|
|
61
57
|
/** Full message from another conversation, used by peekFullMessages(). */
|
|
62
58
|
export interface CrossConvMessage {
|
|
63
59
|
conversationId: string;
|
|
@@ -89,13 +85,8 @@ export declare class MoltZapService {
|
|
|
89
85
|
private readonly lastNotifiedRef;
|
|
90
86
|
private readonly lastReadRef;
|
|
91
87
|
private readonly archivedConversationIds;
|
|
92
|
-
private
|
|
93
|
-
private
|
|
94
|
-
private disconnectHandlers;
|
|
95
|
-
private reconnectHandlers;
|
|
96
|
-
private permissionRequiredHandlers;
|
|
97
|
-
private conversationArchivedHandlers;
|
|
98
|
-
private conversationUnarchivedHandlers;
|
|
88
|
+
private readonly handlers;
|
|
89
|
+
private readonly notificationHandlers;
|
|
99
90
|
private _ownAgentId;
|
|
100
91
|
constructor(opts: ServiceOptions);
|
|
101
92
|
get connected(): boolean;
|
|
@@ -184,28 +175,22 @@ export declare class MoltZapService {
|
|
|
184
175
|
private readCrossConvState;
|
|
185
176
|
private iterNewMessagesByConv;
|
|
186
177
|
private advanceLastNotified;
|
|
187
|
-
on(
|
|
188
|
-
|
|
189
|
-
on(event: "disconnect", handler: EventHandler<void>): void;
|
|
190
|
-
on(event: "reconnect", handler: EventHandler<HelloOk>): void;
|
|
191
|
-
on(event: "permissionRequired", handler: EventHandler<PermissionsRequiredEvent>): void;
|
|
192
|
-
on(event: "conversationArchived", handler: EventHandler<ConversationArchivedEvent>): void;
|
|
193
|
-
on(event: "conversationUnarchived", handler: EventHandler<ConversationUnarchivedEvent>): void;
|
|
194
|
-
sendRpc(method: string, params?: unknown, opts?: RpcCallOptions): Effect.Effect<unknown, ServiceRpcError>;
|
|
195
|
-
grantPermission(params: {
|
|
196
|
-
sessionId: string;
|
|
197
|
-
agentId: string;
|
|
198
|
-
resource: string;
|
|
199
|
-
access: string[];
|
|
200
|
-
}): Effect.Effect<void, ServiceRpcError>;
|
|
178
|
+
on<K extends ServiceHandlerName>(notification: K, handler: NotificationHandler<ServiceHandlerPayloads[K]>): void;
|
|
179
|
+
sendRpc<D extends RpcDefinition<string, TSchema, TSchema>>(definition: D, params: ParamsOf<D>, opts?: RpcCallOptions): Effect.Effect<ResultOf<D>, ServiceRpcError>;
|
|
201
180
|
/**
|
|
202
181
|
* Fetch full conversation details (including participants) via RPC and merge
|
|
203
|
-
* into the local cache. Called on ConversationCreated
|
|
204
|
-
*
|
|
182
|
+
* into the local cache. Called on ConversationCreated notifications because
|
|
183
|
+
* the notification schema omits the participants list — see
|
|
184
|
+
* protocol/notifications.ts.
|
|
205
185
|
*/
|
|
206
186
|
private refreshConversationParticipants;
|
|
207
187
|
private populateFromHello;
|
|
208
|
-
|
|
188
|
+
protected handleNotification(notification: DecodedNotification<AnyNotificationDefinition>): void;
|
|
189
|
+
private createNotificationHandlers;
|
|
190
|
+
private handleMessageReceivedNotification;
|
|
191
|
+
private handleConversationCreatedNotification;
|
|
192
|
+
private handleConversationUpdatedNotification;
|
|
193
|
+
private upsertConversationNotification;
|
|
209
194
|
private markConversationArchived;
|
|
210
195
|
private storeMessage;
|
|
211
196
|
}
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|