@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,316 @@
1
+ import { normalizeOptionalAccountId } from "autobot/plugin-sdk/account-id";
2
+ import type { CoreConfig } from "../../types.js";
3
+ import type { MatrixClient } from "../sdk.js";
4
+ import { LogService } from "../sdk/logger.js";
5
+ import { awaitMatrixStartupWithAbort } from "../startup-abort.js";
6
+ import { resolveMatrixAuth, resolveMatrixAuthContext } from "./config.js";
7
+ import type { MatrixAuth } from "./types.js";
8
+
9
+ type MatrixCreateClientDeps = {
10
+ createMatrixClient: typeof import("./create-client.js").createMatrixClient;
11
+ };
12
+
13
+ let matrixCreateClientDepsPromise: Promise<MatrixCreateClientDeps> | undefined;
14
+
15
+ async function loadMatrixCreateClientDeps(): Promise<MatrixCreateClientDeps> {
16
+ matrixCreateClientDepsPromise ??= import("./create-client.js").then((runtime) => ({
17
+ createMatrixClient: runtime.createMatrixClient,
18
+ }));
19
+ return await matrixCreateClientDepsPromise;
20
+ }
21
+
22
+ type SharedMatrixClientState = {
23
+ client: MatrixClient;
24
+ key: string;
25
+ started: boolean;
26
+ cryptoReady: boolean;
27
+ startPromise: Promise<void> | null;
28
+ leases: number;
29
+ };
30
+
31
+ const sharedClientStates = new Map<string, SharedMatrixClientState>();
32
+ const sharedClientPromises = new Map<string, Promise<SharedMatrixClientState>>();
33
+
34
+ function serializeDispatcherPolicyKey(auth: MatrixAuth): string {
35
+ return JSON.stringify(auth.dispatcherPolicy ?? null);
36
+ }
37
+
38
+ function buildSharedClientKey(auth: MatrixAuth): string {
39
+ return [
40
+ auth.homeserver,
41
+ auth.userId,
42
+ auth.accessToken,
43
+ auth.encryption ? "e2ee" : "plain",
44
+ auth.allowPrivateNetwork ? "private-net" : "strict-net",
45
+ serializeDispatcherPolicyKey(auth),
46
+ auth.accountId,
47
+ ].join("|");
48
+ }
49
+
50
+ async function createSharedMatrixClient(params: {
51
+ auth: MatrixAuth;
52
+ timeoutMs?: number;
53
+ }): Promise<SharedMatrixClientState> {
54
+ const { createMatrixClient } = await loadMatrixCreateClientDeps();
55
+ const client = await createMatrixClient({
56
+ homeserver: params.auth.homeserver,
57
+ userId: params.auth.userId,
58
+ accessToken: params.auth.accessToken,
59
+ password: params.auth.password,
60
+ deviceId: params.auth.deviceId,
61
+ encryption: params.auth.encryption,
62
+ localTimeoutMs: params.timeoutMs,
63
+ initialSyncLimit: params.auth.initialSyncLimit,
64
+ accountId: params.auth.accountId,
65
+ allowPrivateNetwork: params.auth.allowPrivateNetwork,
66
+ ssrfPolicy: params.auth.ssrfPolicy,
67
+ dispatcherPolicy: params.auth.dispatcherPolicy,
68
+ });
69
+ return {
70
+ client,
71
+ key: buildSharedClientKey(params.auth),
72
+ started: false,
73
+ cryptoReady: false,
74
+ startPromise: null,
75
+ leases: 0,
76
+ };
77
+ }
78
+
79
+ function findSharedClientStateByInstance(client: MatrixClient): SharedMatrixClientState | null {
80
+ for (const state of sharedClientStates.values()) {
81
+ if (state.client === client) {
82
+ return state;
83
+ }
84
+ }
85
+ return null;
86
+ }
87
+
88
+ function deleteSharedClientState(state: SharedMatrixClientState): void {
89
+ sharedClientStates.delete(state.key);
90
+ sharedClientPromises.delete(state.key);
91
+ }
92
+
93
+ async function ensureSharedClientStarted(params: {
94
+ state: SharedMatrixClientState;
95
+ encryption?: boolean;
96
+ abortSignal?: AbortSignal;
97
+ }): Promise<void> {
98
+ const waitForStart = async (startPromise: Promise<void>) => {
99
+ await awaitMatrixStartupWithAbort(startPromise, params.abortSignal);
100
+ };
101
+
102
+ if (params.state.started) {
103
+ return;
104
+ }
105
+ if (params.state.startPromise) {
106
+ await waitForStart(params.state.startPromise);
107
+ return;
108
+ }
109
+
110
+ const startPromise = (async () => {
111
+ const client = params.state.client;
112
+
113
+ // Initialize crypto if enabled
114
+ if (params.encryption && !params.state.cryptoReady) {
115
+ try {
116
+ const joinedRooms = await client.getJoinedRooms();
117
+ if (client.crypto) {
118
+ await client.crypto.prepare(joinedRooms);
119
+ params.state.cryptoReady = true;
120
+ }
121
+ } catch (err) {
122
+ LogService.warn("MatrixClientLite", "Failed to prepare crypto:", err);
123
+ }
124
+ }
125
+
126
+ await client.start({ abortSignal: params.abortSignal });
127
+ params.state.started = true;
128
+ })();
129
+ // Keep the shared startup lock until the underlying start fully settles, even
130
+ // if one waiter aborts early while another caller still owns the startup.
131
+ const guardedStart = startPromise.finally(() => {
132
+ if (params.state.startPromise === guardedStart) {
133
+ params.state.startPromise = null;
134
+ }
135
+ });
136
+ params.state.startPromise = guardedStart;
137
+
138
+ await waitForStart(guardedStart);
139
+ }
140
+
141
+ async function resolveSharedMatrixClientState(
142
+ params: {
143
+ cfg?: CoreConfig;
144
+ env?: NodeJS.ProcessEnv;
145
+ timeoutMs?: number;
146
+ auth?: MatrixAuth;
147
+ startClient?: boolean;
148
+ accountId?: string | null;
149
+ abortSignal?: AbortSignal;
150
+ } = {},
151
+ ): Promise<SharedMatrixClientState> {
152
+ const requestedAccountId = normalizeOptionalAccountId(params.accountId);
153
+ if (params.auth && requestedAccountId && requestedAccountId !== params.auth.accountId) {
154
+ throw new Error(
155
+ `Matrix shared client account mismatch: requested ${requestedAccountId}, auth resolved ${params.auth.accountId}`,
156
+ );
157
+ }
158
+ const authContext = (() => {
159
+ if (params.auth) {
160
+ return null;
161
+ }
162
+ if (!params.cfg) {
163
+ throw new Error(
164
+ "Matrix shared client requires a resolved runtime config. Load and resolve config at the command or gateway boundary, then pass cfg through the runtime path.",
165
+ );
166
+ }
167
+ return resolveMatrixAuthContext({
168
+ cfg: params.cfg,
169
+ env: params.env,
170
+ accountId: params.accountId,
171
+ });
172
+ })();
173
+ const auth =
174
+ params.auth ??
175
+ (await resolveMatrixAuth({
176
+ cfg: authContext?.cfg ?? params.cfg,
177
+ env: authContext?.env ?? params.env,
178
+ accountId: authContext?.accountId,
179
+ }));
180
+ const key = buildSharedClientKey(auth);
181
+ const shouldStart = params.startClient !== false;
182
+
183
+ const existingState = sharedClientStates.get(key);
184
+ if (existingState) {
185
+ if (shouldStart) {
186
+ await ensureSharedClientStarted({
187
+ state: existingState,
188
+ encryption: auth.encryption,
189
+ abortSignal: params.abortSignal,
190
+ });
191
+ }
192
+ return existingState;
193
+ }
194
+
195
+ const existingPromise = sharedClientPromises.get(key);
196
+ if (existingPromise) {
197
+ const pending = await existingPromise;
198
+ if (shouldStart) {
199
+ await ensureSharedClientStarted({
200
+ state: pending,
201
+ encryption: auth.encryption,
202
+ abortSignal: params.abortSignal,
203
+ });
204
+ }
205
+ return pending;
206
+ }
207
+
208
+ const creationPromise = createSharedMatrixClient({
209
+ auth,
210
+ timeoutMs: params.timeoutMs,
211
+ });
212
+ sharedClientPromises.set(key, creationPromise);
213
+
214
+ try {
215
+ const created = await creationPromise;
216
+ sharedClientStates.set(key, created);
217
+ if (shouldStart) {
218
+ await ensureSharedClientStarted({
219
+ state: created,
220
+ encryption: auth.encryption,
221
+ abortSignal: params.abortSignal,
222
+ });
223
+ }
224
+ return created;
225
+ } finally {
226
+ sharedClientPromises.delete(key);
227
+ }
228
+ }
229
+
230
+ export async function resolveSharedMatrixClient(
231
+ params: {
232
+ cfg?: CoreConfig;
233
+ env?: NodeJS.ProcessEnv;
234
+ timeoutMs?: number;
235
+ auth?: MatrixAuth;
236
+ startClient?: boolean;
237
+ accountId?: string | null;
238
+ abortSignal?: AbortSignal;
239
+ } = {},
240
+ ): Promise<MatrixClient> {
241
+ const state = await resolveSharedMatrixClientState(params);
242
+ return state.client;
243
+ }
244
+
245
+ export async function acquireSharedMatrixClient(
246
+ params: {
247
+ cfg?: CoreConfig;
248
+ env?: NodeJS.ProcessEnv;
249
+ timeoutMs?: number;
250
+ auth?: MatrixAuth;
251
+ startClient?: boolean;
252
+ accountId?: string | null;
253
+ abortSignal?: AbortSignal;
254
+ } = {},
255
+ ): Promise<MatrixClient> {
256
+ const state = await resolveSharedMatrixClientState(params);
257
+ state.leases += 1;
258
+ return state.client;
259
+ }
260
+
261
+ export function stopSharedClient(): void {
262
+ for (const state of sharedClientStates.values()) {
263
+ state.client.stop();
264
+ }
265
+ sharedClientStates.clear();
266
+ sharedClientPromises.clear();
267
+ }
268
+
269
+ export function stopSharedClientForAccount(auth: MatrixAuth): void {
270
+ const key = buildSharedClientKey(auth);
271
+ const state = sharedClientStates.get(key);
272
+ if (!state) {
273
+ return;
274
+ }
275
+ state.client.stop();
276
+ deleteSharedClientState(state);
277
+ }
278
+
279
+ export function removeSharedClientInstance(client: MatrixClient): boolean {
280
+ const state = findSharedClientStateByInstance(client);
281
+ if (!state) {
282
+ return false;
283
+ }
284
+ deleteSharedClientState(state);
285
+ return true;
286
+ }
287
+
288
+ export function stopSharedClientInstance(client: MatrixClient): void {
289
+ if (!removeSharedClientInstance(client)) {
290
+ return;
291
+ }
292
+ client.stop();
293
+ }
294
+
295
+ export async function releaseSharedClientInstance(
296
+ client: MatrixClient,
297
+ mode: "stop" | "persist" | "discard" = "stop",
298
+ ): Promise<boolean> {
299
+ const state = findSharedClientStateByInstance(client);
300
+ if (!state) {
301
+ return false;
302
+ }
303
+ state.leases = Math.max(0, state.leases - 1);
304
+ if (state.leases > 0) {
305
+ return false;
306
+ }
307
+ deleteSharedClientState(state);
308
+ if (mode === "persist") {
309
+ await client.stopAndPersist();
310
+ } else if (mode === "discard") {
311
+ client.stopWithoutPersist();
312
+ } else {
313
+ client.stop();
314
+ }
315
+ return true;
316
+ }