@diegoaltoworks/chatter 0.55.0 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/channels/index.js +18 -1
- package/dist/channels/index.mjs +18 -1
- package/dist/channels/pipeline.d.ts +11 -1
- package/dist/channels/pipeline.d.ts.map +1 -1
- package/dist/channels/telegram/channel.d.ts +3 -1
- package/dist/channels/telegram/channel.d.ts.map +1 -1
- package/dist/channels/telegram/index.js +22 -2
- package/dist/channels/telegram/index.mjs +22 -2
- package/dist/channels/whatsapp/inbound.d.ts +4 -1
- package/dist/channels/whatsapp/inbound.d.ts.map +1 -1
- package/dist/channels/whatsapp/index.js +22 -2
- package/dist/channels/whatsapp/index.mjs +22 -2
- package/dist/core/answer.d.ts +31 -0
- package/dist/core/answer.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -10
- package/dist/index.mjs +53 -10
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +26 -4
- package/dist/mcp-server.mjs +26 -4
- package/dist/routes/demo.d.ts.map +1 -1
- package/dist/routes/openai.d.ts.map +1 -1
- package/dist/routes/private.d.ts.map +1 -1
- package/dist/routes/public.d.ts.map +1 -1
- package/dist/server.js +38 -6
- package/dist/server.mjs +38 -6
- package/dist/types.d.ts +17 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/channels/index.js
CHANGED
|
@@ -160,6 +160,18 @@ async function answerOnce({
|
|
|
160
160
|
}
|
|
161
161
|
return completeOnce({ client, system, messages, temperature, model });
|
|
162
162
|
}
|
|
163
|
+
async function applyTransformReply(transformReply, input, logger) {
|
|
164
|
+
if (!transformReply) return input.text;
|
|
165
|
+
try {
|
|
166
|
+
return await transformReply(input);
|
|
167
|
+
} catch (error) {
|
|
168
|
+
logger?.error(
|
|
169
|
+
`transformReply threw for channel "${input.channel}"; sending the original reply`,
|
|
170
|
+
error
|
|
171
|
+
);
|
|
172
|
+
return input.text;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
163
175
|
|
|
164
176
|
// src/core/buckets.ts
|
|
165
177
|
function defaultBuckets(mode) {
|
|
@@ -295,7 +307,7 @@ function createInboundPipeline(deps, config) {
|
|
|
295
307
|
channelHint: config.channelHint,
|
|
296
308
|
buckets
|
|
297
309
|
});
|
|
298
|
-
const { content } = await answerOnce({
|
|
310
|
+
const { content: produced } = await answerOnce({
|
|
299
311
|
answerFn: config.answerFn,
|
|
300
312
|
client: deps.client,
|
|
301
313
|
system,
|
|
@@ -305,6 +317,11 @@ function createInboundPipeline(deps, config) {
|
|
|
305
317
|
conversationId,
|
|
306
318
|
model: config.model
|
|
307
319
|
});
|
|
320
|
+
const content = await applyTransformReply(
|
|
321
|
+
config.transformReply,
|
|
322
|
+
{ channel: config.channel ?? "channel", sender, conversationId, text: produced },
|
|
323
|
+
config.logger
|
|
324
|
+
);
|
|
308
325
|
if (!content) {
|
|
309
326
|
return { action: "ignore" };
|
|
310
327
|
}
|
package/dist/channels/index.mjs
CHANGED
|
@@ -127,6 +127,18 @@ async function answerOnce({
|
|
|
127
127
|
}
|
|
128
128
|
return completeOnce({ client, system, messages, temperature, model });
|
|
129
129
|
}
|
|
130
|
+
async function applyTransformReply(transformReply, input, logger) {
|
|
131
|
+
if (!transformReply) return input.text;
|
|
132
|
+
try {
|
|
133
|
+
return await transformReply(input);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
logger?.error(
|
|
136
|
+
`transformReply threw for channel "${input.channel}"; sending the original reply`,
|
|
137
|
+
error
|
|
138
|
+
);
|
|
139
|
+
return input.text;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
130
142
|
|
|
131
143
|
// src/core/buckets.ts
|
|
132
144
|
function defaultBuckets(mode) {
|
|
@@ -262,7 +274,7 @@ function createInboundPipeline(deps, config) {
|
|
|
262
274
|
channelHint: config.channelHint,
|
|
263
275
|
buckets
|
|
264
276
|
});
|
|
265
|
-
const { content } = await answerOnce({
|
|
277
|
+
const { content: produced } = await answerOnce({
|
|
266
278
|
answerFn: config.answerFn,
|
|
267
279
|
client: deps.client,
|
|
268
280
|
system,
|
|
@@ -272,6 +284,11 @@ function createInboundPipeline(deps, config) {
|
|
|
272
284
|
conversationId,
|
|
273
285
|
model: config.model
|
|
274
286
|
});
|
|
287
|
+
const content = await applyTransformReply(
|
|
288
|
+
config.transformReply,
|
|
289
|
+
{ channel: config.channel ?? "channel", sender, conversationId, text: produced },
|
|
290
|
+
config.logger
|
|
291
|
+
);
|
|
275
292
|
if (!content) {
|
|
276
293
|
return { action: "ignore" };
|
|
277
294
|
}
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
* re-derive it. See docs/build-a-channel.md for a worked example.
|
|
15
15
|
*/
|
|
16
16
|
import type OpenAI from "openai";
|
|
17
|
-
import type { AnswerFn } from "../core/answer";
|
|
17
|
+
import type { AnswerFn, TransformReply } from "../core/answer";
|
|
18
18
|
import type { BucketsFor } from "../core/buckets";
|
|
19
|
+
import type { Logger } from "../core/logger";
|
|
19
20
|
import type { PromptLoader } from "../core/prompts";
|
|
20
21
|
import type { VectorStore } from "../core/retrieval";
|
|
21
22
|
import type { HistoryStore } from "../history/types";
|
|
@@ -33,8 +34,15 @@ export interface InboundPipelineDeps {
|
|
|
33
34
|
prompts: PromptLoader;
|
|
34
35
|
}
|
|
35
36
|
export interface InboundPipelineConfig {
|
|
37
|
+
/**
|
|
38
|
+
* This channel's identity for `transformReply` — e.g. "whatsapp",
|
|
39
|
+
* "telegram". @default "channel"
|
|
40
|
+
*/
|
|
41
|
+
channel?: string;
|
|
36
42
|
answerFn?: AnswerFn;
|
|
37
43
|
bucketsFor?: BucketsFor;
|
|
44
|
+
/** Modifies or vetoes the produced reply before delivery — see `ChatterConfig.transformReply`. */
|
|
45
|
+
transformReply?: TransformReply;
|
|
38
46
|
model?: string;
|
|
39
47
|
/** Extra system-prompt section describing the delivery channel; passed through to `prepareChat`. */
|
|
40
48
|
channelHint?: string;
|
|
@@ -65,6 +73,8 @@ export interface InboundPipelineConfig {
|
|
|
65
73
|
windowMs: number;
|
|
66
74
|
};
|
|
67
75
|
now?: () => number;
|
|
76
|
+
/** Logs a `transformReply` throw; the original reply still sends. */
|
|
77
|
+
logger?: Logger;
|
|
68
78
|
}
|
|
69
79
|
export interface InboundTurn {
|
|
70
80
|
/** Delivers this turn's gate ack / chat answer — see {@link InboundReplySender}. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/channels/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/channels/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* Telegram's privacy mode means it only receives messages that address it —
|
|
18
18
|
* which is the same policy `decideChannelAction` applies anyway.
|
|
19
19
|
*/
|
|
20
|
-
import type { AnswerFn } from "../../core/answer";
|
|
20
|
+
import type { AnswerFn, TransformReply } from "../../core/answer";
|
|
21
21
|
import type { BucketsFor } from "../../core/buckets";
|
|
22
22
|
import { type Logger } from "../../core/logger";
|
|
23
23
|
import type { HistoryStore } from "../../history/types";
|
|
@@ -32,6 +32,8 @@ export interface TelegramChannelConfig {
|
|
|
32
32
|
allowedChats?: string[];
|
|
33
33
|
answerFn?: AnswerFn;
|
|
34
34
|
bucketsFor?: BucketsFor;
|
|
35
|
+
/** Modifies or vetoes the produced reply before delivery — see `ChatterConfig.transformReply`. Falls back to the server's own. */
|
|
36
|
+
transformReply?: TransformReply;
|
|
35
37
|
model?: string;
|
|
36
38
|
/** Extra system-prompt section describing the delivery channel; passed through to `prepareChat`. @default "Channel: Telegram." */
|
|
37
39
|
channelHint?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAuB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAqB,KAAK,WAAW,EAAuB,MAAM,OAAO,CAAC;AAOjF,MAAM,WAAW,qBAAqB;IACpC,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,8GAA8G;IAC9G,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iHAAiH;IACjH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kIAAkI;IAClI,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kIAAkI;IAClI,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4GAA4G;IAC5G,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvD,kFAAkF;IAClF,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gHAAgH;IAChH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,cAAc,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,kBAAkB;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0GAA0G;IAC1G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iGAAiG;IACjG,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,mGAAmG;IACnG,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qJAAqJ;IACrJ,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,qEAAqE;IACrE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,uGAAuG;IACvG,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAkI5E"}
|
|
@@ -327,6 +327,18 @@ async function answerOnce({
|
|
|
327
327
|
}
|
|
328
328
|
return completeOnce({ client, system, messages, temperature, model });
|
|
329
329
|
}
|
|
330
|
+
async function applyTransformReply(transformReply, input, logger) {
|
|
331
|
+
if (!transformReply) return input.text;
|
|
332
|
+
try {
|
|
333
|
+
return await transformReply(input);
|
|
334
|
+
} catch (error) {
|
|
335
|
+
logger?.error(
|
|
336
|
+
`transformReply threw for channel "${input.channel}"; sending the original reply`,
|
|
337
|
+
error
|
|
338
|
+
);
|
|
339
|
+
return input.text;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
330
342
|
|
|
331
343
|
// src/core/buckets.ts
|
|
332
344
|
function defaultBuckets(mode) {
|
|
@@ -462,7 +474,7 @@ function createInboundPipeline(deps, config) {
|
|
|
462
474
|
channelHint: config.channelHint,
|
|
463
475
|
buckets
|
|
464
476
|
});
|
|
465
|
-
const { content } = await answerOnce({
|
|
477
|
+
const { content: produced } = await answerOnce({
|
|
466
478
|
answerFn: config.answerFn,
|
|
467
479
|
client: deps.client,
|
|
468
480
|
system,
|
|
@@ -472,6 +484,11 @@ function createInboundPipeline(deps, config) {
|
|
|
472
484
|
conversationId,
|
|
473
485
|
model: config.model
|
|
474
486
|
});
|
|
487
|
+
const content = await applyTransformReply(
|
|
488
|
+
config.transformReply,
|
|
489
|
+
{ channel: config.channel ?? "channel", sender, conversationId, text: produced },
|
|
490
|
+
config.logger
|
|
491
|
+
);
|
|
475
492
|
if (!content) {
|
|
476
493
|
return { action: "ignore" };
|
|
477
494
|
}
|
|
@@ -605,8 +622,10 @@ function createTelegramChannel(config) {
|
|
|
605
622
|
const pipeline = createInboundPipeline(
|
|
606
623
|
{ client: deps.client, store: deps.store, prompts: deps.prompts },
|
|
607
624
|
{
|
|
625
|
+
channel: channelName,
|
|
608
626
|
answerFn: config.answerFn ?? deps.config.answerFn,
|
|
609
627
|
bucketsFor: config.bucketsFor ?? deps.config.bucketsFor,
|
|
628
|
+
transformReply: config.transformReply ?? deps.config.transformReply,
|
|
610
629
|
model: config.model,
|
|
611
630
|
channelHint: config.channelHint ?? "Channel: Telegram.",
|
|
612
631
|
personaResolver: config.personaResolver,
|
|
@@ -618,7 +637,8 @@ function createTelegramChannel(config) {
|
|
|
618
637
|
unmuteReply: config.unmuteReply,
|
|
619
638
|
dmRateLimit: config.dmRateLimit,
|
|
620
639
|
groupRateLimit: config.groupRateLimit,
|
|
621
|
-
now: config.now
|
|
640
|
+
now: config.now,
|
|
641
|
+
logger: log
|
|
622
642
|
}
|
|
623
643
|
);
|
|
624
644
|
const loggedUnallowedChats = /* @__PURE__ */ new Set();
|
|
@@ -285,6 +285,18 @@ async function answerOnce({
|
|
|
285
285
|
}
|
|
286
286
|
return completeOnce({ client, system, messages, temperature, model });
|
|
287
287
|
}
|
|
288
|
+
async function applyTransformReply(transformReply, input, logger) {
|
|
289
|
+
if (!transformReply) return input.text;
|
|
290
|
+
try {
|
|
291
|
+
return await transformReply(input);
|
|
292
|
+
} catch (error) {
|
|
293
|
+
logger?.error(
|
|
294
|
+
`transformReply threw for channel "${input.channel}"; sending the original reply`,
|
|
295
|
+
error
|
|
296
|
+
);
|
|
297
|
+
return input.text;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
288
300
|
|
|
289
301
|
// src/core/buckets.ts
|
|
290
302
|
function defaultBuckets(mode) {
|
|
@@ -420,7 +432,7 @@ function createInboundPipeline(deps, config) {
|
|
|
420
432
|
channelHint: config.channelHint,
|
|
421
433
|
buckets
|
|
422
434
|
});
|
|
423
|
-
const { content } = await answerOnce({
|
|
435
|
+
const { content: produced } = await answerOnce({
|
|
424
436
|
answerFn: config.answerFn,
|
|
425
437
|
client: deps.client,
|
|
426
438
|
system,
|
|
@@ -430,6 +442,11 @@ function createInboundPipeline(deps, config) {
|
|
|
430
442
|
conversationId,
|
|
431
443
|
model: config.model
|
|
432
444
|
});
|
|
445
|
+
const content = await applyTransformReply(
|
|
446
|
+
config.transformReply,
|
|
447
|
+
{ channel: config.channel ?? "channel", sender, conversationId, text: produced },
|
|
448
|
+
config.logger
|
|
449
|
+
);
|
|
433
450
|
if (!content) {
|
|
434
451
|
return { action: "ignore" };
|
|
435
452
|
}
|
|
@@ -563,8 +580,10 @@ function createTelegramChannel(config) {
|
|
|
563
580
|
const pipeline = createInboundPipeline(
|
|
564
581
|
{ client: deps.client, store: deps.store, prompts: deps.prompts },
|
|
565
582
|
{
|
|
583
|
+
channel: channelName,
|
|
566
584
|
answerFn: config.answerFn ?? deps.config.answerFn,
|
|
567
585
|
bucketsFor: config.bucketsFor ?? deps.config.bucketsFor,
|
|
586
|
+
transformReply: config.transformReply ?? deps.config.transformReply,
|
|
568
587
|
model: config.model,
|
|
569
588
|
channelHint: config.channelHint ?? "Channel: Telegram.",
|
|
570
589
|
personaResolver: config.personaResolver,
|
|
@@ -576,7 +595,8 @@ function createTelegramChannel(config) {
|
|
|
576
595
|
unmuteReply: config.unmuteReply,
|
|
577
596
|
dmRateLimit: config.dmRateLimit,
|
|
578
597
|
groupRateLimit: config.groupRateLimit,
|
|
579
|
-
now: config.now
|
|
598
|
+
now: config.now,
|
|
599
|
+
logger: log
|
|
580
600
|
}
|
|
581
601
|
);
|
|
582
602
|
const loggedUnallowedChats = /* @__PURE__ */ new Set();
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
* prompts: deps.prompts,
|
|
37
37
|
* answerFn: deps.config.answerFn,
|
|
38
38
|
* bucketsFor: deps.config.bucketsFor,
|
|
39
|
+
* transformReply: deps.config.transformReply,
|
|
39
40
|
* registry: new Map(),
|
|
40
41
|
* logger: deps.logger,
|
|
41
42
|
* });
|
|
@@ -45,7 +46,7 @@
|
|
|
45
46
|
*/
|
|
46
47
|
import type { WAMessage, WASocket } from "@whiskeysockets/baileys";
|
|
47
48
|
import type OpenAI from "openai";
|
|
48
|
-
import type { AnswerFn } from "../../core/answer";
|
|
49
|
+
import type { AnswerFn, TransformReply } from "../../core/answer";
|
|
49
50
|
import type { BucketsFor } from "../../core/buckets";
|
|
50
51
|
import { type Logger } from "../../core/logger";
|
|
51
52
|
import type { PromptLoader } from "../../core/prompts";
|
|
@@ -128,6 +129,8 @@ export interface WhatsAppInboundConfig {
|
|
|
128
129
|
prompts: PromptLoader;
|
|
129
130
|
answerFn?: AnswerFn;
|
|
130
131
|
bucketsFor?: BucketsFor;
|
|
132
|
+
/** Modifies or vetoes the produced reply before delivery — see `ChatterConfig.transformReply`. */
|
|
133
|
+
transformReply?: TransformReply;
|
|
131
134
|
model?: string;
|
|
132
135
|
/**
|
|
133
136
|
* Own identities per session — share ONE registry across every session
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../../../src/channels/whatsapp/inbound.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../../../src/channels/whatsapp/inbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAuB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,KAAK,cAAc,EAGnB,KAAK,uBAAuB,EAC7B,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAIrD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C;AAOD,kGAAkG;AAClG,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAG/E;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAID,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,GAAG,gBAAgB,CAWnE;AAED,mHAAmH;AACnH,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAWtD;AAeD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBvE;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,cAAc,CAAC;IACpB,8FAA8F;IAC9F,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,uBAAuB,GAChC,iBAAiB,CA+CnB;AAID,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kGAAkG;IAClG,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,QAAQ,EAAE,uBAAuB,CAAC;IAClC,4HAA4H;IAC5H,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gHAAgH;IAChH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,cAAc,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,oGAAoG;IACpG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvD;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B;;;;;OAKG;IACH,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,YAAY,CAAC;QACpB,uDAAuD;QACvD,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,uTAAuT;AACvT,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,qBAAqB,GAC5B,CAAC,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAiGhD"}
|
|
@@ -738,6 +738,18 @@ async function answerOnce({
|
|
|
738
738
|
}
|
|
739
739
|
return completeOnce({ client, system, messages, temperature, model });
|
|
740
740
|
}
|
|
741
|
+
async function applyTransformReply(transformReply, input, logger) {
|
|
742
|
+
if (!transformReply) return input.text;
|
|
743
|
+
try {
|
|
744
|
+
return await transformReply(input);
|
|
745
|
+
} catch (error) {
|
|
746
|
+
logger?.error(
|
|
747
|
+
`transformReply threw for channel "${input.channel}"; sending the original reply`,
|
|
748
|
+
error
|
|
749
|
+
);
|
|
750
|
+
return input.text;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
741
753
|
|
|
742
754
|
// src/core/buckets.ts
|
|
743
755
|
function defaultBuckets(mode) {
|
|
@@ -873,7 +885,7 @@ function createInboundPipeline(deps, config) {
|
|
|
873
885
|
channelHint: config.channelHint,
|
|
874
886
|
buckets
|
|
875
887
|
});
|
|
876
|
-
const { content } = await answerOnce({
|
|
888
|
+
const { content: produced } = await answerOnce({
|
|
877
889
|
answerFn: config.answerFn,
|
|
878
890
|
client: deps.client,
|
|
879
891
|
system,
|
|
@@ -883,6 +895,11 @@ function createInboundPipeline(deps, config) {
|
|
|
883
895
|
conversationId,
|
|
884
896
|
model: config.model
|
|
885
897
|
});
|
|
898
|
+
const content = await applyTransformReply(
|
|
899
|
+
config.transformReply,
|
|
900
|
+
{ channel: config.channel ?? "channel", sender, conversationId, text: produced },
|
|
901
|
+
config.logger
|
|
902
|
+
);
|
|
886
903
|
if (!content) {
|
|
887
904
|
return { action: "ignore" };
|
|
888
905
|
}
|
|
@@ -990,8 +1007,10 @@ function createWhatsAppInboundHandler(config) {
|
|
|
990
1007
|
const pipeline = createInboundPipeline(
|
|
991
1008
|
{ client: config.client, store: config.store, prompts: config.prompts },
|
|
992
1009
|
{
|
|
1010
|
+
channel: "whatsapp",
|
|
993
1011
|
answerFn: config.answerFn,
|
|
994
1012
|
bucketsFor: config.bucketsFor,
|
|
1013
|
+
transformReply: config.transformReply,
|
|
995
1014
|
model: config.model,
|
|
996
1015
|
channelHint: config.channelHint,
|
|
997
1016
|
personaResolver: personaResolver ? ({ sender, text }) => personaResolver({ senderPhone: sender, text }) : void 0,
|
|
@@ -1003,7 +1022,8 @@ function createWhatsAppInboundHandler(config) {
|
|
|
1003
1022
|
unmuteReply: config.unmuteReply,
|
|
1004
1023
|
dmRateLimit: config.dmRateLimit,
|
|
1005
1024
|
groupRateLimit: config.groupRateLimit,
|
|
1006
|
-
now: config.now
|
|
1025
|
+
now: config.now,
|
|
1026
|
+
logger
|
|
1007
1027
|
}
|
|
1008
1028
|
);
|
|
1009
1029
|
return async function handleWhatsAppMessage(event) {
|
|
@@ -676,6 +676,18 @@ async function answerOnce({
|
|
|
676
676
|
}
|
|
677
677
|
return completeOnce({ client, system, messages, temperature, model });
|
|
678
678
|
}
|
|
679
|
+
async function applyTransformReply(transformReply, input, logger) {
|
|
680
|
+
if (!transformReply) return input.text;
|
|
681
|
+
try {
|
|
682
|
+
return await transformReply(input);
|
|
683
|
+
} catch (error) {
|
|
684
|
+
logger?.error(
|
|
685
|
+
`transformReply threw for channel "${input.channel}"; sending the original reply`,
|
|
686
|
+
error
|
|
687
|
+
);
|
|
688
|
+
return input.text;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
679
691
|
|
|
680
692
|
// src/core/buckets.ts
|
|
681
693
|
function defaultBuckets(mode) {
|
|
@@ -811,7 +823,7 @@ function createInboundPipeline(deps, config) {
|
|
|
811
823
|
channelHint: config.channelHint,
|
|
812
824
|
buckets
|
|
813
825
|
});
|
|
814
|
-
const { content } = await answerOnce({
|
|
826
|
+
const { content: produced } = await answerOnce({
|
|
815
827
|
answerFn: config.answerFn,
|
|
816
828
|
client: deps.client,
|
|
817
829
|
system,
|
|
@@ -821,6 +833,11 @@ function createInboundPipeline(deps, config) {
|
|
|
821
833
|
conversationId,
|
|
822
834
|
model: config.model
|
|
823
835
|
});
|
|
836
|
+
const content = await applyTransformReply(
|
|
837
|
+
config.transformReply,
|
|
838
|
+
{ channel: config.channel ?? "channel", sender, conversationId, text: produced },
|
|
839
|
+
config.logger
|
|
840
|
+
);
|
|
824
841
|
if (!content) {
|
|
825
842
|
return { action: "ignore" };
|
|
826
843
|
}
|
|
@@ -928,8 +945,10 @@ function createWhatsAppInboundHandler(config) {
|
|
|
928
945
|
const pipeline = createInboundPipeline(
|
|
929
946
|
{ client: config.client, store: config.store, prompts: config.prompts },
|
|
930
947
|
{
|
|
948
|
+
channel: "whatsapp",
|
|
931
949
|
answerFn: config.answerFn,
|
|
932
950
|
bucketsFor: config.bucketsFor,
|
|
951
|
+
transformReply: config.transformReply,
|
|
933
952
|
model: config.model,
|
|
934
953
|
channelHint: config.channelHint,
|
|
935
954
|
personaResolver: personaResolver ? ({ sender, text }) => personaResolver({ senderPhone: sender, text }) : void 0,
|
|
@@ -941,7 +960,8 @@ function createWhatsAppInboundHandler(config) {
|
|
|
941
960
|
unmuteReply: config.unmuteReply,
|
|
942
961
|
dmRateLimit: config.dmRateLimit,
|
|
943
962
|
groupRateLimit: config.groupRateLimit,
|
|
944
|
-
now: config.now
|
|
963
|
+
now: config.now,
|
|
964
|
+
logger
|
|
945
965
|
}
|
|
946
966
|
);
|
|
947
967
|
return async function handleWhatsAppMessage(event) {
|
package/dist/core/answer.d.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* exactly what it has always been.
|
|
14
14
|
*/
|
|
15
15
|
import type OpenAI from "openai";
|
|
16
|
+
import type { Logger } from "./logger";
|
|
16
17
|
import type { PipelineMessage, PipelineMode } from "./pipeline";
|
|
17
18
|
/** Token accounting in the OpenAI wire shape */
|
|
18
19
|
export interface AnswerUsage {
|
|
@@ -66,6 +67,36 @@ export declare function answerOnce({ answerFn, client, system, messages, mode, s
|
|
|
66
67
|
content: string;
|
|
67
68
|
usage: AnswerUsage;
|
|
68
69
|
}>;
|
|
70
|
+
/** What a `transformReply` hook receives: the produced answer plus who/where it's going. */
|
|
71
|
+
export interface TransformReplyInput {
|
|
72
|
+
/**
|
|
73
|
+
* Identifies the surface delivering this reply — a channel's own name
|
|
74
|
+
* (e.g. "whatsapp", "telegram") or a fixed identifier for an HTTP surface
|
|
75
|
+
* (e.g. "widget-public", "openai-compat-private").
|
|
76
|
+
*/
|
|
77
|
+
channel: string;
|
|
78
|
+
sender?: string;
|
|
79
|
+
conversationId?: string;
|
|
80
|
+
text: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Modifies or vetoes an already-produced reply, after `answerFn`/the built-in
|
|
84
|
+
* completion and guardrails have run. A string result replaces the reply;
|
|
85
|
+
* `null` vetoes it — treated the same as an empty answer by every call site
|
|
86
|
+
* (nothing delivered; the channel pipeline never records an assistant turn
|
|
87
|
+
* for it, though the user's own turn — already appended before answering —
|
|
88
|
+
* stays recorded).
|
|
89
|
+
*
|
|
90
|
+
* Non-streaming surfaces only: a streaming response is delivered incrementally
|
|
91
|
+
* as it's produced, before a final answer exists to transform.
|
|
92
|
+
*/
|
|
93
|
+
export type TransformReply = (input: TransformReplyInput) => string | null | Promise<string | null>;
|
|
94
|
+
/**
|
|
95
|
+
* Runs `transformReply` if configured. A throw/rejection is logged and the
|
|
96
|
+
* ORIGINAL text is returned — the delivery invariant: a bug in a plugin hook
|
|
97
|
+
* must never silently swallow an answer the model already produced.
|
|
98
|
+
*/
|
|
99
|
+
export declare function applyTransformReply(transformReply: TransformReply | undefined, input: TransformReplyInput, logger?: Pick<Logger, "error">): Promise<string | null>;
|
|
69
100
|
/**
|
|
70
101
|
* Stream an answer. A brain that returns a plain string cannot stream, so its
|
|
71
102
|
* answer degrades to a single chunk followed by the stream's normal end —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answer.d.ts","sourceRoot":"","sources":["../../src/core/answer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,uCAAuC;IACvC,IAAI,EAAE,YAAY,CAAC;IACnB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AAE1F,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqBD;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,cAAc,EACd,WAAW,EACX,KAAK,GACN,EAAE,aAAa,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CAKlE;AAED;;;;;;;;GAQG;AACH,wBAAuB,YAAY,CAAC,EAClC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,cAAc,EACd,WAAW,EACX,KAAK,GACN,EAAE,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAaxC"}
|
|
1
|
+
{"version":3,"file":"answer.d.ts","sourceRoot":"","sources":["../../src/core/answer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,uCAAuC;IACvC,IAAI,EAAE,YAAY,CAAC;IACnB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AAE1F,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqBD;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,cAAc,EACd,WAAW,EACX,KAAK,GACN,EAAE,aAAa,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CAKlE;AAED,4FAA4F;AAC5F,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAEpG;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,KAAK,EAAE,mBAAmB,EAC1B,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAED;;;;;;;;GAQG;AACH,wBAAuB,YAAY,CAAC,EAClC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,cAAc,EACd,WAAW,EACX,KAAK,GACN,EAAE,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAaxC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,8 +14,8 @@ export type { ApiKeyOptions, ApiKeyPayload, VerifyResult } from "./auth";
|
|
|
14
14
|
export { ApiKeyManager } from "./auth";
|
|
15
15
|
export type { Channel } from "./channels";
|
|
16
16
|
export type { ChatBotConfig, ChatButtonConfig, ChatConfig, ChatMessage, ChatMode, StreamCallbacks, } from "./client";
|
|
17
|
-
export type { AnswerFn, AnswerFnInput, AnswerFnResult, AnswerOptions, AnswerUsage, } from "./core/answer";
|
|
18
|
-
export { answerOnce, answerStream } from "./core/answer";
|
|
17
|
+
export type { AnswerFn, AnswerFnInput, AnswerFnResult, AnswerOptions, AnswerUsage, TransformReply, TransformReplyInput, } from "./core/answer";
|
|
18
|
+
export { answerOnce, answerStream, applyTransformReply } from "./core/answer";
|
|
19
19
|
export type { BucketsFor, BucketsForContext } from "./core/buckets";
|
|
20
20
|
export { defaultBuckets, resolveBuckets } from "./core/buckets";
|
|
21
21
|
export { detectLeakage, guardOutput, scrubOutput } from "./core/guardrails";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAIvC,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,EACb,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAIvC,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACvE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,YAAY,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
|