@ihazz/bitrix24 1.1.2 → 1.1.3

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
package/README.md CHANGED
@@ -153,6 +153,7 @@ If `eventMode` is omitted, the plugin uses:
153
153
  | `agentWatch` | — | Watch rules for user-visible events captured through `agentMode`. Keys follow the same matching pattern as chats: direct dialog like `"77"`, group dialog like `"chat520"`, numeric chat id like `"520"`, or wildcard `"*"`. Only `mode: "notifyOwnerDm"` is supported. |
154
154
  | `pollingIntervalMs` | `3000` | Base poll interval for `fetch` mode. |
155
155
  | `pollingFastIntervalMs` | `100` | Fast follow-up poll interval when more events are pending. |
156
+ | `verboseLog` | `false` | Enables detailed `info` and `debug` logs for development. Warnings and errors stay enabled either way, and sensitive URL query strings are masked before logging. |
156
157
 
157
158
  Group override matching order:
158
159
 
@@ -369,6 +370,10 @@ If `mode` is omitted, `reply` is used.
369
370
 
370
371
  The RAM cache keeps up to `historyLimit` entries per conversation and uses an LRU cap of `1000` conversation keys per process.
371
372
 
373
+ Outbound media uploads intentionally accept only files from the plugin-managed media directory:
374
+ `$OPENCLAW_STATE_DIR/media/bitrix24` or `~/.openclaw/media/bitrix24`.
375
+ Arbitrary local server paths are rejected on purpose for safety.
376
+
372
377
  ## Not Supported
373
378
 
374
379
  - Persistent SQLite or search-based history layer
@@ -0,0 +1,30 @@
1
+ import { bitrix24Plugin } from './src/channel.js';
2
+ import { type PluginRuntime } from './src/runtime.js';
3
+ import type { IncomingMessage, ServerResponse } from 'node:http';
4
+ interface OpenClawPluginApi {
5
+ config: Record<string, unknown>;
6
+ runtime: PluginRuntime;
7
+ registerChannel: (opts: {
8
+ plugin: typeof bitrix24Plugin;
9
+ }) => void;
10
+ registerHttpRoute: (params: {
11
+ path: string;
12
+ auth?: 'plugin';
13
+ handler: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
14
+ }) => void;
15
+ }
16
+ export declare function collectBitrix24CallbackPaths(config: Record<string, unknown>): string[];
17
+ /**
18
+ * OpenClaw Bitrix24 Channel Plugin
19
+ *
20
+ * Connects Bitrix24 Messenger as a communication channel for OpenClaw agents.
21
+ * Users can chat with the AI assistant through Bitrix24's built-in messenger.
22
+ */
23
+ declare const _default: {
24
+ id: string;
25
+ name: string;
26
+ description: string;
27
+ register(api: OpenClawPluginApi): void;
28
+ };
29
+ export default _default;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,OAAO,cAAc,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,iBAAiB,EAAE,CAAC,MAAM,EAAE;QAC1B,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACvE,KAAK,IAAI,CAAC;CACZ;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAkCtF;AAED;;;;;GAKG;;;;;kBAMa,iBAAiB;;AALjC,wBAoBE"}
package/dist/index.js ADDED
@@ -0,0 +1,55 @@
1
+ import { bitrix24Plugin, handleWebhookRequest } from './src/channel.js';
2
+ import { setBitrix24Runtime } from './src/runtime.js';
3
+ export function collectBitrix24CallbackPaths(config) {
4
+ const channels = config?.channels;
5
+ const bitrix24 = channels?.bitrix24;
6
+ const callbackUrls = [];
7
+ if (typeof bitrix24?.callbackUrl === 'string') {
8
+ callbackUrls.push(bitrix24.callbackUrl);
9
+ }
10
+ for (const account of Object.values(bitrix24?.accounts ?? {})) {
11
+ if (typeof account?.callbackUrl === 'string') {
12
+ callbackUrls.push(account.callbackUrl);
13
+ }
14
+ }
15
+ const paths = [];
16
+ const seenPaths = new Set();
17
+ for (const callbackUrl of callbackUrls) {
18
+ try {
19
+ const path = new URL(callbackUrl).pathname;
20
+ if (!seenPaths.has(path)) {
21
+ seenPaths.add(path);
22
+ paths.push(path);
23
+ }
24
+ }
25
+ catch {
26
+ console.warn('[bitrix24] Invalid callbackUrl, skipping HTTP route');
27
+ }
28
+ }
29
+ return paths;
30
+ }
31
+ /**
32
+ * OpenClaw Bitrix24 Channel Plugin
33
+ *
34
+ * Connects Bitrix24 Messenger as a communication channel for OpenClaw agents.
35
+ * Users can chat with the AI assistant through Bitrix24's built-in messenger.
36
+ */
37
+ export default {
38
+ id: 'bitrix24',
39
+ name: 'Bitrix24 Channel',
40
+ description: 'Bitrix24 Messenger channel for OpenClaw',
41
+ register(api) {
42
+ setBitrix24Runtime(api.runtime);
43
+ api.registerChannel({ plugin: bitrix24Plugin });
44
+ for (const callbackPath of collectBitrix24CallbackPaths(api.config)) {
45
+ api.registerHttpRoute({
46
+ path: callbackPath,
47
+ auth: 'plugin',
48
+ handler: async (req, res) => {
49
+ await handleWebhookRequest(req, res);
50
+ },
51
+ });
52
+ }
53
+ },
54
+ };
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAsB,MAAM,kBAAkB,CAAC;AAc1E,MAAM,UAAU,4BAA4B,CAAC,MAA+B;IAC1E,MAAM,QAAQ,GAAG,MAAM,EAAE,QAA+D,CAAC;IACzF,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAGd,CAAC;IAEd,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,OAAO,QAAQ,EAAE,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC9C,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,IAAI,OAAO,OAAO,EAAE,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7C,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,eAAe;IACb,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,yCAAyC;IAEtD,QAAQ,CAAC,GAAsB;QAC7B,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEhC,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAEhD,KAAK,MAAM,YAAY,IAAI,4BAA4B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,iBAAiB,CAAC;gBACpB,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAE,EAAE;oBAC3D,MAAM,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACvC,CAAC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { Bitrix24AccountConfig } from './types.js';
2
+ import type { PluginRuntime, ChannelPairingAdapter } from './runtime.js';
3
+ /**
4
+ * Normalize an allowFrom entry — strip platform prefixes.
5
+ * "bitrix24:42" → "42", "b24:42" → "42", "bx24:42" → "42", "42" → "42"
6
+ */
7
+ export declare function normalizeAllowEntry(entry: string): string;
8
+ export declare function normalizeAllowList(entries: string[] | undefined): string[];
9
+ export declare function isIdentityAllowed(identity: string, allowFrom: string[] | undefined): boolean;
10
+ /**
11
+ * Extract the owner user ID from a Bitrix24 inbound webhook URL.
12
+ * Format: https://{portal}/rest/{user_id}/{webhook_token}/
13
+ */
14
+ export declare function getWebhookUserId(webhookUrl: string | undefined): string | null;
15
+ /**
16
+ * Check whether a sender is allowed to communicate with the bot.
17
+ *
18
+ * Pairing requires runtime state, so the synchronous helper cannot approve access.
19
+ */
20
+ export declare function checkAccess(senderId: string, config: Bitrix24AccountConfig, _options?: {
21
+ dialogId?: string;
22
+ isDirect?: boolean;
23
+ }): boolean;
24
+ export type AccessResult = 'allow' | 'deny' | 'pairing';
25
+ /**
26
+ * Pairing-aware access check.
27
+ * Merges config allowFrom with file-based allowFrom store.
28
+ * For pairing mode, upserts a pairing request and sends the reply.
29
+ */
30
+ export declare function checkAccessWithPairing(params: {
31
+ senderId: string;
32
+ dialogId?: string;
33
+ isDirect?: boolean;
34
+ config: Bitrix24AccountConfig;
35
+ runtime: PluginRuntime;
36
+ accountId: string;
37
+ pairingAdapter: ChannelPairingAdapter;
38
+ sendReply: (text: string) => Promise<void>;
39
+ logger?: {
40
+ debug: (...args: unknown[]) => void;
41
+ };
42
+ }): Promise<AccessResult>;
43
+ //# sourceMappingURL=access-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../../src/access-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAoB,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGzE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAU1E;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAE5F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAiB9E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACnD,OAAO,CAiBT;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAExD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,qBAAqB,CAAC;IACtC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;CAClD,GAAG,OAAO,CAAC,YAAY,CAAC,CAuExB"}
@@ -0,0 +1,128 @@
1
+ import { stripChannelPrefix } from './utils.js';
2
+ /**
3
+ * Normalize an allowFrom entry — strip platform prefixes.
4
+ * "bitrix24:42" → "42", "b24:42" → "42", "bx24:42" → "42", "42" → "42"
5
+ */
6
+ export function normalizeAllowEntry(entry) {
7
+ return stripChannelPrefix(entry.trim());
8
+ }
9
+ export function normalizeAllowList(entries) {
10
+ if (!Array.isArray(entries)) {
11
+ return [];
12
+ }
13
+ return [...new Set(entries
14
+ .map((entry) => normalizeAllowEntry(String(entry)))
15
+ .filter(Boolean))];
16
+ }
17
+ export function isIdentityAllowed(identity, allowFrom) {
18
+ return normalizeAllowList(allowFrom).includes(identity);
19
+ }
20
+ /**
21
+ * Extract the owner user ID from a Bitrix24 inbound webhook URL.
22
+ * Format: https://{portal}/rest/{user_id}/{webhook_token}/
23
+ */
24
+ export function getWebhookUserId(webhookUrl) {
25
+ if (!webhookUrl)
26
+ return null;
27
+ try {
28
+ const url = new URL(webhookUrl);
29
+ const pathParts = url.pathname.split('/').filter(Boolean);
30
+ const restIndex = pathParts.indexOf('rest');
31
+ if (restIndex < 0 || pathParts.length <= restIndex + 2) {
32
+ return null;
33
+ }
34
+ const userId = pathParts[restIndex + 1];
35
+ return userId ? normalizeAllowEntry(userId) : null;
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ /**
42
+ * Check whether a sender is allowed to communicate with the bot.
43
+ *
44
+ * Pairing requires runtime state, so the synchronous helper cannot approve access.
45
+ */
46
+ export function checkAccess(senderId, config, _options) {
47
+ const dmPolicy = resolveDmPolicy(config.dmPolicy);
48
+ const identity = resolveAccessIdentity(senderId);
49
+ switch (dmPolicy) {
50
+ case 'webhookUser': {
51
+ const webhookUserId = getWebhookUserId(config.webhookUrl);
52
+ return webhookUserId === identity;
53
+ }
54
+ case 'open':
55
+ return true;
56
+ case 'allowlist':
57
+ return isIdentityAllowed(identity, config.allowFrom);
58
+ case 'pairing':
59
+ default:
60
+ return false;
61
+ }
62
+ }
63
+ /**
64
+ * Pairing-aware access check.
65
+ * Merges config allowFrom with file-based allowFrom store.
66
+ * For pairing mode, upserts a pairing request and sends the reply.
67
+ */
68
+ export async function checkAccessWithPairing(params) {
69
+ const { senderId, dialogId, isDirect, config, runtime, accountId, pairingAdapter, sendReply, logger, } = params;
70
+ const identity = resolveAccessIdentity(senderId);
71
+ const dmPolicy = resolveDmPolicy(config.dmPolicy);
72
+ if (dmPolicy === 'open') {
73
+ return 'allow';
74
+ }
75
+ if (dmPolicy === 'allowlist') {
76
+ return isIdentityAllowed(identity, config.allowFrom) ? 'allow' : 'deny';
77
+ }
78
+ if (dmPolicy === 'webhookUser') {
79
+ const webhookUserId = getWebhookUserId(config.webhookUrl);
80
+ if (webhookUserId && webhookUserId === identity) {
81
+ return 'allow';
82
+ }
83
+ logger?.debug('Access denied (webhookUser)', { senderId, dialogId, webhookUserId, identity });
84
+ return 'deny';
85
+ }
86
+ const storeAllowFrom = await runtime.channel.pairing.readAllowFromStore('bitrix24', '', accountId);
87
+ const approved = [...new Set([
88
+ ...normalizeAllowList(config.allowFrom),
89
+ ...normalizeAllowList(storeAllowFrom),
90
+ ])];
91
+ if (approved.includes(identity))
92
+ return 'allow';
93
+ try {
94
+ const { code, created } = await runtime.channel.pairing.upsertPairingRequest({
95
+ channel: 'bitrix24',
96
+ id: identity,
97
+ accountId,
98
+ meta: {},
99
+ pairingAdapter,
100
+ });
101
+ if (created) {
102
+ const reply = runtime.channel.pairing.buildPairingReply({
103
+ code,
104
+ channel: 'bitrix24',
105
+ accountId,
106
+ });
107
+ const replyText = typeof reply === 'string'
108
+ ? reply
109
+ : (reply && typeof reply === 'object' && 'text' in reply && typeof reply.text === 'string')
110
+ ? reply.text
111
+ : String(reply);
112
+ await sendReply(replyText);
113
+ }
114
+ logger?.debug('Pairing request handled', { senderId, dialogId, identity, code, created });
115
+ return 'pairing';
116
+ }
117
+ catch (err) {
118
+ logger?.debug('Pairing request failed, falling back to deny', { senderId, dialogId, identity, error: err });
119
+ return 'deny';
120
+ }
121
+ }
122
+ function resolveAccessIdentity(senderId) {
123
+ return normalizeAllowEntry(String(senderId));
124
+ }
125
+ function resolveDmPolicy(policy) {
126
+ return policy ?? 'webhookUser';
127
+ }
128
+ //# sourceMappingURL=access-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-control.js","sourceRoot":"","sources":["../../src/access-control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ import type { B24ApiResult, B24V2BotResult, B24V2BotListResult, B24V2GetMessageContextResult, B24V2GetMessageResult, B24V2ReadMessageResult, B24InputActionStatusCode, B24V2CommandResult, B24V2EventGetResult, B24V2FileUploadResult, B24Keyboard, Logger } from './types.js';
2
+ /**
3
+ * V2 bot context passed to every API call.
4
+ * In webhook auth mode, botToken is required for all calls.
5
+ */
6
+ export interface BotContext {
7
+ botId: number;
8
+ botToken: string;
9
+ }
10
+ export declare class Bitrix24Api {
11
+ private rateLimiter;
12
+ private logger;
13
+ constructor(opts?: {
14
+ maxPerSecond?: number;
15
+ logger?: Logger;
16
+ });
17
+ /**
18
+ * Call B24 REST API via webhook URL.
19
+ * Webhook URL format: https://domain.bitrix24.com/rest/{user_id}/{token}/
20
+ */
21
+ callWebhook<T = unknown>(webhookUrl: string, method: string, params?: Record<string, unknown>): Promise<B24ApiResult<T>>;
22
+ /**
23
+ * Register a new bot (imbot.v2.Bot.register).
24
+ * Idempotent: same code returns existing bot.
25
+ */
26
+ registerBot(webhookUrl: string, botToken: string, fields: {
27
+ code: string;
28
+ properties: {
29
+ name: string;
30
+ lastName?: string;
31
+ workPosition?: string;
32
+ color?: string;
33
+ gender?: string;
34
+ avatar?: string;
35
+ };
36
+ type?: string;
37
+ eventMode?: 'fetch' | 'webhook';
38
+ webhookUrl?: string;
39
+ isHidden?: boolean;
40
+ isReactionsEnabled?: boolean;
41
+ isSupportOpenline?: boolean;
42
+ backgroundId?: string | null;
43
+ }): Promise<B24V2BotResult>;
44
+ /**
45
+ * Update bot properties (imbot.v2.Bot.update).
46
+ */
47
+ updateBot(webhookUrl: string, bot: BotContext, fields: Record<string, unknown>): Promise<B24V2BotResult>;
48
+ /**
49
+ * List bots of the current application (imbot.v2.Bot.list).
50
+ */
51
+ listBots(webhookUrl: string, botToken: string): Promise<B24V2BotListResult>;
52
+ /**
53
+ * Unregister a bot (imbot.v2.Bot.unregister).
54
+ */
55
+ unregisterBot(webhookUrl: string, bot: BotContext): Promise<boolean>;
56
+ /**
57
+ * Send a message (imbot.v2.Chat.Message.send).
58
+ */
59
+ sendMessage(webhookUrl: string, bot: BotContext, dialogId: string, message: string | null, options?: {
60
+ keyboard?: B24Keyboard;
61
+ attach?: unknown;
62
+ system?: boolean;
63
+ urlPreview?: boolean;
64
+ forwardMessages?: number[];
65
+ }): Promise<number>;
66
+ /**
67
+ * Get a single message by id (imbot.v2.Chat.Message.get).
68
+ */
69
+ getMessage(webhookUrl: string, bot: BotContext, messageId: number): Promise<B24V2GetMessageResult>;
70
+ /**
71
+ * Get message window around a message id (imbot.v2.Chat.Message.getContext).
72
+ */
73
+ getMessageContext(webhookUrl: string, bot: BotContext, messageId: number, range?: number): Promise<B24V2GetMessageContextResult>;
74
+ /**
75
+ * Update a message (imbot.v2.Chat.Message.update).
76
+ */
77
+ updateMessage(webhookUrl: string, bot: BotContext, messageId: number, message: string, options?: {
78
+ keyboard?: B24Keyboard | 'N';
79
+ attach?: unknown;
80
+ }): Promise<boolean>;
81
+ /**
82
+ * Answer a native bot command (imbot.v2.Command.answer).
83
+ */
84
+ answerCommand(webhookUrl: string, bot: BotContext, commandId: number, messageId: number, dialogId: string, message: string, options?: {
85
+ keyboard?: B24Keyboard;
86
+ attach?: unknown;
87
+ system?: boolean;
88
+ urlPreview?: boolean;
89
+ }): Promise<boolean>;
90
+ /**
91
+ * Send typing indicator (imbot.v2.Chat.InputAction.notify).
92
+ */
93
+ notifyInputAction(webhookUrl: string, bot: BotContext, dialogId: string, options?: {
94
+ statusMessageCode?: B24InputActionStatusCode;
95
+ duration?: number;
96
+ }): Promise<boolean>;
97
+ /**
98
+ * Mark messages as read (imbot.v2.Chat.Message.read).
99
+ */
100
+ readMessage(webhookUrl: string, bot: BotContext, dialogId: string, messageId?: number): Promise<B24V2ReadMessageResult>;
101
+ /**
102
+ * Bot leaves a chat (imbot.v2.Chat.leave).
103
+ */
104
+ leaveChat(webhookUrl: string, bot: BotContext, dialogId: string): Promise<boolean>;
105
+ /**
106
+ * Add a reaction to a message (imbot.v2.Chat.Message.Reaction.add).
107
+ */
108
+ addReaction(webhookUrl: string, bot: BotContext, messageId: number, reaction: string): Promise<boolean>;
109
+ /**
110
+ * Remove a reaction from a message (imbot.v2.Chat.Message.Reaction.delete).
111
+ */
112
+ deleteReaction(webhookUrl: string, bot: BotContext, messageId: number, reaction: string): Promise<boolean>;
113
+ /**
114
+ * Register a slash command (imbot.v2.Command.register).
115
+ * Idempotent: same command for same bot returns existing.
116
+ */
117
+ registerCommand(webhookUrl: string, bot: BotContext, params: {
118
+ command: string;
119
+ title?: Record<string, string>;
120
+ params?: Record<string, string>;
121
+ common?: boolean;
122
+ hidden?: boolean;
123
+ extranetSupport?: boolean;
124
+ }): Promise<B24V2CommandResult>;
125
+ /**
126
+ * Unregister a slash command (imbot.v2.Command.unregister).
127
+ */
128
+ unregisterCommand(webhookUrl: string, bot: BotContext, commandId: number): Promise<boolean>;
129
+ /**
130
+ * Fetch events via polling (imbot.v2.Event.get).
131
+ */
132
+ fetchEvents(webhookUrl: string, bot: BotContext, params: {
133
+ offset?: number;
134
+ limit?: number;
135
+ withUserEvents?: boolean;
136
+ }): Promise<B24V2EventGetResult>;
137
+ /**
138
+ * Subscribe current user to event recording (im.v2.Event.subscribe).
139
+ */
140
+ subscribeUserEvents(webhookUrl: string): Promise<boolean>;
141
+ /**
142
+ * Unsubscribe current user from event recording (im.v2.Event.unsubscribe).
143
+ * Idempotent — safe to call even if not subscribed.
144
+ */
145
+ unsubscribeUserEvents(webhookUrl: string): Promise<boolean>;
146
+ /**
147
+ * Upload a file to a chat (imbot.v2.File.upload).
148
+ * Single call replaces the old 3-step process (folder.get → upload → commit).
149
+ */
150
+ uploadFile(webhookUrl: string, bot: BotContext, dialogId: string, fields: {
151
+ name: string;
152
+ content: string;
153
+ message?: string;
154
+ }): Promise<B24V2FileUploadResult>;
155
+ /**
156
+ * Get download URL for a file (imbot.v2.File.download).
157
+ */
158
+ getFileDownloadUrl(webhookUrl: string, bot: BotContext, dialogId: string, fileId: number): Promise<string>;
159
+ destroy(): void;
160
+ }
161
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,4BAA4B,EAC5B,qBAAqB,EAErB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EAErB,WAAW,EACX,MAAM,EACP,MAAM,YAAY,CAAC;AAUpB;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAqED,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAKjE;;;OAGG;IACG,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAiE3B;;;OAGG;IACG,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACzH,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,GACA,OAAO,CAAC,cAAc,CAAC;IAS1B;;OAEG;IACG,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,cAAc,CAAC;IAS1B;;OAEG;IACG,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC;IAS9B;;OAEG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,OAAO,CAAC;IAWnB;;OAEG;IACG,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,WAAW,CAAC;QACvB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,GACA,OAAO,CAAC,MAAM,CAAC;IAwClB;;OAEG;IACG,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC;IAajC;;OAEG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,4BAA4B,CAAC;IAcxC;;OAEG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,GAAG,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3D,OAAO,CAAC,OAAO,CAAC;IAanB;;OAEG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7F,OAAO,CAAC,OAAO,CAAC;IAwBnB;;OAEG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;QAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GACA,OAAO,CAAC,OAAO,CAAC;IAiBnB;;OAEG;IACG,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,CAAC;IAgBlC;;OAEG;IACG,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IAWnB;;OAEG;IACG,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IASnB;;OAEG;IACG,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IAWnB;;;OAGG;IACG,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,GACA,OAAO,CAAC,kBAAkB,CAAC;IAa9B;;OAEG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;IAWnB;;OAEG;IACG,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GACpE,OAAO,CAAC,mBAAmB,CAAC;IAe/B;;OAEG;IACG,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS/D;;;OAGG;IACG,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWjE;;;OAGG;IACG,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1D,OAAO,CAAC,qBAAqB,CAAC;IASjC;;OAEG;IACG,kBAAkB,CACtB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IASlB,OAAO,IAAI,IAAI;CAGhB"}