@moltzap/client 2026.505.0 → 2026.505.2
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/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/transport.test.js +7 -7
- package/dist/cli/transport.test.js.map +1 -1
- package/dist/internal/__tests__/app-callback-partition-key.test.js +2 -2
- package/dist/internal/__tests__/app-callback-partition-key.test.js.map +1 -1
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.js +2 -2
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.js.map +1 -1
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js +1 -1
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js.map +1 -1
- package/dist/internal/__tests__/app-callback-test-requests.d.ts +18 -14
- package/dist/internal/__tests__/app-callback-test-requests.d.ts.map +1 -1
- package/dist/internal/__tests__/app-callback-test-requests.js +25 -25
- package/dist/internal/__tests__/app-callback-test-requests.js.map +1 -1
- package/dist/internal/app-callback-dispatcher-errors.js +1 -1
- package/dist/internal/app-callback-partition-key.d.ts +3 -3
- package/dist/internal/app-callback-partition-key.d.ts.map +1 -1
- package/dist/internal/app-callback-partition-key.js +4 -4
- package/dist/internal/app-callback-partition-key.js.map +1 -1
- package/dist/internal/app-callback-partition-worker.d.ts +1 -1
- package/dist/internal/app-callback-partition-worker.js +1 -1
- package/dist/runtime/frame.d.ts +3 -6
- package/dist/runtime/frame.d.ts.map +1 -1
- package/dist/runtime/frame.js +24 -40
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/frame.test.js +40 -1
- package/dist/runtime/frame.test.js.map +1 -1
- package/dist/runtime/notification-types.types-check.d.ts +2 -0
- package/dist/runtime/notification-types.types-check.d.ts.map +1 -0
- package/dist/runtime/notification-types.types-check.js +57 -0
- package/dist/runtime/notification-types.types-check.js.map +1 -0
- package/dist/runtime/subscribers.d.ts +15 -3
- package/dist/runtime/subscribers.d.ts.map +1 -1
- package/dist/runtime/subscribers.js.map +1 -1
- package/dist/runtime/subscribers.test.js +30 -13
- package/dist/runtime/subscribers.test.js.map +1 -1
- package/dist/service.d.ts +18 -9
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +14 -8
- package/dist/service.js.map +1 -1
- package/dist/service.typed-bridge.test.d.ts +2 -0
- package/dist/service.typed-bridge.test.d.ts.map +1 -0
- package/dist/service.typed-bridge.test.js +93 -0
- package/dist/service.typed-bridge.test.js.map +1 -0
- package/dist/ws-client.d.ts +46 -8
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +63 -15
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-client.test.js +1 -1
- package/dist/ws-client.test.js.map +1 -1
- package/dist/ws-client.typed-bridge.test.d.ts +2 -0
- package/dist/ws-client.typed-bridge.test.d.ts.map +1 -0
- package/dist/ws-client.typed-bridge.test.js +105 -0
- package/dist/ws-client.typed-bridge.test.js.map +1 -0
- package/package.json +3 -3
- package/dist/cli/commands/apps.d.ts +0 -78
- package/dist/cli/commands/apps.d.ts.map +0 -1
- package/dist/cli/commands/apps.js +0 -172
- package/dist/cli/commands/apps.js.map +0 -1
- package/dist/cli/commands/apps.test.d.ts +0 -2
- package/dist/cli/commands/apps.test.d.ts.map +0 -1
- package/dist/cli/commands/apps.test.js +0 -208
- package/dist/cli/commands/apps.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-callback-partition-key.d.ts","sourceRoot":"","sources":["../../src/internal/app-callback-partition-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,KAAK,EAAQ,MAAM,QAAQ,CAAC;AAErC,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AAChE,eAAO,MAAM,YAAY,uCAAgC,CAAC;;;;AAE1D,qBAAa,0BAA2B,SAAQ,gCAE9C;IACA,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,EAAG,aAAsB,CAAC;AAwBtE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"app-callback-partition-key.d.ts","sourceRoot":"","sources":["../../src/internal/app-callback-partition-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,KAAK,EAAQ,MAAM,QAAQ,CAAC;AAErC,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AAChE,eAAO,MAAM,YAAY,uCAAgC,CAAC;;;;AAE1D,qBAAa,0BAA2B,SAAQ,gCAE9C;IACA,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,EAAG,aAAsB,CAAC;AAwBtE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAC9B,iBAAiB,CAAC,2BAA2B,CAAC,GAAG;IAC/C,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;CAC/C,CAAC;AAEJ;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,YAAY,CAId;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,YAAY,GAAG;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC;CAClD,CA6BA"}
|
|
@@ -19,7 +19,7 @@ export class PartitionKeyInvariantError extends Data.TaggedError("PartitionKeyIn
|
|
|
19
19
|
/**
|
|
20
20
|
* Sentinel placeholder for appCallback methods that carry no `conversationId`
|
|
21
21
|
* (lifecycle: `apps/onClose`, `apps/onSessionActive`).
|
|
22
|
-
* All lifecycle calls for the same `(
|
|
22
|
+
* All lifecycle calls for the same `(taskId, method)` share one
|
|
23
23
|
* partition; cross-method lifecycle ordering is preserved by the server,
|
|
24
24
|
* not the client.
|
|
25
25
|
*/
|
|
@@ -49,7 +49,7 @@ const segmentForDefinition = (definition) => {
|
|
|
49
49
|
* has no malformed-input branch.
|
|
50
50
|
*/
|
|
51
51
|
export function extractPartitionKey(request) {
|
|
52
|
-
return PartitionKey(`${request.partition.
|
|
52
|
+
return PartitionKey(`${request.partition.taskId}${KEY_SEP}${request.partition.conversationId}${KEY_SEP}${segmentForDefinition(request.definition)}`);
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
55
|
* Inverse projection for tests + observability. Pure deconstruction of a
|
|
@@ -58,7 +58,7 @@ export function extractPartitionKey(request) {
|
|
|
58
58
|
* `conversationId === LIFECYCLE_CONVERSATION_SENTINEL`.
|
|
59
59
|
*/
|
|
60
60
|
export function describePartitionKey(key) {
|
|
61
|
-
// Method is the only field that can contain a slash;
|
|
61
|
+
// Method is the only field that can contain a slash; taskId is a
|
|
62
62
|
// UUID and conversationId is a UUID or the lifecycle sentinel. Split
|
|
63
63
|
// on the first two `KEY_SEP` occurrences only so a hypothetical
|
|
64
64
|
// future method name with `KEY_SEP` (impossible today; ASCII `|`)
|
|
@@ -82,7 +82,7 @@ export function describePartitionKey(key) {
|
|
|
82
82
|
});
|
|
83
83
|
}
|
|
84
84
|
return {
|
|
85
|
-
|
|
85
|
+
taskId: key.slice(0, first),
|
|
86
86
|
conversationId: key.slice(first + 1, second),
|
|
87
87
|
definition,
|
|
88
88
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-callback-partition-key.js","sourceRoot":"","sources":["../../src/internal/app-callback-partition-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAIN,MAAM,mBAAmB,CAAC;AAO3B,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,EAAgB,CAAC;AAE1D,MAAM,OAAO,0BAA2B,SAAQ,IAAI,CAAC,WAAW,CAC9D,4BAA4B,CAI5B;CAAG;AAEL;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,aAAsB,CAAC;AAEtE;;;;GAIG;AACH,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAuC,CAAC;AAC9E,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAuC,CAAC;AAC5E,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAE9B,MAAM,oBAAoB,GAAG,CAC3B,UAAuC,EAC/B,EAAE;IACV,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC9C,qBAAqB,IAAI,CAAC,CAAC;IAC3B,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5C,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAiBF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA6B;IAE7B,OAAO,YAAY,CACjB,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"app-callback-partition-key.js","sourceRoot":"","sources":["../../src/internal/app-callback-partition-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAIN,MAAM,mBAAmB,CAAC;AAO3B,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,EAAgB,CAAC;AAE1D,MAAM,OAAO,0BAA2B,SAAQ,IAAI,CAAC,WAAW,CAC9D,4BAA4B,CAI5B;CAAG;AAEL;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,aAAsB,CAAC;AAEtE;;;;GAIG;AACH,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAuC,CAAC;AAC9E,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAuC,CAAC;AAC5E,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAE9B,MAAM,oBAAoB,GAAG,CAC3B,UAAuC,EAC/B,EAAE;IACV,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC9C,qBAAqB,IAAI,CAAC,CAAC;IAC3B,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5C,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAiBF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA6B;IAE7B,OAAO,YAAY,CACjB,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAChI,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAiB;IAKpD,iEAAiE;IACjE,qEAAqE;IACrE,gEAAgE;IAChE,kEAAkE;IAClE,kCAAkC;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACnE,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAClC,mEAAmE;QACnE,gEAAgE;QAChE,kDAAkD;QAClD,MAAM,IAAI,0BAA0B,CAAC;YACnC,GAAG;YACH,OAAO,EAAE,iDAAiD,GAAG,EAAE;SAChE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,0BAA0B,CAAC;YACnC,GAAG;YACH,OAAO,EAAE,qDAAqD,GAAG,EAAE;SACpE,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAC3B,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC;QAC5C,UAAU;KACX,CAAC;AACJ,CAAC"}
|
package/dist/runtime/frame.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import { type AnyAppCallbackRpcDefinition, type
|
|
2
|
+
import { type AnyAppCallbackRpcDefinition, type DecodedNotification, type DecodedNotificationFrame, type DecodedRpcRequest, type JsonRpcStringId, type RawDecodedNotification, type ResponseFrame, type UnknownDecodedNotification } from "@moltzap/protocol";
|
|
3
3
|
import { MalformedFrameError } from "./errors.js";
|
|
4
4
|
import { type AppCallbackPartitionRoute } from "../internal/app-callback-partition-key.js";
|
|
5
|
+
export type { DecodedNotification, DecodedNotificationFrame, RawDecodedNotification, UnknownDecodedNotification, };
|
|
5
6
|
/** Decoded response frame — narrowed from the protocol's `ResponseFrame`. */
|
|
6
7
|
export interface DecodedResponse {
|
|
7
8
|
readonly _tag: "Response";
|
|
@@ -11,10 +12,6 @@ export interface DecodedResponse {
|
|
|
11
12
|
error: unknown;
|
|
12
13
|
}>["error"];
|
|
13
14
|
}
|
|
14
|
-
/** Decoded notification frame. */
|
|
15
|
-
export type DecodedNotification<D extends AnyNotificationDefinition = AnyNotificationDefinition> = ProtocolDecodedNotification<D> & {
|
|
16
|
-
readonly _tag: "Notification";
|
|
17
|
-
};
|
|
18
15
|
/**
|
|
19
16
|
* Decoded server-initiated (appCallback) request frame. The client routes these to
|
|
20
17
|
* its per-method handler registry; the server is the originator and awaits
|
|
@@ -24,7 +21,7 @@ export type DecodedServerRequest<D extends AnyAppCallbackRpcDefinition = AnyAppC
|
|
|
24
21
|
readonly _tag: "ServerRequest";
|
|
25
22
|
readonly partition: AppCallbackPartitionRoute;
|
|
26
23
|
};
|
|
27
|
-
export type DecodedFrame = DecodedResponse |
|
|
24
|
+
export type DecodedFrame = DecodedResponse | DecodedNotificationFrame | DecodedServerRequest;
|
|
28
25
|
export declare const splitRawFrames: (raw: string) => Effect.Effect<ReadonlyArray<string>, MalformedFrameError>;
|
|
29
26
|
/**
|
|
30
27
|
* Central typed inbound frame decoder. JSON.parse + shape validation via the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAEL,KAAK,2BAA2B,
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAEL,KAAK,2BAA2B,EAWhC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAEpB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,0BAA0B,EAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,2CAA2C,CAAC;AAEnD,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,GAC3B,CAAC;AAEF,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,OAAO,CAAC,CAAC;CACtE;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,CAC9B,CAAC,SAAS,2BAA2B,GAAG,2BAA2B,IACjE,iBAAiB,CAAC,CAAC,CAAC,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,wBAAwB,GACxB,oBAAoB,CAAC;AAwGzB,eAAO,MAAM,cAAc,GACzB,KAAK,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAsEvD,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,KAAK,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAwB7D,CAAC"}
|
package/dist/runtime/frame.js
CHANGED
|
@@ -24,70 +24,54 @@ const toDecodedFrame = (parsed) => {
|
|
|
24
24
|
})))));
|
|
25
25
|
}
|
|
26
26
|
if (validators.notificationFrame(parsed)) {
|
|
27
|
-
return
|
|
27
|
+
return toDecodedNotification(parsed);
|
|
28
28
|
}
|
|
29
29
|
return Effect.fail(new MalformedFrameError({ raw }));
|
|
30
30
|
};
|
|
31
|
-
const PASSTHROUGH_PARAMS_SCHEMA = Object.freeze({});
|
|
32
|
-
function makePassthroughNotificationDefinition(method) {
|
|
33
|
-
const validate = (data) => data === data;
|
|
34
|
-
const def = {
|
|
35
|
-
name: method,
|
|
36
|
-
paramsSchema: PASSTHROUGH_PARAMS_SCHEMA,
|
|
37
|
-
validateParams: validate,
|
|
38
|
-
Params: undefined,
|
|
39
|
-
};
|
|
40
|
-
return passthroughCast(def);
|
|
41
|
-
}
|
|
42
|
-
// Single chokepoint for the runtime-only widening cast on a passthrough
|
|
43
|
-
// notification definition. ACG's `as-unknown-as` rule and the
|
|
44
|
-
// `sloppy-code-guard.sh` pragma check both opt out here; everywhere else
|
|
45
|
-
// in the package keeps the strict ban.
|
|
46
|
-
function passthroughCast(def) {
|
|
47
|
-
// eslint-disable-next-line agent-code-guard/as-unknown-as -- passthrough definition for unknown-method notifications; structurally compatible with NotificationDefinition but TypeScript can't narrow the literal `Name` union
|
|
48
|
-
return def; // #ignore-sloppy-code[as-unknown-as]: passthrough for unknown-method notifications
|
|
49
|
-
}
|
|
50
31
|
const toDecodedNotification = (parsed) => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
Object.defineProperty(
|
|
32
|
+
// Opacity contract (`delivery/payload-opacity-client`,
|
|
33
|
+
// `boundary/schema-exhaustive-fuzz-client`): no payload validation
|
|
34
|
+
// here. `_tag` and `definition` attach non-enumerably so the
|
|
35
|
+
// decoded value still satisfies `validators.notificationFrame`'s
|
|
36
|
+
// strict `additionalProperties: false`. Unknown methods (no
|
|
37
|
+
// descriptor) emit `UnknownDecodedNotification`; production typed
|
|
38
|
+
// handlers exclude that branch via the `definition` discriminator.
|
|
39
|
+
const definition = notificationGroup.byName.get(parsed.method);
|
|
40
|
+
Object.defineProperty(parsed, "_tag", {
|
|
60
41
|
value: "Notification",
|
|
61
42
|
enumerable: false,
|
|
62
43
|
});
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
44
|
+
if (definition !== undefined) {
|
|
45
|
+
Object.defineProperty(parsed, "definition", {
|
|
46
|
+
value: definition,
|
|
47
|
+
enumerable: false,
|
|
48
|
+
});
|
|
49
|
+
return Effect.succeed(parsed);
|
|
50
|
+
}
|
|
51
|
+
return Effect.succeed(parsed);
|
|
68
52
|
};
|
|
69
|
-
const lifecycleRoute = (
|
|
70
|
-
|
|
53
|
+
const lifecycleRoute = (taskId) => ({
|
|
54
|
+
taskId,
|
|
71
55
|
conversationId: LIFECYCLE_CONVERSATION_SENTINEL,
|
|
72
56
|
});
|
|
73
57
|
const appCallbackPartitionRoute = (request) => {
|
|
74
58
|
if (isDecodedRpcRequest(AppsOnBeforeDispatch, request)) {
|
|
75
59
|
return Effect.succeed({
|
|
76
|
-
|
|
60
|
+
taskId: request.params.taskId,
|
|
77
61
|
conversationId: request.params.conversationId,
|
|
78
62
|
});
|
|
79
63
|
}
|
|
80
64
|
if (isDecodedRpcRequest(AppsOnBeforeMessageDelivery, request)) {
|
|
81
65
|
return Effect.succeed({
|
|
82
|
-
|
|
66
|
+
taskId: request.params.taskId,
|
|
83
67
|
conversationId: request.params.conversationId,
|
|
84
68
|
});
|
|
85
69
|
}
|
|
86
70
|
if (isDecodedRpcRequest(AppsOnSessionActive, request)) {
|
|
87
|
-
return Effect.succeed(lifecycleRoute(request.params.
|
|
71
|
+
return Effect.succeed(lifecycleRoute(request.params.taskId));
|
|
88
72
|
}
|
|
89
73
|
if (isDecodedRpcRequest(AppsOnClose, request)) {
|
|
90
|
-
return Effect.succeed(lifecycleRoute(request.params.
|
|
74
|
+
return Effect.succeed(lifecycleRoute(request.params.taskId));
|
|
91
75
|
}
|
|
92
76
|
return Effect.fail(new MalformedFrameError({
|
|
93
77
|
raw: "unroutable app-callback request descriptor",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,UAAU,EAGV,oBAAoB,EACpB,2BAA2B,EAC3B,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
import { describe, expect, it } from "vitest";
|
|
3
|
-
import { MessageReceivedNotificationDefinition, agentId, conversationId, messageId, notificationFrame, } from "@moltzap/protocol";
|
|
3
|
+
import { MessageReceivedNotificationDefinition, TaskClosedNotificationDefinition, agentId, conversationId, messageId, notificationFrame, } from "@moltzap/protocol";
|
|
4
4
|
import { decodeFrames } from "./frame.js";
|
|
5
5
|
const TEST_MESSAGE = {
|
|
6
6
|
id: messageId("11111111-1111-4111-8111-111111111111"),
|
|
@@ -33,5 +33,44 @@ describe("decodeFrames", () => {
|
|
|
33
33
|
result: { ok: true },
|
|
34
34
|
});
|
|
35
35
|
});
|
|
36
|
+
// R2 regression: drift detection lives at the typed-handler boundary,
|
|
37
|
+
// not the wire decoder. The wire decoder is payload-opaque (conformance
|
|
38
|
+
// §5 C3 / E2 require it) but attaches the protocol definition to every
|
|
39
|
+
// known-method notification, so subscribers can validate via
|
|
40
|
+
// `definition.validateParams` and reject stale shapes — e.g. a
|
|
41
|
+
// pre-Phase-7 `task/closed` carrying `sessionId` instead of
|
|
42
|
+
// `{taskId, conversations, closedBy: {agentId, ownerId}}`.
|
|
43
|
+
it("attaches definition for known methods so subscribers can reject stale `task/closed` payload", async () => {
|
|
44
|
+
const stale = JSON.stringify({
|
|
45
|
+
jsonrpc: "2.0",
|
|
46
|
+
method: "task/closed",
|
|
47
|
+
params: {
|
|
48
|
+
sessionId: "11111111-1111-4111-8111-111111111111",
|
|
49
|
+
closedBy: "33333333-3333-4333-8333-333333333333",
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
const decoded = await Effect.runPromise(decodeFrames(stale));
|
|
53
|
+
expect(decoded).toHaveLength(1);
|
|
54
|
+
const notification = decoded[0];
|
|
55
|
+
expect(notification._tag).toBe("Notification");
|
|
56
|
+
expect(notification.method).toBe(TaskClosedNotificationDefinition.name);
|
|
57
|
+
// R14: assert the decoder ATTACHES the live definition by reference
|
|
58
|
+
// identity (not via the global registry roundtrip — that would pass
|
|
59
|
+
// even if the decoder dropped the attachment).
|
|
60
|
+
expect(notification.definition).toBe(TaskClosedNotificationDefinition);
|
|
61
|
+
// The attached definition rejects the stale payload — subscribers /
|
|
62
|
+
// typed handlers can detect drift even though the decoder itself
|
|
63
|
+
// stays opaque.
|
|
64
|
+
expect(notification.definition.validateParams(notification.params)).toBe(false);
|
|
65
|
+
// And the live shape passes — proves the validator is not vacuously false.
|
|
66
|
+
expect(notification.definition.validateParams({
|
|
67
|
+
taskId: "11111111-1111-4111-8111-111111111111",
|
|
68
|
+
conversations: { main: "22222222-2222-4222-8222-222222222222" },
|
|
69
|
+
closedBy: {
|
|
70
|
+
agentId: "33333333-3333-4333-8333-333333333333",
|
|
71
|
+
ownerId: "owner-1",
|
|
72
|
+
},
|
|
73
|
+
})).toBe(true);
|
|
74
|
+
});
|
|
36
75
|
});
|
|
37
76
|
//# sourceMappingURL=frame.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.test.js","sourceRoot":"","sources":["../../src/runtime/frame.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,qCAAqC,EACrC,OAAO,EACP,cAAc,EACd,SAAS,EACT,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"frame.test.js","sourceRoot":"","sources":["../../src/runtime/frame.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-types.types-check.d.ts","sourceRoot":"","sources":["../../src/runtime/notification-types.types-check.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Negative type-test canary for Phase 7.5c (#455).
|
|
3
|
+
*
|
|
4
|
+
* Locks the compiler-enforced lift contract that splits unvalidated
|
|
5
|
+
* wire-decoder output (`RawDecodedNotification<D>`,
|
|
6
|
+
* `DecodedNotificationFrame`) from validated typed-bridge surface
|
|
7
|
+
* (`DecodedNotification<D>`).
|
|
8
|
+
*
|
|
9
|
+
* What we assert:
|
|
10
|
+
*
|
|
11
|
+
* 1. `subscribers.dispatch` accepts the raw / unknown-method union
|
|
12
|
+
* `DecodedNotificationFrame`. Validated `DecodedNotification<D>`
|
|
13
|
+
* values are still acceptable (subtype of `RawDecodedNotification<D>`),
|
|
14
|
+
* but a raw frame cannot reach the typed handler bucket without
|
|
15
|
+
* passing through `validateNotificationParams`.
|
|
16
|
+
*
|
|
17
|
+
* 2. `defineEffectNotificationHandlers(...).dispatch` (the typed
|
|
18
|
+
* handler dispatcher used by `MoltZapService`) refuses
|
|
19
|
+
* `RawDecodedNotification<D>` and the broader
|
|
20
|
+
* `DecodedNotificationFrame` union — only validated
|
|
21
|
+
* `DecodedNotification<D>` may flow in. This is the load-bearing
|
|
22
|
+
* negative: a regression that re-aliases the two types would
|
|
23
|
+
* surface here as a missing `@ts-expect-error`.
|
|
24
|
+
*
|
|
25
|
+
* Compile-only — no runtime test runner picks this file up. The
|
|
26
|
+
* `@ts-expect-error` markers fail the build if they ever start
|
|
27
|
+
* compiling cleanly.
|
|
28
|
+
*/
|
|
29
|
+
import { Effect } from "effect";
|
|
30
|
+
import { ConversationArchivedNotificationDefinition, bindNotificationHandler, defineEffectNotificationHandlers, defineNotificationGroup, } from "@moltzap/protocol";
|
|
31
|
+
import { makeSubscriberRegistry } from "./subscribers.js";
|
|
32
|
+
const noopLogger = { warn: () => { } };
|
|
33
|
+
const registry = Effect.runSync(makeSubscriberRegistry(noopLogger));
|
|
34
|
+
const canaryGroup = defineNotificationGroup("phase7.5c-canary", [
|
|
35
|
+
ConversationArchivedNotificationDefinition,
|
|
36
|
+
]);
|
|
37
|
+
const typedHandlers = defineEffectNotificationHandlers(canaryGroup, [
|
|
38
|
+
bindNotificationHandler(ConversationArchivedNotificationDefinition, () => Effect.void),
|
|
39
|
+
]);
|
|
40
|
+
// --- Subscribers (raw|unknown) accept the wire-decoder union ---
|
|
41
|
+
void registry.dispatch(rawFrame); // OK: raw subtype of the union
|
|
42
|
+
void registry.dispatch(wireUnion); // OK: union dispatch
|
|
43
|
+
// Validated values are also accepted because `DecodedNotification<D>`
|
|
44
|
+
// is a subtype of `RawDecodedNotification<D>` (params narrower).
|
|
45
|
+
void registry.dispatch(validatedFrame);
|
|
46
|
+
// --- Typed dispatcher refuses pre-validation shapes ---
|
|
47
|
+
// @ts-expect-error - typed dispatcher rejects unvalidated raw frames; lift via `validateNotificationParams` first
|
|
48
|
+
void typedHandlers.dispatch(rawFrame);
|
|
49
|
+
// @ts-expect-error - typed dispatcher rejects the wire-decoder union (includes the unknown-method branch)
|
|
50
|
+
void typedHandlers.dispatch(wireUnion);
|
|
51
|
+
// Validated frame is accepted — proves the negative is not vacuous
|
|
52
|
+
// (a regression that aliases Decoded≡Raw would still pass this line
|
|
53
|
+
// but flip the `@ts-expect-error`s above).
|
|
54
|
+
void typedHandlers.dispatch(validatedFrame);
|
|
55
|
+
// @ts-expect-error - unknown-method branch has no descriptor; typed dispatcher requires `definition`
|
|
56
|
+
void typedHandlers.dispatch(unknownMethodFrame);
|
|
57
|
+
//# sourceMappingURL=notification-types.types-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-types.types-check.js","sourceRoot":"","sources":["../../src/runtime/notification-types.types-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,0CAA0C,EAC1C,uBAAuB,EACvB,gCAAgC,EAChC,uBAAuB,GAIxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;AACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC;AACpE,MAAM,WAAW,GAAG,uBAAuB,CAAC,kBAAkB,EAAE;IAC9D,0CAA0C;CAClC,CAAC,CAAC;AACZ,MAAM,aAAa,GAAG,gCAAgC,CAAC,WAAW,EAAE;IAClE,uBAAuB,CACrB,0CAA0C,EAC1C,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAClB;CACF,CAAC,CAAC;AAUH,kEAAkE;AAElE,KAAK,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,+BAA+B;AACjE,KAAK,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB;AACxD,sEAAsE;AACtE,iEAAiE;AACjE,KAAK,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAEvC,yDAAyD;AAEzD,kHAAkH;AAClH,KAAK,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAEtC,0GAA0G;AAC1G,KAAK,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAEvC,mEAAmE;AACnE,oEAAoE;AACpE,2CAA2C;AAC3C,KAAK,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAS5C,qGAAqG;AACrG,KAAK,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC"}
|
|
@@ -30,7 +30,7 @@
|
|
|
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 { DecodedNotificationFrame } from "./frame.js";
|
|
34
34
|
interface FilterableNotificationFrame {
|
|
35
35
|
readonly method: string;
|
|
36
36
|
readonly params?: unknown;
|
|
@@ -82,6 +82,14 @@ export interface NotificationSubscription {
|
|
|
82
82
|
* dispatch fiber. Must not throw — throws are caught by the registry,
|
|
83
83
|
* logged via the injected logger, and swallowed.
|
|
84
84
|
*
|
|
85
|
+
* The frame type is the pre-validation
|
|
86
|
+
* `DecodedNotificationFrame` union (known method with raw `params:
|
|
87
|
+
* unknown`, or unknown method with no descriptor). Subscribers run
|
|
88
|
+
* BEFORE the typed-bridge lift in `validateNotificationParams`, so
|
|
89
|
+
* `params` is genuinely opaque here — handlers that need a typed
|
|
90
|
+
* payload must validate themselves (`frame.definition?.validateParams`)
|
|
91
|
+
* or live behind the typed-handler bridge in `service.handleNotification`.
|
|
92
|
+
*
|
|
85
93
|
* Returning an `Effect` (not a plain `void`) lets handlers compose with
|
|
86
94
|
* Effect-native downstream code without an extra runSync shim. The
|
|
87
95
|
* registry awaits each handler's effect before moving to the next
|
|
@@ -89,7 +97,7 @@ export interface NotificationSubscription {
|
|
|
89
97
|
* handler on subscription A does not reorder frames seen by
|
|
90
98
|
* subscription B across frames.
|
|
91
99
|
*/
|
|
92
|
-
export type SubscriberHandler = (frame:
|
|
100
|
+
export type SubscriberHandler = (frame: DecodedNotificationFrame) => Effect.Effect<void, never>;
|
|
93
101
|
/**
|
|
94
102
|
* Subscriber registry. One instance per `MoltZapWsClient`, created at
|
|
95
103
|
* construction time and owned by the client. Not exported from the
|
|
@@ -112,11 +120,15 @@ export interface SubscriberRegistry {
|
|
|
112
120
|
* live-subscription list at the start of dispatch so
|
|
113
121
|
* unsubscribe-during-dispatch observes next-frame semantics (OQ-3 A).
|
|
114
122
|
*
|
|
123
|
+
* Frames are pre-validation (`DecodedNotificationFrame` union) — the
|
|
124
|
+
* type-system contract that subscribers see RAW frames, not the lifted
|
|
125
|
+
* `DecodedNotification<D>` shape that typed handlers see.
|
|
126
|
+
*
|
|
115
127
|
* Dispatch order: registration order, iterated sequentially; slow
|
|
116
128
|
* handlers block later subscriptions for this frame but never
|
|
117
129
|
* reorder frame N relative to frame N+1.
|
|
118
130
|
*/
|
|
119
|
-
readonly dispatch: (frame:
|
|
131
|
+
readonly dispatch: (frame: DecodedNotificationFrame) => Effect.Effect<void, never>;
|
|
120
132
|
/**
|
|
121
133
|
* Drop every live subscription. Called from `MoltZapWsClient.close`
|
|
122
134
|
* so handlers stop firing once the client is torn down. Idempotent.
|
|
@@ -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,
|
|
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,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,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;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,wBAAwB,KAC5B,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,wBAAwB,KAC5B,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 +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;AAU5C,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,EAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { describe, expect, it, vi } from "vitest";
|
|
18
18
|
import { Effect, Ref } from "effect";
|
|
19
|
-
import {
|
|
19
|
+
import { TaskFailedNotificationDefinition, ConversationArchivedNotificationDefinition, agentId, conversationId, notificationFrame as makeNotificationFrame, taskId, } from "@moltzap/protocol";
|
|
20
20
|
import { makeSubscriberRegistry, matchesFilter } from "./subscribers.js";
|
|
21
|
-
const
|
|
21
|
+
const TASK_ID = taskId("11111111-1111-4111-8111-111111111111");
|
|
22
22
|
const CONV_1 = conversationId("22222222-2222-4222-8222-222222222222");
|
|
23
23
|
const CONV_2 = conversationId("33333333-3333-4333-8333-333333333333");
|
|
24
24
|
const AGENT_ID = agentId("44444444-4444-4444-8444-444444444444");
|
|
@@ -27,11 +27,28 @@ const filterableNotification = (method, params) => ({
|
|
|
27
27
|
params,
|
|
28
28
|
});
|
|
29
29
|
const decodedNotification = (definition, params) => {
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
// Construct a RawDecodedNotification<D> directly from the typed
|
|
31
|
+
// descriptor + params — bypassing the wire decoder is intentional
|
|
32
|
+
// for test fixtures so the result type stays narrow to D rather than
|
|
33
|
+
// collapsing to the group's union. Subscribers receive the
|
|
34
|
+
// pre-validation `RawDecodedNotification<D>` shape (params: unknown);
|
|
35
|
+
// payload-typed fixtures are still safe to construct because
|
|
36
|
+
// `NotificationParamsOf<D>` assigns to `unknown`.
|
|
37
|
+
const frame = makeNotificationFrame(definition, params);
|
|
38
|
+
const decoded = {
|
|
39
|
+
...frame,
|
|
40
|
+
definition,
|
|
41
|
+
method: definition.name,
|
|
42
|
+
params,
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(decoded, "_tag", {
|
|
45
|
+
value: "Notification",
|
|
46
|
+
enumerable: false,
|
|
47
|
+
});
|
|
48
|
+
return decoded;
|
|
32
49
|
};
|
|
33
|
-
const
|
|
34
|
-
|
|
50
|
+
const taskFailedNotification = () => decodedNotification(TaskFailedNotificationDefinition, {
|
|
51
|
+
taskId: TASK_ID,
|
|
35
52
|
});
|
|
36
53
|
const conversationArchivedNotification = (conv) => decodedNotification(ConversationArchivedNotificationDefinition, {
|
|
37
54
|
conversationId: conv,
|
|
@@ -85,7 +102,7 @@ describe("SubscriberRegistry", () => {
|
|
|
85
102
|
const order = [];
|
|
86
103
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void order.push("a"))));
|
|
87
104
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void order.push("b"))));
|
|
88
|
-
await Effect.runPromise(registry.dispatch(
|
|
105
|
+
await Effect.runPromise(registry.dispatch(taskFailedNotification()));
|
|
89
106
|
expect(order).toEqual(["a", "b"]);
|
|
90
107
|
});
|
|
91
108
|
it("unsubscribe stops delivery for the next frame (OQ-3 A snapshot)", async () => {
|
|
@@ -106,9 +123,9 @@ describe("SubscriberRegistry", () => {
|
|
|
106
123
|
unsubA = handleA.unsubscribe;
|
|
107
124
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void bCalls.push(frameIdx))));
|
|
108
125
|
frameIdx = 0;
|
|
109
|
-
await Effect.runPromise(registry.dispatch(
|
|
126
|
+
await Effect.runPromise(registry.dispatch(taskFailedNotification()));
|
|
110
127
|
frameIdx = 1;
|
|
111
|
-
await Effect.runPromise(registry.dispatch(
|
|
128
|
+
await Effect.runPromise(registry.dispatch(taskFailedNotification()));
|
|
112
129
|
expect(aCalls).toEqual([0]); // a saw frame 0, not frame 1.
|
|
113
130
|
expect(bCalls).toEqual([0, 1]); // b saw both — snapshot at start of frame 0 still included a; b is unaffected by a's unsub.
|
|
114
131
|
});
|
|
@@ -133,7 +150,7 @@ describe("SubscriberRegistry", () => {
|
|
|
133
150
|
throw new Error("subscriber blew up");
|
|
134
151
|
})));
|
|
135
152
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void otherCalls.push(1))));
|
|
136
|
-
await Effect.runPromise(registry.dispatch(
|
|
153
|
+
await Effect.runPromise(registry.dispatch(taskFailedNotification()));
|
|
137
154
|
expect(warn).toHaveBeenCalledTimes(1);
|
|
138
155
|
expect(otherCalls).toEqual([1]); // other subscribers still fire.
|
|
139
156
|
});
|
|
@@ -145,7 +162,7 @@ describe("SubscriberRegistry", () => {
|
|
|
145
162
|
throw new Error("construction-time throw");
|
|
146
163
|
}));
|
|
147
164
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void otherCalls.push(1))));
|
|
148
|
-
await Effect.runPromise(registry.dispatch(
|
|
165
|
+
await Effect.runPromise(registry.dispatch(taskFailedNotification()));
|
|
149
166
|
expect(warn).toHaveBeenCalledTimes(1);
|
|
150
167
|
expect(otherCalls).toEqual([1]); // subsequent subscribers still fire.
|
|
151
168
|
});
|
|
@@ -154,7 +171,7 @@ describe("SubscriberRegistry", () => {
|
|
|
154
171
|
const calls = [];
|
|
155
172
|
await Effect.runPromise(registry.register({}, () => Effect.sync(() => void calls.push(1))));
|
|
156
173
|
await Effect.runPromise(registry.closeAll);
|
|
157
|
-
await Effect.runPromise(registry.dispatch(
|
|
174
|
+
await Effect.runPromise(registry.dispatch(taskFailedNotification()));
|
|
158
175
|
expect(calls).toEqual([]);
|
|
159
176
|
});
|
|
160
177
|
it("Ref-make composition works: register inside an Effect.gen", async () => {
|
|
@@ -165,7 +182,7 @@ describe("SubscriberRegistry", () => {
|
|
|
165
182
|
const registry = yield* makeSubscriberRegistry(noopLogger);
|
|
166
183
|
const counter = yield* Ref.make(0);
|
|
167
184
|
yield* registry.register({}, () => Ref.update(counter, (n) => n + 1));
|
|
168
|
-
yield* registry.dispatch(
|
|
185
|
+
yield* registry.dispatch(taskFailedNotification());
|
|
169
186
|
return yield* Ref.get(counter);
|
|
170
187
|
}));
|
|
171
188
|
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;AACrC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"subscribers.test.js","sourceRoot":"","sources":["../../src/runtime/subscribers.test.ts"],"names":[],"mappings":"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"}
|