@ihazz/bitrix24 1.1.2 → 1.1.4

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.
Files changed (104) hide show
  1. package/README.md +5 -0
  2. package/dist/index.d.ts +30 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +55 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/access-control.d.ts +43 -0
  7. package/dist/src/access-control.d.ts.map +1 -0
  8. package/dist/src/access-control.js +128 -0
  9. package/dist/src/access-control.js.map +1 -0
  10. package/dist/src/api.d.ts +161 -0
  11. package/dist/src/api.d.ts.map +1 -0
  12. package/dist/src/api.js +357 -0
  13. package/dist/src/api.js.map +1 -0
  14. package/dist/src/bot-avatar.d.ts +7 -0
  15. package/dist/src/bot-avatar.d.ts.map +1 -0
  16. package/dist/src/bot-avatar.js +7 -0
  17. package/dist/src/bot-avatar.js.map +1 -0
  18. package/dist/src/channel.d.ts +216 -0
  19. package/dist/src/channel.d.ts.map +1 -0
  20. package/dist/src/channel.js +2324 -0
  21. package/dist/src/channel.js.map +1 -0
  22. package/dist/src/commands.d.ts +22 -0
  23. package/dist/src/commands.d.ts.map +1 -0
  24. package/dist/src/commands.js +160 -0
  25. package/dist/src/commands.js.map +1 -0
  26. package/dist/src/config-schema.d.ts +356 -0
  27. package/dist/src/config-schema.d.ts.map +1 -0
  28. package/dist/src/config-schema.js +43 -0
  29. package/dist/src/config-schema.js.map +1 -0
  30. package/dist/src/config.d.ts +11 -0
  31. package/dist/src/config.d.ts.map +1 -0
  32. package/dist/src/config.js +50 -0
  33. package/dist/src/config.js.map +1 -0
  34. package/dist/src/dedup.d.ts +22 -0
  35. package/dist/src/dedup.d.ts.map +1 -0
  36. package/dist/src/dedup.js +49 -0
  37. package/dist/src/dedup.js.map +1 -0
  38. package/dist/src/group-access.d.ts +52 -0
  39. package/dist/src/group-access.d.ts.map +1 -0
  40. package/dist/src/group-access.js +180 -0
  41. package/dist/src/group-access.js.map +1 -0
  42. package/dist/src/history-cache.d.ts +41 -0
  43. package/dist/src/history-cache.d.ts.map +1 -0
  44. package/dist/src/history-cache.js +82 -0
  45. package/dist/src/history-cache.js.map +1 -0
  46. package/dist/src/i18n.d.ts +22 -0
  47. package/dist/src/i18n.d.ts.map +1 -0
  48. package/dist/src/i18n.js +175 -0
  49. package/dist/src/i18n.js.map +1 -0
  50. package/dist/src/inbound-handler.d.ts +92 -0
  51. package/dist/src/inbound-handler.d.ts.map +1 -0
  52. package/dist/src/inbound-handler.js +417 -0
  53. package/dist/src/inbound-handler.js.map +1 -0
  54. package/dist/src/media-service.d.ts +52 -0
  55. package/dist/src/media-service.d.ts.map +1 -0
  56. package/dist/src/media-service.js +423 -0
  57. package/dist/src/media-service.js.map +1 -0
  58. package/dist/src/message-utils.d.ts +34 -0
  59. package/dist/src/message-utils.d.ts.map +1 -0
  60. package/dist/src/message-utils.js +392 -0
  61. package/dist/src/message-utils.js.map +1 -0
  62. package/dist/src/polling-service.d.ts +39 -0
  63. package/dist/src/polling-service.d.ts.map +1 -0
  64. package/dist/src/polling-service.js +204 -0
  65. package/dist/src/polling-service.js.map +1 -0
  66. package/dist/src/rate-limiter.d.ts +22 -0
  67. package/dist/src/rate-limiter.d.ts.map +1 -0
  68. package/dist/src/rate-limiter.js +72 -0
  69. package/dist/src/rate-limiter.js.map +1 -0
  70. package/dist/src/runtime.d.ts +106 -0
  71. package/dist/src/runtime.d.ts.map +1 -0
  72. package/dist/src/runtime.js +11 -0
  73. package/dist/src/runtime.js.map +1 -0
  74. package/dist/src/send-service.d.ts +66 -0
  75. package/dist/src/send-service.d.ts.map +1 -0
  76. package/dist/src/send-service.js +177 -0
  77. package/dist/src/send-service.js.map +1 -0
  78. package/dist/src/state-paths.d.ts +3 -0
  79. package/dist/src/state-paths.d.ts.map +1 -0
  80. package/dist/src/state-paths.js +23 -0
  81. package/dist/src/state-paths.js.map +1 -0
  82. package/dist/src/types.d.ts +381 -0
  83. package/dist/src/types.d.ts.map +1 -0
  84. package/dist/src/types.js +3 -0
  85. package/dist/src/types.js.map +1 -0
  86. package/dist/src/utils.d.ts +60 -0
  87. package/dist/src/utils.d.ts.map +1 -0
  88. package/dist/src/utils.js +131 -0
  89. package/dist/src/utils.js.map +1 -0
  90. package/index.ts +1 -1
  91. package/openclaw.plugin.json +278 -1
  92. package/package.json +11 -2
  93. package/src/api.ts +0 -3
  94. package/src/channel.ts +76 -73
  95. package/src/config-schema.ts +1 -2
  96. package/src/config.ts +6 -8
  97. package/src/group-access.ts +1 -8
  98. package/src/inbound-handler.ts +128 -15
  99. package/src/media-service.ts +160 -45
  100. package/src/polling-service.ts +2 -3
  101. package/src/send-service.ts +4 -3
  102. package/src/state-paths.ts +4 -0
  103. package/src/types.ts +1 -2
  104. package/src/utils.ts +31 -4
@@ -0,0 +1,180 @@
1
+ import { getWebhookUserId, isIdentityAllowed, normalizeAllowEntry, normalizeAllowList, } from './access-control.js';
2
+ function normalizeWatchRules(rules) {
3
+ return (rules ?? []).map((rule) => ({
4
+ ...rule,
5
+ userId: normalizeAllowEntry(String(rule.userId)),
6
+ topics: Array.isArray(rule.topics)
7
+ ? rule.topics.map((topic) => String(topic).trim()).filter(Boolean)
8
+ : undefined,
9
+ }));
10
+ }
11
+ export function normalizeGroupEntry(entry) {
12
+ return String(entry).trim().toLowerCase();
13
+ }
14
+ export function normalizeGroupAllowList(entries) {
15
+ if (!Array.isArray(entries)) {
16
+ return [];
17
+ }
18
+ return [...new Set(entries
19
+ .map((entry) => normalizeGroupEntry(String(entry)))
20
+ .filter(Boolean))];
21
+ }
22
+ export function buildGroupMatchKeys(params) {
23
+ const keys = [];
24
+ const normalizedDialogId = params.dialogId ? normalizeGroupEntry(params.dialogId) : '';
25
+ const normalizedChatId = params.chatId ? normalizeGroupEntry(params.chatId) : '';
26
+ if (normalizedDialogId) {
27
+ keys.push(normalizedDialogId);
28
+ const dialogMatch = normalizedDialogId.match(/^chat(\d+)$/);
29
+ if (dialogMatch) {
30
+ keys.push(dialogMatch[1]);
31
+ }
32
+ }
33
+ if (normalizedChatId) {
34
+ keys.push(normalizedChatId);
35
+ if (/^\d+$/.test(normalizedChatId)) {
36
+ keys.push(`chat${normalizedChatId}`);
37
+ }
38
+ }
39
+ return [...new Set(keys)];
40
+ }
41
+ export function resolveGroupAccess(params) {
42
+ const matchKeys = buildGroupMatchKeys(params);
43
+ const groups = params.config.groups ?? {};
44
+ const wildcardGroupConfig = groups['*'];
45
+ let matchedGroupKey;
46
+ let matchedGroupConfig;
47
+ for (const key of matchKeys) {
48
+ if (groups[key]) {
49
+ matchedGroupKey = key;
50
+ matchedGroupConfig = groups[key];
51
+ break;
52
+ }
53
+ }
54
+ if (!matchedGroupConfig && wildcardGroupConfig) {
55
+ matchedGroupKey = '*';
56
+ matchedGroupConfig = wildcardGroupConfig;
57
+ }
58
+ const explicitGroupMatched = Boolean(matchedGroupKey
59
+ && matchedGroupKey !== '*'
60
+ && matchedGroupConfig);
61
+ const groupAllowFrom = normalizeGroupAllowList(params.config.groupAllowFrom);
62
+ const groupAllowed = groupAllowFrom.length === 0
63
+ || explicitGroupMatched
64
+ || matchKeys.some((key) => groupAllowFrom.includes(key));
65
+ const watchRules = [
66
+ ...(matchedGroupKey && matchedGroupKey !== '*' ? (matchedGroupConfig?.watch ?? []) : []),
67
+ ...(wildcardGroupConfig?.watch ?? []),
68
+ ];
69
+ return {
70
+ groupPolicy: matchedGroupConfig?.groupPolicy ?? params.config.groupPolicy ?? 'webhookUser',
71
+ requireMention: matchedGroupConfig?.requireMention ?? params.config.requireMention ?? true,
72
+ senderAllowFrom: normalizeAllowList([
73
+ ...(params.config.allowFrom ?? []),
74
+ ...(matchedGroupConfig?.allowFrom ?? []),
75
+ ]),
76
+ watch: normalizeWatchRules(watchRules).map((rule) => ({
77
+ ...rule,
78
+ mode: rule.mode === 'notifyOwnerDm' ? 'notifyOwnerDm' : 'reply',
79
+ })),
80
+ matchedGroupKey,
81
+ matchedGroupConfig,
82
+ groupAllowed,
83
+ };
84
+ }
85
+ export function resolveAgentWatchRules(params) {
86
+ const matchKeys = buildGroupMatchKeys(params);
87
+ const scopes = params.config.agentWatch ?? {};
88
+ const resolvedRules = [];
89
+ for (const key of matchKeys) {
90
+ if (scopes[key]) {
91
+ resolvedRules.push(...normalizeWatchRules(scopes[key]).map((rule) => ({
92
+ ...rule,
93
+ mode: 'notifyOwnerDm',
94
+ })));
95
+ break;
96
+ }
97
+ }
98
+ if (scopes['*']) {
99
+ resolvedRules.push(...normalizeWatchRules(scopes['*']).map((rule) => ({
100
+ ...rule,
101
+ mode: 'notifyOwnerDm',
102
+ })));
103
+ }
104
+ return resolvedRules;
105
+ }
106
+ export async function checkGroupAccessPassive(params) {
107
+ const { senderId, dialogId, chatId, config, runtime, accountId, logger, } = params;
108
+ const identity = normalizeAllowEntry(String(senderId));
109
+ const group = resolveGroupAccess({ config, dialogId, chatId });
110
+ if (!group.groupAllowed || group.groupPolicy === 'disabled') {
111
+ logger?.debug('Group passive access denied (group disabled or not allowed)', {
112
+ senderId,
113
+ dialogId,
114
+ chatId,
115
+ groupAllowed: group.groupAllowed,
116
+ groupPolicy: group.groupPolicy,
117
+ });
118
+ return 'deny';
119
+ }
120
+ if (group.groupPolicy === 'open') {
121
+ return 'allow';
122
+ }
123
+ if (group.groupPolicy === 'webhookUser') {
124
+ const webhookUserId = getWebhookUserId(config.webhookUrl);
125
+ return webhookUserId && webhookUserId === identity ? 'allow' : 'deny';
126
+ }
127
+ if (group.groupPolicy === 'allowlist') {
128
+ return isIdentityAllowed(identity, group.senderAllowFrom) ? 'allow' : 'deny';
129
+ }
130
+ const storeAllowFrom = await runtime.channel.pairing.readAllowFromStore('bitrix24', '', accountId);
131
+ const approved = [...new Set([
132
+ ...group.senderAllowFrom,
133
+ ...normalizeAllowList(storeAllowFrom),
134
+ ])];
135
+ return approved.includes(identity) ? 'allow' : 'pairing';
136
+ }
137
+ export async function checkGroupAccessWithPairing(params) {
138
+ const passiveResult = await checkGroupAccessPassive({
139
+ senderId: params.senderId,
140
+ dialogId: params.dialogId,
141
+ chatId: params.chatId,
142
+ config: params.config,
143
+ runtime: params.runtime,
144
+ accountId: params.accountId,
145
+ logger: params.logger,
146
+ });
147
+ if (passiveResult !== 'pairing') {
148
+ return passiveResult;
149
+ }
150
+ const identity = normalizeAllowEntry(String(params.senderId));
151
+ const group = resolveGroupAccess({
152
+ config: params.config,
153
+ dialogId: params.dialogId,
154
+ chatId: params.chatId,
155
+ });
156
+ try {
157
+ await params.runtime.channel.pairing.upsertPairingRequest({
158
+ channel: 'bitrix24',
159
+ id: identity,
160
+ accountId: params.accountId,
161
+ meta: {
162
+ dialogId: params.dialogId,
163
+ chatId: params.chatId,
164
+ scope: 'group',
165
+ },
166
+ pairingAdapter: params.pairingAdapter,
167
+ });
168
+ return 'pairing';
169
+ }
170
+ catch (err) {
171
+ params.logger?.debug('Group pairing request failed, falling back to deny', {
172
+ senderId: params.senderId,
173
+ dialogId: params.dialogId,
174
+ chatId: params.chatId,
175
+ error: err,
176
+ });
177
+ return 'deny';
178
+ }
179
+ }
180
+ //# sourceMappingURL=group-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-access.js","sourceRoot":"","sources":["../../src/group-access.ts"],"names":[],"mappings":"AASA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAY7B,SAAS,mBAAmB,CAC1B,KAAsB;IAEtB,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,GAAG,IAAI;QACP,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAClE,CAAC,CAAC,SAAS;KACd,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAA6B;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAChB,OAAO;aACJ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aAClD,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAGnC;IACC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjF,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9B,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5D,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,OAAO,gBAAgB,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAIlC;IACC,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAC1C,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,eAAmC,CAAC;IACxC,IAAI,kBAAmD,CAAC;IAExD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,eAAe,GAAG,GAAG,CAAC;YACtB,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,kBAAkB,IAAI,mBAAmB,EAAE,CAAC;QAC/C,eAAe,GAAG,GAAG,CAAC;QACtB,kBAAkB,GAAG,mBAAmB,CAAC;IAC3C,CAAC;IAED,MAAM,oBAAoB,GAAG,OAAO,CAClC,eAAe;WACV,eAAe,KAAK,GAAG;WACvB,kBAAkB,CACxB,CAAC;IACF,MAAM,cAAc,GAAG,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,KAAK,CAAC;WAC3C,oBAAoB;WACpB,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3D,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,eAAe,IAAI,eAAe,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,GAAG,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE,CAAC;KACtC,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,kBAAkB,EAAE,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,aAAa;QAC1F,cAAc,EAAE,kBAAkB,EAAE,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI;QAC1F,eAAe,EAAE,kBAAkB,CAAC;YAClC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;YAClC,GAAG,CAAC,kBAAkB,EAAE,SAAS,IAAI,EAAE,CAAC;SACzC,CAAC;QACF,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpD,GAAG,IAAI;YACP,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO;SAChE,CAAC,CAAC;QACH,eAAe;QACf,kBAAkB;QAClB,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAItC;IACC,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAC9C,MAAM,aAAa,GAA+B,EAAE,CAAC;IAErD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,aAAa,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpE,GAAG,IAAI;gBACP,IAAI,EAAE,eAAwB;aAC/B,CAAC,CAAC,CAAC,CAAC;YACL,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAChB,aAAa,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpE,GAAG,IAAI;YACP,IAAI,EAAE,eAAwB;SAC/B,CAAC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAQ7C;IACC,MAAM,EACJ,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,MAAM,EACN,OAAO,EACP,SAAS,EACT,MAAM,GACP,GAAG,MAAM,CAAC;IACX,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC5D,MAAM,EAAE,KAAK,CAAC,6DAA6D,EAAE;YAC3E,QAAQ;YACR,QAAQ;YACR,MAAM;YACN,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,aAAa,EAAE,CAAC;QACxC,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1D,OAAO,aAAa,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/E,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IACnG,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;YAC3B,GAAG,KAAK,CAAC,eAAe;YACxB,GAAG,kBAAkB,CAAC,cAAc,CAAC;SACtC,CAAC,CAAC,CAAC;IAEJ,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,MASjD;IACC,MAAM,aAAa,GAAG,MAAM,uBAAuB,CAAC;QAClD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC;IACH,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;YACxD,OAAO,EAAE,UAAU;YACnB,EAAE,EAAE,QAAQ;YACZ,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,IAAI,EAAE;gBACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,OAAO;aACf;YACD,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,oDAAoD,EAAE;YACzE,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ export interface HistoryEntry {
2
+ messageId: string;
3
+ sender: string;
4
+ senderId?: string;
5
+ body: string;
6
+ timestamp?: number;
7
+ wasMentioned?: boolean;
8
+ eventScope?: 'bot' | 'user';
9
+ }
10
+ export interface ConversationMeta {
11
+ key: string;
12
+ dialogId: string;
13
+ chatId?: string;
14
+ chatName?: string;
15
+ chatType?: string;
16
+ isGroup?: boolean;
17
+ lastActivityAt?: number;
18
+ }
19
+ export declare class HistoryCache {
20
+ private readonly entries;
21
+ private readonly conversations;
22
+ private readonly maxKeys;
23
+ constructor(params?: {
24
+ maxKeys?: number;
25
+ });
26
+ append(params: {
27
+ key: string;
28
+ entry: HistoryEntry;
29
+ limit: number;
30
+ meta?: Omit<ConversationMeta, 'key'>;
31
+ }): HistoryEntry[];
32
+ get(key: string, limit?: number): HistoryEntry[];
33
+ findByMessageId(key: string, messageId: string | undefined): HistoryEntry | undefined;
34
+ clear(key: string): void;
35
+ clearAll(): void;
36
+ size(): number;
37
+ listConversations(): ConversationMeta[];
38
+ private touch;
39
+ private evictIfNeeded;
40
+ }
41
+ //# sourceMappingURL=history-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-cache.d.ts","sourceRoot":"","sources":["../../src/history-cache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAIzC,MAAM,CAAC,MAAM,EAAE;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,YAAY,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;KACtC,GAAG,YAAY,EAAE;IAwBlB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAchD,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS;IAcrF,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKxB,QAAQ,IAAI,IAAI;IAKhB,IAAI,IAAI,MAAM;IAId,iBAAiB,IAAI,gBAAgB,EAAE;IAMvC,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,aAAa;CAUtB"}
@@ -0,0 +1,82 @@
1
+ export class HistoryCache {
2
+ entries = new Map();
3
+ conversations = new Map();
4
+ maxKeys;
5
+ constructor(params) {
6
+ this.maxKeys = Math.max(1, params?.maxKeys ?? 1000);
7
+ }
8
+ append(params) {
9
+ const key = params.key;
10
+ const limit = Math.max(0, params.limit);
11
+ const currentEntries = this.entries.get(key) ?? [];
12
+ const nextEntries = currentEntries.some((entry) => entry.messageId === params.entry.messageId)
13
+ ? currentEntries
14
+ : [...currentEntries, params.entry];
15
+ const trimmedEntries = limit > 0
16
+ ? nextEntries.slice(-limit)
17
+ : [];
18
+ if (params.meta) {
19
+ this.conversations.set(key, {
20
+ ...this.conversations.get(key),
21
+ ...params.meta,
22
+ key,
23
+ });
24
+ }
25
+ this.touch(key, trimmedEntries);
26
+ this.evictIfNeeded();
27
+ return trimmedEntries;
28
+ }
29
+ get(key, limit) {
30
+ const entries = this.entries.get(key) ?? [];
31
+ if (entries.length === 0) {
32
+ return [];
33
+ }
34
+ this.touch(key, entries);
35
+ if (typeof limit !== 'number' || limit < 0) {
36
+ return [...entries];
37
+ }
38
+ return entries.slice(-limit);
39
+ }
40
+ findByMessageId(key, messageId) {
41
+ if (!messageId) {
42
+ return undefined;
43
+ }
44
+ const entries = this.entries.get(key);
45
+ if (!entries || entries.length === 0) {
46
+ return undefined;
47
+ }
48
+ this.touch(key, entries);
49
+ return entries.find((entry) => entry.messageId === messageId);
50
+ }
51
+ clear(key) {
52
+ this.entries.delete(key);
53
+ this.conversations.delete(key);
54
+ }
55
+ clearAll() {
56
+ this.entries.clear();
57
+ this.conversations.clear();
58
+ }
59
+ size() {
60
+ return this.entries.size;
61
+ }
62
+ listConversations() {
63
+ return [...this.entries.keys()]
64
+ .map((key) => this.conversations.get(key))
65
+ .filter((conversation) => Boolean(conversation));
66
+ }
67
+ touch(key, value) {
68
+ this.entries.delete(key);
69
+ this.entries.set(key, value);
70
+ }
71
+ evictIfNeeded() {
72
+ while (this.entries.size > this.maxKeys) {
73
+ const oldestKey = this.entries.keys().next().value;
74
+ if (typeof oldestKey !== 'string') {
75
+ break;
76
+ }
77
+ this.entries.delete(oldestKey);
78
+ this.conversations.delete(oldestKey);
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=history-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-cache.js","sourceRoot":"","sources":["../../src/history-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Internationalization module for user-facing strings.
3
+ * Supported languages: en, ru, de, es, fr, pt.
4
+ * Language code is resolved from B24 LANGUAGE field in event PARAMS.
5
+ */
6
+ export declare function resolveLocale(lang: string | undefined): string;
7
+ export declare function mediaDownloadFailed(lang: string | undefined, fileNames: string): string;
8
+ export declare function groupChatUnsupported(lang: string | undefined): string;
9
+ export declare function personalBotOwnerOnly(lang: string | undefined): string;
10
+ export declare function accessApproved(lang: string | undefined): string;
11
+ export declare function ownerAndAllowedUsersOnly(lang: string | undefined): string;
12
+ export declare function accessDenied(lang: string | undefined): string;
13
+ export declare function groupPairingPending(lang: string | undefined): string;
14
+ export declare function watchOwnerDmNotice(lang: string | undefined, params: {
15
+ chatRef: string;
16
+ topicsRef?: string;
17
+ sourceKind?: 'chat' | 'dm';
18
+ }): string;
19
+ export declare function welcomeMessage(lang: string | undefined, botName: string): string;
20
+ export declare function pairingWelcomeMessage(lang: string | undefined, botName: string): string;
21
+ export declare function onboardingMessage(lang: string | undefined, botName: string, dmPolicy: 'pairing' | 'webhookUser' | 'allowlist' | 'open' | undefined): string;
22
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/i18n.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE9D;AAkBD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvF;AAaD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAErE;AAaD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAErE;AAWD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE/D;AAWD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEzE;AAWD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE7D;AAWD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEpE;AAyDD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE;IACN,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GACA,MAAM,CAER;AAaD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhF;AAWD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GACrE,MAAM,CAIR"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Internationalization module for user-facing strings.
3
+ * Supported languages: en, ru, de, es, fr, pt.
4
+ * Language code is resolved from B24 LANGUAGE field in event PARAMS.
5
+ */
6
+ // ─── Locale resolver ─────────────────────────────────────────────────────────
7
+ export function resolveLocale(lang) {
8
+ return (lang ?? 'en').toLowerCase().slice(0, 2);
9
+ }
10
+ function resolve(dict, lang) {
11
+ const code = resolveLocale(lang);
12
+ return dict[code] ?? dict.en;
13
+ }
14
+ // ─── Media download failed ───────────────────────────────────────────────────
15
+ const I18N_MEDIA_DOWNLOAD_FAILED = {
16
+ en: (f) => `⚠️ Could not download the file(s): ${f}.\n\nPlease check that the bot is in the required chat and has access to these files.`,
17
+ ru: (f) => `⚠️ Не удалось загрузить файлы: ${f}.\n\nПроверьте, что бот состоит в нужном чате и у него есть доступ к этим файлам.`,
18
+ de: (f) => `⚠️ Die Datei(en) konnten nicht heruntergeladen werden: ${f}.\n\nBitte prüfen Sie, ob der Bot im erforderlichen Chat ist und Zugriff auf diese Dateien hat.`,
19
+ es: (f) => `⚠️ No se pudo descargar el/los archivo(s): ${f}.\n\nCompruebe que el bot este en el chat necesario y tenga acceso a estos archivos.`,
20
+ fr: (f) => `⚠️ Impossible de telecharger le ou les fichiers : ${f}.\n\nVerifiez que le bot se trouve dans le bon chat et qu il a acces a ces fichiers.`,
21
+ pt: (f) => `⚠️ Nao foi possivel baixar o(s) arquivo(s): ${f}.\n\nVerifique se o bot esta no chat correto e se tem acesso a esses arquivos.`,
22
+ };
23
+ export function mediaDownloadFailed(lang, fileNames) {
24
+ return resolve(I18N_MEDIA_DOWNLOAD_FAILED, lang)(fileNames);
25
+ }
26
+ // ─── Group chat unsupported ──────────────────────────────────────────────────
27
+ const I18N_GROUP_CHAT_UNSUPPORTED = {
28
+ en: 'I work only in a direct chat. Please message me there.',
29
+ ru: 'Я работаю только в личном чате. Напишите мне там.',
30
+ de: 'Ich arbeite nur in einem direkten Chat. Bitte schreiben Sie mir dort.',
31
+ es: 'Solo trabajo en un chat personal. Escribame alli.',
32
+ fr: 'Je travaille uniquement dans un chat direct. Ecrivez-moi la-bas.',
33
+ pt: 'Eu trabalho apenas em um chat direto. Escreva para mim por la.',
34
+ };
35
+ export function groupChatUnsupported(lang) {
36
+ return resolve(I18N_GROUP_CHAT_UNSUPPORTED, lang);
37
+ }
38
+ // ─── Personal bot access denied ──────────────────────────────────────────────
39
+ const I18N_PERSONAL_BOT_OWNER_ONLY = {
40
+ en: 'This is a personal bot. Only the bot owner can message it.',
41
+ ru: 'Это персональный бот. Писать ему может только владелец.',
42
+ de: 'Dies ist ein persoenlicher Bot. Nur der Bot-Besitzer kann ihm schreiben.',
43
+ es: 'Este es un bot personal. Solo el propietario del bot puede escribirle.',
44
+ fr: 'Ce bot est personnel. Seul son proprietaire peut lui ecrire.',
45
+ pt: 'Este e um bot pessoal. Apenas o dono do bot pode enviar mensagens para ele.',
46
+ };
47
+ export function personalBotOwnerOnly(lang) {
48
+ return resolve(I18N_PERSONAL_BOT_OWNER_ONLY, lang);
49
+ }
50
+ const I18N_ACCESS_APPROVED = {
51
+ en: 'Access to the bot has been approved.',
52
+ ru: 'Доступ к боту подтвержден.',
53
+ de: 'Der Zugriff auf den Bot wurde bestaetigt.',
54
+ es: 'El acceso al bot ha sido aprobado.',
55
+ fr: 'L acces au bot a ete approuve.',
56
+ pt: 'O acesso ao bot foi aprovado.',
57
+ };
58
+ export function accessApproved(lang) {
59
+ return resolve(I18N_ACCESS_APPROVED, lang);
60
+ }
61
+ const I18N_OWNER_AND_ALLOWED_USERS_ONLY = {
62
+ en: 'This bot is available only to the bot owner and users with approved access.',
63
+ ru: 'Этот бот доступен только владельцу и пользователям с подтвержденным доступом.',
64
+ de: 'Dieser Bot ist nur fuer den Bot-Besitzer und Benutzer mit bestaetigtem Zugriff verfuegbar.',
65
+ es: 'Este bot esta disponible solo para el propietario del bot y los usuarios con acceso confirmado.',
66
+ fr: 'Ce bot est disponible uniquement pour le proprietaire du bot et les utilisateurs disposant d un acces confirme.',
67
+ pt: 'Este bot esta disponivel apenas para o dono do bot e para usuarios com acesso confirmado.',
68
+ };
69
+ export function ownerAndAllowedUsersOnly(lang) {
70
+ return resolve(I18N_OWNER_AND_ALLOWED_USERS_ONLY, lang);
71
+ }
72
+ const I18N_ACCESS_DENIED = {
73
+ en: 'You do not have access to this bot.',
74
+ ru: 'У вас нет доступа к этому боту.',
75
+ de: 'Sie haben keinen Zugriff auf diesen Bot.',
76
+ es: 'No tienes acceso a este bot.',
77
+ fr: 'Vous n avez pas acces a ce bot.',
78
+ pt: 'Voce nao tem acesso a este bot.',
79
+ };
80
+ export function accessDenied(lang) {
81
+ return resolve(I18N_ACCESS_DENIED, lang);
82
+ }
83
+ const I18N_GROUP_PAIRING_PENDING = {
84
+ en: 'To use this bot in group chats, access must be approved first. Please ask the bot owner to confirm your Bitrix24 pairing in OpenClaw.',
85
+ ru: 'Чтобы пользоваться ботом в групповых чатах, сначала нужно подтвердить доступ. Попросите владельца бота подтвердить вашу привязку Bitrix24 в OpenClaw.',
86
+ de: 'Um diesen Bot in Gruppenchats zu verwenden, muss der Zugriff zuerst bestaetigt werden. Bitten Sie den Bot-Besitzer, Ihr Bitrix24-Pairing in OpenClaw zu bestaetigen.',
87
+ es: 'Para usar este bot en chats grupales, primero hay que confirmar el acceso. Pida al propietario del bot que confirme su vinculacion de Bitrix24 en OpenClaw.',
88
+ fr: 'Pour utiliser ce bot dans les chats de groupe, l acces doit d abord etre confirme. Demandez au proprietaire du bot de confirmer votre association Bitrix24 dans OpenClaw.',
89
+ pt: 'Para usar este bot em chats em grupo, o acesso precisa ser confirmado primeiro. Peca ao dono do bot para confirmar seu pareamento do Bitrix24 no OpenClaw.',
90
+ };
91
+ export function groupPairingPending(lang) {
92
+ return resolve(I18N_GROUP_PAIRING_PENDING, lang);
93
+ }
94
+ const I18N_WATCH_OWNER_DM_NOTICE = {
95
+ en: ({ chatRef, topicsRef, sourceKind }) => {
96
+ const topicsSuffix = topicsRef
97
+ ? ` Matched topics: ${topicsRef}`
98
+ : '';
99
+ return sourceKind === 'dm'
100
+ ? `A watch rule was triggered in a direct chat with ${chatRef}.${topicsSuffix}`
101
+ : `A watch rule was triggered in chat ${chatRef}.${topicsSuffix}`;
102
+ },
103
+ ru: ({ chatRef, topicsRef, sourceKind }) => {
104
+ const topicsSuffix = topicsRef
105
+ ? ` Совпавшие темы: ${topicsRef}`
106
+ : '';
107
+ return sourceKind === 'dm'
108
+ ? `Сработало правило отслеживания в личном чате с ${chatRef}.${topicsSuffix}`
109
+ : `Сработало правило отслеживания в чате ${chatRef}.${topicsSuffix}`;
110
+ },
111
+ de: ({ chatRef, topicsRef, sourceKind }) => {
112
+ const topicsSuffix = topicsRef
113
+ ? ` Zugeordnete Themen: ${topicsRef}`
114
+ : '';
115
+ return sourceKind === 'dm'
116
+ ? `Eine Beobachtungsregel wurde im Direktchat mit ${chatRef} ausgeloest.${topicsSuffix}`
117
+ : `Eine Beobachtungsregel wurde im Chat ${chatRef} ausgeloest.${topicsSuffix}`;
118
+ },
119
+ es: ({ chatRef, topicsRef, sourceKind }) => {
120
+ const topicsSuffix = topicsRef
121
+ ? ` Temas coincidentes: ${topicsRef}`
122
+ : '';
123
+ return sourceKind === 'dm'
124
+ ? `Se activo una regla de seguimiento en un chat directo con ${chatRef}.${topicsSuffix}`
125
+ : `Se activo una regla de seguimiento en el chat ${chatRef}.${topicsSuffix}`;
126
+ },
127
+ fr: ({ chatRef, topicsRef, sourceKind }) => {
128
+ const topicsSuffix = topicsRef
129
+ ? ` Sujets correspondants : ${topicsRef}`
130
+ : '';
131
+ return sourceKind === 'dm'
132
+ ? `Une regle de surveillance a ete declenchee dans un chat direct avec ${chatRef}.${topicsSuffix}`
133
+ : `Une regle de surveillance a ete declenchee dans le chat ${chatRef}.${topicsSuffix}`;
134
+ },
135
+ pt: ({ chatRef, topicsRef, sourceKind }) => {
136
+ const topicsSuffix = topicsRef
137
+ ? ` Topicos correspondentes: ${topicsRef}`
138
+ : '';
139
+ return sourceKind === 'dm'
140
+ ? `Uma regra de monitoramento foi acionada em um chat direto com ${chatRef}.${topicsSuffix}`
141
+ : `Uma regra de monitoramento foi acionada no chat ${chatRef}.${topicsSuffix}`;
142
+ },
143
+ };
144
+ export function watchOwnerDmNotice(lang, params) {
145
+ return resolve(I18N_WATCH_OWNER_DM_NOTICE, lang)(params);
146
+ }
147
+ // ─── Onboarding messages ─────────────────────────────────────────────────────
148
+ const I18N_WELCOME = {
149
+ en: (n) => `${n} is ready. Send a message or choose a command below.`,
150
+ ru: (n) => `${n} готов к работе. Напишите сообщение или выберите команду ниже.`,
151
+ de: (n) => `${n} ist bereit. Senden Sie eine Nachricht oder waehlen Sie unten einen Befehl aus.`,
152
+ es: (n) => `${n} esta listo. Envie un mensaje o elija un comando a continuacion.`,
153
+ fr: (n) => `${n} est pret. Envoyez un message ou choisissez une commande ci-dessous.`,
154
+ pt: (n) => `${n} esta pronto. Envie uma mensagem ou escolha um comando abaixo.`,
155
+ };
156
+ export function welcomeMessage(lang, botName) {
157
+ return resolve(I18N_WELCOME, lang)(botName);
158
+ }
159
+ const I18N_PAIRING_WELCOME = {
160
+ en: (n) => `${n} is ready. Send any message, and I will return a pairing code. Then approve it in OpenClaw with: openclaw pairing approve bitrix24 <CODE>`,
161
+ ru: (n) => `${n} готов к работе. Отправьте любое сообщение, и я пришлю код привязки. Затем подтвердите его в OpenClaw командой: openclaw pairing approve bitrix24 <CODE>`,
162
+ de: (n) => `${n} ist bereit. Senden Sie eine beliebige Nachricht, und ich sende einen Pairing-Code. Bestaetigen Sie ihn danach in OpenClaw mit: openclaw pairing approve bitrix24 <CODE>`,
163
+ es: (n) => `${n} esta listo. Envie cualquier mensaje y recibira un codigo de vinculacion. Despues, confirmelo en OpenClaw con: openclaw pairing approve bitrix24 <CODE>`,
164
+ fr: (n) => `${n} est pret. Envoyez n importe quel message et je vous enverrai un code d association. Confirmez-le ensuite dans OpenClaw avec : openclaw pairing approve bitrix24 <CODE>`,
165
+ pt: (n) => `${n} esta pronto. Envie qualquer mensagem e eu enviarei um codigo de pareamento. Depois, confirme-o no OpenClaw com: openclaw pairing approve bitrix24 <CODE>`,
166
+ };
167
+ export function pairingWelcomeMessage(lang, botName) {
168
+ return resolve(I18N_PAIRING_WELCOME, lang)(botName);
169
+ }
170
+ export function onboardingMessage(lang, botName, dmPolicy) {
171
+ return dmPolicy === 'pairing'
172
+ ? pairingWelcomeMessage(lang, botName)
173
+ : welcomeMessage(lang, botName);
174
+ }
175
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import type { B24V2FetchEventItem, B24V2DeleteEventData, B24MsgContext, FetchContext, Bitrix24AccountConfig, Logger } from './types.js';
2
+ /** Normalized fetch command context passed to onFetchCommand callback. */
3
+ export interface FetchCommandContext {
4
+ commandId: number;
5
+ commandName: string;
6
+ commandParams: string;
7
+ commandText: string;
8
+ senderId: string;
9
+ dialogId: string;
10
+ chatId: string;
11
+ chatType: string;
12
+ messageId: string;
13
+ language?: string;
14
+ fetchCtx: FetchContext;
15
+ }
16
+ /** Normalized fetch join chat context */
17
+ export interface FetchJoinChatContext {
18
+ senderId: string;
19
+ dialogId: string;
20
+ chatId: string;
21
+ chatType: string;
22
+ language?: string;
23
+ fetchCtx: FetchContext;
24
+ }
25
+ /** Normalized fetch reaction context. */
26
+ export interface FetchReactionContext {
27
+ eventScope: 'bot' | 'user';
28
+ senderId: string;
29
+ dialogId: string;
30
+ chatId: string;
31
+ messageId: string;
32
+ messageAuthorId: string;
33
+ reaction: string;
34
+ action: 'set' | 'delete';
35
+ language?: string;
36
+ fetchCtx: FetchContext;
37
+ }
38
+ export interface InboundHandlerOptions {
39
+ config: Bitrix24AccountConfig;
40
+ logger?: Logger;
41
+ onMessage?: (ctx: B24MsgContext) => void | Promise<void>;
42
+ /** Called when bot is invited to a chat (FETCH or webhook). */
43
+ onJoinChat?: (ctx: FetchJoinChatContext) => void | Promise<void>;
44
+ /** Called when reaction changes on a message. */
45
+ onReactionChange?: (ctx: FetchReactionContext) => void | Promise<void>;
46
+ /** Called for a slash command. */
47
+ onCommand?: (cmdCtx: FetchCommandContext) => void | Promise<void>;
48
+ /** Called when bot is deleted. */
49
+ onBotDelete?: (data: B24V2DeleteEventData) => void | Promise<void>;
50
+ }
51
+ export declare class InboundHandler {
52
+ private dedup;
53
+ private config;
54
+ private logger;
55
+ private verboseLog;
56
+ private onMessage?;
57
+ private onJoinChat?;
58
+ private onReactionChange?;
59
+ private onCommand?;
60
+ private onBotDelete?;
61
+ constructor(opts: InboundHandlerOptions);
62
+ /**
63
+ * Handle a single event item from imbot.v2.Event.get (FETCH mode).
64
+ * V2 events have camelCase fields and nested bot/message/chat/user objects.
65
+ */
66
+ handleFetchEvent(item: B24V2FetchEventItem, fetchCtx: FetchContext): Promise<boolean>;
67
+ /**
68
+ * Handle V2 ONIMBOTV2MESSAGEADD event.
69
+ * V2 data: { bot, message, chat, user, language }
70
+ */
71
+ private handleV2Message;
72
+ /**
73
+ * Handle V2 ONIMBOTV2REACTIONCHANGE / ONIMV2REACTIONCHANGE event.
74
+ */
75
+ private handleV2ReactionChange;
76
+ /**
77
+ * Handle V2 ONIMBOTV2JOINCHAT event.
78
+ */
79
+ private handleV2JoinChat;
80
+ /**
81
+ * Handle V2 ONIMBOTV2COMMANDADD event.
82
+ * V2 data: { bot, command, message, chat, user, language }
83
+ */
84
+ private handleV2Command;
85
+ /**
86
+ * Handle an incoming V2 webhook POST body.
87
+ * V2 webhooks deliver JSON with { event, data } structure.
88
+ */
89
+ handleWebhook(rawBody: string | Record<string, unknown>): Promise<boolean>;
90
+ destroy(): void;
91
+ }
92
+ //# sourceMappingURL=inbound-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-handler.d.ts","sourceRoot":"","sources":["../../src/inbound-handler.ts"],"names":[],"mappings":"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"}