@gakr-gakr/matrix 0.1.0

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 (205) hide show
  1. package/CHANGELOG.md +285 -0
  2. package/SPEC-SUPPORT.md +116 -0
  3. package/api.ts +38 -0
  4. package/auth-presence.ts +56 -0
  5. package/autobot.plugin.json +28 -0
  6. package/channel-plugin-api.ts +3 -0
  7. package/cli-metadata.ts +11 -0
  8. package/contract-api.ts +17 -0
  9. package/doctor-contract-api.ts +1 -0
  10. package/helper-api.ts +3 -0
  11. package/index.ts +55 -0
  12. package/package.json +101 -0
  13. package/plugin-entry.handlers.runtime.ts +1 -0
  14. package/runtime-api.ts +72 -0
  15. package/runtime-heavy-api.ts +1 -0
  16. package/runtime-setter-api.ts +3 -0
  17. package/secret-contract-api.ts +5 -0
  18. package/setup-entry.ts +17 -0
  19. package/setup-plugin-api.ts +3 -0
  20. package/src/account-selection.ts +223 -0
  21. package/src/actions.ts +346 -0
  22. package/src/approval-auth.ts +25 -0
  23. package/src/approval-handler.runtime.ts +595 -0
  24. package/src/approval-ids.ts +6 -0
  25. package/src/approval-native.ts +348 -0
  26. package/src/approval-reaction-auth.ts +45 -0
  27. package/src/approval-reactions.ts +313 -0
  28. package/src/auth-precedence.ts +61 -0
  29. package/src/channel-account-paths.ts +97 -0
  30. package/src/channel.runtime.ts +17 -0
  31. package/src/channel.setup.ts +48 -0
  32. package/src/channel.ts +667 -0
  33. package/src/cli-metadata.ts +19 -0
  34. package/src/cli.ts +2298 -0
  35. package/src/config-adapter.ts +41 -0
  36. package/src/config-schema.ts +159 -0
  37. package/src/config-ui-hints.ts +56 -0
  38. package/src/directory-live.ts +238 -0
  39. package/src/doctor-contract.ts +287 -0
  40. package/src/doctor.ts +262 -0
  41. package/src/env-vars.ts +92 -0
  42. package/src/exec-approval-resolver.ts +23 -0
  43. package/src/exec-approvals.ts +293 -0
  44. package/src/group-mentions.ts +41 -0
  45. package/src/legacy-crypto-inspector-availability.ts +60 -0
  46. package/src/legacy-crypto.ts +531 -0
  47. package/src/legacy-state.ts +156 -0
  48. package/src/matrix/account-config.ts +175 -0
  49. package/src/matrix/accounts.ts +194 -0
  50. package/src/matrix/actions/client.ts +31 -0
  51. package/src/matrix/actions/devices.ts +34 -0
  52. package/src/matrix/actions/limits.ts +6 -0
  53. package/src/matrix/actions/messages.ts +129 -0
  54. package/src/matrix/actions/pins.ts +63 -0
  55. package/src/matrix/actions/polls.ts +109 -0
  56. package/src/matrix/actions/profile.ts +37 -0
  57. package/src/matrix/actions/reactions.ts +59 -0
  58. package/src/matrix/actions/room.ts +71 -0
  59. package/src/matrix/actions/summary.ts +88 -0
  60. package/src/matrix/actions/types.ts +63 -0
  61. package/src/matrix/actions/verification.ts +589 -0
  62. package/src/matrix/actions.ts +37 -0
  63. package/src/matrix/active-client.ts +26 -0
  64. package/src/matrix/async-lock.ts +18 -0
  65. package/src/matrix/backup-health.ts +124 -0
  66. package/src/matrix/client/config-runtime-api.ts +9 -0
  67. package/src/matrix/client/config-secret-input.runtime.ts +1 -0
  68. package/src/matrix/client/config.ts +853 -0
  69. package/src/matrix/client/create-client.ts +105 -0
  70. package/src/matrix/client/env-auth.ts +95 -0
  71. package/src/matrix/client/file-sync-store.ts +289 -0
  72. package/src/matrix/client/logging.ts +140 -0
  73. package/src/matrix/client/migration-snapshot.runtime.ts +1 -0
  74. package/src/matrix/client/private-network-host.ts +1 -0
  75. package/src/matrix/client/runtime.ts +4 -0
  76. package/src/matrix/client/shared.ts +316 -0
  77. package/src/matrix/client/storage.ts +543 -0
  78. package/src/matrix/client/types.ts +50 -0
  79. package/src/matrix/client/url-validation.ts +76 -0
  80. package/src/matrix/client-bootstrap.ts +173 -0
  81. package/src/matrix/client.ts +23 -0
  82. package/src/matrix/config-paths.ts +31 -0
  83. package/src/matrix/config-update.ts +292 -0
  84. package/src/matrix/credentials-read.ts +207 -0
  85. package/src/matrix/credentials-write.runtime.ts +35 -0
  86. package/src/matrix/credentials.ts +95 -0
  87. package/src/matrix/deps.ts +309 -0
  88. package/src/matrix/device-health.ts +31 -0
  89. package/src/matrix/direct-management.ts +349 -0
  90. package/src/matrix/direct-room.ts +128 -0
  91. package/src/matrix/draft-stream.ts +225 -0
  92. package/src/matrix/encryption-guidance.ts +24 -0
  93. package/src/matrix/errors.ts +21 -0
  94. package/src/matrix/format.ts +426 -0
  95. package/src/matrix/legacy-crypto-inspector.ts +95 -0
  96. package/src/matrix/media-errors.ts +20 -0
  97. package/src/matrix/media-text.ts +162 -0
  98. package/src/matrix/monitor/access-state.ts +145 -0
  99. package/src/matrix/monitor/ack-config.ts +27 -0
  100. package/src/matrix/monitor/allowlist.ts +92 -0
  101. package/src/matrix/monitor/auto-join.ts +86 -0
  102. package/src/matrix/monitor/config.ts +569 -0
  103. package/src/matrix/monitor/context-summary.ts +43 -0
  104. package/src/matrix/monitor/direct.ts +296 -0
  105. package/src/matrix/monitor/events.ts +397 -0
  106. package/src/matrix/monitor/handler.ts +2271 -0
  107. package/src/matrix/monitor/inbound-dedupe.ts +267 -0
  108. package/src/matrix/monitor/index.ts +540 -0
  109. package/src/matrix/monitor/legacy-crypto-restore.ts +139 -0
  110. package/src/matrix/monitor/location.ts +108 -0
  111. package/src/matrix/monitor/media.ts +119 -0
  112. package/src/matrix/monitor/mentions.ts +256 -0
  113. package/src/matrix/monitor/reaction-events.ts +197 -0
  114. package/src/matrix/monitor/recent-invite.ts +30 -0
  115. package/src/matrix/monitor/replies.ts +136 -0
  116. package/src/matrix/monitor/reply-context.ts +92 -0
  117. package/src/matrix/monitor/room-history.ts +301 -0
  118. package/src/matrix/monitor/room-info.ts +126 -0
  119. package/src/matrix/monitor/rooms.ts +52 -0
  120. package/src/matrix/monitor/route.ts +179 -0
  121. package/src/matrix/monitor/runtime-api.ts +28 -0
  122. package/src/matrix/monitor/startup-verification.ts +237 -0
  123. package/src/matrix/monitor/startup.ts +218 -0
  124. package/src/matrix/monitor/status.ts +120 -0
  125. package/src/matrix/monitor/sync-lifecycle.ts +91 -0
  126. package/src/matrix/monitor/task-runner.ts +38 -0
  127. package/src/matrix/monitor/test-events.ts +21 -0
  128. package/src/matrix/monitor/thread-context.ts +108 -0
  129. package/src/matrix/monitor/threads.ts +85 -0
  130. package/src/matrix/monitor/types.ts +30 -0
  131. package/src/matrix/monitor/verification-events.ts +643 -0
  132. package/src/matrix/monitor/verification-utils.ts +46 -0
  133. package/src/matrix/outbound-media-runtime.ts +1 -0
  134. package/src/matrix/poll-summary.ts +110 -0
  135. package/src/matrix/poll-types.ts +429 -0
  136. package/src/matrix/probe.runtime.ts +4 -0
  137. package/src/matrix/probe.ts +97 -0
  138. package/src/matrix/profile.ts +184 -0
  139. package/src/matrix/reaction-common.ts +147 -0
  140. package/src/matrix/sdk/crypto-bootstrap.ts +438 -0
  141. package/src/matrix/sdk/crypto-facade.ts +242 -0
  142. package/src/matrix/sdk/crypto-node.runtime.ts +17 -0
  143. package/src/matrix/sdk/crypto-runtime.ts +14 -0
  144. package/src/matrix/sdk/decrypt-bridge.ts +410 -0
  145. package/src/matrix/sdk/event-helpers.ts +83 -0
  146. package/src/matrix/sdk/http-client.ts +87 -0
  147. package/src/matrix/sdk/idb-persistence-lock.ts +51 -0
  148. package/src/matrix/sdk/idb-persistence.ts +286 -0
  149. package/src/matrix/sdk/logger.ts +108 -0
  150. package/src/matrix/sdk/read-response-with-limit.ts +19 -0
  151. package/src/matrix/sdk/recovery-key-store.ts +453 -0
  152. package/src/matrix/sdk/timeout-abort-signal.ts +1 -0
  153. package/src/matrix/sdk/transport-runtime-api.ts +18 -0
  154. package/src/matrix/sdk/transport.ts +352 -0
  155. package/src/matrix/sdk/types.ts +245 -0
  156. package/src/matrix/sdk/verification-manager.ts +795 -0
  157. package/src/matrix/sdk/verification-status.ts +23 -0
  158. package/src/matrix/sdk.ts +2152 -0
  159. package/src/matrix/send/client.ts +93 -0
  160. package/src/matrix/send/formatting.ts +189 -0
  161. package/src/matrix/send/media.ts +244 -0
  162. package/src/matrix/send/targets.ts +104 -0
  163. package/src/matrix/send/types.ts +131 -0
  164. package/src/matrix/send.ts +660 -0
  165. package/src/matrix/session-store-metadata.ts +108 -0
  166. package/src/matrix/startup-abort.ts +44 -0
  167. package/src/matrix/subagent-hooks.ts +308 -0
  168. package/src/matrix/sync-state.ts +27 -0
  169. package/src/matrix/target-ids.ts +79 -0
  170. package/src/matrix/thread-bindings-shared.ts +206 -0
  171. package/src/matrix/thread-bindings.ts +580 -0
  172. package/src/matrix-migration.runtime.ts +9 -0
  173. package/src/migration-config.ts +243 -0
  174. package/src/migration-snapshot-backup.ts +116 -0
  175. package/src/migration-snapshot.ts +53 -0
  176. package/src/onboarding.ts +775 -0
  177. package/src/outbound.ts +248 -0
  178. package/src/plugin-entry.runtime.js +115 -0
  179. package/src/plugin-entry.runtime.ts +70 -0
  180. package/src/profile-update.ts +71 -0
  181. package/src/record-shared.ts +3 -0
  182. package/src/resolve-targets.ts +175 -0
  183. package/src/resolver.runtime.ts +5 -0
  184. package/src/resolver.ts +21 -0
  185. package/src/runtime-api.ts +106 -0
  186. package/src/runtime.ts +13 -0
  187. package/src/secret-contract.ts +174 -0
  188. package/src/session-route.ts +126 -0
  189. package/src/setup-bootstrap.ts +102 -0
  190. package/src/setup-config.ts +222 -0
  191. package/src/setup-contract.ts +90 -0
  192. package/src/setup-core.ts +146 -0
  193. package/src/setup-dm-policy.ts +15 -0
  194. package/src/setup-surface.ts +4 -0
  195. package/src/startup-maintenance.ts +114 -0
  196. package/src/storage-paths.ts +92 -0
  197. package/src/thread-binding-api.ts +23 -0
  198. package/src/tool-actions.runtime.ts +1 -0
  199. package/src/tool-actions.ts +498 -0
  200. package/src/types.ts +257 -0
  201. package/subagent-hooks-api.ts +31 -0
  202. package/test-api.ts +21 -0
  203. package/thread-binding-api.ts +4 -0
  204. package/thread-bindings-runtime.ts +4 -0
  205. package/tsconfig.json +16 -0
@@ -0,0 +1,293 @@
1
+ import { resolveApprovalApprovers } from "autobot/plugin-sdk/approval-auth-runtime";
2
+ import {
3
+ createChannelExecApprovalProfile,
4
+ getExecApprovalReplyMetadata,
5
+ isChannelExecApprovalClientEnabledFromConfig,
6
+ isChannelExecApprovalTargetRecipient,
7
+ matchesApprovalRequestFilters,
8
+ } from "autobot/plugin-sdk/approval-client-runtime";
9
+ import { resolveApprovalRequestChannelAccountId } from "autobot/plugin-sdk/approval-native-runtime";
10
+ import type {
11
+ ExecApprovalRequest,
12
+ PluginApprovalRequest,
13
+ } from "autobot/plugin-sdk/approval-runtime";
14
+ import type { AutoBotConfig } from "autobot/plugin-sdk/config-contracts";
15
+ import type { ReplyPayload } from "autobot/plugin-sdk/reply-runtime";
16
+ import { normalizeAccountId } from "autobot/plugin-sdk/routing";
17
+ import { normalizeLowercaseStringOrEmpty } from "autobot/plugin-sdk/string-coerce-runtime";
18
+ import { getMatrixApprovalAuthApprovers } from "./approval-auth.js";
19
+ import { normalizeMatrixApproverId } from "./approval-ids.js";
20
+ import { listMatrixAccountIds, resolveMatrixAccount } from "./matrix/accounts.js";
21
+ import type { CoreConfig } from "./types.js";
22
+
23
+ type ApprovalRequest = ExecApprovalRequest | PluginApprovalRequest;
24
+ type ApprovalKind = "exec" | "plugin";
25
+
26
+ export { normalizeMatrixApproverId };
27
+
28
+ function normalizeMatrixExecApproverId(value: string | number): string | undefined {
29
+ const normalized = normalizeMatrixApproverId(value);
30
+ return normalized === "*" ? undefined : normalized;
31
+ }
32
+
33
+ function resolveMatrixExecApprovalConfig(params: {
34
+ cfg: AutoBotConfig;
35
+ accountId?: string | null;
36
+ }) {
37
+ const account = resolveMatrixAccount(params);
38
+ const config = account.config.execApprovals;
39
+ if (!config) {
40
+ return undefined;
41
+ }
42
+ return {
43
+ ...config,
44
+ enabled: account.enabled && account.configured ? config.enabled : false,
45
+ };
46
+ }
47
+
48
+ function countMatrixExecApprovalEligibleAccounts(params: {
49
+ cfg: AutoBotConfig;
50
+ request: ApprovalRequest;
51
+ approvalKind: ApprovalKind;
52
+ }): number {
53
+ return listMatrixAccountIds(params.cfg).filter((accountId) => {
54
+ const account = resolveMatrixAccount({ cfg: params.cfg, accountId });
55
+ if (!account.enabled || !account.configured) {
56
+ return false;
57
+ }
58
+ const config = resolveMatrixExecApprovalConfig({
59
+ cfg: params.cfg,
60
+ accountId,
61
+ });
62
+ const filters = config?.enabled
63
+ ? {
64
+ agentFilter: config.agentFilter,
65
+ sessionFilter: config.sessionFilter,
66
+ }
67
+ : {
68
+ agentFilter: undefined,
69
+ sessionFilter: undefined,
70
+ };
71
+ return (
72
+ isChannelExecApprovalClientEnabledFromConfig({
73
+ enabled: config?.enabled,
74
+ approverCount: getMatrixApprovalApprovers({
75
+ cfg: params.cfg,
76
+ accountId,
77
+ approvalKind: params.approvalKind,
78
+ }).length,
79
+ }) &&
80
+ matchesApprovalRequestFilters({
81
+ request: params.request.request,
82
+ agentFilter: filters.agentFilter,
83
+ sessionFilter: filters.sessionFilter,
84
+ })
85
+ );
86
+ }).length;
87
+ }
88
+
89
+ function matchesMatrixRequestAccount(params: {
90
+ cfg: AutoBotConfig;
91
+ accountId?: string | null;
92
+ request: ApprovalRequest;
93
+ approvalKind: ApprovalKind;
94
+ }): boolean {
95
+ const turnSourceChannel = normalizeLowercaseStringOrEmpty(
96
+ params.request.request.turnSourceChannel,
97
+ );
98
+ const boundAccountId = resolveApprovalRequestChannelAccountId({
99
+ cfg: params.cfg,
100
+ request: params.request,
101
+ channel: "matrix",
102
+ });
103
+ if (turnSourceChannel && turnSourceChannel !== "matrix" && !boundAccountId) {
104
+ return (
105
+ countMatrixExecApprovalEligibleAccounts({
106
+ cfg: params.cfg,
107
+ request: params.request,
108
+ approvalKind: params.approvalKind,
109
+ }) <= 1
110
+ );
111
+ }
112
+ return (
113
+ !boundAccountId ||
114
+ !params.accountId ||
115
+ normalizeAccountId(boundAccountId) === normalizeAccountId(params.accountId)
116
+ );
117
+ }
118
+
119
+ export function getMatrixExecApprovalApprovers(params: {
120
+ cfg: AutoBotConfig;
121
+ accountId?: string | null;
122
+ }): string[] {
123
+ const account = resolveMatrixAccount(params).config;
124
+ return resolveApprovalApprovers({
125
+ explicit: account.execApprovals?.approvers,
126
+ allowFrom: account.dm?.allowFrom,
127
+ normalizeApprover: normalizeMatrixExecApproverId,
128
+ });
129
+ }
130
+
131
+ function resolveMatrixApprovalKind(request: ApprovalRequest): ApprovalKind {
132
+ return request.id.startsWith("plugin:") ? "plugin" : "exec";
133
+ }
134
+
135
+ export function getMatrixApprovalApprovers(params: {
136
+ cfg: AutoBotConfig;
137
+ accountId?: string | null;
138
+ approvalKind: ApprovalKind;
139
+ }): string[] {
140
+ if (params.approvalKind === "plugin") {
141
+ return getMatrixApprovalAuthApprovers({
142
+ cfg: params.cfg as CoreConfig,
143
+ accountId: params.accountId,
144
+ });
145
+ }
146
+ return getMatrixExecApprovalApprovers(params);
147
+ }
148
+
149
+ export function isMatrixExecApprovalTargetRecipient(params: {
150
+ cfg: AutoBotConfig;
151
+ senderId?: string | null;
152
+ accountId?: string | null;
153
+ }): boolean {
154
+ return isChannelExecApprovalTargetRecipient({
155
+ ...params,
156
+ channel: "matrix",
157
+ normalizeSenderId: normalizeMatrixApproverId,
158
+ matchTarget: ({ target, normalizedSenderId }) =>
159
+ normalizeMatrixApproverId(target.to) === normalizedSenderId,
160
+ });
161
+ }
162
+
163
+ const matrixExecApprovalProfile = createChannelExecApprovalProfile({
164
+ resolveConfig: resolveMatrixExecApprovalConfig,
165
+ resolveApprovers: getMatrixExecApprovalApprovers,
166
+ normalizeSenderId: normalizeMatrixApproverId,
167
+ isTargetRecipient: isMatrixExecApprovalTargetRecipient,
168
+ matchesRequestAccount: (params) =>
169
+ matchesMatrixRequestAccount({
170
+ ...params,
171
+ approvalKind: "exec",
172
+ }),
173
+ });
174
+
175
+ export const isMatrixExecApprovalClientEnabled = matrixExecApprovalProfile.isClientEnabled;
176
+ export const isMatrixExecApprovalApprover = matrixExecApprovalProfile.isApprover;
177
+ export const isMatrixExecApprovalAuthorizedSender = matrixExecApprovalProfile.isAuthorizedSender;
178
+ export const resolveMatrixExecApprovalTarget = matrixExecApprovalProfile.resolveTarget;
179
+ export const shouldHandleMatrixExecApprovalRequest = matrixExecApprovalProfile.shouldHandleRequest;
180
+
181
+ export function isMatrixApprovalClientEnabled(params: {
182
+ cfg: AutoBotConfig;
183
+ accountId?: string | null;
184
+ approvalKind: ApprovalKind;
185
+ }): boolean {
186
+ if (params.approvalKind === "exec") {
187
+ return isMatrixExecApprovalClientEnabled(params);
188
+ }
189
+ const config = resolveMatrixExecApprovalConfig(params);
190
+ return isChannelExecApprovalClientEnabledFromConfig({
191
+ enabled: config?.enabled,
192
+ approverCount: getMatrixApprovalApprovers(params).length,
193
+ });
194
+ }
195
+
196
+ export function isMatrixAnyApprovalClientEnabled(params: {
197
+ cfg: AutoBotConfig;
198
+ accountId?: string | null;
199
+ }): boolean {
200
+ return (
201
+ isMatrixApprovalClientEnabled({
202
+ ...params,
203
+ approvalKind: "exec",
204
+ }) ||
205
+ isMatrixApprovalClientEnabled({
206
+ ...params,
207
+ approvalKind: "plugin",
208
+ })
209
+ );
210
+ }
211
+
212
+ export function shouldHandleMatrixApprovalRequest(params: {
213
+ cfg: AutoBotConfig;
214
+ accountId?: string | null;
215
+ request: ApprovalRequest;
216
+ }): boolean {
217
+ const approvalKind = resolveMatrixApprovalKind(params.request);
218
+ if (
219
+ !matchesMatrixRequestAccount({
220
+ ...params,
221
+ approvalKind,
222
+ })
223
+ ) {
224
+ return false;
225
+ }
226
+ const config = resolveMatrixExecApprovalConfig(params);
227
+ if (
228
+ !isChannelExecApprovalClientEnabledFromConfig({
229
+ enabled: config?.enabled,
230
+ approverCount: getMatrixApprovalApprovers({
231
+ ...params,
232
+ approvalKind,
233
+ }).length,
234
+ })
235
+ ) {
236
+ return false;
237
+ }
238
+ return matchesApprovalRequestFilters({
239
+ request: params.request.request,
240
+ agentFilter: config?.agentFilter,
241
+ sessionFilter: config?.sessionFilter,
242
+ });
243
+ }
244
+
245
+ function buildFilterCheckRequest(params: {
246
+ metadata: NonNullable<ReturnType<typeof getExecApprovalReplyMetadata>>;
247
+ }): ApprovalRequest {
248
+ if (params.metadata.approvalKind === "plugin") {
249
+ return {
250
+ id: params.metadata.approvalId,
251
+ request: {
252
+ title: "Plugin Approval Required",
253
+ description: "",
254
+ agentId: params.metadata.agentId ?? null,
255
+ sessionKey: params.metadata.sessionKey ?? null,
256
+ },
257
+ createdAtMs: 0,
258
+ expiresAtMs: 0,
259
+ };
260
+ }
261
+ return {
262
+ id: params.metadata.approvalId,
263
+ request: {
264
+ command: "",
265
+ agentId: params.metadata.agentId ?? null,
266
+ sessionKey: params.metadata.sessionKey ?? null,
267
+ },
268
+ createdAtMs: 0,
269
+ expiresAtMs: 0,
270
+ };
271
+ }
272
+
273
+ export function shouldSuppressLocalMatrixExecApprovalPrompt(params: {
274
+ cfg: AutoBotConfig;
275
+ accountId?: string | null;
276
+ payload: ReplyPayload;
277
+ }): boolean {
278
+ if (!matrixExecApprovalProfile.shouldSuppressLocalPrompt(params)) {
279
+ return false;
280
+ }
281
+ const metadata = getExecApprovalReplyMetadata(params.payload);
282
+ if (!metadata) {
283
+ return false;
284
+ }
285
+ const request = buildFilterCheckRequest({
286
+ metadata,
287
+ });
288
+ return shouldHandleMatrixApprovalRequest({
289
+ cfg: params.cfg,
290
+ accountId: params.accountId,
291
+ request,
292
+ });
293
+ }
@@ -0,0 +1,41 @@
1
+ import { resolveMatrixAccountConfig } from "./matrix/accounts.js";
2
+ import { resolveMatrixRoomConfig } from "./matrix/monitor/rooms.js";
3
+ import { normalizeMatrixResolvableTarget } from "./matrix/target-ids.js";
4
+ import type { ChannelGroupContext, GroupToolPolicyConfig } from "./runtime-api.js";
5
+ import type { CoreConfig } from "./types.js";
6
+
7
+ function resolveMatrixRoomConfigForGroup(params: ChannelGroupContext) {
8
+ const roomId = normalizeMatrixResolvableTarget(params.groupId?.trim() ?? "");
9
+ const groupChannel = params.groupChannel?.trim() ?? "";
10
+ const aliases = groupChannel ? [normalizeMatrixResolvableTarget(groupChannel)] : [];
11
+ const cfg = params.cfg as CoreConfig;
12
+ const matrixConfig = resolveMatrixAccountConfig({ cfg, accountId: params.accountId });
13
+ return resolveMatrixRoomConfig({
14
+ rooms: matrixConfig.groups ?? matrixConfig.rooms,
15
+ roomId,
16
+ aliases,
17
+ }).config;
18
+ }
19
+
20
+ export function resolveMatrixGroupRequireMention(params: ChannelGroupContext): boolean {
21
+ const resolved = resolveMatrixRoomConfigForGroup(params);
22
+ if (resolved) {
23
+ if (resolved.autoReply === true) {
24
+ return false;
25
+ }
26
+ if (resolved.autoReply === false) {
27
+ return true;
28
+ }
29
+ if (typeof resolved.requireMention === "boolean") {
30
+ return resolved.requireMention;
31
+ }
32
+ }
33
+ return true;
34
+ }
35
+
36
+ export function resolveMatrixGroupToolPolicy(
37
+ params: ChannelGroupContext,
38
+ ): GroupToolPolicyConfig | undefined {
39
+ const resolved = resolveMatrixRoomConfigForGroup(params);
40
+ return resolved?.tools;
41
+ }
@@ -0,0 +1,60 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const LEGACY_CRYPTO_INSPECTOR_FILE = "legacy-crypto-inspector.js";
6
+ const LEGACY_CRYPTO_INSPECTOR_CHUNK_PREFIX = "legacy-crypto-inspector-";
7
+ const LEGACY_CRYPTO_INSPECTOR_HELPER_CHUNK_PREFIX = "availability-";
8
+ const JAVASCRIPT_MODULE_SUFFIX = ".js";
9
+
10
+ function isLegacyCryptoInspectorArtifactName(name: string): boolean {
11
+ if (name === LEGACY_CRYPTO_INSPECTOR_FILE) {
12
+ return true;
13
+ }
14
+ if (
15
+ !name.startsWith(LEGACY_CRYPTO_INSPECTOR_CHUNK_PREFIX) ||
16
+ !name.endsWith(JAVASCRIPT_MODULE_SUFFIX)
17
+ ) {
18
+ return false;
19
+ }
20
+ const chunkSuffix = name.slice(
21
+ LEGACY_CRYPTO_INSPECTOR_CHUNK_PREFIX.length,
22
+ -JAVASCRIPT_MODULE_SUFFIX.length,
23
+ );
24
+ return (
25
+ chunkSuffix.length > 0 &&
26
+ chunkSuffix !== "availability" &&
27
+ !chunkSuffix.startsWith(LEGACY_CRYPTO_INSPECTOR_HELPER_CHUNK_PREFIX)
28
+ );
29
+ }
30
+
31
+ function hasSourceInspectorArtifact(currentDir: string): boolean {
32
+ return [
33
+ path.resolve(currentDir, "matrix", "legacy-crypto-inspector.ts"),
34
+ path.resolve(currentDir, "matrix", "legacy-crypto-inspector.js"),
35
+ ].some((candidate) => fs.existsSync(candidate));
36
+ }
37
+
38
+ function hasBuiltInspectorArtifact(currentDir: string): boolean {
39
+ if (fs.existsSync(path.join(currentDir, "legacy-crypto-inspector.js"))) {
40
+ return true;
41
+ }
42
+ if (fs.existsSync(path.join(currentDir, "extensions", "matrix", "legacy-crypto-inspector.js"))) {
43
+ return true;
44
+ }
45
+ return fs
46
+ .readdirSync(currentDir, { withFileTypes: true })
47
+ .some((entry) => entry.isFile() && isLegacyCryptoInspectorArtifactName(entry.name));
48
+ }
49
+
50
+ export function isMatrixLegacyCryptoInspectorAvailable(): boolean {
51
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
52
+ if (hasSourceInspectorArtifact(currentDir)) {
53
+ return true;
54
+ }
55
+ try {
56
+ return hasBuiltInspectorArtifact(currentDir);
57
+ } catch {
58
+ return false;
59
+ }
60
+ }