@openclaw/crabline 0.1.16 → 0.1.18

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 (39) hide show
  1. package/README.md +8 -0
  2. package/dist/src/openclaw/bridges/whatsapp.js +21 -1
  3. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  4. package/dist/src/openclaw/private-file.js +87 -30
  5. package/dist/src/openclaw/private-file.js.map +1 -1
  6. package/dist/src/openclaw/shared.d.ts +9 -0
  7. package/dist/src/openclaw/shared.js +2 -1
  8. package/dist/src/openclaw/shared.js.map +1 -1
  9. package/dist/src/platform/process-owned-lock.d.ts +5 -2
  10. package/dist/src/platform/process-owned-lock.js +20 -10
  11. package/dist/src/platform/process-owned-lock.js.map +1 -1
  12. package/dist/src/servers/discord.js +25 -35
  13. package/dist/src/servers/discord.js.map +1 -1
  14. package/dist/src/servers/http.d.ts +3 -0
  15. package/dist/src/servers/http.js +15 -0
  16. package/dist/src/servers/http.js.map +1 -1
  17. package/dist/src/servers/matrix.js +8 -8
  18. package/dist/src/servers/matrix.js.map +1 -1
  19. package/dist/src/servers/mattermost.js +7 -10
  20. package/dist/src/servers/mattermost.js.map +1 -1
  21. package/dist/src/servers/recorder.d.ts +16 -6
  22. package/dist/src/servers/recorder.js +52 -12
  23. package/dist/src/servers/recorder.js.map +1 -1
  24. package/dist/src/servers/signal.js +8 -8
  25. package/dist/src/servers/signal.js.map +1 -1
  26. package/dist/src/servers/slack.js +8 -8
  27. package/dist/src/servers/slack.js.map +1 -1
  28. package/dist/src/servers/telegram.d.ts +2 -2
  29. package/dist/src/servers/telegram.js +8 -8
  30. package/dist/src/servers/telegram.js.map +1 -1
  31. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +15 -0
  32. package/dist/src/servers/whatsapp-baileys-websocket.js +32 -2
  33. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  34. package/dist/src/servers/whatsapp.js +189 -29
  35. package/dist/src/servers/whatsapp.js.map +1 -1
  36. package/dist/src/servers/zalo.js +8 -7
  37. package/dist/src/servers/zalo.js.map +1 -1
  38. package/docs/channel-setup.md +65 -1
  39. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../../../src/servers/matrix.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\";\nimport type { IncomingMessage } from \"node:http\";\nimport path from \"node:path\";\nimport {\n isHistoricalMatrixUserId,\n isMatrixEventId,\n isMatrixRoomId,\n isMatrixUserId,\n} from \"../matrix-ids.js\";\nimport {\n adminAuthError,\n constantTimeTokenEqual,\n DEFAULT_MAX_RESPONSE_BODY_BYTES,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readInteger,\n readTrimmedString,\n RequestBodyTooLargeError,\n startHttpJsonServer,\n type ServerRequestEvent,\n} from \"./http.js\";\nimport {\n recordCommittedServerEvent,\n recordServerEvent,\n type ServerEventObserver,\n} from \"./recorder.js\";\n\ntype MatrixEvent = {\n content: Record<string, unknown>;\n event_id: string;\n origin_server_ts: number;\n room_id: string;\n sender: string;\n state_key?: string;\n type: string;\n unsigned?: { transaction_id: string };\n};\n\ntype MatrixRoom = {\n createdSequence: number;\n ephemeral: Array<{\n event: { content: Record<string, unknown>; type: \"m.receipt\" | \"m.typing\" };\n sequence: number;\n }>;\n id: string;\n lastDroppedTimelineSequence: number | undefined;\n name: string;\n state: MatrixEvent[];\n stateBeforeTimeline: Map<string, MatrixEvent>;\n timeline: Array<{ sequence: number; event: MatrixEvent }>;\n typingTimeouts: Map<string, NodeJS.Timeout>;\n typingUsers: Set<string>;\n users: Map<string, { avatar_url?: string; display_name?: string }>;\n};\n\ntype MatrixTransactionResponse = {\n body: Record<string, unknown>;\n expiresAt: number;\n status: number;\n};\n\ntype MatrixServerState = {\n accessToken: string;\n adminToken: string;\n botUserId: string;\n deviceId: string;\n directRooms: Map<string, Set<string>>;\n directRoomsSequence: number | undefined;\n filterBytes: number;\n filters: Map<string, { body: Record<string, unknown>; bytes: number }>;\n maxCommittedRooms: number;\n maxCommittedUsers: number;\n maxSyncResponseBytes: number;\n nextEvent: number;\n nextFilter: number;\n nextSequence: number;\n onEvent: ServerEventObserver | undefined;\n profiles: Map<string, { avatar_url?: string; display_name?: string }>;\n recorderPath: string;\n rooms: Map<string, MatrixRoom>;\n serverName: string;\n syncWaiters: Set<() => void>;\n transactions: Map<string, MatrixTransactionResponse>;\n};\n\ntype MatrixRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n};\n\nconst MAX_MATRIX_FILTER_BYTES = 1024 * 1024;\nconst MAX_MATRIX_FILTERS = 100;\nconst MAX_MATRIX_TIMELINE_EVENTS = 1_000;\nconst MAX_MATRIX_TRANSACTION_RESPONSES = 1_000;\nconst MATRIX_TRANSACTION_RETENTION_MS = 10 * 60_000;\nconst MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;\nconst DEFAULT_MAX_MATRIX_COMMITTED_ROOMS = 1_000;\nconst DEFAULT_MAX_MATRIX_COMMITTED_USERS = 1_000;\nconst DEFAULT_MAX_MATRIX_SYNC_RESPONSE_BYTES = 4 * 1024 * 1024;\n\nclass InvalidMatrixPathEncodingError extends Error {\n constructor() {\n super(\"Matrix request path contains invalid percent encoding.\");\n this.name = \"InvalidMatrixPathEncodingError\";\n }\n}\n\nexport type MatrixServerManifest = {\n accessToken: string;\n adminToken: string;\n baseUrl: string;\n botUserId: string;\n deviceId: string;\n endpoints: {\n adminInboundUrl: string;\n clientApiRoot: string;\n syncUrl: string;\n };\n env: {\n MATRIX_ACCESS_TOKEN: string;\n MATRIX_BASE_URL: string;\n MATRIX_USER_ID: string;\n };\n provider: \"matrix\";\n recorderPath: string;\n version: 1;\n};\n\nexport type StartedMatrixServer = {\n close(): Promise<void>;\n manifest: MatrixServerManifest;\n};\n\nexport type StartMatrixServerParams = {\n accessToken?: string | undefined;\n adminToken?: string | undefined;\n botUserId?: string | undefined;\n deviceId?: string | undefined;\n host?: string | undefined;\n maxCommittedRooms?: number | undefined;\n maxCommittedUsers?: number | undefined;\n maxSyncResponseBytes?: number | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n roomId?: string | undefined;\n roomName?: string | undefined;\n serverName?: string | undefined;\n};\n\nfunction matrixRoomId(value: string, serverName: string): string {\n return `!${createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16)}:${serverName}`;\n}\n\nasync function appendEvent(\n state: MatrixServerState,\n event: ServerRequestEvent,\n committed = false,\n): Promise<void> {\n const params = { event, onEvent: state.onEvent, recorderPath: state.recorderPath };\n await (committed ? recordCommittedServerEvent(params) : recordServerEvent(params));\n}\n\nfunction authorized(request: IncomingMessage, token: string): boolean {\n const match = /^Bearer\\s+(\\S+)$/iu.exec(request.headers.authorization ?? \"\");\n const providedToken = match?.[1];\n return providedToken ? constantTimeTokenEqual(providedToken, token) : false;\n}\n\nfunction matrixError(errcode: string, error: string, status: number): Response {\n return jsonResponse({ errcode, error }, status);\n}\n\nfunction matrixResourceLimitError(error: string): Response {\n return jsonResponse(\n {\n admin_contact: \"mailto:admin@localhost\",\n errcode: \"M_RESOURCE_LIMIT_EXCEEDED\",\n error,\n },\n 503,\n );\n}\n\nfunction resolvePositiveLimit(value: number | undefined, name: string, fallback: number): number {\n if (value === undefined) {\n return fallback;\n }\n if (!Number.isSafeInteger(value) || value < 1) {\n throw new Error(`${name} must be a positive safe integer.`);\n }\n return value;\n}\n\nfunction decodeMatrixPathSegment(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n throw new InvalidMatrixPathEncodingError();\n }\n}\n\nfunction eventId(state: MatrixServerState): string {\n return `$${createHash(\"sha256\")\n .update(state.serverName)\n .update(\"\\0\")\n .update(`event-${state.nextEvent++}`)\n .digest(\"base64url\")}`;\n}\n\nfunction notifySyncWaiters(state: MatrixServerState): void {\n for (const resolve of state.syncWaiters) {\n resolve();\n }\n state.syncWaiters.clear();\n}\n\nasync function waitForSyncEvent(state: MatrixServerState, timeout: number): Promise<void> {\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n state.syncWaiters.delete(onEvent);\n resolve();\n }, timeout);\n const onEvent = () => {\n clearTimeout(timer);\n resolve();\n };\n state.syncWaiters.add(onEvent);\n });\n}\n\nfunction createEvent(params: {\n content: Record<string, unknown>;\n roomId: string;\n sender: string;\n state: MatrixServerState;\n stateKey?: string;\n transactionId?: string;\n type: string;\n}): MatrixEvent {\n return {\n content: params.content,\n event_id: eventId(params.state),\n origin_server_ts: Date.now(),\n room_id: params.roomId,\n sender: params.sender,\n ...(params.stateKey !== undefined ? { state_key: params.stateKey } : {}),\n type: params.type,\n ...(params.transactionId ? { unsigned: { transaction_id: params.transactionId } } : {}),\n };\n}\n\nfunction createRoom(params: {\n botUserId: string;\n createdSequence: number;\n direct?: boolean;\n id: string;\n name: string;\n serverName: string;\n state: MatrixServerState;\n}): MatrixRoom {\n const room: MatrixRoom = {\n createdSequence: params.createdSequence,\n ephemeral: [],\n id: params.id,\n lastDroppedTimelineSequence: undefined,\n name: params.name,\n state: [],\n stateBeforeTimeline: new Map(),\n timeline: [],\n typingTimeouts: new Map(),\n typingUsers: new Set(),\n users: new Map([[params.botUserId, { display_name: \"OpenClaw QA\" }]]),\n };\n room.state.push(\n createEvent({\n content: { creator: params.botUserId, room_version: \"10\" },\n roomId: room.id,\n sender: params.botUserId,\n state: params.state,\n stateKey: \"\",\n type: \"m.room.create\",\n }),\n createEvent({\n content: {\n membership: \"join\",\n displayname: \"OpenClaw QA\",\n ...(params.direct ? { is_direct: true } : {}),\n },\n roomId: room.id,\n sender: params.botUserId,\n state: params.state,\n stateKey: params.botUserId,\n type: \"m.room.member\",\n }),\n createEvent({\n content: { name: room.name },\n roomId: room.id,\n sender: params.botUserId,\n state: params.state,\n stateKey: \"\",\n type: \"m.room.name\",\n }),\n );\n for (const event of room.state) {\n room.stateBeforeTimeline.set(matrixStateKey(event), event);\n }\n return room;\n}\n\nfunction matrixStateKey(event: MatrixEvent): string {\n return JSON.stringify([event.type, event.state_key ?? \"\"]);\n}\n\nfunction appendTimelineEvent(\n room: MatrixRoom,\n entry: { event: MatrixEvent; sequence: number },\n): void {\n room.timeline.push(entry);\n if (room.timeline.length > MAX_MATRIX_TIMELINE_EVENTS) {\n const dropped = room.timeline.splice(0, room.timeline.length - MAX_MATRIX_TIMELINE_EVENTS);\n room.lastDroppedTimelineSequence = dropped.at(-1)?.sequence;\n for (const droppedEntry of dropped) {\n if (droppedEntry.event.state_key !== undefined) {\n room.stateBeforeTimeline.set(matrixStateKey(droppedEntry.event), droppedEntry.event);\n }\n }\n }\n}\n\nfunction appendEphemeralEvent(\n room: MatrixRoom,\n entry: {\n event: { content: Record<string, unknown>; type: \"m.receipt\" | \"m.typing\" };\n sequence: number;\n },\n): void {\n room.ephemeral.push(entry);\n if (room.ephemeral.length > MAX_MATRIX_TIMELINE_EVENTS) {\n room.ephemeral.splice(0, room.ephemeral.length - MAX_MATRIX_TIMELINE_EVENTS);\n }\n}\n\nfunction publishTypingState(state: MatrixServerState, room: MatrixRoom): void {\n appendEphemeralEvent(room, {\n event: { content: { user_ids: [...room.typingUsers] }, type: \"m.typing\" },\n sequence: state.nextSequence++,\n });\n notifySyncWaiters(state);\n}\n\nfunction publishDirectRoom(state: MatrixServerState, userId: string, roomId: string): void {\n const roomIds = state.directRooms.get(userId) ?? new Set<string>();\n if (roomIds.has(roomId)) {\n return;\n }\n roomIds.add(roomId);\n state.directRooms.set(userId, roomIds);\n state.directRoomsSequence = state.nextSequence++;\n}\n\nfunction serializeSyncAccountData(\n state: MatrixServerState,\n since: number | undefined,\n maxBytes: number,\n): string | undefined {\n const sequence = state.directRoomsSequence;\n if (sequence === undefined || (since !== undefined && sequence <= since)) {\n return '{\"events\":[]}';\n }\n const prefix = '{\"events\":[{\"content\":{';\n const suffix = '},\"type\":\"m.direct\"}]}';\n const parts: string[] = [];\n let bytes = Buffer.byteLength(prefix, \"utf8\") + Buffer.byteLength(suffix, \"utf8\");\n for (const [userId, roomIds] of state.directRooms) {\n const roomParts: string[] = [];\n let roomBytes = 2;\n for (const roomId of roomIds) {\n const separator = roomParts.length === 0 ? \"\" : \",\";\n const roomPart = `${separator}${JSON.stringify(roomId)}`;\n roomBytes += Buffer.byteLength(roomPart, \"utf8\");\n if (bytes + roomBytes > maxBytes) {\n return undefined;\n }\n roomParts.push(roomPart);\n }\n const separator = parts.length === 0 ? \"\" : \",\";\n const part = `${separator}${JSON.stringify(userId)}:[${roomParts.join(\"\")}]`;\n bytes += Buffer.byteLength(part, \"utf8\");\n if (bytes > maxBytes) {\n return undefined;\n }\n parts.push(part);\n }\n return `${prefix}${parts.join(\"\")}${suffix}`;\n}\n\nfunction rememberTransaction(\n state: MatrixServerState,\n key: string,\n response: MatrixTransactionResponse,\n): void {\n state.transactions.set(key, response);\n}\n\nfunction forgetExpiredTransactions(state: MatrixServerState): void {\n const now = Date.now();\n for (const [key, response] of state.transactions) {\n if (response.expiresAt > now) {\n break;\n }\n state.transactions.delete(key);\n }\n}\n\nfunction transactionResponse(\n state: MatrixServerState,\n key: string,\n): MatrixTransactionResponse | undefined {\n forgetExpiredTransactions(state);\n const response = state.transactions.get(key);\n if (!response) {\n return undefined;\n }\n state.transactions.delete(key);\n response.expiresAt = Date.now() + MATRIX_TRANSACTION_RETENTION_MS;\n state.transactions.set(key, response);\n return response;\n}\n\nfunction readTimelineLimit(\n filter: Record<string, unknown> | undefined,\n): number | Response | undefined {\n const room = filter?.room;\n if (room === undefined) {\n return undefined;\n }\n if (!isJsonObject(room)) {\n return matrixError(\"M_INVALID_PARAM\", \"Invalid room filter\", 400);\n }\n const timeline = room.timeline;\n if (timeline === undefined) {\n return undefined;\n }\n if (!isJsonObject(timeline)) {\n return matrixError(\"M_INVALID_PARAM\", \"Invalid timeline filter\", 400);\n }\n if (!Object.hasOwn(timeline, \"limit\")) {\n return undefined;\n }\n const limit = timeline.limit;\n return typeof limit === \"number\" && Number.isSafeInteger(limit) && limit > 0\n ? limit\n : matrixError(\"M_INVALID_PARAM\", \"Invalid timeline limit\", 400);\n}\n\nfunction resolveSyncFilter(\n url: URL,\n state: MatrixServerState,\n): Record<string, unknown> | Response | undefined {\n const value = url.searchParams.get(\"filter\");\n if (value === null) {\n return undefined;\n }\n const stored = state.filters.get(value);\n if (stored) {\n return stored.body;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return isJsonObject(parsed) ? parsed : matrixError(\"M_INVALID_PARAM\", \"Invalid filter\", 400);\n } catch {\n return matrixError(\"M_INVALID_PARAM\", \"Unknown filter\", 400);\n }\n}\n\nfunction createSyncRoom(\n room: MatrixRoom,\n since: number | undefined,\n available: Array<{ sequence: number; event: MatrixEvent }>,\n timeline: Array<{ sequence: number; event: MatrixEvent }>,\n) {\n const firstSequence = timeline[0]?.sequence;\n const historyWasTrimmed =\n room.lastDroppedTimelineSequence !== undefined &&\n (since === undefined || since < room.lastDroppedTimelineSequence);\n const limited = historyWasTrimmed || timeline.length < available.length;\n const omittedTimeline = available.slice(0, available.length - timeline.length);\n const omittedState = new Map<string, MatrixEvent>();\n if (since === undefined || room.createdSequence > since || historyWasTrimmed) {\n for (const [key, event] of room.stateBeforeTimeline) {\n omittedState.set(key, event);\n }\n }\n for (const entry of omittedTimeline) {\n if (entry.event.state_key !== undefined) {\n omittedState.set(matrixStateKey(entry.event), entry.event);\n }\n }\n return {\n account_data: { events: [] },\n ephemeral: {\n events: room.ephemeral\n .filter((entry) => since === undefined || entry.sequence > since)\n .map((entry) => entry.event),\n },\n state: {\n events: [...omittedState.values()].filter(\n (event) => !timeline.some((entry) => entry.event.event_id === event.event_id),\n ),\n },\n timeline: {\n events: timeline.map((entry) => entry.event),\n limited,\n prev_batch: `s${firstSequence === undefined ? (since ?? 0) : firstSequence - 1}`,\n },\n unread_notifications: { highlight_count: 0, notification_count: 0 },\n };\n}\n\nfunction jsonItemsByteLength(items: readonly unknown[], maxBytes: number): number | undefined {\n let bytes = 0;\n for (const item of items) {\n const serialized = JSON.stringify(item);\n if (serialized === undefined) {\n return undefined;\n }\n bytes += Buffer.byteLength(serialized, \"utf8\");\n if (bytes > maxBytes) {\n return undefined;\n }\n }\n return bytes;\n}\n\nfunction boundedSyncRoom(\n room: MatrixRoom,\n since: number | undefined,\n timelineLimit: number | undefined,\n maxBytes: number,\n maxTimelineEvents = Number.POSITIVE_INFINITY,\n): string | undefined {\n const available = room.timeline.filter((entry) => since === undefined || entry.sequence > since);\n const requestedTimeline =\n timelineLimit === undefined\n ? available\n : available.slice(Math.max(0, available.length - timelineLimit));\n const ephemeral = room.ephemeral\n .filter((entry) => since === undefined || entry.sequence > since)\n .map((entry) => entry.event);\n const ephemeralBytes = jsonItemsByteLength(ephemeral, maxBytes);\n if (ephemeralBytes === undefined) {\n return undefined;\n }\n\n const timeline: Array<{ sequence: number; event: MatrixEvent }> = [];\n let timelineBytes = 0;\n for (let index = requestedTimeline.length - 1; index >= 0; index -= 1) {\n if (timeline.length >= maxTimelineEvents) {\n break;\n }\n const entry = requestedTimeline[index]!;\n const serializedEvent = JSON.stringify(entry.event);\n if (serializedEvent === undefined) {\n return undefined;\n }\n const eventBytes = Buffer.byteLength(serializedEvent, \"utf8\");\n if (timelineBytes + ephemeralBytes + eventBytes > maxBytes) {\n break;\n }\n timeline.unshift(entry);\n timelineBytes += eventBytes;\n }\n if (requestedTimeline.length > 0 && timelineLimit !== 0 && timeline.length === 0) {\n return undefined;\n }\n\n while (true) {\n const body = createSyncRoom(room, since, available, timeline);\n const stateBytes = jsonItemsByteLength(body.state.events, maxBytes);\n if (stateBytes !== undefined && stateBytes + ephemeralBytes + timelineBytes <= maxBytes) {\n const serialized = JSON.stringify(body);\n if (Buffer.byteLength(serialized, \"utf8\") <= maxBytes) {\n return serialized;\n }\n }\n if (timeline.length === 1 && requestedTimeline.length > 0 && timelineLimit !== 0) {\n return undefined;\n }\n const dropped = timeline.shift();\n if (!dropped) {\n return undefined;\n }\n const serializedDropped = JSON.stringify(dropped.event);\n if (serializedDropped === undefined) {\n return undefined;\n }\n timelineBytes -= Buffer.byteLength(serializedDropped, \"utf8\");\n }\n}\n\nfunction roomHasSyncUpdates(room: MatrixRoom, since: number | undefined): boolean {\n return (\n since === undefined ||\n room.createdSequence > since ||\n room.timeline.some((entry) => entry.sequence > since) ||\n room.ephemeral.some((entry) => entry.sequence > since)\n );\n}\n\nfunction parseSyncToken(value: string | null): number | null | undefined {\n if (value === null) {\n return undefined;\n }\n const match = /^s(\\d+)$/u.exec(value);\n if (!match) {\n return null;\n }\n const sequence = Number(match[1]);\n return Number.isSafeInteger(sequence) ? sequence : null;\n}\n\nasync function handleSync(url: URL, state: MatrixServerState): Promise<Response> {\n const since = parseSyncToken(url.searchParams.get(\"since\"));\n if (since === null || (since !== undefined && since > state.nextSequence - 1)) {\n return matrixError(\"M_UNKNOWN_POS\", \"Unknown position\", 400);\n }\n const filter = resolveSyncFilter(url, state);\n if (filter instanceof Response) {\n return filter;\n }\n const timelineLimit = readTimelineLimit(filter);\n if (timelineLimit instanceof Response) {\n return timelineLimit;\n }\n const timeout = Math.min(readInteger(url.searchParams.get(\"timeout\")) ?? 0, 1_000);\n const hasNewEvents =\n (state.directRoomsSequence !== undefined &&\n (since === undefined || state.directRoomsSequence > since)) ||\n [...state.rooms.values()].some((room) => roomHasSyncUpdates(room, since));\n if (since !== undefined && !hasNewEvents && timeout > 0) {\n await waitForSyncEvent(state, timeout);\n }\n const accountData = serializeSyncAccountData(state, since, state.maxSyncResponseBytes);\n if (!accountData) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n const prefix = `{\"account_data\":${accountData},\"device_lists\":{\"changed\":[],\"left\":[]},\"device_one_time_keys_count\":{},\"next_batch\":${JSON.stringify(\n `s${state.nextSequence - 1}`,\n )},\"presence\":{\"events\":[]},\"rooms\":{\"invite\":{},\"join\":{`;\n const suffix = '},\"knock\":{},\"leave\":{}},\"to_device\":{\"events\":[]}}';\n let responseBytes = Buffer.byteLength(prefix, \"utf8\") + Buffer.byteLength(suffix, \"utf8\");\n const rooms = [...state.rooms.values()].filter((room) => roomHasSyncUpdates(room, since));\n const minimumEntries: Array<{\n framingBytes: number;\n minimumBytes: number;\n room: MatrixRoom;\n roomKey: string;\n separator: string;\n }> = [];\n for (const [index, room] of rooms.entries()) {\n const separator = index === 0 ? \"\" : \",\";\n const roomKey = JSON.stringify(room.id);\n const framingBytes = Buffer.byteLength(`${separator}${roomKey}:`, \"utf8\");\n const roomBody = boundedSyncRoom(room, since, timelineLimit, state.maxSyncResponseBytes, 1);\n if (!roomBody) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n minimumEntries.push({\n framingBytes,\n minimumBytes: framingBytes + Buffer.byteLength(roomBody, \"utf8\"),\n room,\n roomKey,\n separator,\n });\n }\n let reservedBytes = minimumEntries.reduce((total, entry) => total + entry.minimumBytes, 0);\n if (responseBytes + reservedBytes > state.maxSyncResponseBytes) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n\n const parts: string[] = [];\n for (const entry of minimumEntries) {\n reservedBytes -= entry.minimumBytes;\n const roomBody = boundedSyncRoom(\n entry.room,\n since,\n timelineLimit,\n state.maxSyncResponseBytes - responseBytes - entry.framingBytes - reservedBytes,\n );\n if (!roomBody) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n parts.push(`${entry.separator}${entry.roomKey}:${roomBody}`);\n responseBytes += entry.framingBytes + Buffer.byteLength(roomBody, \"utf8\");\n }\n const body = `${prefix}${parts.join(\"\")}${suffix}`;\n if (Buffer.byteLength(body, \"utf8\") > state.maxSyncResponseBytes) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n return new Response(body, {\n headers: { \"content-type\": \"application/json\" },\n status: 200,\n });\n}\n\nfunction findRoom(state: MatrixServerState, encodedRoomId: string): MatrixRoom | undefined {\n return state.rooms.get(decodeMatrixPathSegment(encodedRoomId));\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: MatrixServerState;\n}): Promise<Response> {\n const roomId = readTrimmedString(params.body.roomId);\n const sender = readTrimmedString(params.body.sender ?? params.body.senderId);\n const text = typeof params.body.text === \"string\" ? params.body.text : undefined;\n if (!roomId || !sender || text === undefined || text.length === 0) {\n return jsonResponse({ error: \"roomId, senderId, and text are required\", ok: false }, 400);\n }\n const threadId = readTrimmedString(params.body.threadId);\n if (\n !isMatrixRoomId(roomId) ||\n !isHistoricalMatrixUserId(sender) ||\n (threadId !== undefined && !isMatrixEventId(threadId))\n ) {\n return jsonResponse({ error: \"Invalid Matrix identifier\", ok: false }, 400);\n }\n const direct = params.body.direct === true;\n const existingRoom = params.state.rooms.get(roomId);\n if (!existingRoom && params.state.rooms.size >= params.state.maxCommittedRooms) {\n return jsonResponse({ error: \"Committed Matrix rooms limit reached\", ok: false }, 503);\n }\n if (\n !params.state.profiles.has(sender) &&\n params.state.profiles.size >= params.state.maxCommittedUsers\n ) {\n return jsonResponse({ error: \"Committed Matrix users limit reached\", ok: false }, 503);\n }\n const roomHasSender = existingRoom\n ? existingRoom.users.has(sender)\n : sender === params.state.botUserId;\n const roomUserCount = existingRoom?.users.size ?? 1;\n if (!roomHasSender && roomUserCount >= params.state.maxCommittedUsers) {\n return jsonResponse({ error: \"Committed Matrix users limit reached\", ok: false }, 503);\n }\n const room =\n existingRoom ??\n createRoom({\n botUserId: params.state.botUserId,\n createdSequence: params.state.nextSequence++,\n direct,\n id: roomId,\n name: readTrimmedString(params.body.roomName) ?? roomId,\n serverName: params.state.serverName,\n state: params.state,\n });\n params.state.rooms.set(roomId, room);\n if (direct) {\n publishDirectRoom(params.state, sender, roomId);\n }\n const senderName = readTrimmedString(params.body.senderName);\n if (senderName) {\n params.state.profiles.set(sender, {\n ...params.state.profiles.get(sender),\n display_name: senderName,\n });\n } else if (!params.state.profiles.has(sender)) {\n params.state.profiles.set(sender, {});\n }\n const existingProfile = room.users.get(sender);\n if (existingProfile === undefined) {\n room.users.set(sender, senderName ? { display_name: senderName } : {});\n const membership = createEvent({\n content: {\n membership: \"join\",\n ...(senderName ? { displayname: senderName } : {}),\n },\n roomId,\n sender,\n state: params.state,\n stateKey: sender,\n type: \"m.room.member\",\n });\n room.state.push(membership);\n appendTimelineEvent(room, { event: membership, sequence: params.state.nextSequence++ });\n } else if (senderName && existingProfile.display_name !== senderName) {\n room.users.set(sender, { ...existingProfile, display_name: senderName });\n const membership = createEvent({\n content: { membership: \"join\", displayname: senderName },\n roomId,\n sender,\n state: params.state,\n stateKey: sender,\n type: \"m.room.member\",\n });\n const stateIndex = room.state.findIndex(\n (event) => event.type === \"m.room.member\" && event.state_key === sender,\n );\n if (stateIndex >= 0) {\n room.state[stateIndex] = membership;\n } else {\n room.state.push(membership);\n }\n appendTimelineEvent(room, {\n event: membership,\n sequence: params.state.nextSequence++,\n });\n }\n const roomAvatarUrl = room.users.get(sender)?.avatar_url;\n if (roomAvatarUrl) {\n params.state.profiles.set(sender, {\n ...params.state.profiles.get(sender),\n avatar_url: roomAvatarUrl,\n });\n }\n const content: Record<string, unknown> = { body: text, msgtype: \"m.text\" };\n if (threadId) {\n content[\"m.relates_to\"] = {\n event_id: threadId,\n is_falling_back: true,\n rel_type: \"m.thread\",\n \"m.in_reply_to\": { event_id: threadId },\n };\n }\n const event = createEvent({\n content,\n roomId,\n sender,\n state: params.state,\n type: \"m.room.message\",\n });\n appendTimelineEvent(room, { event, sequence: params.state.nextSequence++ });\n notifySyncWaiters(params.state);\n return jsonResponse({ event, ok: true });\n}\n\nasync function handleMatrixApi(params: {\n body: Record<string, unknown>;\n method: string;\n path: string;\n recorderEvent: MatrixRecorderEvent;\n state: MatrixServerState;\n url: URL;\n}): Promise<Response> {\n const relativePath = params.path.replace(/^\\/_matrix\\/client\\/(?:v3|r0)/u, \"\");\n if (params.method === \"GET\" && relativePath === \"/account/whoami\") {\n return jsonResponse({\n device_id: params.state.deviceId,\n is_guest: false,\n user_id: params.state.botUserId,\n });\n }\n if (params.method === \"GET\" && relativePath === \"/joined_rooms\") {\n return jsonResponse({ joined_rooms: [...params.state.rooms.keys()] });\n }\n if (params.method === \"GET\" && relativePath === \"/capabilities\") {\n return jsonResponse({ capabilities: {} });\n }\n let match = /^\\/profile\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"GET\" && match) {\n const userId = decodeMatrixPathSegment(match[1]!);\n const profile = params.state.profiles.get(userId);\n return profile\n ? jsonResponse({\n ...(profile.avatar_url ? { avatar_url: profile.avatar_url } : {}),\n ...(profile.display_name ? { displayname: profile.display_name } : {}),\n })\n : matrixError(\"M_NOT_FOUND\", \"Unknown user\", 404);\n }\n if (params.method === \"GET\" && relativePath === \"/pushrules/\") {\n const empty = { content: [], override: [], room: [], sender: [], underride: [] };\n return jsonResponse({ global: empty });\n }\n if (params.method === \"GET\" && relativePath === \"/sync\") {\n return await handleSync(params.url, params.state);\n }\n\n match = /^\\/user\\/([^/]+)\\/filter$/u.exec(relativePath);\n if (params.method === \"POST\" && match) {\n const userId = decodeMatrixPathSegment(match[1]!);\n if (userId !== params.state.botUserId) {\n return matrixError(\"M_FORBIDDEN\", \"Cannot create a filter for another user\", 403);\n }\n const bytes = Buffer.byteLength(JSON.stringify(params.body), \"utf8\");\n if (\n params.state.filters.size >= MAX_MATRIX_FILTERS ||\n params.state.filterBytes + bytes > MAX_MATRIX_FILTER_BYTES\n ) {\n return matrixResourceLimitError(\"Too many stored filters\");\n }\n const filterId = String(params.state.nextFilter++);\n params.state.filters.set(filterId, { body: params.body, bytes });\n params.state.filterBytes += bytes;\n return jsonResponse({ filter_id: filterId });\n }\n\n match = /^\\/user\\/([^/]+)\\/filter\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"GET\" && match) {\n const userId = decodeMatrixPathSegment(match[1]!);\n if (userId !== params.state.botUserId) {\n return matrixError(\"M_FORBIDDEN\", \"Cannot get filters for another user\", 403);\n }\n const filter = params.state.filters.get(decodeMatrixPathSegment(match[2]!));\n return filter ? jsonResponse(filter.body) : matrixError(\"M_NOT_FOUND\", \"Unknown filter\", 404);\n }\n\n match = /^\\/rooms\\/([^/]+)\\/joined_members$/u.exec(relativePath);\n if (params.method === \"GET\" && match) {\n const room = findRoom(params.state, match[1]!);\n return room\n ? jsonResponse({ joined: Object.fromEntries(room.users) })\n : matrixError(\"M_NOT_FOUND\", \"Unknown room\", 404);\n }\n\n match = /^\\/rooms\\/([^/]+)\\/state\\/([^/]+)(?:\\/(.*))?$/u.exec(relativePath);\n if (params.method === \"GET\" && match) {\n const room = findRoom(params.state, match[1]!);\n if (!room) {\n return matrixError(\"M_NOT_FOUND\", \"Unknown room\", 404);\n }\n const eventType = decodeMatrixPathSegment(match[2]!);\n const stateKey = decodeMatrixPathSegment(match[3] ?? \"\");\n if (eventType === \"m.room.name\" && stateKey === \"\") {\n return jsonResponse({ name: room.name });\n }\n if (eventType === \"m.room.canonical_alias\" && stateKey === \"\") {\n return matrixError(\"M_NOT_FOUND\", \"Unknown state event\", 404);\n }\n if (eventType === \"m.room.member\") {\n const membership = [...room.state]\n .reverse()\n .find((event) => event.type === \"m.room.member\" && event.state_key === stateKey);\n return membership\n ? jsonResponse(membership.content)\n : matrixError(\"M_NOT_FOUND\", \"Unknown room member\", 404);\n }\n return matrixError(\"M_NOT_FOUND\", \"Unknown state event\", 404);\n }\n\n match = /^\\/rooms\\/([^/]+)\\/send\\/([^/]+)\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"PUT\" && match) {\n const roomId = decodeMatrixPathSegment(match[1]!);\n const eventType = decodeMatrixPathSegment(match[2]!);\n const transactionId = decodeMatrixPathSegment(match[3]!);\n const transactionKey = JSON.stringify([\n params.state.botUserId,\n roomId,\n eventType,\n transactionId,\n ]);\n const existingResponse = transactionResponse(params.state, transactionKey);\n if (existingResponse) {\n params.recorderEvent.accepted =\n existingResponse.status >= 200 && existingResponse.status < 300;\n return jsonResponse(existingResponse.body, existingResponse.status);\n }\n if (params.state.transactions.size >= MAX_MATRIX_TRANSACTION_RESPONSES) {\n params.recorderEvent.accepted = false;\n return matrixResourceLimitError(\"Too many retained transaction responses\");\n }\n const room = params.state.rooms.get(roomId);\n if (!room) {\n params.recorderEvent.accepted = false;\n const body = { errcode: \"M_NOT_FOUND\", error: \"Unknown room\" };\n rememberTransaction(params.state, transactionKey, {\n body,\n expiresAt: Date.now() + MATRIX_TRANSACTION_RETENTION_MS,\n status: 404,\n });\n return jsonResponse(body, 404);\n }\n const event = createEvent({\n content: params.body,\n roomId: room.id,\n sender: params.state.botUserId,\n state: params.state,\n transactionId,\n type: eventType,\n });\n appendTimelineEvent(room, { event, sequence: params.state.nextSequence++ });\n const body = { event_id: event.event_id };\n rememberTransaction(params.state, transactionKey, {\n body,\n expiresAt: Date.now() + MATRIX_TRANSACTION_RETENTION_MS,\n status: 200,\n });\n notifySyncWaiters(params.state);\n params.recorderEvent.accepted = true;\n return jsonResponse(body);\n }\n\n match = /^\\/rooms\\/([^/]+)\\/typing\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"PUT\" && match) {\n const room = findRoom(params.state, match[1]!);\n if (!room) {\n return matrixError(\"M_NOT_FOUND\", \"Unknown room\", 404);\n }\n const userId = decodeMatrixPathSegment(match[2]!);\n if (userId !== params.state.botUserId) {\n return matrixError(\"M_FORBIDDEN\", \"Cannot set typing state for another user\", 403);\n }\n if (typeof params.body.typing !== \"boolean\") {\n return matrixError(\"M_BAD_JSON\", \"typing must be a boolean\", 400);\n }\n const timeout =\n params.body.typing &&\n typeof params.body.timeout === \"number\" &&\n Number.isSafeInteger(params.body.timeout)\n ? params.body.timeout\n : undefined;\n if (\n params.body.typing &&\n (timeout === undefined || timeout < 1 || timeout > MAX_NODE_TIMER_DELAY_MS)\n ) {\n return matrixError(\n \"M_BAD_JSON\",\n `timeout must be a positive integer no greater than ${MAX_NODE_TIMER_DELAY_MS}`,\n 400,\n );\n }\n const existingTimeout = room.typingTimeouts.get(userId);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n room.typingTimeouts.delete(userId);\n }\n if (params.body.typing) {\n room.typingUsers.add(userId);\n const timer = setTimeout(() => {\n room.typingTimeouts.delete(userId);\n if (room.typingUsers.delete(userId)) {\n publishTypingState(params.state, room);\n }\n }, timeout!);\n timer.unref();\n room.typingTimeouts.set(userId, timer);\n } else {\n room.typingUsers.delete(userId);\n }\n publishTypingState(params.state, room);\n return jsonResponse({});\n }\n match = /^\\/rooms\\/([^/]+)\\/receipt\\/m\\.read\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"POST\" && match) {\n const room = findRoom(params.state, match[1]!);\n if (!room) {\n return matrixError(\"M_NOT_FOUND\", \"Unknown room\", 404);\n }\n const receiptEventId = decodeMatrixPathSegment(match[2]!);\n appendEphemeralEvent(room, {\n event: {\n content: {\n [receiptEventId]: {\n \"m.read\": {\n [params.state.botUserId]: {\n ts: Date.now(),\n ...(readTrimmedString(params.body.thread_id)\n ? { thread_id: readTrimmedString(params.body.thread_id) }\n : {}),\n },\n },\n },\n },\n type: \"m.receipt\",\n },\n sequence: params.state.nextSequence++,\n });\n notifySyncWaiters(params.state);\n return jsonResponse({});\n }\n\n return matrixError(\"M_UNRECOGNIZED\", \"Unrecognized request\", 404);\n}\n\nexport async function startMatrixServer(\n params: StartMatrixServerParams = {},\n): Promise<StartedMatrixServer> {\n const host = params.host ?? \"127.0.0.1\";\n const serverName = params.serverName ?? \"matrix.test\";\n const botUserId = params.botUserId ?? `@openclaw:${serverName}`;\n if (!isMatrixUserId(botUserId)) {\n throw new Error(\"botUserId must be a canonical Matrix user ID.\");\n }\n const state: MatrixServerState = {\n accessToken: params.accessToken ?? `syt_crabline_${randomBytes(12).toString(\"hex\")}`,\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n botUserId,\n deviceId: params.deviceId ?? \"CRABLINE\",\n directRooms: new Map(),\n directRoomsSequence: undefined,\n filterBytes: 0,\n filters: new Map(),\n maxCommittedRooms: resolvePositiveLimit(\n params.maxCommittedRooms,\n \"maxCommittedRooms\",\n DEFAULT_MAX_MATRIX_COMMITTED_ROOMS,\n ),\n maxCommittedUsers: resolvePositiveLimit(\n params.maxCommittedUsers,\n \"maxCommittedUsers\",\n DEFAULT_MAX_MATRIX_COMMITTED_USERS,\n ),\n maxSyncResponseBytes: resolvePositiveLimit(\n params.maxSyncResponseBytes,\n \"maxSyncResponseBytes\",\n DEFAULT_MAX_MATRIX_SYNC_RESPONSE_BYTES,\n ),\n nextEvent: 1,\n nextFilter: 1,\n nextSequence: 1,\n onEvent: params.onEvent,\n profiles: new Map([[botUserId, { display_name: \"OpenClaw QA\" }]]),\n recorderPath: params.recorderPath ?? path.resolve(\"artifacts/crabline/matrix.jsonl\"),\n rooms: new Map(),\n serverName,\n syncWaiters: new Set(),\n transactions: new Map(),\n };\n const roomId = params.roomId ?? matrixRoomId(\"default-room\", serverName);\n state.rooms.set(\n roomId,\n createRoom({\n botUserId: state.botUserId,\n createdSequence: 0,\n id: roomId,\n name: params.roomName ?? \"Crabline Matrix Room\",\n serverName,\n state,\n }),\n );\n\n const server = await startHttpJsonServer({\n handleError: (error) => {\n if (error instanceof InvalidJsonBodyError) {\n return matrixError(\"M_NOT_JSON\", \"Request body is not valid JSON\", 400);\n }\n if (error instanceof RequestBodyTooLargeError) {\n return matrixError(\"M_TOO_LARGE\", \"Request body is too large\", 413);\n }\n if (error instanceof InvalidMatrixPathEncodingError) {\n return matrixError(\"M_INVALID_PARAM\", \"Invalid request path encoding\", 400);\n }\n return matrixError(\"M_UNKNOWN\", \"Internal server error\", 500);\n },\n host,\n maxResponseBodyBytes: Math.max(DEFAULT_MAX_RESPONSE_BODY_BYTES, state.maxSyncResponseBytes),\n port: params.port ?? 0,\n serverName: \"Matrix\",\n async handle(request) {\n const url = new URL(request.url ?? \"/\", \"http://localhost\");\n const method = request.method ?? \"GET\";\n const type = url.pathname === \"/crabline/matrix/inbound\" ? \"admin\" : \"api\";\n if (type === \"admin\") {\n if (method !== \"POST\") {\n return jsonResponse({ error: \"Method not allowed\", ok: false }, 405);\n }\n if (!hasAdminToken(request, state.adminToken)) {\n request.resume();\n return adminAuthError();\n }\n const body = await parseUnknownRequestBody(request);\n if (!isJsonObject(body)) {\n return jsonResponse({ error: \"Request body must be a JSON object\", ok: false }, 400);\n }\n await appendEvent(state, {\n at: new Date().toISOString(),\n ...(Object.keys(body).length > 0 ? { body } : {}),\n method,\n path: url.pathname,\n query: queryRecord(url),\n type,\n });\n return await handleAdminInbound({ body, state });\n }\n if (url.pathname === \"/_matrix/client/versions\" && method === \"GET\") {\n await appendEvent(state, {\n at: new Date().toISOString(),\n method,\n path: url.pathname,\n query: queryRecord(url),\n type,\n });\n return jsonResponse({ unstable_features: {}, versions: [\"v1.11\"] });\n }\n if (!url.pathname.startsWith(\"/_matrix/client/\")) {\n return matrixError(\"M_UNRECOGNIZED\", \"Unrecognized request\", 404);\n }\n if (!authorized(request, state.accessToken)) {\n request.resume();\n return matrixError(\"M_UNKNOWN_TOKEN\", \"Invalid access token\", 401);\n }\n const parsedBody = [\"POST\", \"PUT\"].includes(method)\n ? await parseUnknownRequestBody(request)\n : {};\n if (!isJsonObject(parsedBody)) {\n return matrixError(\"M_BAD_JSON\", \"Request body must be a JSON object\", 400);\n }\n const event: MatrixRecorderEvent = {\n at: new Date().toISOString(),\n ...(Object.keys(parsedBody).length > 0 ? { body: parsedBody } : {}),\n method,\n path: url.pathname,\n query: queryRecord(url),\n type,\n };\n const response = await handleMatrixApi({\n body: parsedBody,\n method,\n path: url.pathname,\n recorderEvent: event,\n state,\n url,\n });\n event.accepted ??= response.ok;\n await appendEvent(state, event, response.ok && [\"DELETE\", \"POST\", \"PUT\"].includes(method));\n return response;\n },\n });\n\n const clientApiRoot = `${server.baseUrl}/_matrix/client/v3`;\n return {\n async close() {\n for (const room of state.rooms.values()) {\n for (const timer of room.typingTimeouts.values()) {\n clearTimeout(timer);\n }\n room.typingTimeouts.clear();\n }\n await server.close();\n },\n manifest: {\n accessToken: state.accessToken,\n adminToken: state.adminToken,\n baseUrl: server.baseUrl,\n botUserId: state.botUserId,\n deviceId: state.deviceId,\n endpoints: {\n adminInboundUrl: `${server.baseUrl}/crabline/matrix/inbound`,\n clientApiRoot,\n syncUrl: `${clientApiRoot}/sync`,\n },\n env: {\n MATRIX_ACCESS_TOKEN: state.accessToken,\n MATRIX_BASE_URL: server.baseUrl,\n MATRIX_USER_ID: state.botUserId,\n },\n provider: \"matrix\",\n recorderPath: state.recorderPath,\n version: 1,\n },\n };\n}\n"]}
1
+ {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../../../src/servers/matrix.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\";\nimport type { IncomingMessage } from \"node:http\";\nimport path from \"node:path\";\nimport {\n isHistoricalMatrixUserId,\n isMatrixEventId,\n isMatrixRoomId,\n isMatrixUserId,\n} from \"../matrix-ids.js\";\nimport {\n adminAuthError,\n createServerClose,\n constantTimeTokenEqual,\n DEFAULT_MAX_RESPONSE_BODY_BYTES,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readInteger,\n readTrimmedString,\n RequestBodyTooLargeError,\n startHttpJsonServer,\n type ServerRequestEvent,\n} from \"./http.js\";\nimport { createServerRecorder, type ServerRecorder, type ServerEventObserver } from \"./recorder.js\";\n\ntype MatrixEvent = {\n content: Record<string, unknown>;\n event_id: string;\n origin_server_ts: number;\n room_id: string;\n sender: string;\n state_key?: string;\n type: string;\n unsigned?: { transaction_id: string };\n};\n\ntype MatrixRoom = {\n createdSequence: number;\n ephemeral: Array<{\n event: { content: Record<string, unknown>; type: \"m.receipt\" | \"m.typing\" };\n sequence: number;\n }>;\n id: string;\n lastDroppedTimelineSequence: number | undefined;\n name: string;\n state: MatrixEvent[];\n stateBeforeTimeline: Map<string, MatrixEvent>;\n timeline: Array<{ sequence: number; event: MatrixEvent }>;\n typingTimeouts: Map<string, NodeJS.Timeout>;\n typingUsers: Set<string>;\n users: Map<string, { avatar_url?: string; display_name?: string }>;\n};\n\ntype MatrixTransactionResponse = {\n body: Record<string, unknown>;\n expiresAt: number;\n status: number;\n};\n\ntype MatrixServerState = {\n accessToken: string;\n adminToken: string;\n botUserId: string;\n deviceId: string;\n directRooms: Map<string, Set<string>>;\n directRoomsSequence: number | undefined;\n filterBytes: number;\n filters: Map<string, { body: Record<string, unknown>; bytes: number }>;\n maxCommittedRooms: number;\n maxCommittedUsers: number;\n maxSyncResponseBytes: number;\n nextEvent: number;\n nextFilter: number;\n nextSequence: number;\n recorder: ServerRecorder;\n profiles: Map<string, { avatar_url?: string; display_name?: string }>;\n recorderPath: string;\n rooms: Map<string, MatrixRoom>;\n serverName: string;\n syncWaiters: Set<() => void>;\n transactions: Map<string, MatrixTransactionResponse>;\n};\n\ntype MatrixRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n};\n\nconst MAX_MATRIX_FILTER_BYTES = 1024 * 1024;\nconst MAX_MATRIX_FILTERS = 100;\nconst MAX_MATRIX_TIMELINE_EVENTS = 1_000;\nconst MAX_MATRIX_TRANSACTION_RESPONSES = 1_000;\nconst MATRIX_TRANSACTION_RETENTION_MS = 10 * 60_000;\nconst MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;\nconst DEFAULT_MAX_MATRIX_COMMITTED_ROOMS = 1_000;\nconst DEFAULT_MAX_MATRIX_COMMITTED_USERS = 1_000;\nconst DEFAULT_MAX_MATRIX_SYNC_RESPONSE_BYTES = 4 * 1024 * 1024;\n\nclass InvalidMatrixPathEncodingError extends Error {\n constructor() {\n super(\"Matrix request path contains invalid percent encoding.\");\n this.name = \"InvalidMatrixPathEncodingError\";\n }\n}\n\nexport type MatrixServerManifest = {\n accessToken: string;\n adminToken: string;\n baseUrl: string;\n botUserId: string;\n deviceId: string;\n endpoints: {\n adminInboundUrl: string;\n clientApiRoot: string;\n syncUrl: string;\n };\n env: {\n MATRIX_ACCESS_TOKEN: string;\n MATRIX_BASE_URL: string;\n MATRIX_USER_ID: string;\n };\n provider: \"matrix\";\n recorderPath: string;\n version: 1;\n};\n\nexport type StartedMatrixServer = {\n close(): Promise<void>;\n manifest: MatrixServerManifest;\n};\n\nexport type StartMatrixServerParams = {\n accessToken?: string | undefined;\n adminToken?: string | undefined;\n botUserId?: string | undefined;\n deviceId?: string | undefined;\n host?: string | undefined;\n maxCommittedRooms?: number | undefined;\n maxCommittedUsers?: number | undefined;\n maxSyncResponseBytes?: number | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n roomId?: string | undefined;\n roomName?: string | undefined;\n serverName?: string | undefined;\n};\n\nfunction matrixRoomId(value: string, serverName: string): string {\n return `!${createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16)}:${serverName}`;\n}\n\nasync function appendEvent(\n state: MatrixServerState,\n event: ServerRequestEvent,\n committed = false,\n): Promise<void> {\n await (committed ? state.recorder.recordCommitted(event) : state.recorder.record(event));\n}\n\nfunction authorized(request: IncomingMessage, token: string): boolean {\n const match = /^Bearer\\s+(\\S+)$/iu.exec(request.headers.authorization ?? \"\");\n const providedToken = match?.[1];\n return providedToken ? constantTimeTokenEqual(providedToken, token) : false;\n}\n\nfunction matrixError(errcode: string, error: string, status: number): Response {\n return jsonResponse({ errcode, error }, status);\n}\n\nfunction matrixResourceLimitError(error: string): Response {\n return jsonResponse(\n {\n admin_contact: \"mailto:admin@localhost\",\n errcode: \"M_RESOURCE_LIMIT_EXCEEDED\",\n error,\n },\n 503,\n );\n}\n\nfunction resolvePositiveLimit(value: number | undefined, name: string, fallback: number): number {\n if (value === undefined) {\n return fallback;\n }\n if (!Number.isSafeInteger(value) || value < 1) {\n throw new Error(`${name} must be a positive safe integer.`);\n }\n return value;\n}\n\nfunction decodeMatrixPathSegment(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n throw new InvalidMatrixPathEncodingError();\n }\n}\n\nfunction eventId(state: MatrixServerState): string {\n return `$${createHash(\"sha256\")\n .update(state.serverName)\n .update(\"\\0\")\n .update(`event-${state.nextEvent++}`)\n .digest(\"base64url\")}`;\n}\n\nfunction notifySyncWaiters(state: MatrixServerState): void {\n for (const resolve of state.syncWaiters) {\n resolve();\n }\n state.syncWaiters.clear();\n}\n\nasync function waitForSyncEvent(state: MatrixServerState, timeout: number): Promise<void> {\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n state.syncWaiters.delete(onEvent);\n resolve();\n }, timeout);\n const onEvent = () => {\n clearTimeout(timer);\n resolve();\n };\n state.syncWaiters.add(onEvent);\n });\n}\n\nfunction createEvent(params: {\n content: Record<string, unknown>;\n roomId: string;\n sender: string;\n state: MatrixServerState;\n stateKey?: string;\n transactionId?: string;\n type: string;\n}): MatrixEvent {\n return {\n content: params.content,\n event_id: eventId(params.state),\n origin_server_ts: Date.now(),\n room_id: params.roomId,\n sender: params.sender,\n ...(params.stateKey !== undefined ? { state_key: params.stateKey } : {}),\n type: params.type,\n ...(params.transactionId ? { unsigned: { transaction_id: params.transactionId } } : {}),\n };\n}\n\nfunction createRoom(params: {\n botUserId: string;\n createdSequence: number;\n direct?: boolean;\n id: string;\n name: string;\n serverName: string;\n state: MatrixServerState;\n}): MatrixRoom {\n const room: MatrixRoom = {\n createdSequence: params.createdSequence,\n ephemeral: [],\n id: params.id,\n lastDroppedTimelineSequence: undefined,\n name: params.name,\n state: [],\n stateBeforeTimeline: new Map(),\n timeline: [],\n typingTimeouts: new Map(),\n typingUsers: new Set(),\n users: new Map([[params.botUserId, { display_name: \"OpenClaw QA\" }]]),\n };\n room.state.push(\n createEvent({\n content: { creator: params.botUserId, room_version: \"10\" },\n roomId: room.id,\n sender: params.botUserId,\n state: params.state,\n stateKey: \"\",\n type: \"m.room.create\",\n }),\n createEvent({\n content: {\n membership: \"join\",\n displayname: \"OpenClaw QA\",\n ...(params.direct ? { is_direct: true } : {}),\n },\n roomId: room.id,\n sender: params.botUserId,\n state: params.state,\n stateKey: params.botUserId,\n type: \"m.room.member\",\n }),\n createEvent({\n content: { name: room.name },\n roomId: room.id,\n sender: params.botUserId,\n state: params.state,\n stateKey: \"\",\n type: \"m.room.name\",\n }),\n );\n for (const event of room.state) {\n room.stateBeforeTimeline.set(matrixStateKey(event), event);\n }\n return room;\n}\n\nfunction matrixStateKey(event: MatrixEvent): string {\n return JSON.stringify([event.type, event.state_key ?? \"\"]);\n}\n\nfunction appendTimelineEvent(\n room: MatrixRoom,\n entry: { event: MatrixEvent; sequence: number },\n): void {\n room.timeline.push(entry);\n if (room.timeline.length > MAX_MATRIX_TIMELINE_EVENTS) {\n const dropped = room.timeline.splice(0, room.timeline.length - MAX_MATRIX_TIMELINE_EVENTS);\n room.lastDroppedTimelineSequence = dropped.at(-1)?.sequence;\n for (const droppedEntry of dropped) {\n if (droppedEntry.event.state_key !== undefined) {\n room.stateBeforeTimeline.set(matrixStateKey(droppedEntry.event), droppedEntry.event);\n }\n }\n }\n}\n\nfunction appendEphemeralEvent(\n room: MatrixRoom,\n entry: {\n event: { content: Record<string, unknown>; type: \"m.receipt\" | \"m.typing\" };\n sequence: number;\n },\n): void {\n room.ephemeral.push(entry);\n if (room.ephemeral.length > MAX_MATRIX_TIMELINE_EVENTS) {\n room.ephemeral.splice(0, room.ephemeral.length - MAX_MATRIX_TIMELINE_EVENTS);\n }\n}\n\nfunction publishTypingState(state: MatrixServerState, room: MatrixRoom): void {\n appendEphemeralEvent(room, {\n event: { content: { user_ids: [...room.typingUsers] }, type: \"m.typing\" },\n sequence: state.nextSequence++,\n });\n notifySyncWaiters(state);\n}\n\nfunction publishDirectRoom(state: MatrixServerState, userId: string, roomId: string): void {\n const roomIds = state.directRooms.get(userId) ?? new Set<string>();\n if (roomIds.has(roomId)) {\n return;\n }\n roomIds.add(roomId);\n state.directRooms.set(userId, roomIds);\n state.directRoomsSequence = state.nextSequence++;\n}\n\nfunction serializeSyncAccountData(\n state: MatrixServerState,\n since: number | undefined,\n maxBytes: number,\n): string | undefined {\n const sequence = state.directRoomsSequence;\n if (sequence === undefined || (since !== undefined && sequence <= since)) {\n return '{\"events\":[]}';\n }\n const prefix = '{\"events\":[{\"content\":{';\n const suffix = '},\"type\":\"m.direct\"}]}';\n const parts: string[] = [];\n let bytes = Buffer.byteLength(prefix, \"utf8\") + Buffer.byteLength(suffix, \"utf8\");\n for (const [userId, roomIds] of state.directRooms) {\n const roomParts: string[] = [];\n let roomBytes = 2;\n for (const roomId of roomIds) {\n const separator = roomParts.length === 0 ? \"\" : \",\";\n const roomPart = `${separator}${JSON.stringify(roomId)}`;\n roomBytes += Buffer.byteLength(roomPart, \"utf8\");\n if (bytes + roomBytes > maxBytes) {\n return undefined;\n }\n roomParts.push(roomPart);\n }\n const separator = parts.length === 0 ? \"\" : \",\";\n const part = `${separator}${JSON.stringify(userId)}:[${roomParts.join(\"\")}]`;\n bytes += Buffer.byteLength(part, \"utf8\");\n if (bytes > maxBytes) {\n return undefined;\n }\n parts.push(part);\n }\n return `${prefix}${parts.join(\"\")}${suffix}`;\n}\n\nfunction rememberTransaction(\n state: MatrixServerState,\n key: string,\n response: MatrixTransactionResponse,\n): void {\n state.transactions.set(key, response);\n}\n\nfunction forgetExpiredTransactions(state: MatrixServerState): void {\n const now = Date.now();\n for (const [key, response] of state.transactions) {\n if (response.expiresAt > now) {\n break;\n }\n state.transactions.delete(key);\n }\n}\n\nfunction transactionResponse(\n state: MatrixServerState,\n key: string,\n): MatrixTransactionResponse | undefined {\n forgetExpiredTransactions(state);\n const response = state.transactions.get(key);\n if (!response) {\n return undefined;\n }\n state.transactions.delete(key);\n response.expiresAt = Date.now() + MATRIX_TRANSACTION_RETENTION_MS;\n state.transactions.set(key, response);\n return response;\n}\n\nfunction readTimelineLimit(\n filter: Record<string, unknown> | undefined,\n): number | Response | undefined {\n const room = filter?.room;\n if (room === undefined) {\n return undefined;\n }\n if (!isJsonObject(room)) {\n return matrixError(\"M_INVALID_PARAM\", \"Invalid room filter\", 400);\n }\n const timeline = room.timeline;\n if (timeline === undefined) {\n return undefined;\n }\n if (!isJsonObject(timeline)) {\n return matrixError(\"M_INVALID_PARAM\", \"Invalid timeline filter\", 400);\n }\n if (!Object.hasOwn(timeline, \"limit\")) {\n return undefined;\n }\n const limit = timeline.limit;\n return typeof limit === \"number\" && Number.isSafeInteger(limit) && limit > 0\n ? limit\n : matrixError(\"M_INVALID_PARAM\", \"Invalid timeline limit\", 400);\n}\n\nfunction resolveSyncFilter(\n url: URL,\n state: MatrixServerState,\n): Record<string, unknown> | Response | undefined {\n const value = url.searchParams.get(\"filter\");\n if (value === null) {\n return undefined;\n }\n const stored = state.filters.get(value);\n if (stored) {\n return stored.body;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return isJsonObject(parsed) ? parsed : matrixError(\"M_INVALID_PARAM\", \"Invalid filter\", 400);\n } catch {\n return matrixError(\"M_INVALID_PARAM\", \"Unknown filter\", 400);\n }\n}\n\nfunction createSyncRoom(\n room: MatrixRoom,\n since: number | undefined,\n available: Array<{ sequence: number; event: MatrixEvent }>,\n timeline: Array<{ sequence: number; event: MatrixEvent }>,\n) {\n const firstSequence = timeline[0]?.sequence;\n const historyWasTrimmed =\n room.lastDroppedTimelineSequence !== undefined &&\n (since === undefined || since < room.lastDroppedTimelineSequence);\n const limited = historyWasTrimmed || timeline.length < available.length;\n const omittedTimeline = available.slice(0, available.length - timeline.length);\n const omittedState = new Map<string, MatrixEvent>();\n if (since === undefined || room.createdSequence > since || historyWasTrimmed) {\n for (const [key, event] of room.stateBeforeTimeline) {\n omittedState.set(key, event);\n }\n }\n for (const entry of omittedTimeline) {\n if (entry.event.state_key !== undefined) {\n omittedState.set(matrixStateKey(entry.event), entry.event);\n }\n }\n return {\n account_data: { events: [] },\n ephemeral: {\n events: room.ephemeral\n .filter((entry) => since === undefined || entry.sequence > since)\n .map((entry) => entry.event),\n },\n state: {\n events: [...omittedState.values()].filter(\n (event) => !timeline.some((entry) => entry.event.event_id === event.event_id),\n ),\n },\n timeline: {\n events: timeline.map((entry) => entry.event),\n limited,\n prev_batch: `s${firstSequence === undefined ? (since ?? 0) : firstSequence - 1}`,\n },\n unread_notifications: { highlight_count: 0, notification_count: 0 },\n };\n}\n\nfunction jsonItemsByteLength(items: readonly unknown[], maxBytes: number): number | undefined {\n let bytes = 0;\n for (const item of items) {\n const serialized = JSON.stringify(item);\n if (serialized === undefined) {\n return undefined;\n }\n bytes += Buffer.byteLength(serialized, \"utf8\");\n if (bytes > maxBytes) {\n return undefined;\n }\n }\n return bytes;\n}\n\nfunction boundedSyncRoom(\n room: MatrixRoom,\n since: number | undefined,\n timelineLimit: number | undefined,\n maxBytes: number,\n maxTimelineEvents = Number.POSITIVE_INFINITY,\n): string | undefined {\n const available = room.timeline.filter((entry) => since === undefined || entry.sequence > since);\n const requestedTimeline =\n timelineLimit === undefined\n ? available\n : available.slice(Math.max(0, available.length - timelineLimit));\n const ephemeral = room.ephemeral\n .filter((entry) => since === undefined || entry.sequence > since)\n .map((entry) => entry.event);\n const ephemeralBytes = jsonItemsByteLength(ephemeral, maxBytes);\n if (ephemeralBytes === undefined) {\n return undefined;\n }\n\n const timeline: Array<{ sequence: number; event: MatrixEvent }> = [];\n let timelineBytes = 0;\n for (let index = requestedTimeline.length - 1; index >= 0; index -= 1) {\n if (timeline.length >= maxTimelineEvents) {\n break;\n }\n const entry = requestedTimeline[index]!;\n const serializedEvent = JSON.stringify(entry.event);\n if (serializedEvent === undefined) {\n return undefined;\n }\n const eventBytes = Buffer.byteLength(serializedEvent, \"utf8\");\n if (timelineBytes + ephemeralBytes + eventBytes > maxBytes) {\n break;\n }\n timeline.unshift(entry);\n timelineBytes += eventBytes;\n }\n if (requestedTimeline.length > 0 && timelineLimit !== 0 && timeline.length === 0) {\n return undefined;\n }\n\n while (true) {\n const body = createSyncRoom(room, since, available, timeline);\n const stateBytes = jsonItemsByteLength(body.state.events, maxBytes);\n if (stateBytes !== undefined && stateBytes + ephemeralBytes + timelineBytes <= maxBytes) {\n const serialized = JSON.stringify(body);\n if (Buffer.byteLength(serialized, \"utf8\") <= maxBytes) {\n return serialized;\n }\n }\n if (timeline.length === 1 && requestedTimeline.length > 0 && timelineLimit !== 0) {\n return undefined;\n }\n const dropped = timeline.shift();\n if (!dropped) {\n return undefined;\n }\n const serializedDropped = JSON.stringify(dropped.event);\n if (serializedDropped === undefined) {\n return undefined;\n }\n timelineBytes -= Buffer.byteLength(serializedDropped, \"utf8\");\n }\n}\n\nfunction roomHasSyncUpdates(room: MatrixRoom, since: number | undefined): boolean {\n return (\n since === undefined ||\n room.createdSequence > since ||\n room.timeline.some((entry) => entry.sequence > since) ||\n room.ephemeral.some((entry) => entry.sequence > since)\n );\n}\n\nfunction parseSyncToken(value: string | null): number | null | undefined {\n if (value === null) {\n return undefined;\n }\n const match = /^s(\\d+)$/u.exec(value);\n if (!match) {\n return null;\n }\n const sequence = Number(match[1]);\n return Number.isSafeInteger(sequence) ? sequence : null;\n}\n\nasync function handleSync(url: URL, state: MatrixServerState): Promise<Response> {\n const since = parseSyncToken(url.searchParams.get(\"since\"));\n if (since === null || (since !== undefined && since > state.nextSequence - 1)) {\n return matrixError(\"M_UNKNOWN_POS\", \"Unknown position\", 400);\n }\n const filter = resolveSyncFilter(url, state);\n if (filter instanceof Response) {\n return filter;\n }\n const timelineLimit = readTimelineLimit(filter);\n if (timelineLimit instanceof Response) {\n return timelineLimit;\n }\n const timeout = Math.min(readInteger(url.searchParams.get(\"timeout\")) ?? 0, 1_000);\n const hasNewEvents =\n (state.directRoomsSequence !== undefined &&\n (since === undefined || state.directRoomsSequence > since)) ||\n [...state.rooms.values()].some((room) => roomHasSyncUpdates(room, since));\n if (since !== undefined && !hasNewEvents && timeout > 0) {\n await waitForSyncEvent(state, timeout);\n }\n const accountData = serializeSyncAccountData(state, since, state.maxSyncResponseBytes);\n if (!accountData) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n const prefix = `{\"account_data\":${accountData},\"device_lists\":{\"changed\":[],\"left\":[]},\"device_one_time_keys_count\":{},\"next_batch\":${JSON.stringify(\n `s${state.nextSequence - 1}`,\n )},\"presence\":{\"events\":[]},\"rooms\":{\"invite\":{},\"join\":{`;\n const suffix = '},\"knock\":{},\"leave\":{}},\"to_device\":{\"events\":[]}}';\n let responseBytes = Buffer.byteLength(prefix, \"utf8\") + Buffer.byteLength(suffix, \"utf8\");\n const rooms = [...state.rooms.values()].filter((room) => roomHasSyncUpdates(room, since));\n const minimumEntries: Array<{\n framingBytes: number;\n minimumBytes: number;\n room: MatrixRoom;\n roomKey: string;\n separator: string;\n }> = [];\n for (const [index, room] of rooms.entries()) {\n const separator = index === 0 ? \"\" : \",\";\n const roomKey = JSON.stringify(room.id);\n const framingBytes = Buffer.byteLength(`${separator}${roomKey}:`, \"utf8\");\n const roomBody = boundedSyncRoom(room, since, timelineLimit, state.maxSyncResponseBytes, 1);\n if (!roomBody) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n minimumEntries.push({\n framingBytes,\n minimumBytes: framingBytes + Buffer.byteLength(roomBody, \"utf8\"),\n room,\n roomKey,\n separator,\n });\n }\n let reservedBytes = minimumEntries.reduce((total, entry) => total + entry.minimumBytes, 0);\n if (responseBytes + reservedBytes > state.maxSyncResponseBytes) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n\n const parts: string[] = [];\n for (const entry of minimumEntries) {\n reservedBytes -= entry.minimumBytes;\n const roomBody = boundedSyncRoom(\n entry.room,\n since,\n timelineLimit,\n state.maxSyncResponseBytes - responseBytes - entry.framingBytes - reservedBytes,\n );\n if (!roomBody) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n parts.push(`${entry.separator}${entry.roomKey}:${roomBody}`);\n responseBytes += entry.framingBytes + Buffer.byteLength(roomBody, \"utf8\");\n }\n const body = `${prefix}${parts.join(\"\")}${suffix}`;\n if (Buffer.byteLength(body, \"utf8\") > state.maxSyncResponseBytes) {\n return matrixResourceLimitError(\"Sync response exceeds the configured byte limit\");\n }\n return new Response(body, {\n headers: { \"content-type\": \"application/json\" },\n status: 200,\n });\n}\n\nfunction findRoom(state: MatrixServerState, encodedRoomId: string): MatrixRoom | undefined {\n return state.rooms.get(decodeMatrixPathSegment(encodedRoomId));\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: MatrixServerState;\n}): Promise<Response> {\n const roomId = readTrimmedString(params.body.roomId);\n const sender = readTrimmedString(params.body.sender ?? params.body.senderId);\n const text = typeof params.body.text === \"string\" ? params.body.text : undefined;\n if (!roomId || !sender || text === undefined || text.length === 0) {\n return jsonResponse({ error: \"roomId, senderId, and text are required\", ok: false }, 400);\n }\n const threadId = readTrimmedString(params.body.threadId);\n if (\n !isMatrixRoomId(roomId) ||\n !isHistoricalMatrixUserId(sender) ||\n (threadId !== undefined && !isMatrixEventId(threadId))\n ) {\n return jsonResponse({ error: \"Invalid Matrix identifier\", ok: false }, 400);\n }\n const direct = params.body.direct === true;\n const existingRoom = params.state.rooms.get(roomId);\n if (!existingRoom && params.state.rooms.size >= params.state.maxCommittedRooms) {\n return jsonResponse({ error: \"Committed Matrix rooms limit reached\", ok: false }, 503);\n }\n if (\n !params.state.profiles.has(sender) &&\n params.state.profiles.size >= params.state.maxCommittedUsers\n ) {\n return jsonResponse({ error: \"Committed Matrix users limit reached\", ok: false }, 503);\n }\n const roomHasSender = existingRoom\n ? existingRoom.users.has(sender)\n : sender === params.state.botUserId;\n const roomUserCount = existingRoom?.users.size ?? 1;\n if (!roomHasSender && roomUserCount >= params.state.maxCommittedUsers) {\n return jsonResponse({ error: \"Committed Matrix users limit reached\", ok: false }, 503);\n }\n const room =\n existingRoom ??\n createRoom({\n botUserId: params.state.botUserId,\n createdSequence: params.state.nextSequence++,\n direct,\n id: roomId,\n name: readTrimmedString(params.body.roomName) ?? roomId,\n serverName: params.state.serverName,\n state: params.state,\n });\n params.state.rooms.set(roomId, room);\n if (direct) {\n publishDirectRoom(params.state, sender, roomId);\n }\n const senderName = readTrimmedString(params.body.senderName);\n if (senderName) {\n params.state.profiles.set(sender, {\n ...params.state.profiles.get(sender),\n display_name: senderName,\n });\n } else if (!params.state.profiles.has(sender)) {\n params.state.profiles.set(sender, {});\n }\n const existingProfile = room.users.get(sender);\n if (existingProfile === undefined) {\n room.users.set(sender, senderName ? { display_name: senderName } : {});\n const membership = createEvent({\n content: {\n membership: \"join\",\n ...(senderName ? { displayname: senderName } : {}),\n },\n roomId,\n sender,\n state: params.state,\n stateKey: sender,\n type: \"m.room.member\",\n });\n room.state.push(membership);\n appendTimelineEvent(room, { event: membership, sequence: params.state.nextSequence++ });\n } else if (senderName && existingProfile.display_name !== senderName) {\n room.users.set(sender, { ...existingProfile, display_name: senderName });\n const membership = createEvent({\n content: { membership: \"join\", displayname: senderName },\n roomId,\n sender,\n state: params.state,\n stateKey: sender,\n type: \"m.room.member\",\n });\n const stateIndex = room.state.findIndex(\n (event) => event.type === \"m.room.member\" && event.state_key === sender,\n );\n if (stateIndex >= 0) {\n room.state[stateIndex] = membership;\n } else {\n room.state.push(membership);\n }\n appendTimelineEvent(room, {\n event: membership,\n sequence: params.state.nextSequence++,\n });\n }\n const roomAvatarUrl = room.users.get(sender)?.avatar_url;\n if (roomAvatarUrl) {\n params.state.profiles.set(sender, {\n ...params.state.profiles.get(sender),\n avatar_url: roomAvatarUrl,\n });\n }\n const content: Record<string, unknown> = { body: text, msgtype: \"m.text\" };\n if (threadId) {\n content[\"m.relates_to\"] = {\n event_id: threadId,\n is_falling_back: true,\n rel_type: \"m.thread\",\n \"m.in_reply_to\": { event_id: threadId },\n };\n }\n const event = createEvent({\n content,\n roomId,\n sender,\n state: params.state,\n type: \"m.room.message\",\n });\n appendTimelineEvent(room, { event, sequence: params.state.nextSequence++ });\n notifySyncWaiters(params.state);\n return jsonResponse({ event, ok: true });\n}\n\nasync function handleMatrixApi(params: {\n body: Record<string, unknown>;\n method: string;\n path: string;\n recorderEvent: MatrixRecorderEvent;\n state: MatrixServerState;\n url: URL;\n}): Promise<Response> {\n const relativePath = params.path.replace(/^\\/_matrix\\/client\\/(?:v3|r0)/u, \"\");\n if (params.method === \"GET\" && relativePath === \"/account/whoami\") {\n return jsonResponse({\n device_id: params.state.deviceId,\n is_guest: false,\n user_id: params.state.botUserId,\n });\n }\n if (params.method === \"GET\" && relativePath === \"/joined_rooms\") {\n return jsonResponse({ joined_rooms: [...params.state.rooms.keys()] });\n }\n if (params.method === \"GET\" && relativePath === \"/capabilities\") {\n return jsonResponse({ capabilities: {} });\n }\n let match = /^\\/profile\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"GET\" && match) {\n const userId = decodeMatrixPathSegment(match[1]!);\n const profile = params.state.profiles.get(userId);\n return profile\n ? jsonResponse({\n ...(profile.avatar_url ? { avatar_url: profile.avatar_url } : {}),\n ...(profile.display_name ? { displayname: profile.display_name } : {}),\n })\n : matrixError(\"M_NOT_FOUND\", \"Unknown user\", 404);\n }\n if (params.method === \"GET\" && relativePath === \"/pushrules/\") {\n const empty = { content: [], override: [], room: [], sender: [], underride: [] };\n return jsonResponse({ global: empty });\n }\n if (params.method === \"GET\" && relativePath === \"/sync\") {\n return await handleSync(params.url, params.state);\n }\n\n match = /^\\/user\\/([^/]+)\\/filter$/u.exec(relativePath);\n if (params.method === \"POST\" && match) {\n const userId = decodeMatrixPathSegment(match[1]!);\n if (userId !== params.state.botUserId) {\n return matrixError(\"M_FORBIDDEN\", \"Cannot create a filter for another user\", 403);\n }\n const bytes = Buffer.byteLength(JSON.stringify(params.body), \"utf8\");\n if (\n params.state.filters.size >= MAX_MATRIX_FILTERS ||\n params.state.filterBytes + bytes > MAX_MATRIX_FILTER_BYTES\n ) {\n return matrixResourceLimitError(\"Too many stored filters\");\n }\n const filterId = String(params.state.nextFilter++);\n params.state.filters.set(filterId, { body: params.body, bytes });\n params.state.filterBytes += bytes;\n return jsonResponse({ filter_id: filterId });\n }\n\n match = /^\\/user\\/([^/]+)\\/filter\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"GET\" && match) {\n const userId = decodeMatrixPathSegment(match[1]!);\n if (userId !== params.state.botUserId) {\n return matrixError(\"M_FORBIDDEN\", \"Cannot get filters for another user\", 403);\n }\n const filter = params.state.filters.get(decodeMatrixPathSegment(match[2]!));\n return filter ? jsonResponse(filter.body) : matrixError(\"M_NOT_FOUND\", \"Unknown filter\", 404);\n }\n\n match = /^\\/rooms\\/([^/]+)\\/joined_members$/u.exec(relativePath);\n if (params.method === \"GET\" && match) {\n const room = findRoom(params.state, match[1]!);\n return room\n ? jsonResponse({ joined: Object.fromEntries(room.users) })\n : matrixError(\"M_NOT_FOUND\", \"Unknown room\", 404);\n }\n\n match = /^\\/rooms\\/([^/]+)\\/state\\/([^/]+)(?:\\/(.*))?$/u.exec(relativePath);\n if (params.method === \"GET\" && match) {\n const room = findRoom(params.state, match[1]!);\n if (!room) {\n return matrixError(\"M_NOT_FOUND\", \"Unknown room\", 404);\n }\n const eventType = decodeMatrixPathSegment(match[2]!);\n const stateKey = decodeMatrixPathSegment(match[3] ?? \"\");\n if (eventType === \"m.room.name\" && stateKey === \"\") {\n return jsonResponse({ name: room.name });\n }\n if (eventType === \"m.room.canonical_alias\" && stateKey === \"\") {\n return matrixError(\"M_NOT_FOUND\", \"Unknown state event\", 404);\n }\n if (eventType === \"m.room.member\") {\n const membership = [...room.state]\n .reverse()\n .find((event) => event.type === \"m.room.member\" && event.state_key === stateKey);\n return membership\n ? jsonResponse(membership.content)\n : matrixError(\"M_NOT_FOUND\", \"Unknown room member\", 404);\n }\n return matrixError(\"M_NOT_FOUND\", \"Unknown state event\", 404);\n }\n\n match = /^\\/rooms\\/([^/]+)\\/send\\/([^/]+)\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"PUT\" && match) {\n const roomId = decodeMatrixPathSegment(match[1]!);\n const eventType = decodeMatrixPathSegment(match[2]!);\n const transactionId = decodeMatrixPathSegment(match[3]!);\n const transactionKey = JSON.stringify([\n params.state.botUserId,\n roomId,\n eventType,\n transactionId,\n ]);\n const existingResponse = transactionResponse(params.state, transactionKey);\n if (existingResponse) {\n params.recorderEvent.accepted =\n existingResponse.status >= 200 && existingResponse.status < 300;\n return jsonResponse(existingResponse.body, existingResponse.status);\n }\n if (params.state.transactions.size >= MAX_MATRIX_TRANSACTION_RESPONSES) {\n params.recorderEvent.accepted = false;\n return matrixResourceLimitError(\"Too many retained transaction responses\");\n }\n const room = params.state.rooms.get(roomId);\n if (!room) {\n params.recorderEvent.accepted = false;\n const body = { errcode: \"M_NOT_FOUND\", error: \"Unknown room\" };\n rememberTransaction(params.state, transactionKey, {\n body,\n expiresAt: Date.now() + MATRIX_TRANSACTION_RETENTION_MS,\n status: 404,\n });\n return jsonResponse(body, 404);\n }\n const event = createEvent({\n content: params.body,\n roomId: room.id,\n sender: params.state.botUserId,\n state: params.state,\n transactionId,\n type: eventType,\n });\n appendTimelineEvent(room, { event, sequence: params.state.nextSequence++ });\n const body = { event_id: event.event_id };\n rememberTransaction(params.state, transactionKey, {\n body,\n expiresAt: Date.now() + MATRIX_TRANSACTION_RETENTION_MS,\n status: 200,\n });\n notifySyncWaiters(params.state);\n params.recorderEvent.accepted = true;\n return jsonResponse(body);\n }\n\n match = /^\\/rooms\\/([^/]+)\\/typing\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"PUT\" && match) {\n const room = findRoom(params.state, match[1]!);\n if (!room) {\n return matrixError(\"M_NOT_FOUND\", \"Unknown room\", 404);\n }\n const userId = decodeMatrixPathSegment(match[2]!);\n if (userId !== params.state.botUserId) {\n return matrixError(\"M_FORBIDDEN\", \"Cannot set typing state for another user\", 403);\n }\n if (typeof params.body.typing !== \"boolean\") {\n return matrixError(\"M_BAD_JSON\", \"typing must be a boolean\", 400);\n }\n const timeout =\n params.body.typing &&\n typeof params.body.timeout === \"number\" &&\n Number.isSafeInteger(params.body.timeout)\n ? params.body.timeout\n : undefined;\n if (\n params.body.typing &&\n (timeout === undefined || timeout < 1 || timeout > MAX_NODE_TIMER_DELAY_MS)\n ) {\n return matrixError(\n \"M_BAD_JSON\",\n `timeout must be a positive integer no greater than ${MAX_NODE_TIMER_DELAY_MS}`,\n 400,\n );\n }\n const existingTimeout = room.typingTimeouts.get(userId);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n room.typingTimeouts.delete(userId);\n }\n if (params.body.typing) {\n room.typingUsers.add(userId);\n const timer = setTimeout(() => {\n room.typingTimeouts.delete(userId);\n if (room.typingUsers.delete(userId)) {\n publishTypingState(params.state, room);\n }\n }, timeout!);\n timer.unref();\n room.typingTimeouts.set(userId, timer);\n } else {\n room.typingUsers.delete(userId);\n }\n publishTypingState(params.state, room);\n return jsonResponse({});\n }\n match = /^\\/rooms\\/([^/]+)\\/receipt\\/m\\.read\\/([^/]+)$/u.exec(relativePath);\n if (params.method === \"POST\" && match) {\n const room = findRoom(params.state, match[1]!);\n if (!room) {\n return matrixError(\"M_NOT_FOUND\", \"Unknown room\", 404);\n }\n const receiptEventId = decodeMatrixPathSegment(match[2]!);\n appendEphemeralEvent(room, {\n event: {\n content: {\n [receiptEventId]: {\n \"m.read\": {\n [params.state.botUserId]: {\n ts: Date.now(),\n ...(readTrimmedString(params.body.thread_id)\n ? { thread_id: readTrimmedString(params.body.thread_id) }\n : {}),\n },\n },\n },\n },\n type: \"m.receipt\",\n },\n sequence: params.state.nextSequence++,\n });\n notifySyncWaiters(params.state);\n return jsonResponse({});\n }\n\n return matrixError(\"M_UNRECOGNIZED\", \"Unrecognized request\", 404);\n}\n\nexport async function startMatrixServer(\n params: StartMatrixServerParams = {},\n): Promise<StartedMatrixServer> {\n const host = params.host ?? \"127.0.0.1\";\n const serverName = params.serverName ?? \"matrix.test\";\n const botUserId = params.botUserId ?? `@openclaw:${serverName}`;\n if (!isMatrixUserId(botUserId)) {\n throw new Error(\"botUserId must be a canonical Matrix user ID.\");\n }\n const recorderPath = params.recorderPath ?? path.resolve(\"artifacts/crabline/matrix.jsonl\");\n const state: MatrixServerState = {\n accessToken: params.accessToken ?? `syt_crabline_${randomBytes(12).toString(\"hex\")}`,\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n botUserId,\n deviceId: params.deviceId ?? \"CRABLINE\",\n directRooms: new Map(),\n directRoomsSequence: undefined,\n filterBytes: 0,\n filters: new Map(),\n maxCommittedRooms: resolvePositiveLimit(\n params.maxCommittedRooms,\n \"maxCommittedRooms\",\n DEFAULT_MAX_MATRIX_COMMITTED_ROOMS,\n ),\n maxCommittedUsers: resolvePositiveLimit(\n params.maxCommittedUsers,\n \"maxCommittedUsers\",\n DEFAULT_MAX_MATRIX_COMMITTED_USERS,\n ),\n maxSyncResponseBytes: resolvePositiveLimit(\n params.maxSyncResponseBytes,\n \"maxSyncResponseBytes\",\n DEFAULT_MAX_MATRIX_SYNC_RESPONSE_BYTES,\n ),\n nextEvent: 1,\n nextFilter: 1,\n nextSequence: 1,\n recorder: createServerRecorder({ recorderPath, onEvent: params.onEvent }),\n profiles: new Map([[botUserId, { display_name: \"OpenClaw QA\" }]]),\n recorderPath,\n rooms: new Map(),\n serverName,\n syncWaiters: new Set(),\n transactions: new Map(),\n };\n const roomId = params.roomId ?? matrixRoomId(\"default-room\", serverName);\n state.rooms.set(\n roomId,\n createRoom({\n botUserId: state.botUserId,\n createdSequence: 0,\n id: roomId,\n name: params.roomName ?? \"Crabline Matrix Room\",\n serverName,\n state,\n }),\n );\n\n const server = await startHttpJsonServer({\n handleError: (error) => {\n if (error instanceof InvalidJsonBodyError) {\n return matrixError(\"M_NOT_JSON\", \"Request body is not valid JSON\", 400);\n }\n if (error instanceof RequestBodyTooLargeError) {\n return matrixError(\"M_TOO_LARGE\", \"Request body is too large\", 413);\n }\n if (error instanceof InvalidMatrixPathEncodingError) {\n return matrixError(\"M_INVALID_PARAM\", \"Invalid request path encoding\", 400);\n }\n return matrixError(\"M_UNKNOWN\", \"Internal server error\", 500);\n },\n host,\n maxResponseBodyBytes: Math.max(DEFAULT_MAX_RESPONSE_BODY_BYTES, state.maxSyncResponseBytes),\n port: params.port ?? 0,\n serverName: \"Matrix\",\n async handle(request) {\n const url = new URL(request.url ?? \"/\", \"http://localhost\");\n const method = request.method ?? \"GET\";\n const type = url.pathname === \"/crabline/matrix/inbound\" ? \"admin\" : \"api\";\n if (type === \"admin\") {\n if (method !== \"POST\") {\n return jsonResponse({ error: \"Method not allowed\", ok: false }, 405);\n }\n if (!hasAdminToken(request, state.adminToken)) {\n request.resume();\n return adminAuthError();\n }\n const body = await parseUnknownRequestBody(request);\n if (!isJsonObject(body)) {\n return jsonResponse({ error: \"Request body must be a JSON object\", ok: false }, 400);\n }\n await appendEvent(state, {\n at: new Date().toISOString(),\n ...(Object.keys(body).length > 0 ? { body } : {}),\n method,\n path: url.pathname,\n query: queryRecord(url),\n type,\n });\n return await handleAdminInbound({ body, state });\n }\n if (url.pathname === \"/_matrix/client/versions\" && method === \"GET\") {\n await appendEvent(state, {\n at: new Date().toISOString(),\n method,\n path: url.pathname,\n query: queryRecord(url),\n type,\n });\n return jsonResponse({ unstable_features: {}, versions: [\"v1.11\"] });\n }\n if (!url.pathname.startsWith(\"/_matrix/client/\")) {\n return matrixError(\"M_UNRECOGNIZED\", \"Unrecognized request\", 404);\n }\n if (!authorized(request, state.accessToken)) {\n request.resume();\n return matrixError(\"M_UNKNOWN_TOKEN\", \"Invalid access token\", 401);\n }\n const parsedBody = [\"POST\", \"PUT\"].includes(method)\n ? await parseUnknownRequestBody(request)\n : {};\n if (!isJsonObject(parsedBody)) {\n return matrixError(\"M_BAD_JSON\", \"Request body must be a JSON object\", 400);\n }\n const event: MatrixRecorderEvent = {\n at: new Date().toISOString(),\n ...(Object.keys(parsedBody).length > 0 ? { body: parsedBody } : {}),\n method,\n path: url.pathname,\n query: queryRecord(url),\n type,\n };\n const response = await handleMatrixApi({\n body: parsedBody,\n method,\n path: url.pathname,\n recorderEvent: event,\n state,\n url,\n });\n event.accepted ??= response.ok;\n await appendEvent(state, event, response.ok && [\"DELETE\", \"POST\", \"PUT\"].includes(method));\n return response;\n },\n });\n\n const clientApiRoot = `${server.baseUrl}/_matrix/client/v3`;\n return {\n close: createServerClose(state.recorder, async () => {\n for (const room of state.rooms.values()) {\n for (const timer of room.typingTimeouts.values()) {\n clearTimeout(timer);\n }\n room.typingTimeouts.clear();\n }\n await server.close();\n }),\n manifest: {\n accessToken: state.accessToken,\n adminToken: state.adminToken,\n baseUrl: server.baseUrl,\n botUserId: state.botUserId,\n deviceId: state.deviceId,\n endpoints: {\n adminInboundUrl: `${server.baseUrl}/crabline/matrix/inbound`,\n clientApiRoot,\n syncUrl: `${clientApiRoot}/sync`,\n },\n env: {\n MATRIX_ACCESS_TOKEN: state.accessToken,\n MATRIX_BASE_URL: server.baseUrl,\n MATRIX_USER_ID: state.botUserId,\n },\n provider: \"matrix\",\n recorderPath: state.recorderPath,\n version: 1,\n },\n };\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import { createHash, randomBytes } from "node:crypto";
2
2
  import path from "node:path";
3
3
  import { WebSocket, WebSocketServer } from "ws";
4
- import { adminAuthError, constantTimeTokenEqual, drainRequestBody, hasAdminToken, InvalidJsonBodyError, isJsonObject, isJsonMediaType, isLoopbackHost, jsonResponse, parseUnknownRequestBody, queryRecord, RequestBodyTooLargeError, startHttpJsonServer, } from "./http.js";
5
- import { recordCommittedServerEvent, recordServerEvent, } from "./recorder.js";
4
+ import { adminAuthError, createServerClose, constantTimeTokenEqual, drainRequestBody, hasAdminToken, InvalidJsonBodyError, isJsonObject, isJsonMediaType, isLoopbackHost, jsonResponse, parseUnknownRequestBody, queryRecord, RequestBodyTooLargeError, startHttpJsonServer, } from "./http.js";
5
+ import { createServerRecorder } from "./recorder.js";
6
6
  import { resolveMaxPendingInboundEvents } from "./pending-events.js";
7
7
  import { closeWebSocketServer } from "./websocket.js";
8
8
  const DEFAULT_WEBSOCKET_AUTHENTICATION_TIMEOUT_MS = 5_000;
@@ -34,8 +34,7 @@ function mattermostDirectChannelName(firstUserId, secondUserId) {
34
34
  return [firstUserId, secondUserId].sort().join("__");
35
35
  }
36
36
  async function appendEvent(state, event, committed = false) {
37
- const params = { event, onEvent: state.onEvent, recorderPath: state.recorderPath };
38
- await (committed ? recordCommittedServerEvent(params) : recordServerEvent(params));
37
+ await (committed ? state.recorder.recordCommitted(event) : state.recorder.record(event));
39
38
  }
40
39
  function authorized(request, token) {
41
40
  const providedToken = /^Bearer ([^\s]+)$/iu.exec(request.headers.authorization ?? "")?.[1];
@@ -860,6 +859,7 @@ export async function startMattermostServer(params = {}) {
860
859
  if (initialCommittedStateBytes > maxCommittedStateBytes) {
861
860
  throw new Error("maxCommittedStateBytes cannot retain the configured bot user.");
862
861
  }
862
+ const recorderPath = params.recorderPath ?? path.resolve(".crabline", "servers", "mattermost.jsonl");
863
863
  const state = {
864
864
  adminToken: params.adminToken ?? randomBytes(24).toString("base64url"),
865
865
  botToken: params.botToken ??
@@ -876,11 +876,11 @@ export async function startMattermostServer(params = {}) {
876
876
  maxPendingInboundEvents: resolveMaxPendingInboundEvents(params.maxPendingInboundEvents),
877
877
  maxWebSocketBufferedBytes: resolvePositiveLimit(params.maxWebSocketBufferedBytes, "maxWebSocketBufferedBytes", DEFAULT_MAX_WEBSOCKET_BUFFERED_BYTES),
878
878
  nextPost: 1,
879
- onEvent: params.onEvent,
879
+ recorder: createServerRecorder({ recorderPath, onEvent: params.onEvent }),
880
880
  pendingEventBytes: 0,
881
881
  pendingEvents: [],
882
882
  posts: new Map(),
883
- recorderPath: params.recorderPath ?? path.resolve(".crabline", "servers", "mattermost.jsonl"),
883
+ recorderPath,
884
884
  userIdsByUsername: new Map([[botUsername, botUserId]]),
885
885
  users: new Map([[botUserId, botUser]]),
886
886
  websocketClients: new Map(),
@@ -908,10 +908,7 @@ export async function startMattermostServer(params = {}) {
908
908
  state,
909
909
  });
910
910
  return {
911
- async close() {
912
- await closeMattermostWebSocketServer();
913
- await httpServer.close();
914
- },
911
+ close: createServerClose(state.recorder, closeMattermostWebSocketServer, () => httpServer.close()),
915
912
  manifest: {
916
913
  adminToken: state.adminToken,
917
914
  baseUrl: httpServer.baseUrl,