@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,216 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { Bitrix24Api } from './api.js';
3
+ import type { BotContext } from './api.js';
4
+ import { SendService } from './send-service.js';
5
+ import { MediaService } from './media-service.js';
6
+ import { InboundHandler } from './inbound-handler.js';
7
+ import type { B24MsgContext, Bitrix24AccountConfig, Bitrix24DmPolicy, B24Keyboard, Logger } from './types.js';
8
+ export declare function canCoalesceDirectMessage(msgCtx: B24MsgContext, config: Bitrix24AccountConfig): boolean;
9
+ export declare function mergeBufferedDirectMessages(messages: B24MsgContext[]): B24MsgContext;
10
+ export declare function mergeForwardedMessageContext(previousMsgCtx: B24MsgContext, forwardedMsgCtx: B24MsgContext): B24MsgContext;
11
+ export declare function resolveDirectMessageCoalesceDelay(params: {
12
+ startedAt: number;
13
+ now: number;
14
+ debounceMs?: number;
15
+ maxWaitMs?: number;
16
+ }): number;
17
+ export declare function shouldSkipJoinChatWelcome(params: {
18
+ dialogId?: string;
19
+ chatType?: string;
20
+ webhookUrl: string;
21
+ dmPolicy?: Bitrix24AccountConfig['dmPolicy'];
22
+ }): boolean;
23
+ export interface Bitrix24ConversationRef {
24
+ dialogId: string;
25
+ address: string;
26
+ historyKey: string;
27
+ peer: {
28
+ kind: 'direct' | 'group';
29
+ id: string;
30
+ };
31
+ }
32
+ export declare function resolveConversationRef(params: {
33
+ accountId: string;
34
+ dialogId: string;
35
+ isDirect: boolean;
36
+ }): Bitrix24ConversationRef;
37
+ export declare function buildConversationSessionKey(routeSessionKey: string, conversation: Pick<Bitrix24ConversationRef, 'address'>): string;
38
+ /** State held per running gateway instance */
39
+ interface GatewayState {
40
+ accountId: string;
41
+ api: Bitrix24Api;
42
+ bot: BotContext;
43
+ sendService: SendService;
44
+ mediaService: MediaService;
45
+ inboundHandler: InboundHandler;
46
+ eventMode: 'fetch' | 'webhook';
47
+ }
48
+ export declare function __setGatewayStateForTests(state: GatewayState | null): void;
49
+ /** Default keyboard shown with command responses and welcome messages. */
50
+ export declare const DEFAULT_COMMAND_KEYBOARD: B24Keyboard;
51
+ /** Generic button format used by OpenClaw channelData. */
52
+ export interface ChannelButton {
53
+ text: string;
54
+ callback_data?: string;
55
+ style?: string;
56
+ }
57
+ /**
58
+ * Convert OpenClaw button rows to B24 flat KEYBOARD array.
59
+ */
60
+ export declare function convertButtonsToKeyboard(input: ChannelButton[][] | ChannelButton[]): B24Keyboard;
61
+ /**
62
+ * Extract B24 keyboard from a dispatcher payload's channelData.
63
+ */
64
+ export declare function extractKeyboardFromPayload(payload: {
65
+ channelData?: Record<string, unknown>;
66
+ }): B24Keyboard | undefined;
67
+ /**
68
+ * Extract inline button JSON embedded in message text by the agent.
69
+ *
70
+ * Agents (especially GPT-4o) sometimes embed button markup directly in text
71
+ * as `[[{...},{...}]]` instead of using tool call parameters.
72
+ * This function detects such patterns, extracts the keyboard, and returns
73
+ * cleaned text without the JSON fragment.
74
+ */
75
+ export declare function extractInlineButtonsFromText(text: string): {
76
+ cleanText: string;
77
+ keyboard: B24Keyboard;
78
+ } | undefined;
79
+ export declare function buildBotCodeCandidates(config: Pick<Bitrix24AccountConfig, 'webhookUrl' | 'botCode'>, maxCandidates?: number): string[];
80
+ /**
81
+ * Handle an incoming HTTP request on the webhook route (V2 webhook mode).
82
+ */
83
+ export declare function handleWebhookRequest(req: IncomingMessage, res: ServerResponse): Promise<void>;
84
+ /**
85
+ * The Bitrix24 channel plugin object.
86
+ */
87
+ export declare const bitrix24Plugin: {
88
+ id: string;
89
+ meta: {
90
+ id: string;
91
+ label: string;
92
+ selectionLabel: string;
93
+ docsPath: string;
94
+ docsLabel: string;
95
+ blurb: string;
96
+ aliases: string[];
97
+ };
98
+ capabilities: {
99
+ chatTypes: readonly ["direct", "group"];
100
+ media: boolean;
101
+ reactions: boolean;
102
+ threads: boolean;
103
+ nativeCommands: boolean;
104
+ inlineButtons: string;
105
+ };
106
+ messaging: {
107
+ normalizeTarget: (raw: string) => string;
108
+ targetResolver: {
109
+ hint: string;
110
+ looksLikeId: (raw: string, _normalized: string) => boolean;
111
+ };
112
+ };
113
+ config: {
114
+ listAccountIds: (cfg: Record<string, unknown>) => string[];
115
+ resolveAccount: (cfg: Record<string, unknown>, accountId?: string) => {
116
+ accountId: string;
117
+ config: Bitrix24AccountConfig;
118
+ configured: boolean;
119
+ enabled: boolean;
120
+ };
121
+ };
122
+ security: {
123
+ resolveDmPolicy: (params: {
124
+ cfg?: Record<string, unknown>;
125
+ accountId?: string;
126
+ account?: {
127
+ config?: Record<string, unknown>;
128
+ };
129
+ }) => {
130
+ policy: Bitrix24DmPolicy;
131
+ allowFrom: string[];
132
+ policyPath: string;
133
+ allowFromPath: string;
134
+ approveHint: string;
135
+ normalizeEntry: (raw: string) => string;
136
+ };
137
+ normalizeAllowFrom: (entry: string) => string;
138
+ };
139
+ pairing: {
140
+ idLabel: string;
141
+ normalizeAllowEntry: (entry: string) => string;
142
+ notifyApproval: (params: {
143
+ cfg: Record<string, unknown>;
144
+ id: string;
145
+ runtime?: unknown;
146
+ }) => Promise<void>;
147
+ };
148
+ outbound: {
149
+ deliveryMode: "direct";
150
+ textChunkLimit: number;
151
+ sendText: (ctx: {
152
+ cfg: Record<string, unknown>;
153
+ to: string;
154
+ accountId?: string;
155
+ text: string;
156
+ [key: string]: unknown;
157
+ }) => Promise<{
158
+ messageId: string;
159
+ }>;
160
+ sendMedia: (ctx: {
161
+ cfg: Record<string, unknown>;
162
+ to: string;
163
+ accountId?: string;
164
+ text: string;
165
+ mediaUrl?: string;
166
+ [key: string]: unknown;
167
+ }) => Promise<{
168
+ messageId: string;
169
+ }>;
170
+ sendPayload: (ctx: {
171
+ cfg: Record<string, unknown>;
172
+ to: string;
173
+ accountId?: string;
174
+ text: string;
175
+ mediaUrl?: string;
176
+ payload?: {
177
+ channelData?: Record<string, unknown>;
178
+ [key: string]: unknown;
179
+ };
180
+ [key: string]: unknown;
181
+ }) => Promise<{
182
+ messageId: string;
183
+ }>;
184
+ };
185
+ actions: {
186
+ listActions: (_params: {
187
+ cfg: Record<string, unknown>;
188
+ }) => string[];
189
+ supportsAction: (params: {
190
+ action: string;
191
+ }) => boolean;
192
+ handleAction: (ctx: {
193
+ action: string;
194
+ channel: string;
195
+ cfg: Record<string, unknown>;
196
+ accountId?: string;
197
+ params: Record<string, unknown>;
198
+ [key: string]: unknown;
199
+ }) => Promise<Record<string, unknown> | null>;
200
+ };
201
+ gateway: {
202
+ startAccount: (ctx: {
203
+ cfg: Record<string, unknown>;
204
+ accountId: string;
205
+ account: {
206
+ config?: Record<string, unknown>;
207
+ };
208
+ runtime: unknown;
209
+ abortSignal: AbortSignal;
210
+ log?: Logger;
211
+ setStatus?: (status: Record<string, unknown>) => void;
212
+ }) => Promise<void>;
213
+ };
214
+ };
215
+ export {};
216
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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"}