@elizaos/plugin-imessage 2.0.0-beta.1 → 2.0.11-beta.7

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 (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -18
  3. package/auto-enable.ts +1 -1
  4. package/package.json +21 -4
  5. package/dist/accounts.d.ts +0 -135
  6. package/dist/accounts.d.ts.map +0 -1
  7. package/dist/accounts.js +0 -209
  8. package/dist/accounts.js.map +0 -1
  9. package/dist/api/bluebubbles-routes.d.ts +0 -10
  10. package/dist/api/bluebubbles-routes.d.ts.map +0 -1
  11. package/dist/api/bluebubbles-routes.js +0 -132
  12. package/dist/api/bluebubbles-routes.js.map +0 -1
  13. package/dist/api/imessage-routes.d.ts +0 -80
  14. package/dist/api/imessage-routes.d.ts.map +0 -1
  15. package/dist/api/imessage-routes.js +0 -230
  16. package/dist/api/imessage-routes.js.map +0 -1
  17. package/dist/chatdb-reader.d.ts +0 -240
  18. package/dist/chatdb-reader.d.ts.map +0 -1
  19. package/dist/chatdb-reader.js +0 -647
  20. package/dist/chatdb-reader.js.map +0 -1
  21. package/dist/config.d.ts +0 -60
  22. package/dist/config.d.ts.map +0 -1
  23. package/dist/config.js +0 -8
  24. package/dist/config.js.map +0 -1
  25. package/dist/connector-account-provider.d.ts +0 -18
  26. package/dist/connector-account-provider.d.ts.map +0 -1
  27. package/dist/connector-account-provider.js +0 -83
  28. package/dist/connector-account-provider.js.map +0 -1
  29. package/dist/contacts-reader.d.ts +0 -147
  30. package/dist/contacts-reader.d.ts.map +0 -1
  31. package/dist/contacts-reader.js +0 -481
  32. package/dist/contacts-reader.js.map +0 -1
  33. package/dist/index.d.ts +0 -23
  34. package/dist/index.d.ts.map +0 -1
  35. package/dist/index.js +0 -78
  36. package/dist/index.js.map +0 -1
  37. package/dist/providers/index.d.ts +0 -4
  38. package/dist/providers/index.d.ts.map +0 -1
  39. package/dist/providers/index.js +0 -5
  40. package/dist/providers/index.js.map +0 -1
  41. package/dist/rpc.d.ts +0 -206
  42. package/dist/rpc.d.ts.map +0 -1
  43. package/dist/rpc.js +0 -393
  44. package/dist/rpc.js.map +0 -1
  45. package/dist/service.d.ts +0 -266
  46. package/dist/service.d.ts.map +0 -1
  47. package/dist/service.js +0 -1694
  48. package/dist/service.js.map +0 -1
  49. package/dist/setup-routes.d.ts +0 -38
  50. package/dist/setup-routes.d.ts.map +0 -1
  51. package/dist/setup-routes.js +0 -322
  52. package/dist/setup-routes.js.map +0 -1
  53. package/dist/types.d.ts +0 -192
  54. package/dist/types.d.ts.map +0 -1
  55. package/dist/types.js +0 -138
  56. package/dist/types.js.map +0 -1
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Shaw Walters and elizaOS Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @elizaos/plugin-imessage
2
2
 
3
- iMessage plugin for ElizaOS agents. Enables chat integration with Apple's iMessage on macOS.
3
+ iMessage plugin for elizaOS agents. Enables chat integration with Apple's iMessage on macOS.
4
4
 
5
5
  **Note: This plugin only works on macOS systems.**
6
6
 
@@ -41,6 +41,7 @@ bun add @elizaos/plugin-imessage
41
41
  | `IMESSAGE_GROUP_POLICY` | Group policy: open, allowlist, disabled | No |
42
42
  | `IMESSAGE_ALLOW_FROM` | Comma-separated handles for allowlist | No |
43
43
  | `IMESSAGE_ENABLED` | Enable/disable the plugin | No |
44
+ | `IMESSAGE_BACKFILL` | Rows before current DB tip to replay on startup | No |
44
45
 
45
46
  ### Agent Configuration
46
47
 
@@ -59,21 +60,16 @@ bun add @elizaos/plugin-imessage
59
60
 
60
61
  ### Permissions
61
62
 
62
- 1. Open System Preferences > Security & Privacy > Privacy
63
+ 1. Open System Settings > Privacy & Security > Full Disk Access
63
64
  2. Grant Full Disk Access to:
64
- - Terminal (or your terminal app)
65
- - Your Node.js/Python executable
66
- 3. Allow Messages app to be controlled via AppleScript
65
+ - Your terminal app (or the Eliza process)
66
+ 3. Allow Messages app to be controlled via AppleScript (Automation permission)
67
67
 
68
68
  ### CLI Tool (Optional)
69
69
 
70
- For enhanced functionality, you can use an iMessage CLI tool like `imsg`:
70
+ For enhanced functionality, you can use an iMessage CLI tool (e.g. `imsg`). Set the path once installed:
71
71
 
72
72
  ```bash
73
- # Install a CLI tool (example)
74
- brew install imessage-cli
75
-
76
- # Configure the path
77
73
  IMESSAGE_CLI_PATH=/usr/local/bin/imsg
78
74
  ```
79
75
 
@@ -140,8 +136,10 @@ iMessage supports multiple target types:
140
136
  ## Limitations
141
137
 
142
138
  - **macOS Only**: iMessage doesn't have an official API and only works on macOS
143
- - **No Official API**: Relies on AppleScript or CLI tools
144
- - **Permissions**: Requires Full Disk Access and Automation permissions
139
+ - **No Official API**: Sending still relies on AppleScript or CLI tools
140
+ - **Permissions**: Message history requires Full Disk Access, sending through
141
+ Messages requires Automation, and contact resolution/editing requires
142
+ Contacts access
145
143
  - **Rate Limits**: Apple may throttle excessive automation
146
144
 
147
145
  ## Development
@@ -149,7 +147,7 @@ iMessage supports multiple target types:
149
147
  ### Building
150
148
 
151
149
  ```bash
152
- cd typescript && npm run build
150
+ bun run --cwd plugins/plugin-imessage build
153
151
  ```
154
152
 
155
153
  ### Testing
@@ -157,7 +155,7 @@ cd typescript && npm run build
157
155
  Testing requires a macOS environment with Messages app configured:
158
156
 
159
157
  ```bash
160
- npm test
158
+ bun run --cwd plugins/plugin-imessage test
161
159
  ```
162
160
 
163
161
  ## Troubleshooting
@@ -165,7 +163,7 @@ npm test
165
163
  ### "Cannot access Messages app"
166
164
 
167
165
  1. Ensure Full Disk Access is granted
168
- 2. Ensure Automation permissions are granted
166
+ 2. Ensure Automation permissions are granted if sending through Messages fails
169
167
  3. Try opening Messages app manually first
170
168
 
171
169
  ### "Service not available"
@@ -179,6 +177,3 @@ npm test
179
177
  2. Verify the recipient has iMessage enabled
180
178
  3. Check for rate limiting (try again later)
181
179
 
182
- ## License
183
-
184
- MIT
package/auto-enable.ts CHANGED
@@ -8,7 +8,7 @@ import type { PluginAutoEnableContext } from "@elizaos/core";
8
8
 
9
9
  /** Enable when an `imessage` connector block is present and not explicitly disabled. */
10
10
  export function shouldEnable(ctx: PluginAutoEnableContext): boolean {
11
- const c = (ctx.config?.connectors as Record<string, unknown> | undefined)
11
+ const c = (ctx.config.connectors as Record<string, unknown> | undefined)
12
12
  ?.imessage;
13
13
  if (!c || typeof c !== "object") return false;
14
14
  const config = c as Record<string, unknown>;
package/package.json CHANGED
@@ -1,14 +1,30 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-imessage",
3
- "version": "2.0.0-beta.1",
3
+ "version": "2.0.11-beta.7",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "exports": {
8
8
  ".": {
9
9
  "types": "./dist/index.d.ts",
10
+ "eliza-source": {
11
+ "types": "./src/index.ts",
12
+ "import": "./src/index.ts",
13
+ "default": "./src/index.ts"
14
+ },
10
15
  "import": "./dist/index.js",
11
16
  "default": "./dist/index.js"
17
+ },
18
+ "./*.css": "./dist/*.css",
19
+ "./*": {
20
+ "types": "./dist/*.d.ts",
21
+ "eliza-source": {
22
+ "types": "./src/*.ts",
23
+ "import": "./src/*.ts",
24
+ "default": "./src/*.ts"
25
+ },
26
+ "import": "./dist/*.js",
27
+ "default": "./dist/*.js"
12
28
  }
13
29
  },
14
30
  "files": [
@@ -31,10 +47,10 @@
31
47
  "lint:check": "bunx @biomejs/biome check .",
32
48
  "format": "bunx @biomejs/biome format --write .",
33
49
  "format:check": "bunx @biomejs/biome format .",
34
- "typecheck": "tsc --noEmit"
50
+ "typecheck": "tsgo --noEmit"
35
51
  },
36
52
  "dependencies": {
37
- "@elizaos/core": "2.0.0-beta.1",
53
+ "@elizaos/core": "2.0.11-beta.7",
38
54
  "zod": "^4.4.3"
39
55
  },
40
56
  "devDependencies": {
@@ -100,5 +116,6 @@
100
116
  "sensitive": false
101
117
  }
102
118
  }
103
- }
119
+ },
120
+ "gitHead": "cdbc876f793d96073d7eb0d09715a031ce0cd32e"
104
121
  }
@@ -1,135 +0,0 @@
1
- import type { IAgentRuntime } from "@elizaos/core";
2
- /**
3
- * Default account identifier used when no specific account is configured
4
- */
5
- export declare const DEFAULT_ACCOUNT_ID = "default";
6
- /**
7
- * Group-specific configuration
8
- */
9
- export interface IMessageGroupConfig {
10
- /** If false, ignore messages from this group */
11
- enabled?: boolean;
12
- /** Allowlist for users in this group */
13
- allowFrom?: Array<string | number>;
14
- /** Require bot mention to respond */
15
- requireMention?: boolean;
16
- /** Custom system prompt for this group */
17
- systemPrompt?: string;
18
- /** Skills enabled for this group */
19
- skills?: string[];
20
- }
21
- /**
22
- * Configuration for a single iMessage account
23
- */
24
- export interface IMessageAccountConfig {
25
- /** Optional display name for this account */
26
- name?: string;
27
- /** If false, do not start this iMessage account */
28
- enabled?: boolean;
29
- /** Path to the iMessage CLI tool */
30
- cliPath?: string;
31
- /** Path to the iMessage database */
32
- dbPath?: string;
33
- /** iMessage service type (iMessage or SMS) */
34
- service?: "iMessage" | "SMS";
35
- /** Phone number region code */
36
- region?: string;
37
- /** Allowlist for DM senders */
38
- allowFrom?: Array<string | number>;
39
- /** Allowlist for groups */
40
- groupAllowFrom?: Array<string | number>;
41
- /** DM access policy */
42
- dmPolicy?: "open" | "allowlist" | "pairing" | "disabled";
43
- /** Group message access policy */
44
- groupPolicy?: "open" | "allowlist" | "disabled";
45
- /** Whether to include attachments */
46
- includeAttachments?: boolean;
47
- /** Max media size in MB */
48
- mediaMaxMb?: number;
49
- /** Text chunk limit for messages */
50
- textChunkLimit?: number;
51
- /** Group-specific configurations */
52
- groups?: Record<string, IMessageGroupConfig>;
53
- }
54
- /**
55
- * Multi-account iMessage configuration structure
56
- */
57
- export interface IMessageMultiAccountConfig {
58
- /** Default/base configuration applied to all accounts */
59
- enabled?: boolean;
60
- cliPath?: string;
61
- dbPath?: string;
62
- service?: "iMessage" | "SMS";
63
- region?: string;
64
- dmPolicy?: "open" | "allowlist" | "pairing" | "disabled";
65
- groupPolicy?: "open" | "allowlist" | "disabled";
66
- includeAttachments?: boolean;
67
- mediaMaxMb?: number;
68
- textChunkLimit?: number;
69
- /** Per-account configuration overrides */
70
- accounts?: Record<string, IMessageAccountConfig>;
71
- /** Group configurations at base level */
72
- groups?: Record<string, IMessageGroupConfig>;
73
- }
74
- /**
75
- * Resolved iMessage account with all configuration merged
76
- */
77
- export interface ResolvedIMessageAccount {
78
- accountId: string;
79
- enabled: boolean;
80
- name?: string;
81
- cliPath: string;
82
- dbPath?: string;
83
- configured: boolean;
84
- config: IMessageAccountConfig;
85
- }
86
- /**
87
- * Normalizes an account ID, returning the default if not provided
88
- */
89
- export declare function normalizeAccountId(accountId?: string | null): string;
90
- /**
91
- * Gets the multi-account configuration from runtime settings
92
- */
93
- export declare function getMultiAccountConfig(runtime: IAgentRuntime): IMessageMultiAccountConfig;
94
- /**
95
- * Lists all configured account IDs
96
- */
97
- export declare function listIMessageAccountIds(runtime: IAgentRuntime): string[];
98
- /**
99
- * Resolves the default account ID to use
100
- */
101
- export declare function resolveDefaultIMessageAccountId(runtime: IAgentRuntime): string;
102
- /**
103
- * Resolves a complete iMessage account configuration
104
- */
105
- export declare function resolveIMessageAccount(runtime: IAgentRuntime, accountId?: string | null): ResolvedIMessageAccount;
106
- /**
107
- * Lists all enabled iMessage accounts
108
- */
109
- export declare function listEnabledIMessageAccounts(runtime: IAgentRuntime): ResolvedIMessageAccount[];
110
- /**
111
- * Checks if multi-account mode is enabled
112
- */
113
- export declare function isMultiAccountEnabled(runtime: IAgentRuntime): boolean;
114
- /**
115
- * Resolves group configuration for a specific group
116
- */
117
- export declare function resolveIMessageGroupConfig(runtime: IAgentRuntime, accountId: string, groupId: string): IMessageGroupConfig | undefined;
118
- /**
119
- * Checks if a user is allowed based on policy and allowlist
120
- */
121
- export declare function isIMessageUserAllowed(params: {
122
- identifier: string;
123
- accountConfig: IMessageAccountConfig;
124
- isGroup: boolean;
125
- groupId?: string;
126
- groupConfig?: IMessageGroupConfig;
127
- }): boolean;
128
- /**
129
- * Checks if mention is required in a group
130
- */
131
- export declare function isIMessageMentionRequired(params: {
132
- accountConfig: IMessageAccountConfig;
133
- groupConfig?: IMessageGroupConfig;
134
- }): boolean;
135
- //# sourceMappingURL=accounts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
package/dist/accounts.js DELETED
@@ -1,209 +0,0 @@
1
- /**
2
- * Default account identifier used when no specific account is configured
3
- */
4
- export const DEFAULT_ACCOUNT_ID = "default";
5
- /**
6
- * Normalizes an account ID, returning the default if not provided
7
- */
8
- export function normalizeAccountId(accountId) {
9
- if (!accountId || typeof accountId !== "string") {
10
- return DEFAULT_ACCOUNT_ID;
11
- }
12
- const trimmed = accountId.trim().toLowerCase();
13
- if (!trimmed || trimmed === "default") {
14
- return DEFAULT_ACCOUNT_ID;
15
- }
16
- return trimmed;
17
- }
18
- /**
19
- * Gets the multi-account configuration from runtime settings
20
- */
21
- export function getMultiAccountConfig(runtime) {
22
- const characterIMessage = runtime.character?.settings?.imessage;
23
- return {
24
- enabled: characterIMessage?.enabled,
25
- cliPath: characterIMessage?.cliPath,
26
- dbPath: characterIMessage?.dbPath,
27
- service: characterIMessage?.service,
28
- region: characterIMessage?.region,
29
- dmPolicy: characterIMessage?.dmPolicy,
30
- groupPolicy: characterIMessage?.groupPolicy,
31
- includeAttachments: characterIMessage?.includeAttachments,
32
- mediaMaxMb: characterIMessage?.mediaMaxMb,
33
- textChunkLimit: characterIMessage?.textChunkLimit,
34
- accounts: characterIMessage?.accounts,
35
- groups: characterIMessage?.groups,
36
- };
37
- }
38
- /**
39
- * Lists all configured account IDs
40
- */
41
- export function listIMessageAccountIds(runtime) {
42
- const config = getMultiAccountConfig(runtime);
43
- const accounts = config.accounts;
44
- if (!accounts || typeof accounts !== "object") {
45
- return [DEFAULT_ACCOUNT_ID];
46
- }
47
- const ids = Object.keys(accounts).filter(Boolean);
48
- if (ids.length === 0) {
49
- return [DEFAULT_ACCOUNT_ID];
50
- }
51
- return ids.slice().sort((a, b) => a.localeCompare(b));
52
- }
53
- /**
54
- * Resolves the default account ID to use
55
- */
56
- export function resolveDefaultIMessageAccountId(runtime) {
57
- const ids = listIMessageAccountIds(runtime);
58
- if (ids.includes(DEFAULT_ACCOUNT_ID)) {
59
- return DEFAULT_ACCOUNT_ID;
60
- }
61
- return ids[0] ?? DEFAULT_ACCOUNT_ID;
62
- }
63
- /**
64
- * Gets the account-specific configuration
65
- */
66
- function getAccountConfig(runtime, accountId) {
67
- const config = getMultiAccountConfig(runtime);
68
- const accounts = config.accounts;
69
- if (!accounts || typeof accounts !== "object") {
70
- return undefined;
71
- }
72
- return accounts[accountId];
73
- }
74
- /**
75
- * Merges base configuration with account-specific overrides
76
- */
77
- function mergeIMessageAccountConfig(runtime, accountId) {
78
- const multiConfig = getMultiAccountConfig(runtime);
79
- const { accounts: _ignored, ...baseConfig } = multiConfig;
80
- const accountConfig = getAccountConfig(runtime, accountId) ?? {};
81
- // Get environment/runtime settings for the base config
82
- const envCliPath = runtime.getSetting("IMESSAGE_CLI_PATH");
83
- const envDbPath = runtime.getSetting("IMESSAGE_DB_PATH");
84
- const envDmPolicy = runtime.getSetting("IMESSAGE_DM_POLICY");
85
- const envGroupPolicy = runtime.getSetting("IMESSAGE_GROUP_POLICY");
86
- const envConfig = {
87
- cliPath: envCliPath || undefined,
88
- dbPath: envDbPath || undefined,
89
- dmPolicy: envDmPolicy,
90
- groupPolicy: envGroupPolicy,
91
- };
92
- // Merge order: env defaults < base config < account config
93
- return {
94
- ...envConfig,
95
- ...baseConfig,
96
- ...accountConfig,
97
- };
98
- }
99
- /**
100
- * Resolves a complete iMessage account configuration
101
- */
102
- export function resolveIMessageAccount(runtime, accountId) {
103
- const normalizedAccountId = normalizeAccountId(accountId);
104
- const multiConfig = getMultiAccountConfig(runtime);
105
- const baseEnabled = multiConfig.enabled !== false;
106
- const merged = mergeIMessageAccountConfig(runtime, normalizedAccountId);
107
- const accountEnabled = merged.enabled !== false;
108
- const enabled = baseEnabled && accountEnabled;
109
- const cliPath = merged.cliPath?.trim() || "imsg";
110
- // Determine if this account is actually configured
111
- const configured = Boolean(merged.cliPath?.trim() ||
112
- merged.dbPath?.trim() ||
113
- merged.service ||
114
- merged.region?.trim() ||
115
- (merged.allowFrom && merged.allowFrom.length > 0) ||
116
- (merged.groupAllowFrom && merged.groupAllowFrom.length > 0) ||
117
- merged.dmPolicy ||
118
- merged.groupPolicy ||
119
- typeof merged.includeAttachments === "boolean" ||
120
- typeof merged.mediaMaxMb === "number" ||
121
- typeof merged.textChunkLimit === "number" ||
122
- (merged.groups && Object.keys(merged.groups).length > 0));
123
- return {
124
- accountId: normalizedAccountId,
125
- enabled,
126
- name: merged.name?.trim() || undefined,
127
- cliPath,
128
- dbPath: merged.dbPath?.trim() || undefined,
129
- configured,
130
- config: merged,
131
- };
132
- }
133
- /**
134
- * Lists all enabled iMessage accounts
135
- */
136
- export function listEnabledIMessageAccounts(runtime) {
137
- return listIMessageAccountIds(runtime)
138
- .map((accountId) => resolveIMessageAccount(runtime, accountId))
139
- .filter((account) => account.enabled);
140
- }
141
- /**
142
- * Checks if multi-account mode is enabled
143
- */
144
- export function isMultiAccountEnabled(runtime) {
145
- const accounts = listEnabledIMessageAccounts(runtime);
146
- return accounts.length > 1;
147
- }
148
- /**
149
- * Resolves group configuration for a specific group
150
- */
151
- export function resolveIMessageGroupConfig(runtime, accountId, groupId) {
152
- const multiConfig = getMultiAccountConfig(runtime);
153
- const accountConfig = getAccountConfig(runtime, accountId);
154
- // Check account-level groups first
155
- const accountGroup = accountConfig?.groups?.[groupId];
156
- if (accountGroup) {
157
- return accountGroup;
158
- }
159
- // Fall back to base-level groups
160
- return multiConfig.groups?.[groupId];
161
- }
162
- /**
163
- * Checks if a user is allowed based on policy and allowlist
164
- */
165
- export function isIMessageUserAllowed(params) {
166
- const { identifier, accountConfig, isGroup, groupConfig } = params;
167
- if (isGroup) {
168
- const policy = accountConfig.groupPolicy ?? "allowlist";
169
- if (policy === "disabled") {
170
- return false;
171
- }
172
- if (policy === "open") {
173
- return true;
174
- }
175
- // Check group-specific allowlist first
176
- if (groupConfig?.allowFrom?.length) {
177
- return groupConfig.allowFrom.some((allowed) => String(allowed) === identifier);
178
- }
179
- // Check account-level group allowlist
180
- if (accountConfig.groupAllowFrom?.length) {
181
- return accountConfig.groupAllowFrom.some((allowed) => String(allowed) === identifier);
182
- }
183
- return policy !== "allowlist";
184
- }
185
- // DM handling
186
- const policy = accountConfig.dmPolicy ?? "pairing";
187
- if (policy === "disabled") {
188
- return false;
189
- }
190
- if (policy === "open") {
191
- return true;
192
- }
193
- if (policy === "pairing") {
194
- return true;
195
- }
196
- // Allowlist policy
197
- if (accountConfig.allowFrom?.length) {
198
- return accountConfig.allowFrom.some((allowed) => String(allowed) === identifier);
199
- }
200
- return false;
201
- }
202
- /**
203
- * Checks if mention is required in a group
204
- */
205
- export function isIMessageMentionRequired(params) {
206
- const { groupConfig } = params;
207
- return groupConfig?.requireMention ?? false;
208
- }
209
- //# sourceMappingURL=accounts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type http from "node:http";
2
- import type { RouteHelpers } from "./imessage-routes.js";
3
- export interface BlueBubblesRouteState {
4
- runtime?: {
5
- getService(type: string): unknown;
6
- };
7
- }
8
- export declare function resolveBlueBubblesWebhookPath(state: BlueBubblesRouteState): string;
9
- export declare function handleBlueBubblesRoute(req: http.IncomingMessage, res: http.ServerResponse, pathname: string, method: string, state: BlueBubblesRouteState, helpers: RouteHelpers): Promise<boolean>;
10
- //# sourceMappingURL=bluebubbles-routes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bluebubbles-routes.d.ts","sourceRoot":"","sources":["../../src/api/bluebubbles-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA0BzD,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;KACnC,CAAC;CACH;AAUD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAOlF;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CAkJlB"}