@openclaw/crabline 0.1.11 → 0.1.12

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 (197) hide show
  1. package/README.md +99 -12
  2. package/dist/src/bin/crabline.js +3 -1
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +5 -1
  5. package/dist/src/cli/program.js +264 -50
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +39 -3
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +20 -0
  10. package/dist/src/config/schema.js +163 -35
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.d.ts +1 -0
  13. package/dist/src/core/errors.js +6 -3
  14. package/dist/src/core/errors.js.map +1 -1
  15. package/dist/src/core/http-path.d.ts +1 -0
  16. package/dist/src/core/http-path.js +14 -0
  17. package/dist/src/core/http-path.js.map +1 -0
  18. package/dist/src/core/matcher.d.ts +3 -1
  19. package/dist/src/core/matcher.js +58 -2
  20. package/dist/src/core/matcher.js.map +1 -1
  21. package/dist/src/core/nonces.d.ts +2 -0
  22. package/dist/src/core/nonces.js +11 -1
  23. package/dist/src/core/nonces.js.map +1 -1
  24. package/dist/src/core/reporters.d.ts +5 -0
  25. package/dist/src/core/reporters.js +26 -2
  26. package/dist/src/core/reporters.js.map +1 -1
  27. package/dist/src/core/run.d.ts +3 -1
  28. package/dist/src/core/run.js +178 -66
  29. package/dist/src/core/run.js.map +1 -1
  30. package/dist/src/matrix-ids.d.ts +5 -0
  31. package/dist/src/matrix-ids.js +83 -0
  32. package/dist/src/matrix-ids.js.map +1 -0
  33. package/dist/src/openclaw/artifact-generation.d.ts +7 -2
  34. package/dist/src/openclaw/artifact-generation.js +399 -27
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  36. package/dist/src/openclaw/bridges/matrix.js +21 -4
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +13 -8
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
  41. package/dist/src/openclaw/bridges/probe-response.js +5 -0
  42. package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
  43. package/dist/src/openclaw/bridges/signal.js +15 -6
  44. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  45. package/dist/src/openclaw/bridges/slack.js +116 -23
  46. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  47. package/dist/src/openclaw/bridges/telegram.js +45 -19
  48. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  49. package/dist/src/openclaw/bridges/whatsapp.js +32 -16
  50. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  51. package/dist/src/openclaw/bridges/zalo.js +8 -3
  52. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  53. package/dist/src/openclaw/private-file.d.ts +38 -3
  54. package/dist/src/openclaw/private-file.js +2008 -87
  55. package/dist/src/openclaw/private-file.js.map +1 -1
  56. package/dist/src/openclaw/shared.d.ts +1 -0
  57. package/dist/src/openclaw/shared.js +48 -13
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +9 -0
  60. package/dist/src/openclaw/smoke-lock.js +626 -172
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -1
  62. package/dist/src/openclaw.js +225 -42
  63. package/dist/src/openclaw.js.map +1 -1
  64. package/dist/src/platform/process-owned-lock.d.ts +11 -0
  65. package/dist/src/platform/process-owned-lock.js +1698 -0
  66. package/dist/src/platform/process-owned-lock.js.map +1 -0
  67. package/dist/src/platform/recorder-directory.d.ts +1 -0
  68. package/dist/src/platform/recorder-directory.js +14 -0
  69. package/dist/src/platform/recorder-directory.js.map +1 -0
  70. package/dist/src/platform/windows-acl.d.ts +18 -0
  71. package/dist/src/platform/windows-acl.js +1367 -0
  72. package/dist/src/platform/windows-acl.js.map +1 -0
  73. package/dist/src/platform/windows-lock-root.d.ts +13 -0
  74. package/dist/src/platform/windows-lock-root.js +98 -0
  75. package/dist/src/platform/windows-lock-root.js.map +1 -0
  76. package/dist/src/providers/builtin/discord.d.ts +4 -0
  77. package/dist/src/providers/builtin/discord.js +52 -9
  78. package/dist/src/providers/builtin/discord.js.map +1 -1
  79. package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
  80. package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
  81. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
  82. package/dist/src/providers/builtin/feishu.d.ts +1 -0
  83. package/dist/src/providers/builtin/feishu.js +96 -26
  84. package/dist/src/providers/builtin/feishu.js.map +1 -1
  85. package/dist/src/providers/builtin/googlechat.d.ts +1 -0
  86. package/dist/src/providers/builtin/googlechat.js +95 -26
  87. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  88. package/dist/src/providers/builtin/imessage.js +60 -17
  89. package/dist/src/providers/builtin/imessage.js.map +1 -1
  90. package/dist/src/providers/builtin/loopback.js +88 -35
  91. package/dist/src/providers/builtin/loopback.js.map +1 -1
  92. package/dist/src/providers/builtin/matrix.d.ts +2 -2
  93. package/dist/src/providers/builtin/matrix.js +78 -21
  94. package/dist/src/providers/builtin/matrix.js.map +1 -1
  95. package/dist/src/providers/builtin/mattermost.d.ts +11 -7
  96. package/dist/src/providers/builtin/mattermost.js +138 -24
  97. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  98. package/dist/src/providers/builtin/msteams.d.ts +1 -0
  99. package/dist/src/providers/builtin/msteams.js +118 -38
  100. package/dist/src/providers/builtin/msteams.js.map +1 -1
  101. package/dist/src/providers/builtin/native-local-mock.js +4 -4
  102. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  103. package/dist/src/providers/builtin/script.js +1057 -146
  104. package/dist/src/providers/builtin/script.js.map +1 -1
  105. package/dist/src/providers/builtin/slack.d.ts +8 -1
  106. package/dist/src/providers/builtin/slack.js +327 -24
  107. package/dist/src/providers/builtin/slack.js.map +1 -1
  108. package/dist/src/providers/builtin/telegram.d.ts +1 -1
  109. package/dist/src/providers/builtin/telegram.js +55 -14
  110. package/dist/src/providers/builtin/telegram.js.map +1 -1
  111. package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
  112. package/dist/src/providers/builtin/whatsapp.js +157 -29
  113. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  114. package/dist/src/providers/builtin/zalo.d.ts +5 -2
  115. package/dist/src/providers/builtin/zalo.js +31 -7
  116. package/dist/src/providers/builtin/zalo.js.map +1 -1
  117. package/dist/src/providers/catalog.d.ts +1 -1
  118. package/dist/src/providers/catalog.js +1 -1
  119. package/dist/src/providers/catalog.js.map +1 -1
  120. package/dist/src/providers/local-mock.d.ts +4 -0
  121. package/dist/src/providers/local-mock.js +162 -35
  122. package/dist/src/providers/local-mock.js.map +1 -1
  123. package/dist/src/providers/native-ids.d.ts +2 -0
  124. package/dist/src/providers/native-ids.js +3 -0
  125. package/dist/src/providers/native-ids.js.map +1 -1
  126. package/dist/src/providers/recorder.d.ts +14 -3
  127. package/dist/src/providers/recorder.js +521 -41
  128. package/dist/src/providers/recorder.js.map +1 -1
  129. package/dist/src/providers/registry.d.ts +1 -0
  130. package/dist/src/providers/registry.js +65 -20
  131. package/dist/src/providers/registry.js.map +1 -1
  132. package/dist/src/providers/signed-jwt.d.ts +6 -1
  133. package/dist/src/providers/signed-jwt.js +241 -50
  134. package/dist/src/providers/signed-jwt.js.map +1 -1
  135. package/dist/src/providers/slack-ids.d.ts +1 -0
  136. package/dist/src/providers/slack-ids.js +5 -0
  137. package/dist/src/providers/slack-ids.js.map +1 -1
  138. package/dist/src/providers/target-normalizers.d.ts +9 -1
  139. package/dist/src/providers/target-normalizers.js +177 -58
  140. package/dist/src/providers/target-normalizers.js.map +1 -1
  141. package/dist/src/providers/webhook-server.d.ts +3 -0
  142. package/dist/src/providers/webhook-server.js +268 -47
  143. package/dist/src/providers/webhook-server.js.map +1 -1
  144. package/dist/src/servers/http.d.ts +14 -2
  145. package/dist/src/servers/http.js +229 -58
  146. package/dist/src/servers/http.js.map +1 -1
  147. package/dist/src/servers/matrix.d.ts +3 -0
  148. package/dist/src/servers/matrix.js +268 -110
  149. package/dist/src/servers/matrix.js.map +1 -1
  150. package/dist/src/servers/mattermost.d.ts +5 -0
  151. package/dist/src/servers/mattermost.js +389 -91
  152. package/dist/src/servers/mattermost.js.map +1 -1
  153. package/dist/src/servers/recorder.d.ts +11 -0
  154. package/dist/src/servers/recorder.js +1072 -69
  155. package/dist/src/servers/recorder.js.map +1 -1
  156. package/dist/src/servers/signal.d.ts +1 -0
  157. package/dist/src/servers/signal.js +279 -44
  158. package/dist/src/servers/signal.js.map +1 -1
  159. package/dist/src/servers/slack.d.ts +15 -0
  160. package/dist/src/servers/slack.js +259 -51
  161. package/dist/src/servers/slack.js.map +1 -1
  162. package/dist/src/servers/telegram-identity.d.ts +6 -0
  163. package/dist/src/servers/telegram-identity.js +27 -0
  164. package/dist/src/servers/telegram-identity.js.map +1 -0
  165. package/dist/src/servers/telegram.d.ts +17 -6
  166. package/dist/src/servers/telegram.js +1169 -107
  167. package/dist/src/servers/telegram.js.map +1 -1
  168. package/dist/src/servers/webhook-target.d.ts +12 -4
  169. package/dist/src/servers/webhook-target.js +226 -28
  170. package/dist/src/servers/webhook-target.js.map +1 -1
  171. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
  172. package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
  173. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  174. package/dist/src/servers/whatsapp-jid.d.ts +1 -0
  175. package/dist/src/servers/whatsapp-jid.js +9 -5
  176. package/dist/src/servers/whatsapp-jid.js.map +1 -1
  177. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
  178. package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
  179. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
  181. package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
  182. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  183. package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
  184. package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
  185. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  186. package/dist/src/servers/whatsapp-wire/signal.js +3 -3
  187. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  188. package/dist/src/servers/whatsapp.d.ts +7 -0
  189. package/dist/src/servers/whatsapp.js +149 -24
  190. package/dist/src/servers/whatsapp.js.map +1 -1
  191. package/dist/src/servers/zalo.d.ts +1 -0
  192. package/dist/src/servers/zalo.js +193 -82
  193. package/dist/src/servers/zalo.js.map +1 -1
  194. package/docs/channel-setup.md +185 -43
  195. package/fixtures/examples/crabline.example.yaml +3 -2
  196. package/package.json +18 -10
  197. package/fixtures/examples/openclaw-bridge.yaml +0 -125
@@ -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 { isIP } from \"node:net\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\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 filterBytes: number;\n filters: Map<string, { body: Record<string, unknown>; bytes: number }>;\n nextEvent: number;\n nextFilter: number;\n nextSequence: number;\n onEvent: ServerEventObserver | undefined;\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_IDENTIFIER_BYTES = 255;\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;\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 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 matrixId(prefix: \"$\" | \"!\", value: string, serverName: string): string {\n return `${prefix}${createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16)}:${serverName}`;\n}\n\nfunction isMatrixIpv4Address(value: string): boolean {\n const octets = value.split(\".\");\n return (\n octets.length === 4 && octets.every((octet) => /^\\d{1,3}$/u.test(octet) && Number(octet) <= 255)\n );\n}\n\nfunction isMatrixServerName(value: string): boolean {\n const ipv6 = /^\\[([^\\]]+)\\](?::(\\d{1,5}))?$/u.exec(value);\n if (ipv6) {\n return isIP(ipv6[1]!) === 6;\n }\n const hostAndPort = /^([^:]+?)(?::(\\d{1,5}))?$/u.exec(value);\n if (!hostAndPort) {\n return false;\n }\n const hostname = hostAndPort[1]!;\n if (isMatrixIpv4Address(hostname)) {\n return true;\n }\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/u.test(hostname)) {\n return false;\n }\n return hostname.length <= 255 && /^[A-Za-z0-9.-]+$/u.test(hostname);\n}\n\nfunction hasLoneSurrogate(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n return true;\n }\n index += 1;\n } else if (code >= 0xdc00 && code <= 0xdfff) {\n return true;\n }\n }\n return false;\n}\n\nfunction isMatrixScopedIdentifier(value: string, sigil: \"!\" | \"$\" | \"@\"): boolean {\n const separator = value.indexOf(\":\");\n const localpart = value.slice(1, separator);\n return (\n value.startsWith(sigil) &&\n Buffer.byteLength(value, \"utf8\") <= MAX_MATRIX_IDENTIFIER_BYTES &&\n separator >= (sigil === \"@\" ? 1 : 2) &&\n !localpart.includes(\"\\0\") &&\n !hasLoneSurrogate(localpart) &&\n isMatrixServerName(value.slice(separator + 1))\n );\n}\n\nfunction isMatrixHashIdentifier(\n value: string,\n sigil: \"!\" | \"$\",\n allowLegacyBase64: boolean,\n): boolean {\n if (!value.startsWith(sigil) || Buffer.byteLength(value, \"utf8\") > MAX_MATRIX_IDENTIFIER_BYTES) {\n return false;\n }\n const opaqueId = value.slice(1);\n const encoding =\n allowLegacyBase64 && /^[A-Za-z0-9+/]{43}$/u.test(opaqueId)\n ? \"base64\"\n : /^[A-Za-z0-9_-]{43}$/u.test(opaqueId)\n ? \"base64url\"\n : undefined;\n if (!encoding) {\n return false;\n }\n const decoded = Buffer.from(opaqueId, encoding);\n return decoded.length === 32 && decoded.toString(encoding).replace(/=+$/u, \"\") === opaqueId;\n}\n\nfunction isMatrixRoomId(value: string): boolean {\n return isMatrixScopedIdentifier(value, \"!\") || isMatrixHashIdentifier(value, \"!\", false);\n}\n\nfunction isMatrixEventId(value: string): boolean {\n return isMatrixScopedIdentifier(value, \"$\") || isMatrixHashIdentifier(value, \"$\", true);\n}\n\nfunction isMatrixUserId(value: string): boolean {\n return isMatrixScopedIdentifier(value, \"@\");\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 return match?.[1] === token;\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 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 matrixId(\"$\", `event-${state.nextEvent++}`, state.serverName);\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 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(filter: Record<string, unknown> | undefined): number | undefined {\n const room = filter?.room;\n const timeline = isJsonObject(room) ? room.timeline : undefined;\n const limit = isJsonObject(timeline) ? readInteger(timeline.limit) : undefined;\n return limit === undefined ? undefined : Math.max(0, limit);\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 syncRoom(room: MatrixRoom, since: number | undefined, timelineLimit: number | undefined) {\n const available = room.timeline.filter((entry) => since === undefined || entry.sequence > since);\n const timeline =\n timelineLimit === undefined\n ? available\n : available.slice(Math.max(0, available.length - timelineLimit));\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 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 const timeout = Math.min(readInteger(url.searchParams.get(\"timeout\")) ?? 0, 1_000);\n const hasNewEvents = [...state.rooms.values()].some((room) =>\n [...room.timeline, ...room.ephemeral].some(\n (entry) => since === undefined || entry.sequence > since,\n ),\n );\n if (since !== undefined && !hasNewEvents && timeout > 0) {\n await waitForSyncEvent(state, timeout);\n }\n const join = Object.fromEntries(\n [...state.rooms.values()].map((room) => [room.id, syncRoom(room, since, timelineLimit)]),\n );\n return jsonResponse({\n account_data: { events: [] },\n device_lists: { changed: [], left: [] },\n device_one_time_keys_count: {},\n next_batch: `s${state.nextSequence - 1}`,\n presence: { events: [] },\n rooms: { invite: {}, join, knock: {}, leave: {} },\n to_device: { events: [] },\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 = readTrimmedString(params.body.text);\n if (!roomId || !sender || !text) {\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 !isMatrixUserId(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 room =\n params.state.rooms.get(roomId) ??\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 const senderName = readTrimmedString(params.body.senderName);\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 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 member = [...params.state.rooms.values()]\n .map((room) => room.users.get(userId))\n .find((profile) => profile !== undefined);\n return member\n ? jsonResponse({\n ...(member.avatar_url ? { avatar_url: member.avatar_url } : {}),\n ...(member.display_name ? { displayname: member.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 state: MatrixServerState = {\n accessToken: params.accessToken ?? `syt_crabline_${randomBytes(12).toString(\"hex\")}`,\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n botUserId: params.botUserId ?? `@openclaw:${serverName}`,\n deviceId: params.deviceId ?? \"CRABLINE\",\n filterBytes: 0,\n filters: new Map(),\n nextEvent: 1,\n nextFilter: 1,\n nextSequence: 1,\n onEvent: params.onEvent,\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 ?? matrixId(\"!\", \"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 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 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 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"]}
@@ -30,6 +30,11 @@ export type StartMattermostServerParams = {
30
30
  onEvent?: ServerEventObserver | undefined;
31
31
  port?: number | undefined;
32
32
  recorderPath?: string | undefined;
33
+ maxCommittedChannels?: number | undefined;
34
+ maxCommittedPosts?: number | undefined;
35
+ maxCommittedStateBytes?: number | undefined;
36
+ maxCommittedUsers?: number | undefined;
37
+ maxPendingInboundBytes?: number | undefined;
33
38
  maxPendingInboundEvents?: number | undefined;
34
39
  maxWebSocketBufferedBytes?: number | undefined;
35
40
  maxWebSocketMessageBytes?: number | undefined;