@chatman-media/conversation-engine 1.2.0 → 1.3.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/admin-informer.d.ts +90 -0
- package/dist/admin-informer.d.ts.map +1 -0
- package/dist/admin-informer.integration.test.d.ts +2 -0
- package/dist/admin-informer.integration.test.d.ts.map +1 -0
- package/dist/admin-informer.test.d.ts +2 -0
- package/dist/admin-informer.test.d.ts.map +1 -0
- package/dist/dal/index.d.ts +1 -1
- package/dist/dal/index.d.ts.map +1 -1
- package/dist/dal/notifications.d.ts +39 -1
- package/dist/dal/notifications.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +729 -25
- package/dist/notifications.d.ts +14 -1
- package/dist/notifications.d.ts.map +1 -1
- package/dist/operator-bot-handler.d.ts +16 -0
- package/dist/operator-bot-handler.d.ts.map +1 -1
- package/dist/ops-alerts.d.ts +101 -0
- package/dist/ops-alerts.d.ts.map +1 -0
- package/dist/ops-alerts.integration.test.d.ts +2 -0
- package/dist/ops-alerts.integration.test.d.ts.map +1 -0
- package/package.json +9 -9
package/dist/notifications.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AdminInformer } from "./admin-informer.ts";
|
|
1
2
|
import type { NotificationRule, NotificationsRepo } from "./dal/notifications.ts";
|
|
2
3
|
export interface NotificationEvent {
|
|
3
4
|
tenantId: number;
|
|
@@ -13,8 +14,20 @@ export declare class NotificationService {
|
|
|
13
14
|
private readonly repo;
|
|
14
15
|
private readonly botToken;
|
|
15
16
|
private readonly appUrl;
|
|
17
|
+
/**
|
|
18
|
+
* Если задан — владелец (superadmin) обслуживается информером (уровни +
|
|
19
|
+
* дайджест + лента) и пропускается в per-operator-рассылке ниже, чтобы не
|
|
20
|
+
* было дублей. Операторские правила/группы — без изменений.
|
|
21
|
+
*/
|
|
22
|
+
private readonly informer?;
|
|
16
23
|
private client;
|
|
17
|
-
constructor(repo: NotificationsRepo, botToken: string, appUrl: string
|
|
24
|
+
constructor(repo: NotificationsRepo, botToken: string, appUrl: string,
|
|
25
|
+
/**
|
|
26
|
+
* Если задан — владелец (superadmin) обслуживается информером (уровни +
|
|
27
|
+
* дайджест + лента) и пропускается в per-operator-рассылке ниже, чтобы не
|
|
28
|
+
* было дублей. Операторские правила/группы — без изменений.
|
|
29
|
+
*/
|
|
30
|
+
informer?: AdminInformer | undefined);
|
|
18
31
|
notify(event: NotificationEvent): Promise<void>;
|
|
19
32
|
sendTestMessage(chatId: string): Promise<{
|
|
20
33
|
ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAElF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAElF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAX5B,OAAO,CAAC,MAAM,CAA+B;gBAG1B,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;IAC/B;;;;OAIG;IACc,QAAQ,CAAC,EAAE,aAAa,YAAA;IAOrC,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmD/C,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;YAcjE,WAAW;IAazB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO;IAa3E,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAc9D,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAsB/C,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,SAAS;CAUlB"}
|
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
import { type TgUpdate } from "@chatman-media/channel-telegram";
|
|
2
2
|
import type { NotificationsRepo } from "./dal/notifications.ts";
|
|
3
|
+
/** "2h" / "30m" / "1d" → секунды; "off"/"0"/"" → 0; мусор → null. */
|
|
4
|
+
export declare function parseMuteSeconds(arg: string): number | null;
|
|
3
5
|
export declare class OperatorBotHandler {
|
|
4
6
|
private readonly repo;
|
|
5
7
|
private readonly botToken;
|
|
6
8
|
private client;
|
|
7
9
|
constructor(repo: NotificationsRepo, botToken: string);
|
|
8
10
|
handleUpdate(update: TgUpdate): Promise<void>;
|
|
11
|
+
private cmdStatus;
|
|
12
|
+
private cmdLevel;
|
|
13
|
+
private cmdTopics;
|
|
14
|
+
private cmdDigest;
|
|
15
|
+
private cmdMute;
|
|
16
|
+
private cmdLast;
|
|
17
|
+
private handleCallback;
|
|
18
|
+
private editKeyboard;
|
|
19
|
+
private levelKeyboard;
|
|
20
|
+
private digestKeyboard;
|
|
21
|
+
private topicsKeyboard;
|
|
22
|
+
/** JSON-карта тоглов → полная карта {topic:bool} с дефолтом true. */
|
|
23
|
+
private topicMap;
|
|
24
|
+
private replyNotLinked;
|
|
9
25
|
private handleLinkToken;
|
|
10
26
|
private handleGroupLinkToken;
|
|
11
27
|
private handleSetupGroup;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operator-bot-handler.d.ts","sourceRoot":"","sources":["../src/operator-bot-handler.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"operator-bot-handler.d.ts","sourceRoot":"","sources":["../src/operator-bot-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAsChE,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ3D;AAED,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ3B,OAAO,CAAC,MAAM,CAA+B;gBAG1B,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM;IAO7B,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAmErC,SAAS;YAwBT,QAAQ;YAUR,SAAS;YAUT,SAAS;YAUT,OAAO;YAsBP,OAAO;YAqBP,cAAc;YAoCd,YAAY;IAkB1B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;IAQtB,qEAAqE;IACrE,OAAO,CAAC,QAAQ;YAiBF,cAAc;YASd,eAAe;YAoBf,oBAAoB;YAmCpB,gBAAgB;CAkB/B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations-алерты владельцу (#145). Доставка операционных алертов обменника
|
|
3
|
+
* (резкие колебания курса, устаревший фид, зависшие заявки, упавшие каналы,
|
|
4
|
+
* всплеск оборота) человеку, который НЕ сидит в админке.
|
|
5
|
+
*
|
|
6
|
+
* Источники алертов (sink-и): operations-watcher (apps/worker) и рыночный фид
|
|
7
|
+
* (apps/api). Оба строят OpsAlert и зовут OpsAlertRouter.emit().
|
|
8
|
+
*
|
|
9
|
+
* Маршрутизация по severity:
|
|
10
|
+
* critical → личный Telegram владельца + email (немедленно; email — гарантия,
|
|
11
|
+
* даже если Telegram не настроен/упал);
|
|
12
|
+
* warning → Telegram (email только как fallback, если Telegram не доставлен);
|
|
13
|
+
* info → Telegram (дайджест — возможный follow-up).
|
|
14
|
+
*
|
|
15
|
+
* Анти-шторм: in-memory cooldown на (tenant, dedupKey). Не переживает рестарт
|
|
16
|
+
* процесса (тогда возможен один повторный алерт — это не шторм).
|
|
17
|
+
*
|
|
18
|
+
* Зависимости (TelegramClient, email-отправитель) инжектятся — пакет остаётся
|
|
19
|
+
* без app-зависимостей.
|
|
20
|
+
*/
|
|
21
|
+
import type { AdminInformer } from "./admin-informer.ts";
|
|
22
|
+
import type { Db } from "./dal/types.ts";
|
|
23
|
+
export type OpsAlertKind = "rate_anomaly" | "rate_feed_stale" | "order_stuck" | "channel_down" | "volume_spike";
|
|
24
|
+
export type OpsSeverity = "critical" | "warning" | "info";
|
|
25
|
+
export interface OpsAlert {
|
|
26
|
+
tenantId: number;
|
|
27
|
+
kind: OpsAlertKind;
|
|
28
|
+
severity: OpsSeverity;
|
|
29
|
+
title: string;
|
|
30
|
+
detail: string;
|
|
31
|
+
/** Уникален для конкретного условия — основа cooldown/анти-шторма. */
|
|
32
|
+
dedupKey: string;
|
|
33
|
+
}
|
|
34
|
+
export interface OpsAlertSink {
|
|
35
|
+
emit(alert: OpsAlert): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
/** Минимальный контракт отправителя email (Mailer из apps/api ему соответствует). */
|
|
38
|
+
export interface OpsEmailSender {
|
|
39
|
+
send(opts: {
|
|
40
|
+
to: string;
|
|
41
|
+
subject: string;
|
|
42
|
+
html: string;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/** Контракт отправителя Telegram (по умолчанию строится из botToken; инжектится в тестах). */
|
|
46
|
+
export interface OpsTelegramSender {
|
|
47
|
+
send(chatId: string, htmlText: string): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export interface OwnerContacts {
|
|
50
|
+
email: string | null;
|
|
51
|
+
slug: string | null;
|
|
52
|
+
telegramChatIds: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface OpsAlertRouterDeps {
|
|
55
|
+
db: Db;
|
|
56
|
+
/** Токен operator-бота (PLATFORM_OPERATOR_BOT_TOKEN). Пусто → Telegram отключён. */
|
|
57
|
+
botToken: string;
|
|
58
|
+
appUrl: string;
|
|
59
|
+
/** Отправитель email. null → email-канал отключён. */
|
|
60
|
+
email?: OpsEmailSender | null;
|
|
61
|
+
/** Override отправителя Telegram (для тестов). По умолчанию строится из botToken. */
|
|
62
|
+
telegram?: OpsTelegramSender | null;
|
|
63
|
+
/** Анти-шторм: не повторять один (tenant, dedupKey) чаще, мс. Default 30 мин. */
|
|
64
|
+
cooldownMs?: number;
|
|
65
|
+
/**
|
|
66
|
+
* Если задан — emit() делегирует доставку информеру владельца (уровни +
|
|
67
|
+
* дайджест + лента), а собственный Telegram/email-роутинг НЕ выполняется
|
|
68
|
+
* (чтобы не было дублей). ops-watch-sweep не трогаем: он по-прежнему зовёт
|
|
69
|
+
* sink.emit(). Без informer — standalone-поведение (back-compat для тестов).
|
|
70
|
+
*/
|
|
71
|
+
informer?: AdminInformer;
|
|
72
|
+
log?: {
|
|
73
|
+
warn?: (msg: string, ctx?: unknown) => void;
|
|
74
|
+
info?: (msg: string, ctx?: unknown) => void;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Резолвит контакты владельца тенанта: email супер-админа + Telegram-чаты операторов. */
|
|
78
|
+
export declare function resolveOwnerContacts(db: Db, tenantId: number): Promise<OwnerContacts>;
|
|
79
|
+
export declare class OpsAlertRouter implements OpsAlertSink {
|
|
80
|
+
private readonly deps;
|
|
81
|
+
private readonly telegram;
|
|
82
|
+
private readonly cooldownMs;
|
|
83
|
+
private readonly lastAt;
|
|
84
|
+
constructor(deps: OpsAlertRouterDeps);
|
|
85
|
+
private suppressed;
|
|
86
|
+
emit(alert: OpsAlert): Promise<void>;
|
|
87
|
+
}
|
|
88
|
+
/** Самодостаточный HTML операционного алерта (без зависимости от шаблонов apps/api). */
|
|
89
|
+
export declare function renderOpsEmailHtml(alert: OpsAlert, appUrl: string): string;
|
|
90
|
+
/** Тонкий транспорт Resend для apps/worker (apps/api использует свой Mailer). */
|
|
91
|
+
export declare class ResendEmailSender implements OpsEmailSender {
|
|
92
|
+
private readonly apiKey;
|
|
93
|
+
private readonly from;
|
|
94
|
+
constructor(apiKey: string, from: string);
|
|
95
|
+
send(opts: {
|
|
96
|
+
to: string;
|
|
97
|
+
subject: string;
|
|
98
|
+
html: string;
|
|
99
|
+
}): Promise<void>;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=ops-alerts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-alerts.d.ts","sourceRoot":"","sources":["../src/ops-alerts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-alerts.integration.test.d.ts","sourceRoot":"","sources":["../src/ops-alerts.integration.test.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chatman-media/conversation-engine",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "Channel-agnostic pipeline обработки inbound сообщений: contact-resolve → conversation lookup → mode routing → AI-reply / queued / human → outbound. Сердце data plane.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -34,20 +34,20 @@
|
|
|
34
34
|
"author": "Alexander Kireev",
|
|
35
35
|
"license": "MIT",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@chatman-media/channel-core": "1.
|
|
38
|
-
"@chatman-media/channel-telegram": "1.
|
|
39
|
-
"@chatman-media/llm-router": "1.
|
|
40
|
-
"@chatman-media/kb": "1.
|
|
41
|
-
"@chatman-media/storage": "1.
|
|
42
|
-
"@chatman-media/verticals": "1.
|
|
37
|
+
"@chatman-media/channel-core": "1.1.0",
|
|
38
|
+
"@chatman-media/channel-telegram": "1.1.0",
|
|
39
|
+
"@chatman-media/llm-router": "1.1.0",
|
|
40
|
+
"@chatman-media/kb": "1.3.0",
|
|
41
|
+
"@chatman-media/storage": "1.5.0",
|
|
42
|
+
"@chatman-media/verticals": "1.2.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"drizzle-orm": ">=0.36.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@biomejs/biome": "^2.4.
|
|
48
|
+
"@biomejs/biome": "^2.4.16",
|
|
49
49
|
"@types/bun": "1.3.14",
|
|
50
|
-
"drizzle-orm": "^0.
|
|
50
|
+
"drizzle-orm": "^0.45.2",
|
|
51
51
|
"postgres": "^3.4.5",
|
|
52
52
|
"typescript": "^6.0.3"
|
|
53
53
|
},
|