@moltzap/client 2026.425.2 → 2026.430.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/auth.d.ts +26 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +37 -0
- package/dist/auth.js.map +1 -0
- package/dist/auth.test.d.ts +2 -0
- package/dist/auth.test.d.ts.map +1 -0
- package/dist/auth.test.js +84 -0
- package/dist/auth.test.js.map +1 -0
- package/dist/channel-core.d.ts +64 -4
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +306 -17
- package/dist/channel-core.js.map +1 -1
- package/dist/channel-core.test.js +387 -2
- package/dist/channel-core.test.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/service.d.ts +5 -2
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +79 -3
- package/dist/service.js.map +1 -1
- package/dist/service.test.js +41 -0
- package/dist/service.test.js.map +1 -1
- package/dist/test/index.d.ts +7 -17
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +6 -26
- package/dist/test/index.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +1 -0
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js +8 -2
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/test-utils/fake-service.d.ts +3 -1
- package/dist/test-utils/fake-service.d.ts.map +1 -1
- package/dist/test-utils/fake-service.js +2 -2
- package/dist/test-utils/fake-service.js.map +1 -1
- package/dist/ws-client.d.ts +5 -2
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +8 -7
- package/dist/ws-client.js.map +1 -1
- package/package.json +3 -3
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
/** HTTP response from the agent registration endpoints
|
|
3
|
+
* (`/api/v1/auth/register` and `/api/v1/admin/register-agent`). */
|
|
4
|
+
export interface RegisterResponse {
|
|
5
|
+
agentId: string;
|
|
6
|
+
apiKey: string;
|
|
7
|
+
claimUrl: string;
|
|
8
|
+
claimToken: string;
|
|
9
|
+
}
|
|
10
|
+
/** Options for {@link registerAgent}. */
|
|
11
|
+
export interface RegisterAgentOptions {
|
|
12
|
+
description?: string;
|
|
13
|
+
inviteCode?: string;
|
|
14
|
+
/** When set, registers via the secret-gated admin endpoint and pre-claims
|
|
15
|
+
* the agent for this user. See {@link registerAgent}. */
|
|
16
|
+
ownerUserId?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Register a new agent via HTTP. Thin wrapper around the agent-registration
|
|
19
|
+
* endpoints — the WebSocket dance is `MoltZapWsClient`'s job; this just
|
|
20
|
+
* returns the credentials the caller feeds it as `agentKey` at construction.
|
|
21
|
+
*
|
|
22
|
+
* Routes to `/api/v1/admin/register-agent` when `ownerUserId` is provided
|
|
23
|
+
* (admin path pre-claims the agent for the given owner); otherwise routes
|
|
24
|
+
* to the public `/api/v1/auth/register` endpoint. */
|
|
25
|
+
export declare const registerAgent: (baseUrl: string, name: string, opts?: RegisterAgentOptions) => Effect.Effect<RegisterResponse, Error>;
|
|
26
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;mEACmE;AACnE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;6DACyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD;;;;;;qDAMqD;AACrD,eAAO,MAAM,aAAa,GACxB,SAAS,MAAM,EACf,MAAM,MAAM,EACZ,OAAO,oBAAoB,KAC1B,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAiCrC,CAAC"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
const PUBLIC_PATH = "/api/v1/auth/register";
|
|
3
|
+
const ADMIN_PATH = "/api/v1/admin/register-agent";
|
|
4
|
+
/** Register a new agent via HTTP. Thin wrapper around the agent-registration
|
|
5
|
+
* endpoints — the WebSocket dance is `MoltZapWsClient`'s job; this just
|
|
6
|
+
* returns the credentials the caller feeds it as `agentKey` at construction.
|
|
7
|
+
*
|
|
8
|
+
* Routes to `/api/v1/admin/register-agent` when `ownerUserId` is provided
|
|
9
|
+
* (admin path pre-claims the agent for the given owner); otherwise routes
|
|
10
|
+
* to the public `/api/v1/auth/register` endpoint. */
|
|
11
|
+
export const registerAgent = (baseUrl, name, opts) => Effect.tryPromise({
|
|
12
|
+
try: () => {
|
|
13
|
+
const body = { name };
|
|
14
|
+
if (opts?.description)
|
|
15
|
+
body.description = opts.description;
|
|
16
|
+
if (opts?.inviteCode)
|
|
17
|
+
body.inviteCode = opts.inviteCode;
|
|
18
|
+
if (opts?.ownerUserId)
|
|
19
|
+
body.ownerUserId = opts.ownerUserId;
|
|
20
|
+
const path = opts?.ownerUserId ? ADMIN_PATH : PUBLIC_PATH;
|
|
21
|
+
return fetch(`${baseUrl}${path}`, {
|
|
22
|
+
method: "POST",
|
|
23
|
+
headers: { "Content-Type": "application/json" },
|
|
24
|
+
body: JSON.stringify(body),
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
catch: (err) => (err instanceof Error ? err : new Error(String(err))),
|
|
28
|
+
}).pipe(Effect.flatMap((res) => res.ok
|
|
29
|
+
? Effect.tryPromise({
|
|
30
|
+
try: () => res.json(),
|
|
31
|
+
catch: (err) => err instanceof Error ? err : new Error(String(err)),
|
|
32
|
+
})
|
|
33
|
+
: Effect.tryPromise({
|
|
34
|
+
try: () => res.text(),
|
|
35
|
+
catch: (err) => err instanceof Error ? err : new Error(String(err)),
|
|
36
|
+
}).pipe(Effect.flatMap((text) => Effect.fail(new Error(`Register failed: ${res.status} ${text}`))))));
|
|
37
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAoBhC,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAC5C,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAElD;;;;;;qDAMqD;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAe,EACf,IAAY,EACZ,IAA2B,EACa,EAAE,CAC1C,MAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,GAAG,EAAE;QACR,MAAM,IAAI,GAA2B,EAAE,IAAI,EAAE,CAAC;QAC9C,IAAI,IAAI,EAAE,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAC3D,IAAI,IAAI,EAAE,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACxD,IAAI,IAAI,EAAE,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAC1D,OAAO,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;CACtE,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CACrB,GAAG,CAAC,EAAE;IACJ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAA+B;QAClD,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACb,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KACtD,CAAC;IACJ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;QACrB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACb,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KACtD,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CACjE,CACF,CACN,CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.test.d.ts","sourceRoot":"","sources":["../src/auth.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { registerAgent } from "./auth.js";
|
|
4
|
+
/** Run an Effect to a Promise for vitest assertions. */
|
|
5
|
+
const run = (e) => Effect.runPromise(e);
|
|
6
|
+
/** Build a fake `fetch` that captures the request and returns a canned
|
|
7
|
+
* `RegisterResponse` payload. The capture is the assertion target — we
|
|
8
|
+
* verify URL and body shape without standing up the real server. The
|
|
9
|
+
* fake matches `typeof globalThis.fetch` so it can replace the real
|
|
10
|
+
* binding without a cast. */
|
|
11
|
+
function makeFakeFetch(responder) {
|
|
12
|
+
const calls = [];
|
|
13
|
+
const fakeFetch = async (input, init) => {
|
|
14
|
+
const url = typeof input === "string"
|
|
15
|
+
? input
|
|
16
|
+
: input instanceof URL
|
|
17
|
+
? input.toString()
|
|
18
|
+
: input.url;
|
|
19
|
+
const bodyText = typeof init?.body === "string" ? init.body : "";
|
|
20
|
+
calls.push({
|
|
21
|
+
url,
|
|
22
|
+
method: init?.method,
|
|
23
|
+
body: bodyText ? JSON.parse(bodyText) : undefined,
|
|
24
|
+
});
|
|
25
|
+
if (responder)
|
|
26
|
+
return responder(url);
|
|
27
|
+
return new Response(JSON.stringify({
|
|
28
|
+
agentId: "agent-id",
|
|
29
|
+
apiKey: "api-key",
|
|
30
|
+
claimUrl: "http://example/claim",
|
|
31
|
+
claimToken: "claim-token",
|
|
32
|
+
}), { status: 201, headers: { "Content-Type": "application/json" } });
|
|
33
|
+
};
|
|
34
|
+
return { fakeFetch, calls };
|
|
35
|
+
}
|
|
36
|
+
describe("registerAgent", () => {
|
|
37
|
+
const baseUrl = "http://test.local";
|
|
38
|
+
let originalFetch;
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
originalFetch = globalThis.fetch;
|
|
41
|
+
});
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
globalThis.fetch = originalFetch;
|
|
44
|
+
});
|
|
45
|
+
it("posts ownerUserId in the body to the admin endpoint", async () => {
|
|
46
|
+
const { fakeFetch, calls } = makeFakeFetch();
|
|
47
|
+
globalThis.fetch = fakeFetch;
|
|
48
|
+
const result = await run(registerAgent(baseUrl, "test", {
|
|
49
|
+
inviteCode: "secret",
|
|
50
|
+
ownerUserId: "00000000-0000-4000-8000-000000000001",
|
|
51
|
+
}));
|
|
52
|
+
expect(calls).toHaveLength(1);
|
|
53
|
+
const [call] = calls;
|
|
54
|
+
expect(call.url).toBe(`${baseUrl}/api/v1/admin/register-agent`);
|
|
55
|
+
expect(call.method).toBe("POST");
|
|
56
|
+
expect(call.body).toEqual({
|
|
57
|
+
name: "test",
|
|
58
|
+
inviteCode: "secret",
|
|
59
|
+
ownerUserId: "00000000-0000-4000-8000-000000000001",
|
|
60
|
+
});
|
|
61
|
+
expect(result.agentId).toBe("agent-id");
|
|
62
|
+
});
|
|
63
|
+
it("posts to the public endpoint without ownerUserId when absent", async () => {
|
|
64
|
+
const { fakeFetch, calls } = makeFakeFetch();
|
|
65
|
+
globalThis.fetch = fakeFetch;
|
|
66
|
+
await run(registerAgent(baseUrl, "test", { inviteCode: "secret" }));
|
|
67
|
+
expect(calls[0].url).toBe(`${baseUrl}/api/v1/auth/register`);
|
|
68
|
+
// toEqual with `additionalProperties` rejects extra keys, so this also
|
|
69
|
+
// proves ownerUserId is not on the body.
|
|
70
|
+
expect(calls[0].body).toEqual({ name: "test", inviteCode: "secret" });
|
|
71
|
+
});
|
|
72
|
+
it("fails when the server returns a non-2xx response", async () => {
|
|
73
|
+
const { fakeFetch } = makeFakeFetch(() => new Response("invite required", {
|
|
74
|
+
status: 403,
|
|
75
|
+
headers: { "Content-Type": "text/plain" },
|
|
76
|
+
}));
|
|
77
|
+
globalThis.fetch = fakeFetch;
|
|
78
|
+
const exit = await Effect.runPromiseExit(registerAgent(baseUrl, "test", {
|
|
79
|
+
ownerUserId: "00000000-0000-4000-8000-000000000001",
|
|
80
|
+
}));
|
|
81
|
+
expect(exit._tag).toBe("Failure");
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../src/auth.test.ts"],"names":[],"mappings":"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"}
|
package/dist/channel-core.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shared message-enrichment helper for MoltZap channel adapters.
|
|
3
3
|
*/
|
|
4
4
|
import { Effect } from "effect";
|
|
5
|
-
import type { Message, PermissionsRequiredEvent } from "@moltzap/protocol";
|
|
5
|
+
import type { LogicalClock, Message, PermissionsRequiredEvent } from "@moltzap/protocol";
|
|
6
6
|
import type { CrossConversationEntry, CrossConvMessage, ServiceRpcError } from "./service.js";
|
|
7
7
|
import type { WsClientLogger } from "./ws-client.js";
|
|
8
8
|
export interface EnrichedSender {
|
|
@@ -31,7 +31,50 @@ export interface EnrichedInboundMessage {
|
|
|
31
31
|
replyToId?: string;
|
|
32
32
|
conversationMeta?: EnrichedConversationMeta;
|
|
33
33
|
contextBlocks: ContextBlocks;
|
|
34
|
+
/**
|
|
35
|
+
* Present when multiple queued messages from the same conversation were
|
|
36
|
+
* coalesced into this single dispatch. Includes the primary message first.
|
|
37
|
+
*/
|
|
38
|
+
coalescedMessages?: ReadonlyArray<{
|
|
39
|
+
id: string;
|
|
40
|
+
sender: EnrichedSender;
|
|
41
|
+
text: string;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
replyToId?: string;
|
|
44
|
+
}>;
|
|
45
|
+
/** Lease that authorizes a runtime reply for this dispatch, when present. */
|
|
46
|
+
dispatchLeaseId?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface PendingDispatchMessage {
|
|
49
|
+
messageId: string;
|
|
50
|
+
conversationId: string;
|
|
51
|
+
senderAgentId: string;
|
|
52
|
+
createdAt: string;
|
|
53
|
+
receivedAt: string;
|
|
54
|
+
clock?: LogicalClock;
|
|
55
|
+
parts?: Message["parts"];
|
|
56
|
+
}
|
|
57
|
+
export interface DispatchAdmissionRequest {
|
|
58
|
+
message: Message;
|
|
59
|
+
conversationId: string;
|
|
60
|
+
senderAgentId: string;
|
|
61
|
+
attempt: number;
|
|
62
|
+
receivedAt: string;
|
|
63
|
+
clock: LogicalClock;
|
|
64
|
+
pending: ReadonlyArray<PendingDispatchMessage>;
|
|
34
65
|
}
|
|
66
|
+
export type DispatchAdmissionDecision = {
|
|
67
|
+
_tag: "grant";
|
|
68
|
+
leaseId?: string;
|
|
69
|
+
leaseTimeoutMs?: number;
|
|
70
|
+
dispatchMessageId?: string;
|
|
71
|
+
} | {
|
|
72
|
+
_tag: "deny";
|
|
73
|
+
reason?: string;
|
|
74
|
+
} | {
|
|
75
|
+
_tag: "hold";
|
|
76
|
+
reason?: string;
|
|
77
|
+
};
|
|
35
78
|
/** The subset of MoltZapService that MoltZapChannelCore needs. */
|
|
36
79
|
export interface ChannelService {
|
|
37
80
|
readonly ownAgentId: string | undefined;
|
|
@@ -41,7 +84,9 @@ export interface ChannelService {
|
|
|
41
84
|
on(event: "permissionRequired", handler: (data: PermissionsRequiredEvent) => void): void;
|
|
42
85
|
connect(): Effect.Effect<unknown, ServiceRpcError>;
|
|
43
86
|
close(): void;
|
|
44
|
-
send(conversationId: string, text: string
|
|
87
|
+
send(conversationId: string, text: string, opts?: {
|
|
88
|
+
dispatchLeaseId?: string;
|
|
89
|
+
}): Effect.Effect<void, ServiceRpcError>;
|
|
45
90
|
getConversation(convId: string): {
|
|
46
91
|
type: string;
|
|
47
92
|
name?: string;
|
|
@@ -60,10 +105,12 @@ export interface ChannelService {
|
|
|
60
105
|
messages: CrossConvMessage[];
|
|
61
106
|
commit: () => void;
|
|
62
107
|
};
|
|
108
|
+
authorizeDispatch?(request: DispatchAdmissionRequest): Effect.Effect<DispatchAdmissionDecision, ServiceRpcError>;
|
|
63
109
|
}
|
|
64
110
|
export interface ChannelCoreOptions {
|
|
65
111
|
service: ChannelService;
|
|
66
112
|
logger?: WsClientLogger;
|
|
113
|
+
dispatchAdmissionTimeoutMs?: number;
|
|
67
114
|
}
|
|
68
115
|
/**
|
|
69
116
|
* Handler invoked for every enriched inbound message. Returns an Effect so the
|
|
@@ -83,8 +130,12 @@ export type InboundHandler<E = unknown> = (msg: EnrichedInboundMessage) => Effec
|
|
|
83
130
|
export declare class MoltZapChannelCore {
|
|
84
131
|
private readonly service;
|
|
85
132
|
private readonly logger;
|
|
133
|
+
private readonly dispatchAdmissionTimeoutMs;
|
|
86
134
|
private connected;
|
|
87
135
|
private inboundHandler;
|
|
136
|
+
private activeDispatchLeaseId;
|
|
137
|
+
private readonly logicalClocks;
|
|
138
|
+
private readonly parkedByConversation;
|
|
88
139
|
/** Inbound messages enqueue synchronously; a single forked consumer fiber
|
|
89
140
|
* serialises delivery so handlers execute one-at-a-time in arrival order. */
|
|
90
141
|
private readonly inboundQueue;
|
|
@@ -102,12 +153,21 @@ export declare class MoltZapChannelCore {
|
|
|
102
153
|
connect(): Effect.Effect<void, ServiceRpcError>;
|
|
103
154
|
disconnect(): Effect.Effect<void, never>;
|
|
104
155
|
isConnected(): boolean;
|
|
105
|
-
sendReply(conversationId: string, text: string
|
|
156
|
+
sendReply(conversationId: string, text: string, opts?: {
|
|
157
|
+
dispatchLeaseId?: string;
|
|
158
|
+
}): Effect.Effect<void, ServiceRpcError>;
|
|
159
|
+
private observeMessage;
|
|
160
|
+
private takeDispatchCandidate;
|
|
161
|
+
private parkDispatchWork;
|
|
162
|
+
private dispatchAdmission;
|
|
163
|
+
private dispatchInboundWork;
|
|
164
|
+
private pendingDispatchSnapshot;
|
|
165
|
+
private takeCoalescedConversationMessages;
|
|
106
166
|
/**
|
|
107
167
|
* Stateless enrichment helper. Falls back to `sender.id` if
|
|
108
168
|
* `resolveAgentName` throws (e.g. service not yet connected).
|
|
109
169
|
*/
|
|
110
|
-
static enrichMessage(service: ChannelService,
|
|
170
|
+
static enrichMessage(service: ChannelService, messageOrMessages: Message | ReadonlyArray<Message>): Effect.Effect<{
|
|
111
171
|
enriched: EnrichedInboundMessage;
|
|
112
172
|
commitContext?: () => void;
|
|
113
173
|
}, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-core.d.ts","sourceRoot":"","sources":["../src/channel-core.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"channel-core.d.ts","sourceRoot":"","sources":["../src/channel-core.ts"],"names":[],"mappings":"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"}
|