@undefineds.co/xpod 0.3.48 → 0.3.50

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 (128) hide show
  1. package/bin/xpod.js +0 -0
  2. package/dist/api/auth/MultiAuthenticator.js +2 -2
  3. package/dist/api/auth/MultiAuthenticator.js.map +1 -1
  4. package/dist/api/chatkit/pod-store.d.ts +16 -17
  5. package/dist/api/chatkit/pod-store.js +299 -231
  6. package/dist/api/chatkit/pod-store.js.map +1 -1
  7. package/dist/api/chatkit/schema.d.ts +1 -1
  8. package/dist/api/chatkit/service.js +13 -11
  9. package/dist/api/chatkit/service.js.map +1 -1
  10. package/dist/api/chatkit/store.d.ts +1 -0
  11. package/dist/api/chatkit/store.js +23 -11
  12. package/dist/api/chatkit/store.js.map +1 -1
  13. package/dist/api/chatkit/types.d.ts +17 -10
  14. package/dist/api/chatkit/types.js +97 -14
  15. package/dist/api/chatkit/types.js.map +1 -1
  16. package/dist/api/container/common.js +16 -2
  17. package/dist/api/container/common.js.map +1 -1
  18. package/dist/api/container/routes.js +3 -0
  19. package/dist/api/container/routes.js.map +1 -1
  20. package/dist/api/container/types.d.ts +3 -0
  21. package/dist/api/container/types.js.map +1 -1
  22. package/dist/api/handlers/ChatKitV1Handler.js +1 -2
  23. package/dist/api/handlers/ChatKitV1Handler.js.map +1 -1
  24. package/dist/api/handlers/CoordinationHandler.d.ts +6 -0
  25. package/dist/api/handlers/CoordinationHandler.js +115 -0
  26. package/dist/api/handlers/CoordinationHandler.js.map +1 -0
  27. package/dist/api/handlers/MatrixHandler.d.ts +11 -0
  28. package/dist/api/handlers/MatrixHandler.js +144 -2
  29. package/dist/api/handlers/MatrixHandler.js.map +1 -1
  30. package/dist/api/handlers/RunHandler.js +33 -15
  31. package/dist/api/handlers/RunHandler.js.map +1 -1
  32. package/dist/api/handlers/index.d.ts +1 -0
  33. package/dist/api/handlers/index.js +1 -0
  34. package/dist/api/handlers/index.js.map +1 -1
  35. package/dist/api/index.d.ts +1 -0
  36. package/dist/api/index.js +1 -0
  37. package/dist/api/index.js.map +1 -1
  38. package/dist/api/matrix/PodMatrixStore.d.ts +25 -1
  39. package/dist/api/matrix/PodMatrixStore.js +253 -41
  40. package/dist/api/matrix/PodMatrixStore.js.map +1 -1
  41. package/dist/api/matrix/index.d.ts +1 -1
  42. package/dist/api/matrix/index.js.map +1 -1
  43. package/dist/api/matrix/types.d.ts +25 -2
  44. package/dist/api/matrix/types.js.map +1 -1
  45. package/dist/api/middleware/AuthMiddleware.d.ts +1 -0
  46. package/dist/api/middleware/AuthMiddleware.js +13 -1
  47. package/dist/api/middleware/AuthMiddleware.js.map +1 -1
  48. package/dist/api/protocol-metadata.d.ts +4 -0
  49. package/dist/api/protocol-metadata.js +64 -0
  50. package/dist/api/protocol-metadata.js.map +1 -0
  51. package/dist/api/reconciler/ClientReconcilerCoordinator.d.ts +42 -0
  52. package/dist/api/reconciler/ClientReconcilerCoordinator.js +250 -0
  53. package/dist/api/reconciler/ClientReconcilerCoordinator.js.map +1 -0
  54. package/dist/api/reconciler/ClientReconcilerCoordinator.jsonld +186 -0
  55. package/dist/api/reconciler/ServerGroupReconcilerService.d.ts +39 -0
  56. package/dist/api/reconciler/ServerGroupReconcilerService.js +91 -0
  57. package/dist/api/reconciler/ServerGroupReconcilerService.js.map +1 -0
  58. package/dist/api/reconciler/ServerGroupReconcilerService.jsonld +146 -0
  59. package/dist/api/reconciler/WakeAgentQueue.d.ts +23 -0
  60. package/dist/api/reconciler/WakeAgentQueue.js +123 -0
  61. package/dist/api/reconciler/WakeAgentQueue.js.map +1 -0
  62. package/dist/api/reconciler/WakeAgentQueue.jsonld +91 -0
  63. package/dist/api/reconciler/coordination.d.ts +61 -0
  64. package/dist/api/reconciler/coordination.js +109 -0
  65. package/dist/api/reconciler/coordination.js.map +1 -0
  66. package/dist/api/reconciler/coordination.jsonld +186 -0
  67. package/dist/api/reconciler/index.d.ts +4 -0
  68. package/dist/api/reconciler/index.js +21 -0
  69. package/dist/api/reconciler/index.js.map +1 -0
  70. package/dist/api/runs/ManagedRunWorker.js +0 -5
  71. package/dist/api/runs/ManagedRunWorker.js.map +1 -1
  72. package/dist/api/runs/RunStateCenter.d.ts +1 -1
  73. package/dist/api/runs/RunStateCenter.js +12 -28
  74. package/dist/api/runs/RunStateCenter.js.map +1 -1
  75. package/dist/api/runs/store.d.ts +12 -15
  76. package/dist/api/runs/store.js +24 -15
  77. package/dist/api/runs/store.js.map +1 -1
  78. package/dist/api/tasks/TaskMaterializer.d.ts +1 -0
  79. package/dist/api/tasks/TaskMaterializer.js +10 -13
  80. package/dist/api/tasks/TaskMaterializer.js.map +1 -1
  81. package/dist/api/tasks/TaskService.d.ts +0 -2
  82. package/dist/api/tasks/TaskService.js +6 -16
  83. package/dist/api/tasks/TaskService.js.map +1 -1
  84. package/dist/api/tasks/store.d.ts +0 -2
  85. package/dist/api/tasks/store.js.map +1 -1
  86. package/dist/cli/commands/auth.d.ts +1 -1
  87. package/dist/cli/commands/auth.js +4 -5
  88. package/dist/cli/commands/auth.js.map +1 -1
  89. package/dist/cli/commands/backup.js +1 -1
  90. package/dist/cli/commands/backup.js.map +1 -1
  91. package/dist/cli/commands/login.js +1 -1
  92. package/dist/cli/commands/login.js.map +1 -1
  93. package/dist/cli/commands/pod.js +1 -1
  94. package/dist/cli/commands/pod.js.map +1 -1
  95. package/dist/cli/lib/auth-context.js +10 -7
  96. package/dist/cli/lib/auth-context.js.map +1 -1
  97. package/dist/cli/lib/auth-helper.d.ts +10 -6
  98. package/dist/cli/lib/auth-helper.js +10 -6
  99. package/dist/cli/lib/auth-helper.js.map +1 -1
  100. package/dist/cli/lib/credentials-store.d.ts +22 -4
  101. package/dist/cli/lib/credentials-store.js +68 -51
  102. package/dist/cli/lib/credentials-store.js.map +1 -1
  103. package/dist/cli/lib/oidc-auth.d.ts +4 -0
  104. package/dist/cli/lib/oidc-auth.js +90 -0
  105. package/dist/cli/lib/oidc-auth.js.map +1 -0
  106. package/dist/cli/lib/oidc-session-storage.d.ts +3 -0
  107. package/dist/cli/lib/oidc-session-storage.js +41 -0
  108. package/dist/cli/lib/oidc-session-storage.js.map +1 -0
  109. package/dist/components/components.jsonld +5 -1
  110. package/dist/components/context.jsonld +103 -0
  111. package/dist/index.d.ts +1 -0
  112. package/dist/index.js +15 -0
  113. package/dist/index.js.map +1 -1
  114. package/dist/provision/LocalPodProvisioningService.d.ts +1 -0
  115. package/dist/provision/LocalPodProvisioningService.js +9 -0
  116. package/dist/provision/LocalPodProvisioningService.js.map +1 -1
  117. package/dist/provision/LocalPodProvisioningService.jsonld +4 -0
  118. package/dist/runtime/Proxy.d.ts +1 -0
  119. package/dist/runtime/Proxy.js +8 -1
  120. package/dist/runtime/Proxy.js.map +1 -1
  121. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
  122. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +19 -9
  123. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
  124. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
  125. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +19 -9
  126. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
  127. package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
  128. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"PodMatrixStore.js","sourceRoot":"","sources":["../../../src/api/matrix/PodMatrixStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from 'node:crypto';\nimport { and, desc, drizzle, eq, gt, lte } from '@undefineds.co/drizzle-solid';\nimport {\n chatResource,\n messageResource,\n MessageRole,\n MessageStatus,\n threadResource,\n} from '@undefineds.co/models';\nimport { getWebId, isSolidAuth, type AuthContext } from '../auth/AuthContext';\nimport type {\n MatrixClientEvent,\n MatrixCreateRoomRequest,\n MatrixEventRecord,\n MatrixRoomRecord,\n MatrixSendEventRequest,\n MatrixStoreContext,\n MatrixSyncResponse,\n} from './types';\n\nconst schema = {\n chat: chatResource,\n thread: threadResource,\n message: messageResource,\n};\n\nexport interface PodMatrixStoreOptions {\n serverName?: string;\n}\n\ntype Db = any;\ntype JsonObjectSource = string | Record<string, unknown> | null | undefined;\n\ninterface MatrixRoomSource {\n id: string;\n title?: string | null;\n description?: string | null;\n author?: string | null;\n createdAt?: string | Date | null;\n metadata?: JsonObjectSource;\n}\n\ninterface MatrixEventSource {\n id: string;\n maker?: string | null;\n content?: JsonObjectSource;\n createdAt?: string | Date | null;\n metadata?: JsonObjectSource;\n}\n\nexport class PodMatrixStore {\n private readonly serverName?: string;\n\n public constructor(options: PodMatrixStoreOptions) {\n this.serverName = options.serverName;\n }\n\n public async createRoom(input: MatrixCreateRoomRequest, context: MatrixStoreContext): Promise<MatrixRoomRecord> {\n const db = await this.getDb(context);\n const sender = this.getMatrixUserId(context);\n const now = Date.now();\n const roomId = this.generateRoomId(context);\n const chatId = this.chatResourceIdFromRoomId(roomId);\n const threadId = this.threadResourceIdFromRoomId(roomId);\n\n await db.insert(chatResource).values({\n id: chatId,\n title: input.name ?? roomId,\n description: input.topic ?? null,\n author: context.userId,\n status: 'active',\n participants: [context.userId],\n metadata: {\n protocol: 'matrix',\n roomId,\n canonicalAlias: input.room_alias_name ? `#${input.room_alias_name}:${this.getServerName(context)}` : null,\n visibility: input.visibility === 'public' ? 'public' : 'private',\n roomVersion: String(input.creation_content?.room_version ?? '11'),\n federate: input.creation_content?.['m.federate'] === true,\n members: [context.userId],\n preset: input.preset,\n is_direct: input.is_direct,\n invite: input.invite ?? [],\n },\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n await db.insert(threadResource).values({\n id: threadId,\n chat: chatId,\n title: input.name ?? roomId,\n status: 'active',\n metadata: {\n protocol: 'matrix',\n roomId,\n commandKind: 'chat',\n surface_id: this.surfaceIdFromRoomId(roomId),\n chat_id: this.surfaceIdFromRoomId(roomId),\n },\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n\n await this.appendEvent(db, {\n roomId,\n type: 'm.room.create',\n sender,\n originServerTs: now,\n stateKey: '',\n content: {\n creator: sender,\n room_version: String(input.creation_content?.room_version ?? '11'),\n type: input.creation_content?.type,\n 'm.federate': input.creation_content?.['m.federate'] === true,\n },\n }, context);\n await this.appendEvent(db, {\n roomId,\n type: 'm.room.member',\n sender,\n originServerTs: now + 1,\n stateKey: sender,\n content: {\n membership: 'join',\n displayname: this.displayNameFromUserId(sender),\n },\n }, context);\n if (input.name) {\n await this.appendEvent(db, {\n roomId,\n type: 'm.room.name',\n sender,\n originServerTs: now + 2,\n stateKey: '',\n content: { name: input.name },\n }, context);\n }\n if (input.topic) {\n await this.appendEvent(db, {\n roomId,\n type: 'm.room.topic',\n sender,\n originServerTs: now + 3,\n stateKey: '',\n content: { topic: input.topic },\n }, context);\n }\n for (const state of input.initial_state ?? []) {\n await this.appendEvent(db, {\n roomId,\n type: state.type,\n sender,\n originServerTs: Date.now(),\n stateKey: state.state_key ?? '',\n content: state.content ?? {},\n }, context);\n }\n\n return {\n roomId,\n name: input.name,\n topic: input.topic,\n creator: sender,\n createdAt: now,\n };\n }\n\n public async sendEvent(\n roomId: string,\n eventType: string,\n txnId: string,\n content: MatrixSendEventRequest,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n\n const existing = await this.findEventByTxnId(db, roomId, txnId, context);\n if (existing) {\n return existing;\n }\n\n const sender = this.getMatrixUserId(context);\n const event = await this.appendEvent(db, {\n roomId,\n type: eventType,\n sender,\n txnId,\n originServerTs: Date.now(),\n content,\n }, context);\n\n return event;\n }\n\n public async sync(context: MatrixStoreContext, options: { since?: string; limit?: number } = {}): Promise<MatrixSyncResponse> {\n const db = await this.getDb(context);\n const rooms = await this.listRooms(db);\n const sinceTs = this.parseSyncToken(options.since);\n const limit = options.limit && options.limit > 0 ? options.limit : 50;\n const join: MatrixSyncResponse['rooms']['join'] = {};\n\n for (const room of rooms) {\n const events = await this.listEvents(db, room.roomId, context, {\n sinceTs,\n limit,\n });\n join[room.roomId] = {\n state: {\n events: events.filter((event) => event.stateKey !== undefined).map((event) => this.toClientEvent(event)),\n },\n timeline: {\n events: events.map((event) => this.toClientEvent(event)),\n limited: false,\n },\n };\n }\n\n return {\n next_batch: this.encodeSyncToken(Date.now()),\n rooms: { join },\n };\n }\n\n public async listMessages(\n roomId: string,\n context: MatrixStoreContext,\n options: { limit?: number; dir?: 'b' | 'f'; from?: string } = {},\n ): Promise<{ chunk: MatrixClientEvent[]; start?: string; end: string }> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n const limit = options.limit && options.limit > 0 ? options.limit : 50;\n const fromTs = this.parseSyncToken(options.from);\n const forward = options.dir === 'f';\n const events = await this.listEvents(db, roomId, context, {\n sinceTs: forward && fromTs > 0 ? fromTs : undefined,\n beforeOrAtTs: !forward && fromTs > 0 ? fromTs : undefined,\n limit,\n newestFirst: !forward,\n });\n const chunk = events.slice(0, limit).map((event) => this.toClientEvent(event));\n return {\n chunk,\n start: options.from,\n end: this.encodeSyncToken(chunk.length ? chunk[chunk.length - 1].origin_server_ts : Date.now()),\n };\n }\n\n public async getEvent(roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixClientEvent> {\n const db = await this.getDb(context);\n const event = await this.findEventById(db, roomId, eventId, context);\n if (!event) {\n throw new Error(`Matrix event not found: ${eventId}`);\n }\n return this.toClientEvent(event);\n }\n\n public async getState(\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<Record<string, unknown>> {\n const db = await this.getDb(context);\n const event = await this.findLatestStateEvent(db, roomId, eventType, stateKey, context);\n if (!event) {\n throw new Error(`Matrix state not found: ${eventType}/${stateKey}`);\n }\n return event.content;\n }\n\n private async getDb(context: MatrixStoreContext): Promise<Db> {\n if ((context as any)._matrixDb) {\n return (context as any)._matrixDb;\n }\n\n const auth = context.auth as AuthContext | undefined;\n if (!auth || !isSolidAuth(auth) || !auth.accessToken || !auth.webId) {\n throw new Error('Matrix API requires Solid access-token authentication');\n }\n\n const db: Db = drizzle(\n {\n fetch: this.createAccessTokenFetch(auth.accessToken, auth.tokenType),\n info: { webId: auth.webId, isLoggedIn: true },\n } as any,\n { schema },\n );\n await db.init(\n chatResource,\n threadResource,\n messageResource,\n );\n (context as any)._matrixDb = db;\n return db;\n }\n\n private createAccessTokenFetch(accessToken: string, tokenType?: 'Bearer' | 'DPoP'): typeof fetch {\n const scheme = tokenType ?? 'Bearer';\n return async (input, init) => {\n const headers = new Headers(init?.headers);\n if (!headers.has('Authorization')) {\n headers.set('Authorization', `${scheme} ${accessToken}`);\n }\n return fetch(input, { ...init, headers });\n };\n }\n\n private async ensureRoomExists(db: Db, roomId: string): Promise<void> {\n const room = await db.findById(chatResource, this.chatResourceIdFromRoomId(roomId));\n if (!room) {\n throw new Error(`Matrix room not found: ${roomId}`);\n }\n }\n\n private async appendEvent(\n db: Db,\n input: {\n roomId: string;\n type: string;\n sender: string;\n originServerTs: number;\n content: Record<string, unknown>;\n stateKey?: string;\n txnId?: string;\n },\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const eventId = this.generateEventId(context);\n const depth = await this.nextEventDepth(db, input.roomId, context);\n const originIso = new Date(input.originServerTs).toISOString();\n const record = {\n eventId,\n roomId: input.roomId,\n type: input.type,\n sender: input.sender,\n senderWebId: context.userId,\n originServerTs: input.originServerTs,\n depth,\n txnId: input.txnId ?? undefined,\n stateKey: input.stateKey ?? undefined,\n content: input.content,\n createdAt: originIso,\n };\n await db.insert(messageResource).values({\n id: this.messageResourceIdFromEvent(input.roomId, eventId, input.originServerTs),\n chat: this.chatResourceIdFromRoomId(input.roomId),\n thread: this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(input.roomId), context),\n maker: context.userId,\n role: input.type === 'm.room.message' ? MessageRole.USER : MessageRole.SYSTEM,\n content: this.messageContentFromMatrixEvent(input.type, input.content),\n status: MessageStatus.SENT,\n metadata: {\n protocol: 'matrix',\n eventId,\n roomId: input.roomId,\n eventType: input.type,\n sender: input.sender,\n senderWebId: context.userId,\n originServerTs: input.originServerTs,\n depth,\n txnId: input.txnId ?? null,\n stateKey: input.stateKey ?? null,\n content: input.content,\n commandKind: 'chat',\n surface_id: this.surfaceIdFromRoomId(input.roomId),\n chat_id: this.surfaceIdFromRoomId(input.roomId),\n },\n createdAt: originIso,\n updatedAt: originIso,\n });\n return record;\n }\n\n private async listRooms(db: Db): Promise<MatrixRoomRecord[]> {\n const rooms = await db.select().from(chatResource) as MatrixRoomSource[];\n return rooms\n .map((room) => this.chatSourceToRoomRecord(room))\n .filter((room): room is MatrixRoomRecord => room !== undefined);\n }\n\n private async listEvents(\n db: Db,\n roomId: string,\n context: MatrixStoreContext,\n options: {\n sinceTs?: number;\n beforeOrAtTs?: number;\n limit?: number;\n newestFirst?: boolean;\n } = {},\n ): Promise<MatrixEventRecord[]> {\n const conditions = [\n eq(messageResource.thread, this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(roomId), context)),\n options.sinceTs !== undefined ? gt(messageResource.createdAt, new Date(options.sinceTs).toISOString()) : undefined,\n options.beforeOrAtTs !== undefined ? lte(messageResource.createdAt, new Date(options.beforeOrAtTs).toISOString()) : undefined,\n ];\n let query = db.select().from(messageResource).where(and(...conditions));\n query = options.newestFirst\n ? query.orderBy(desc(messageResource.createdAt as any))\n : query.orderBy(messageResource.createdAt as any);\n if (options.limit && options.limit > 0) {\n query = query.limit(options.limit);\n }\n const events = await query as MatrixEventSource[];\n return events.map((event) => this.eventSourceToRecord(event));\n }\n\n private async findEventByTxnId(db: Db, roomId: string, txnId: string, context: MatrixStoreContext): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context);\n return records.find((record) => record.txnId === txnId);\n }\n\n private async findEventById(db: Db, roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context);\n return records.find((record) => record.eventId === eventId);\n }\n\n private async nextEventDepth(db: Db, roomId: string, context: MatrixStoreContext): Promise<number> {\n const records = await this.listEvents(db, roomId, context);\n return records.reduce((max, record) => Math.max(max, record.depth ?? 0), 0) + 1;\n }\n\n private async findLatestStateEvent(\n db: Db,\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context, { newestFirst: true });\n return records.find((record) => record.type === eventType && (record.stateKey ?? '') === stateKey);\n }\n\n private eventSourceToRecord(source: MatrixEventSource): MatrixEventRecord {\n const metadata = this.parseJsonObject(source.metadata) ?? {};\n const content = this.parseJsonObject(metadata.content as JsonObjectSource)\n ?? this.parseJsonObject(source.content)\n ?? {};\n const unsigned = this.parseJsonObject(metadata.unsigned as JsonObjectSource);\n const stateKey = this.stringValue(metadata.stateKey);\n const txnId = this.stringValue(metadata.txnId);\n return {\n eventId: this.stringValue(metadata.eventId) ?? source.id,\n roomId: this.stringValue(metadata.roomId) ?? '',\n type: this.stringValue(metadata.eventType) ?? 'm.room.message',\n sender: this.stringValue(metadata.sender) ?? '',\n senderWebId: this.stringValue(metadata.senderWebId) ?? source.maker ?? undefined,\n originServerTs: this.numberValue(metadata.originServerTs) ?? this.isoToMillis(source.createdAt) ?? Date.now(),\n depth: this.numberValue(metadata.depth),\n txnId: txnId ?? undefined,\n content,\n stateKey: stateKey ?? undefined,\n unsigned,\n };\n }\n\n private chatSourceToRoomRecord(source: MatrixRoomSource): MatrixRoomRecord | undefined {\n const metadata = this.parseJsonObject(source.metadata) ?? {};\n if (metadata.protocol !== 'matrix') {\n return undefined;\n }\n const roomId = this.stringValue(metadata.roomId);\n if (!roomId) {\n return undefined;\n }\n return {\n roomId,\n name: source.title ?? undefined,\n topic: source.description ?? undefined,\n creator: source.author ?? '',\n createdAt: this.isoToMillis(source.createdAt) ?? 0,\n };\n }\n\n private toClientEvent(event: MatrixEventRecord): MatrixClientEvent {\n return {\n event_id: event.eventId,\n room_id: event.roomId,\n type: event.type,\n sender: event.sender,\n origin_server_ts: event.originServerTs,\n content: event.content,\n ...(event.stateKey !== undefined ? { state_key: event.stateKey } : {}),\n ...(event.unsigned ? { unsigned: event.unsigned } : {}),\n };\n }\n\n private parseJsonObject(value: JsonObjectSource): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n if (typeof value !== 'string') {\n return undefined;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n private stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n }\n\n private numberValue(value: unknown): number | undefined {\n if (typeof value !== 'number') {\n return undefined;\n }\n return Number.isFinite(value) ? value : undefined;\n }\n\n private messageContentFromMatrixEvent(eventType: string, content: Record<string, unknown>): string {\n if (eventType === 'm.room.message' && typeof content.body === 'string') {\n return content.body;\n }\n return JSON.stringify(content);\n }\n\n private getMatrixUserId(context: MatrixStoreContext): string {\n const serverName = this.getServerName(context);\n const localpart = this.localpartFromUserId(context.userId);\n return `@${localpart}:${serverName}`;\n }\n\n private getServerName(context: MatrixStoreContext): string {\n if (this.serverName) {\n return this.serverName;\n }\n try {\n return new URL(context.userId).host || 'localhost';\n } catch {\n return 'localhost';\n }\n }\n\n private localpartFromUserId(userId: string): string {\n try {\n const url = new URL(userId);\n const withoutHash = `${url.pathname}${url.hash}`.replace(/^\\/+/, '');\n return this.slug(withoutHash || url.host);\n } catch {\n return this.slug(userId);\n }\n }\n\n private displayNameFromUserId(matrixUserId: string): string {\n return matrixUserId.replace(/^@/, '').split(':')[0] || matrixUserId;\n }\n\n private generateRoomId(context: MatrixStoreContext): string {\n return `!${this.randomId(24)}:${this.getServerName(context)}`;\n }\n\n private generateEventId(context: MatrixStoreContext): string {\n return `$${this.randomId(24)}:${this.getServerName(context)}`;\n }\n\n private randomId(size: number): string {\n return randomBytes(size).toString('base64url');\n }\n\n private slug(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9._=-]+/g, '_').replace(/^_+|_+$/g, '') || 'user';\n }\n\n private surfaceIdFromRoomId(roomId: string): string {\n return `matrix-${createHash('sha256').update(roomId).digest('hex').slice(0, 16)}`;\n }\n\n private chatResourceIdFromRoomId(roomId: string): string {\n return `${this.surfaceIdFromRoomId(roomId)}/index.ttl#this`;\n }\n\n private threadResourceIdFromRoomId(roomId: string): string {\n return `chat/${this.surfaceIdFromRoomId(roomId)}/index.ttl#thread`;\n }\n\n private messageResourceIdFromEvent(roomId: string, eventId: string, ts: number): string {\n const { yyyy, MM, dd } = this.dateParts(ts);\n return `chat/${this.surfaceIdFromRoomId(roomId)}/${yyyy}/${MM}/${dd}/messages.ttl#${this.slug(eventId)}`;\n }\n\n private resolveDataResourceUriFromId(resourceId: string, context: MatrixStoreContext): string {\n const podBaseUrl = this.derivePodBaseUrl(getWebId(context.auth as AuthContext) ?? context.userId);\n if (!podBaseUrl) {\n return resourceId;\n }\n return `${podBaseUrl.replace(/\\/$/, '')}/.data/${resourceId}`;\n }\n\n private derivePodBaseUrl(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n try {\n const url = new URL(webId);\n url.hash = '';\n url.search = '';\n const normalizedPath = url.pathname.replace(/\\/+$/, '');\n if (!normalizedPath.endsWith('/profile/card')) {\n return url.origin;\n }\n url.pathname = normalizedPath.slice(0, -'/profile/card'.length) || '/';\n return url.toString().replace(/\\/$/, '');\n } catch {\n return undefined;\n }\n }\n\n private dateParts(value: number): { yyyy: string; MM: string; dd: string } {\n const date = new Date(value);\n return {\n yyyy: String(date.getUTCFullYear()),\n MM: String(date.getUTCMonth() + 1).padStart(2, '0'),\n dd: String(date.getUTCDate()).padStart(2, '0'),\n };\n }\n\n private isoToMillis(value: string | Date | null | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n const date = value instanceof Date ? value : new Date(value);\n const time = date.getTime();\n return Number.isFinite(time) ? time : undefined;\n }\n\n private encodeSyncToken(ts: number): string {\n return `s${Math.max(0, Math.floor(ts))}`;\n }\n\n private parseSyncToken(token: string | undefined): number {\n if (!token) {\n return 0;\n }\n const parsed = Number(token.replace(/^s/, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n}\n"]}
1
+ {"version":3,"file":"PodMatrixStore.js","sourceRoot":"","sources":["../../../src/api/matrix/PodMatrixStore.ts"],"names":[],"mappings":";;;AAAA,6CAAsD;AACtD,iEAAqD;AACrD,gEAAoF;AACpF,kDAM+B;AAC/B,8CAMuB;AACvB,4DAAiF;AACjF,qDAAoE;AAYpE,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,qBAAY;IAClB,MAAM,EAAE,uBAAc;IACtB,OAAO,EAAE,wBAAe;CACzB,CAAC;AAmCF,MAAa,cAAc;IAKzB,YAAmB,OAA8B;QAJhC,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAK3C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,4BAA4B,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAC3E,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,OAA2B;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC;YAChD,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC;SACtD,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,KAA8B,EAAE,OAA2B;QACjF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,eAAe,GAAG,QAAiB,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAA,2CAA8B,EAAC,eAAe,CAAC,CAAC;QAErE,MAAM,EAAE,CAAC,MAAM,CAAC,qBAAY,CAAC,CAAC,MAAM,CAAC;YACnC,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM;YAC3B,WAAW,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;YAChC,MAAM,EAAE,OAAO,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7B,QAAQ,EAAE,IAAA,wCAAoB,EAAC;gBAC7B,QAAQ,EAAE,QAAQ;gBAClB,GAAG,YAAY;aAChB,EAAE,QAAQ,EAAE;gBACX,MAAM;gBACN,cAAc,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;gBACzG,UAAU,EAAE,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;gBAChE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,IAAI,IAAI,CAAC;gBACjE,QAAQ,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,YAAY,CAAC,KAAK,IAAI;gBACzD,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;aAC3B,CAAC;YACF,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YACtC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,uBAAc,CAAC,CAAC,MAAM,CAAC;YACrC,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;YAC5C,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM;YAC3B,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAA,wCAAoB,EAAC;gBAC7B,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,MAAM;gBACnB,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;gBAC5C,GAAG,YAAY;aAChB,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC;YACxB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YACtC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;YACzB,MAAM;YACN,eAAe;YACf,IAAI,EAAE,eAAe;YACrB,MAAM;YACN,cAAc,EAAE,GAAG;YACnB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE;gBACP,OAAO,EAAE,MAAM;gBACf,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,IAAI,IAAI,CAAC;gBAClE,IAAI,EAAE,KAAK,CAAC,gBAAgB,EAAE,IAAI;gBAClC,YAAY,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,YAAY,CAAC,KAAK,IAAI;aAC9D;SACF,EAAE,OAAO,CAAC,CAAC;QACZ,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;YACzB,MAAM;YACN,eAAe;YACf,IAAI,EAAE,eAAe;YACrB,MAAM;YACN,cAAc,EAAE,GAAG,GAAG,CAAC;YACvB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE;gBACP,UAAU,EAAE,MAAM;gBAClB,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;aAChD;SACF,EAAE,OAAO,CAAC,CAAC;QACZ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;gBACzB,MAAM;gBACN,eAAe;gBACf,IAAI,EAAE,aAAa;gBACnB,MAAM;gBACN,cAAc,EAAE,GAAG,GAAG,CAAC;gBACvB,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;aAC9B,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;gBACzB,MAAM;gBACN,eAAe;gBACf,IAAI,EAAE,cAAc;gBACpB,MAAM;gBACN,cAAc,EAAE,GAAG,GAAG,CAAC;gBACvB,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;aAChC,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;YAC9C,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;gBACzB,MAAM;gBACN,eAAe;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM;gBACN,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;gBAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;gBAC/B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;aAC7B,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACxG,CAAC;QAED,OAAO;YACL,MAAM;YACN,cAAc,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YAC9G,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,MAAM;YACf,eAAe,EAAE,YAAY,CAAC,eAAe;YAC7C,SAAS,EAAE,GAAG;SACf,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,aAAqB,EAAE,OAA2B;QACtE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAExC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/F,IAAI,QAAQ,EAAE,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YAC5C,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,MAAc,EAAE,OAA2B;QACjF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,OAA2B;QAChE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAChG,CAAC;IAEM,KAAK,CAAC,SAAS,CACpB,MAAc,EACd,SAAiB,EACjB,KAAa,EACb,OAA+B,EAC/B,OAA2B;QAE3B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAExC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACzE,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;YACvC,MAAM;YACN,IAAI,EAAE,SAAS;YACf,MAAM;YACN,KAAK;YACL,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;YAC1B,OAAO;SACR,EAAE,OAAO,CAAC,CAAC;QAEZ,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,KAAK,CAAC,QAAQ,CACnB,MAAc,EACd,SAAiB,EACjB,QAAgB,EAChB,OAAgC,EAChC,OAA2B;QAE3B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;YAC1B,MAAM;YACN,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YACrC,QAAQ;YACR,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;YAC1B,OAAO;SACR,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,OAA2B,EAAE,UAA8C,EAAE;QAC7F,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,GAAwC,EAAE,CAAC;QAErD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;gBAC7D,OAAO;gBACP,KAAK;aACN,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;gBAClB,KAAK,EAAE;oBACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;iBACzG;gBACD,QAAQ,EAAE;oBACR,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBACxD,OAAO,EAAE,KAAK;iBACf;gBACD,4BAA4B,EAAE;oBAC5B,eAAe,EAAE,IAAI,CAAC,eAAe;iBACtC;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5C,KAAK,EAAE,EAAE,IAAI,EAAE;SAChB,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,OAA2B;QACtD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpF,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,OAA2B;QACjE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA6B,CAAC;QAC9D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3G,SAAS;YACX,CAAC;YACD,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;aACzC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;aAC/G,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,MAAc,EACd,OAA2B,EAC3B,UAA8D,EAAE;QAEhE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;YACxD,OAAO,EAAE,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACnD,YAAY,EAAE,CAAC,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACzD,KAAK;YACL,WAAW,EAAE,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,OAAO;YACL,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;SAChG,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAAe,EAAE,OAA2B;QAChF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,QAAQ,CACnB,MAAc,EACd,SAAiB,EACjB,QAAgB,EAChB,OAA2B;QAE3B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,IAAI,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,OAA2B;QAC7C,IAAK,OAAe,CAAC,SAAS,EAAE,CAAC;YAC/B,OAAQ,OAAe,CAAC,SAAS,CAAC;QACpC,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAA+B,CAAC;QACrD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAA,yBAAW,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,EAAE,GAAO,IAAA,uBAAO,EACpB;YACE,KAAK,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;YACpE,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB;SACK,EACR;YACE,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CACF,CAAC;QACF,MAAM,EAAE,CAAC,IAAI,CACX,qBAAY,EACZ,uBAAc,EACd,wBAAe,CAChB,CAAC;QACD,OAAe,CAAC,SAAS,GAAG,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,sBAAsB,CAAC,WAAmB,EAAE,SAA6B;QAC/E,MAAM,MAAM,GAAG,SAAS,IAAI,QAAQ,CAAC;QACrC,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,EAAM,EAAE,MAAc;QACnD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,EAAM,EACN,KASC,EACD,OAA2B;QAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/D,MAAM,iBAAiB,GAAG,KAAK,CAAC,eAAe,KAAK,SAAS;eACxD,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,IAAI,CAAC,4BAA4B,KAAK,SAAS,CAAC,CAAC;QAC1F,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChG,MAAM,YAAY,GAAG,WAAW,EAAE,QAAQ,CAAC;QAC3C,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,+BAA+B,CAAC,YAAY,CAAC,CAAC;QACpG,MAAM,YAAY,GAAG,IAAA,2CAA8B,EAAC,eAAe,CAAC,CAAC;QACrE,MAAM,iBAAiB,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QACvG,MAAM,MAAM,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QACzG,MAAM,WAAW,GAAG,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG;YACb,OAAO;YACP,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,OAAO,CAAC,KAAK;YAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,SAAS;YAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS;YACrC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,MAAM,EAAE,CAAC,MAAM,CAAC,wBAAe,CAAC,CAAC,MAAM,CAAC;YACtC,EAAE,EAAE,iBAAiB;YACrB,MAAM,EAAE,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;YACxG,IAAI,EAAE,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC;YACjD,MAAM;YACN,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,oBAAW,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAW,CAAC,MAAM;YAC7E,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,sBAAa,CAAC,IAAI;YAC1B,QAAQ;YACR,gBAAgB,EAAE,gBAAgB,IAAI,IAAI;YAC1C,QAAQ,EAAE,IAAA,wCAAoB,EAAC;gBAC7B,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,MAAM;gBACnB,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC;gBAClD,GAAG,YAAY;aAChB,EAAE,QAAQ,EAAE;gBACX,OAAO;gBACP,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW,EAAE,OAAO,CAAC,KAAK;gBAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,KAAK;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;YACF,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,yBAAyB,CAAC;YACnC,MAAM;YACN,cAAc,EAAE,IAAI,CAAC,4BAA4B,CAAC,iBAAiB,EAAE,OAAO,CAAC;YAC7E,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,oBAAW,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAW,CAAC,MAAM;YAC7E,OAAO,EAAE,WAAW;YACpB,eAAe;YACf,QAAQ;YACR,gBAAgB;YAChB,YAAY,EAAE,WAAW,EAAE,YAAY;SACxC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,EAAM,EACN,MAAc,EACd,YAAoB,EACpB,UAA+C,EAC/C,OAA2B,EAC3B,UAAkE,EAAE;QAEpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;YAC1B,MAAM;YACN,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,IAAI,EAAE,eAAe;YACrB,MAAM;YACN,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;YAC1B,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE;gBACP,UAAU;gBACV,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC;aACtD;SACF,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,EAAM;QAC5B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,qBAAY,CAAuB,CAAC;QACzE,OAAO,KAAK;aACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;aAChD,MAAM,CAAC,CAAC,IAAI,EAA4B,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACpE,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,EAAM,EAAE,OAA2B;QACrE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAC5G,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC1G,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,EAAM,EAAE,aAAqB;QACvD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,KAAK,aAAa,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,gCAAgC,aAAa,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,EAAM,EACN,MAAc,EACd,OAA2B,EAC3B,UAKI,EAAE;QAEN,MAAM,UAAU,GAAG;YACjB,IAAA,kBAAE,EAAC,wBAAe,CAAC,MAAM,EAAE,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/G,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,kBAAE,EAAC,wBAAe,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAClH,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,mBAAG,EAAC,wBAAe,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9H,CAAC;QACF,IAAI,KAAK,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,wBAAe,CAAC,CAAC,KAAK,CAAC,IAAA,mBAAG,EAAC,GAAG,UAAU,CAAC,CAAC,CAAC;QACxE,KAAK,GAAG,OAAO,CAAC,WAAW;YACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAA,oBAAI,EAAC,wBAAe,CAAC,SAAgB,CAAC,CAAC;YACvD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAA,mBAAG,EAAC,wBAAe,CAAC,SAAgB,CAAC,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,KAA4B,CAAC;QAClD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,EAAM,EAAE,MAAc,EAAE,KAAa,EAAE,OAA2B;QAC/F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,EAAM,EAAE,MAAc,EAAE,OAAe,EAAE,OAA2B;QAC9F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,EAAM,EAAE,MAAc,EAAE,OAA2B;QAC9E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAClF,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,EAAM,EACN,MAAc,EACd,SAAiB,EACjB,QAAgB,EAChB,OAA2B;QAE3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC;IACrG,CAAC;IAEO,mBAAmB,CAAC,MAAyB;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAA,uCAAmB,EAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAA2B,CAAC;eACnE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAA2B,CAAC;eAC1D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;eACpC,EAAE,CAAC;QACR,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAA4B,CAAC;eACrE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAA4B,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChF,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,EAAE;YAC7F,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;YAClF,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,gBAAgB;YACvG,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;YAChE,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,SAAS;YAC9H,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,gBAAgB,IAAI,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;YACjK,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;YACvD,KAAK,EAAE,KAAK,IAAI,SAAS;YACzB,OAAO;YACP,QAAQ,EAAE,QAAQ,IAAI,SAAS;YAC/B,QAAQ;SACT,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,MAAwB;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7D,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,uCAAmB,EAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,eAAe,GAAG,IAAA,qCAAwB,EAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,IAAA,2CAA8B,EAAC,eAAe,CAAC,CAAC;QACrE,OAAO;YACL,MAAM;YACN,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,eAAe,IAAI,QAAQ,CAAC,cAAc,CAAC;YAC5G,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS;YAC/B,KAAK,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;YACtC,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;YAC5B,eAAe,EAAE,YAAY,CAAC,eAAe;YAC7C,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;SACnD,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,KAAwB;QAC5C,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,OAAO,EAAE,KAAK,CAAC,MAAM;YACrB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,gBAAgB,EAAE,KAAK,CAAC,cAAc;YACtC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,KAAuB;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;YAC5C,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACnE,CAAC,CAAC,MAAiC;gBACnC,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,KAAc;QAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IAEO,WAAW,CAAC,KAAc;QAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,EAAM,EAAE,MAAc;QACjD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAA4B,CAAC;QAC/G,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;YAC9C,YAAY,EAAE,IAAA,+BAAkB,EAAC,IAAI,EAAE,YAAY,CAAC;SACrD,CAAC;IACJ,CAAC;IAEO,+BAA+B,CAAC,QAA6C;QACnF,OAAO,IAAA,qCAAwB,EAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,KAUvC;QACC,IAAI,CAAC,IAAI,CAAC,4BAA4B,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAW,CAAC,IAAI,EAAE,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,4BAA4B,CAAC,sBAAsB,CAAC;gBAC7D,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mDAAmD,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAEO,6BAA6B,CAAC,SAAiB,EAAE,OAAgC;QACvF,IAAI,SAAS,KAAK,gBAAgB,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvE,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAEO,yBAAyB,CAAC,OAAgC;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,YAAY,CAAqB,CAAC,CAAC;QACvF,OAAO,IAAA,+BAAkB,EAAC;YACxB,GAAG,IAAA,+BAAkB,EAAC,OAAO,CAAC,QAAQ,CAAC;YACvC,GAAG,IAAA,+BAAkB,EAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;YACxD,GAAG,IAAA,+BAAkB,EAAC,cAAc,EAAE,MAAM,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAEO,iCAAiC,CAAC,OAAgC;QACxE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC;eAC5C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;eAC3D,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,CAAC;IACrE,CAAC;IAEO,eAAe,CAAC,OAA2B;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1D,OAAO,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;IACvC,CAAC;IAEO,aAAa,CAAC,OAA2B;QAC/C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,MAAc;QACxC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5B,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,YAAoB;QAChD,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;IACtE,CAAC;IAEO,cAAc,CAAC,OAA2B;QAChD,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IAChE,CAAC;IAEO,eAAe,CAAC,OAA2B;QACjD,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IAChE,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,OAAO,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;IAC/F,CAAC;IAEO,QAAQ,CAAC,IAAY;QAC3B,OAAO,IAAA,yBAAW,EAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAEO,IAAI,CAAC,KAAa;QACxB,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;IAC/F,CAAC;IAEO,mBAAmB,CAAC,MAAc;QACxC,OAAO,UAAU,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACpF,CAAC;IAEO,wBAAwB,CAAC,MAAc;QAC7C,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,iBAAiB,CAAC;IAC9D,CAAC;IAEO,iCAAiC,CAAC,MAAc;QACtD,OAAO,QAAQ,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACnE,CAAC;IAEO,0BAA0B,CAAC,MAAc;QAC/C,OAAO,QAAQ,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACrE,CAAC;IAEO,uBAAuB,CAAC,MAAc;QAC5C,OAAO,eAAe,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;IAChE,CAAC;IAEO,0BAA0B,CAAC,MAAc,EAAE,OAAe,EAAE,EAAU;QAC5E,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,QAAQ,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,iBAAiB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3G,CAAC;IAEO,4BAA4B,CAAC,UAAkB,EAAE,OAA2B;QAClF,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,UAAU,EAAE,CAAC;IAChE,CAAC;IAEO,gBAAgB,CAAC,KAAyB;QAChD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;YAChB,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC9C,OAAO,GAAG,CAAC,MAAM,CAAC;YACpB,CAAC;YACD,GAAG,CAAC,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;YACvE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,KAAa;QAC7B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACnC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;YACnD,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;SAC/C,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,KAAuC;QACzD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;IAEO,eAAe,CAAC,EAAU;QAChC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IAEO,cAAc,CAAC,KAAyB;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF;AAn1BD,wCAm1BC","sourcesContent":["import { createHash, randomBytes } from 'node:crypto';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { and, asc, desc, drizzle, eq, gt, lte } from '@undefineds.co/drizzle-solid';\nimport {\n chatResource,\n messageResource,\n MessageRole,\n MessageStatus,\n threadResource,\n} from '@undefineds.co/models';\nimport {\n normalizeAgentUris,\n normalizeReconcilerOwner,\n reconcilerCoordinationMetadata,\n type ReconcilerOwner,\n type ServerGroupReconcilerService,\n} from '../reconciler';\nimport { getProtocolMetadata, withProtocolMetadata } from '../protocol-metadata';\nimport { isSolidAuth, type AuthContext } from '../auth/AuthContext';\nimport type {\n MatrixAccountInfo,\n MatrixClientEvent,\n MatrixCreateRoomRequest,\n MatrixEventRecord,\n MatrixRoomRecord,\n MatrixSendEventRequest,\n MatrixStoreContext,\n MatrixSyncResponse,\n} from './types';\n\nconst schema = {\n chat: chatResource,\n thread: threadResource,\n message: messageResource,\n};\n\nexport interface PodMatrixStoreOptions {\n serverName?: string;\n serverGroupReconcilerService?: ServerGroupReconcilerService;\n}\n\ntype Db = any;\ntype JsonObjectSource = string | Record<string, unknown> | null | undefined;\n\ninterface MatrixRoomSource {\n id: string;\n title?: string | null;\n description?: string | null;\n author?: string | null;\n participants?: string[] | null;\n createdAt?: string | Date | null;\n metadata?: JsonObjectSource;\n}\n\ninterface MatrixEventSource {\n id: string;\n maker?: string | null;\n content?: JsonObjectSource;\n mentions?: string[] | null;\n routeTargetAgent?: string | null;\n createdAt?: string | Date | null;\n metadata?: JsonObjectSource;\n}\n\ninterface MatrixRoomContext {\n metadata?: Record<string, unknown>;\n participants: string[];\n}\n\nexport class PodMatrixStore {\n private readonly logger = getLoggerFor(this);\n private readonly serverName?: string;\n private readonly serverGroupReconcilerService?: ServerGroupReconcilerService;\n\n public constructor(options: PodMatrixStoreOptions) {\n this.serverName = options.serverName;\n this.serverGroupReconcilerService = options.serverGroupReconcilerService;\n }\n\n public async getAccount(context: MatrixStoreContext): Promise<MatrixAccountInfo> {\n const matrixUserId = this.getMatrixUserId(context);\n return {\n userId: matrixUserId,\n deviceId: this.deviceIdFromUserId(context.webId),\n displayName: this.displayNameFromUserId(matrixUserId),\n };\n }\n\n public async createRoom(input: MatrixCreateRoomRequest, context: MatrixStoreContext): Promise<MatrixRoomRecord> {\n const db = await this.getDb(context);\n const sender = this.getMatrixUserId(context);\n const now = Date.now();\n const roomId = this.generateRoomId(context);\n const chatId = this.chatResourceIdFromRoomId(roomId);\n const threadId = this.threadResourceIdFromRoomId(roomId);\n const reconcilerOwner = 'server' as const;\n const coordination = reconcilerCoordinationMetadata(reconcilerOwner);\n\n await db.insert(chatResource).values({\n id: chatId,\n title: input.name ?? roomId,\n description: input.topic ?? null,\n author: context.webId,\n status: 'active',\n participants: [context.webId],\n metadata: withProtocolMetadata({\n protocol: 'matrix',\n ...coordination,\n }, 'matrix', {\n roomId,\n canonicalAlias: input.room_alias_name ? `#${input.room_alias_name}:${this.getServerName(context)}` : null,\n visibility: input.visibility === 'public' ? 'public' : 'private',\n roomVersion: String(input.creation_content?.room_version ?? '11'),\n federate: input.creation_content?.['m.federate'] === true,\n members: [context.webId],\n preset: input.preset,\n invite: input.invite ?? [],\n }),\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n await db.insert(threadResource).values({\n id: threadId,\n parent: this.chatParentRefFromRoomId(roomId),\n title: input.name ?? roomId,\n status: 'active',\n metadata: withProtocolMetadata({\n protocol: 'matrix',\n commandKind: 'chat',\n surface_id: this.surfaceIdFromRoomId(roomId),\n ...coordination,\n }, 'matrix', { roomId }),\n createdAt: new Date(now).toISOString(),\n updatedAt: new Date(now).toISOString(),\n });\n\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.create',\n sender,\n originServerTs: now,\n stateKey: '',\n content: {\n creator: sender,\n room_version: String(input.creation_content?.room_version ?? '11'),\n type: input.creation_content?.type,\n 'm.federate': input.creation_content?.['m.federate'] === true,\n },\n }, context);\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.member',\n sender,\n originServerTs: now + 1,\n stateKey: sender,\n content: {\n membership: 'join',\n displayname: this.displayNameFromUserId(sender),\n },\n }, context);\n if (input.name) {\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.name',\n sender,\n originServerTs: now + 2,\n stateKey: '',\n content: { name: input.name },\n }, context);\n }\n if (input.topic) {\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: 'm.room.topic',\n sender,\n originServerTs: now + 3,\n stateKey: '',\n content: { topic: input.topic },\n }, context);\n }\n for (const state of input.initial_state ?? []) {\n await this.appendEvent(db, {\n roomId,\n reconcilerOwner,\n type: state.type,\n sender,\n originServerTs: Date.now(),\n stateKey: state.state_key ?? '',\n content: state.content ?? {},\n }, context);\n }\n for (const invitee of input.invite ?? []) {\n await this.appendMembershipEvent(db, roomId, invitee, 'invite', context, { sender, reconcilerOwner });\n }\n\n return {\n roomId,\n canonicalAlias: input.room_alias_name ? `#${input.room_alias_name}:${this.getServerName(context)}` : undefined,\n name: input.name,\n topic: input.topic,\n creator: sender,\n reconcilerOwner: coordination.reconcilerOwner,\n createdAt: now,\n };\n }\n\n public async joinRoom(roomIdOrAlias: string, context: MatrixStoreContext): Promise<{ roomId: string }> {\n const db = await this.getDb(context);\n const roomId = await this.resolveRoomId(db, roomIdOrAlias);\n await this.ensureRoomExists(db, roomId);\n\n const sender = this.getMatrixUserId(context);\n const existing = await this.findLatestStateEvent(db, roomId, 'm.room.member', sender, context);\n if (existing?.content.membership !== 'join') {\n await this.appendMembershipEvent(db, roomId, sender, 'join', context);\n }\n\n return { roomId };\n }\n\n public async inviteUser(roomId: string, userId: string, context: MatrixStoreContext): Promise<void> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n await this.appendMembershipEvent(db, roomId, userId, 'invite', context);\n }\n\n public async leaveRoom(roomId: string, context: MatrixStoreContext): Promise<void> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n await this.appendMembershipEvent(db, roomId, this.getMatrixUserId(context), 'leave', context);\n }\n\n public async sendEvent(\n roomId: string,\n eventType: string,\n txnId: string,\n content: MatrixSendEventRequest,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n\n const existing = await this.findEventByTxnId(db, roomId, txnId, context);\n if (existing) {\n return existing;\n }\n\n const sender = this.getMatrixUserId(context);\n const event = await this.appendEvent(db, {\n roomId,\n type: eventType,\n sender,\n txnId,\n originServerTs: Date.now(),\n content,\n }, context);\n\n return event;\n }\n\n public async setState(\n roomId: string,\n eventType: string,\n stateKey: string,\n content: Record<string, unknown>,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n return this.appendEvent(db, {\n roomId,\n type: eventType,\n sender: this.getMatrixUserId(context),\n stateKey,\n originServerTs: Date.now(),\n content,\n }, context);\n }\n\n public async sync(context: MatrixStoreContext, options: { since?: string; limit?: number } = {}): Promise<MatrixSyncResponse> {\n const db = await this.getDb(context);\n const rooms = await this.listJoinedRoomRecords(db, context);\n const sinceTs = this.parseSyncToken(options.since);\n const limit = options.limit && options.limit > 0 ? options.limit : 50;\n const join: MatrixSyncResponse['rooms']['join'] = {};\n\n for (const room of rooms) {\n const events = await this.listEvents(db, room.roomId, context, {\n sinceTs,\n limit,\n });\n join[room.roomId] = {\n state: {\n events: events.filter((event) => event.stateKey !== undefined).map((event) => this.toClientEvent(event)),\n },\n timeline: {\n events: events.map((event) => this.toClientEvent(event)),\n limited: false,\n },\n 'co.undefineds.coordination': {\n reconcilerOwner: room.reconcilerOwner,\n },\n };\n }\n\n return {\n next_batch: this.encodeSyncToken(Date.now()),\n rooms: { join },\n };\n }\n\n public async listJoinedRooms(context: MatrixStoreContext): Promise<string[]> {\n const db = await this.getDb(context);\n return (await this.listJoinedRoomRecords(db, context)).map((room) => room.roomId);\n }\n\n public async getMembers(roomId: string, context: MatrixStoreContext): Promise<MatrixClientEvent[]> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n const events = await this.listEvents(db, roomId, context, { newestFirst: true });\n const latestByStateKey = new Map<string, MatrixEventRecord>();\n for (const event of events) {\n if (event.type !== 'm.room.member' || event.stateKey === undefined || latestByStateKey.has(event.stateKey)) {\n continue;\n }\n latestByStateKey.set(event.stateKey, event);\n }\n return Array.from(latestByStateKey.values())\n .sort((left, right) => (left.originServerTs - right.originServerTs) || ((left.depth ?? 0) - (right.depth ?? 0)))\n .map((event) => this.toClientEvent(event));\n }\n\n public async listMessages(\n roomId: string,\n context: MatrixStoreContext,\n options: { limit?: number; dir?: 'b' | 'f'; from?: string } = {},\n ): Promise<{ chunk: MatrixClientEvent[]; start?: string; end: string }> {\n const db = await this.getDb(context);\n await this.ensureRoomExists(db, roomId);\n const limit = options.limit && options.limit > 0 ? options.limit : 50;\n const fromTs = this.parseSyncToken(options.from);\n const forward = options.dir === 'f';\n const events = await this.listEvents(db, roomId, context, {\n sinceTs: forward && fromTs > 0 ? fromTs : undefined,\n beforeOrAtTs: !forward && fromTs > 0 ? fromTs : undefined,\n limit,\n newestFirst: !forward,\n });\n const chunk = events.slice(0, limit).map((event) => this.toClientEvent(event));\n return {\n chunk,\n start: options.from,\n end: this.encodeSyncToken(chunk.length ? chunk[chunk.length - 1].origin_server_ts : Date.now()),\n };\n }\n\n public async getEvent(roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixClientEvent> {\n const db = await this.getDb(context);\n const event = await this.findEventById(db, roomId, eventId, context);\n if (!event) {\n throw new Error(`Matrix event not found: ${eventId}`);\n }\n return this.toClientEvent(event);\n }\n\n public async getState(\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<Record<string, unknown>> {\n const db = await this.getDb(context);\n const event = await this.findLatestStateEvent(db, roomId, eventType, stateKey, context);\n if (!event) {\n throw new Error(`Matrix state not found: ${eventType}/${stateKey}`);\n }\n return event.content;\n }\n\n private async getDb(context: MatrixStoreContext): Promise<Db> {\n if ((context as any)._matrixDb) {\n return (context as any)._matrixDb;\n }\n\n const auth = context.auth as AuthContext | undefined;\n if (!auth || !isSolidAuth(auth) || !auth.accessToken || !auth.webId) {\n throw new Error('Matrix API requires Solid access-token authentication');\n }\n\n const db: Db = drizzle(\n {\n fetch: this.createAccessTokenFetch(auth.accessToken, auth.tokenType),\n info: {\n webId: auth.webId,\n isLoggedIn: true,\n podUrl: context.podUrl,\n },\n } as any,\n {\n schema,\n podUrl: context.podUrl,\n },\n );\n await db.init(\n chatResource,\n threadResource,\n messageResource,\n );\n (context as any)._matrixDb = db;\n return db;\n }\n\n private createAccessTokenFetch(accessToken: string, tokenType?: 'Bearer' | 'DPoP'): typeof fetch {\n const scheme = tokenType ?? 'Bearer';\n return async (input, init) => {\n const headers = new Headers(init?.headers);\n if (!headers.has('Authorization')) {\n headers.set('Authorization', `${scheme} ${accessToken}`);\n }\n return fetch(input, { ...init, headers });\n };\n }\n\n private async ensureRoomExists(db: Db, roomId: string): Promise<void> {\n const room = await db.findById(chatResource, this.chatResourceIdFromRoomId(roomId));\n if (!room) {\n throw new Error(`Matrix room not found: ${roomId}`);\n }\n }\n\n private async appendEvent(\n db: Db,\n input: {\n roomId: string;\n type: string;\n sender: string;\n originServerTs: number;\n content: Record<string, unknown>;\n stateKey?: string;\n txnId?: string;\n reconcilerOwner?: ReconcilerOwner;\n },\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord> {\n const eventId = this.generateEventId(context);\n const depth = await this.nextEventDepth(db, input.roomId, context);\n const originIso = new Date(input.originServerTs).toISOString();\n const needsRoomMetadata = input.reconcilerOwner === undefined\n || (input.type === 'm.room.message' && this.serverGroupReconcilerService !== undefined);\n const roomContext = needsRoomMetadata ? await this.getRoomContext(db, input.roomId) : undefined;\n const roomMetadata = roomContext?.metadata;\n const reconcilerOwner = input.reconcilerOwner ?? this.reconcilerOwnerFromRoomMetadata(roomMetadata);\n const coordination = reconcilerCoordinationMetadata(reconcilerOwner);\n const messageResourceId = this.messageResourceIdFromEvent(input.roomId, eventId, input.originServerTs);\n const thread = this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(input.roomId), context);\n const contentText = this.messageContentFromMatrixEvent(input.type, input.content);\n const mentions = this.mentionsFromMatrixContent(input.content);\n const routeTargetAgent = this.routeTargetAgentFromMatrixContent(input.content);\n const record = {\n eventId,\n roomId: input.roomId,\n type: input.type,\n sender: input.sender,\n senderWebId: context.webId,\n originServerTs: input.originServerTs,\n depth,\n txnId: input.txnId ?? undefined,\n stateKey: input.stateKey ?? undefined,\n content: input.content,\n createdAt: originIso,\n };\n await db.insert(messageResource).values({\n id: messageResourceId,\n parent: this.resolveDataResourceUriFromId(this.messageParentResourceIdFromRoomId(input.roomId), context),\n chat: this.chatResourceIdFromRoomId(input.roomId),\n thread,\n maker: context.webId,\n role: input.type === 'm.room.message' ? MessageRole.USER : MessageRole.SYSTEM,\n content: contentText,\n status: MessageStatus.SENT,\n mentions,\n routeTargetAgent: routeTargetAgent ?? null,\n metadata: withProtocolMetadata({\n protocol: 'matrix',\n commandKind: 'chat',\n surface_id: this.surfaceIdFromRoomId(input.roomId),\n ...coordination,\n }, 'matrix', {\n eventId,\n roomId: input.roomId,\n eventType: input.type,\n sender: input.sender,\n senderWebId: context.webId,\n originServerTs: input.originServerTs,\n depth,\n txnId: input.txnId ?? null,\n stateKey: input.stateKey ?? null,\n content: input.content,\n }),\n createdAt: originIso,\n updatedAt: originIso,\n });\n\n await this.reconcileGroupUserMessage({\n thread,\n triggerMessage: this.resolveDataResourceUriFromId(messageResourceId, context),\n actor: context.webId,\n role: input.type === 'm.room.message' ? MessageRole.USER : MessageRole.SYSTEM,\n content: contentText,\n reconcilerOwner,\n mentions,\n routeTargetAgent,\n participants: roomContext?.participants,\n });\n\n return record;\n }\n\n private async appendMembershipEvent(\n db: Db,\n roomId: string,\n memberUserId: string,\n membership: 'invite' | 'join' | 'leave' | 'ban',\n context: MatrixStoreContext,\n options: { sender?: string; reconcilerOwner?: ReconcilerOwner } = {},\n ): Promise<MatrixEventRecord> {\n const sender = options.sender ?? this.getMatrixUserId(context);\n return this.appendEvent(db, {\n roomId,\n reconcilerOwner: options.reconcilerOwner,\n type: 'm.room.member',\n sender,\n originServerTs: Date.now(),\n stateKey: memberUserId,\n content: {\n membership,\n displayname: this.displayNameFromUserId(memberUserId),\n },\n }, context);\n }\n\n private async listRooms(db: Db): Promise<MatrixRoomRecord[]> {\n const rooms = await db.select().from(chatResource) as MatrixRoomSource[];\n return rooms\n .map((room) => this.chatSourceToRoomRecord(room))\n .filter((room): room is MatrixRoomRecord => room !== undefined);\n }\n\n private async listJoinedRoomRecords(db: Db, context: MatrixStoreContext): Promise<MatrixRoomRecord[]> {\n const rooms = await this.listRooms(db);\n const matrixUserId = this.getMatrixUserId(context);\n const joined: MatrixRoomRecord[] = [];\n for (const room of rooms) {\n const membership = await this.findLatestStateEvent(db, room.roomId, 'm.room.member', matrixUserId, context);\n if (!membership || membership.content.membership === 'join' || membership.content.membership === 'invite') {\n joined.push(room);\n }\n }\n return joined;\n }\n\n private async resolveRoomId(db: Db, roomIdOrAlias: string): Promise<string> {\n if (!roomIdOrAlias.startsWith('#')) {\n return roomIdOrAlias;\n }\n const rooms = await this.listRooms(db);\n const room = rooms.find((candidate) => candidate.canonicalAlias === roomIdOrAlias);\n if (!room) {\n throw new Error(`Matrix room alias not found: ${roomIdOrAlias}`);\n }\n return room.roomId;\n }\n\n private async listEvents(\n db: Db,\n roomId: string,\n context: MatrixStoreContext,\n options: {\n sinceTs?: number;\n beforeOrAtTs?: number;\n limit?: number;\n newestFirst?: boolean;\n } = {},\n ): Promise<MatrixEventRecord[]> {\n const conditions = [\n eq(messageResource.thread, this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(roomId), context)),\n options.sinceTs !== undefined ? gt(messageResource.createdAt, new Date(options.sinceTs).toISOString()) : undefined,\n options.beforeOrAtTs !== undefined ? lte(messageResource.createdAt, new Date(options.beforeOrAtTs).toISOString()) : undefined,\n ];\n let query = db.select().from(messageResource).where(and(...conditions));\n query = options.newestFirst\n ? query.orderBy(desc(messageResource.createdAt as any))\n : query.orderBy(asc(messageResource.createdAt as any));\n if (options.limit && options.limit > 0) {\n query = query.limit(options.limit);\n }\n const events = await query as MatrixEventSource[];\n return events.map((event) => this.eventSourceToRecord(event));\n }\n\n private async findEventByTxnId(db: Db, roomId: string, txnId: string, context: MatrixStoreContext): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context);\n return records.find((record) => record.txnId === txnId);\n }\n\n private async findEventById(db: Db, roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context);\n return records.find((record) => record.eventId === eventId);\n }\n\n private async nextEventDepth(db: Db, roomId: string, context: MatrixStoreContext): Promise<number> {\n const records = await this.listEvents(db, roomId, context);\n return records.reduce((max, record) => Math.max(max, record.depth ?? 0), 0) + 1;\n }\n\n private async findLatestStateEvent(\n db: Db,\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, context, { newestFirst: true });\n return records.find((record) => record.type === eventType && (record.stateKey ?? '') === stateKey);\n }\n\n private eventSourceToRecord(source: MatrixEventSource): MatrixEventRecord {\n const metadata = this.parseJsonObject(source.metadata) ?? {};\n const matrix = getProtocolMetadata(metadata, 'matrix') ?? {};\n const content = this.parseJsonObject(matrix.content as JsonObjectSource)\n ?? this.parseJsonObject(metadata.content as JsonObjectSource)\n ?? this.parseJsonObject(source.content)\n ?? {};\n const unsigned = this.parseJsonObject(matrix.unsigned as JsonObjectSource)\n ?? this.parseJsonObject(metadata.unsigned as JsonObjectSource);\n const stateKey = this.stringValue(matrix.stateKey ?? matrix.state_key ?? metadata.stateKey);\n const txnId = this.stringValue(matrix.txnId ?? matrix.txn_id ?? metadata.txnId);\n return {\n eventId: this.stringValue(matrix.eventId ?? matrix.event_id ?? metadata.eventId) ?? source.id,\n roomId: this.stringValue(matrix.roomId ?? matrix.room_id ?? metadata.roomId) ?? '',\n type: this.stringValue(matrix.eventType ?? matrix.event_type ?? metadata.eventType) ?? 'm.room.message',\n sender: this.stringValue(matrix.sender ?? metadata.sender) ?? '',\n senderWebId: this.stringValue(matrix.senderWebId ?? matrix.sender_web_id ?? metadata.senderWebId) ?? source.maker ?? undefined,\n originServerTs: this.numberValue(matrix.originServerTs ?? matrix.origin_server_ts ?? metadata.originServerTs) ?? this.isoToMillis(source.createdAt) ?? Date.now(),\n depth: this.numberValue(matrix.depth ?? metadata.depth),\n txnId: txnId ?? undefined,\n content,\n stateKey: stateKey ?? undefined,\n unsigned,\n };\n }\n\n private chatSourceToRoomRecord(source: MatrixRoomSource): MatrixRoomRecord | undefined {\n const metadata = this.parseJsonObject(source.metadata) ?? {};\n if (metadata.protocol !== 'matrix') {\n return undefined;\n }\n const matrix = getProtocolMetadata(metadata, 'matrix') ?? {};\n const roomId = this.stringValue(matrix.roomId ?? matrix.room_id ?? metadata.roomId);\n if (!roomId) {\n return undefined;\n }\n const reconcilerOwner = normalizeReconcilerOwner(metadata.reconcilerOwner, 'server');\n const coordination = reconcilerCoordinationMetadata(reconcilerOwner);\n return {\n roomId,\n canonicalAlias: this.stringValue(matrix.canonicalAlias ?? matrix.canonical_alias ?? metadata.canonicalAlias),\n name: source.title ?? undefined,\n topic: source.description ?? undefined,\n creator: source.author ?? '',\n reconcilerOwner: coordination.reconcilerOwner,\n createdAt: this.isoToMillis(source.createdAt) ?? 0,\n };\n }\n\n private toClientEvent(event: MatrixEventRecord): MatrixClientEvent {\n return {\n event_id: event.eventId,\n room_id: event.roomId,\n type: event.type,\n sender: event.sender,\n origin_server_ts: event.originServerTs,\n content: event.content,\n ...(event.stateKey !== undefined ? { state_key: event.stateKey } : {}),\n ...(event.unsigned ? { unsigned: event.unsigned } : {}),\n };\n }\n\n private parseJsonObject(value: JsonObjectSource): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n if (typeof value !== 'string') {\n return undefined;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n private stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n }\n\n private numberValue(value: unknown): number | undefined {\n if (typeof value !== 'number') {\n return undefined;\n }\n return Number.isFinite(value) ? value : undefined;\n }\n\n private async getRoomContext(db: Db, roomId: string): Promise<MatrixRoomContext> {\n const room = await db.findById(chatResource, this.chatResourceIdFromRoomId(roomId)) as MatrixRoomSource | null;\n return {\n metadata: this.parseJsonObject(room?.metadata),\n participants: normalizeAgentUris(room?.participants),\n };\n }\n\n private reconcilerOwnerFromRoomMetadata(metadata: Record<string, unknown> | undefined): ReconcilerOwner {\n return normalizeReconcilerOwner(metadata?.reconcilerOwner, 'server');\n }\n\n private async reconcileGroupUserMessage(input: {\n thread: string;\n triggerMessage: string;\n actor: string;\n role: string;\n content: string;\n reconcilerOwner: ReconcilerOwner;\n mentions?: string[];\n routeTargetAgent?: string;\n participants?: string[];\n }): Promise<void> {\n if (!this.serverGroupReconcilerService || input.role !== MessageRole.USER) {\n return;\n }\n try {\n await this.serverGroupReconcilerService.reconcileThreadMessage({\n thread: input.thread,\n triggerMessage: input.triggerMessage,\n actor: input.actor,\n role: 'user',\n content: input.content,\n reconcilerOwner: input.reconcilerOwner,\n mentions: input.mentions,\n routeTargetAgent: input.routeTargetAgent,\n participants: input.participants,\n });\n } catch (error) {\n this.logger.warn(`Failed to enqueue Matrix group Reconciler wake: ${error}`);\n }\n }\n\n private messageContentFromMatrixEvent(eventType: string, content: Record<string, unknown>): string {\n if (eventType === 'm.room.message' && typeof content.body === 'string') {\n return content.body;\n }\n return JSON.stringify(content);\n }\n\n private mentionsFromMatrixContent(content: Record<string, unknown>): string[] {\n const matrixMentions = this.parseJsonObject(content['m.mentions'] as JsonObjectSource);\n return normalizeAgentUris([\n ...normalizeAgentUris(content.mentions),\n ...normalizeAgentUris(content['co.undefineds.mentions']),\n ...normalizeAgentUris(matrixMentions?.agents),\n ]);\n }\n\n private routeTargetAgentFromMatrixContent(content: Record<string, unknown>): string | undefined {\n return this.stringValue(content.routeTargetAgent)\n ?? this.stringValue(content['co.undefineds.routeTargetAgent'])\n ?? this.stringValue(content['co.undefineds.route_target_agent']);\n }\n\n private getMatrixUserId(context: MatrixStoreContext): string {\n const serverName = this.getServerName(context);\n const localpart = this.localpartFromUserId(context.webId);\n return `@${localpart}:${serverName}`;\n }\n\n private getServerName(context: MatrixStoreContext): string {\n if (this.serverName) {\n return this.serverName;\n }\n try {\n return new URL(context.webId).host || 'localhost';\n } catch {\n return 'localhost';\n }\n }\n\n private localpartFromUserId(userId: string): string {\n try {\n const url = new URL(userId);\n const withoutHash = `${url.pathname}${url.hash}`.replace(/^\\/+/, '');\n return this.slug(withoutHash || url.host);\n } catch {\n return this.slug(userId);\n }\n }\n\n private displayNameFromUserId(matrixUserId: string): string {\n return matrixUserId.replace(/^@/, '').split(':')[0] || matrixUserId;\n }\n\n private generateRoomId(context: MatrixStoreContext): string {\n return `!${this.randomId(24)}:${this.getServerName(context)}`;\n }\n\n private generateEventId(context: MatrixStoreContext): string {\n return `$${this.randomId(24)}:${this.getServerName(context)}`;\n }\n\n private deviceIdFromUserId(userId: string): string {\n return `XPOD${createHash('sha256').update(userId).digest('hex').slice(0, 12).toUpperCase()}`;\n }\n\n private randomId(size: number): string {\n return randomBytes(size).toString('base64url');\n }\n\n private slug(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9._=-]+/g, '_').replace(/^_+|_+$/g, '') || 'user';\n }\n\n private surfaceIdFromRoomId(roomId: string): string {\n return `matrix-${createHash('sha256').update(roomId).digest('hex').slice(0, 16)}`;\n }\n\n private chatResourceIdFromRoomId(roomId: string): string {\n return `${this.surfaceIdFromRoomId(roomId)}/index.ttl#this`;\n }\n\n private messageParentResourceIdFromRoomId(roomId: string): string {\n return `chat/${this.surfaceIdFromRoomId(roomId)}/index.ttl#this`;\n }\n\n private threadResourceIdFromRoomId(roomId: string): string {\n return `chat/${this.surfaceIdFromRoomId(roomId)}/index.ttl#thread`;\n }\n\n private chatParentRefFromRoomId(roomId: string): string {\n return `/.data/chat/${this.chatResourceIdFromRoomId(roomId)}`;\n }\n\n private messageResourceIdFromEvent(roomId: string, eventId: string, ts: number): string {\n const { yyyy, MM, dd } = this.dateParts(ts);\n return `chat/${this.surfaceIdFromRoomId(roomId)}/${yyyy}/${MM}/${dd}/messages.ttl#${this.slug(eventId)}`;\n }\n\n private resolveDataResourceUriFromId(resourceId: string, context: MatrixStoreContext): string {\n const podBaseUrl = context.podUrl ?? this.derivePodBaseUrl(context.webId);\n if (!podBaseUrl) {\n return resourceId;\n }\n return `${podBaseUrl.replace(/\\/$/, '')}/.data/${resourceId}`;\n }\n\n private derivePodBaseUrl(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n try {\n const url = new URL(webId);\n url.hash = '';\n url.search = '';\n const normalizedPath = url.pathname.replace(/\\/+$/, '');\n if (!normalizedPath.endsWith('/profile/card')) {\n return url.origin;\n }\n url.pathname = normalizedPath.slice(0, -'/profile/card'.length) || '/';\n return url.toString().replace(/\\/$/, '');\n } catch {\n return undefined;\n }\n }\n\n private dateParts(value: number): { yyyy: string; MM: string; dd: string } {\n const date = new Date(value);\n return {\n yyyy: String(date.getUTCFullYear()),\n MM: String(date.getUTCMonth() + 1).padStart(2, '0'),\n dd: String(date.getUTCDate()).padStart(2, '0'),\n };\n }\n\n private isoToMillis(value: string | Date | null | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n const date = value instanceof Date ? value : new Date(value);\n const time = date.getTime();\n return Number.isFinite(time) ? time : undefined;\n }\n\n private encodeSyncToken(ts: number): string {\n return `s${Math.max(0, Math.floor(ts))}`;\n }\n\n private parseSyncToken(token: string | undefined): number {\n if (!token) {\n return 0;\n }\n const parsed = Number(token.replace(/^s/, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
1
  export { PodMatrixStore, type PodMatrixStoreOptions } from './PodMatrixStore';
2
- export type { MatrixClientEvent, MatrixCreateRoomRequest, MatrixEventRecord, MatrixRoomRecord, MatrixSendEventRequest, MatrixStore, MatrixStoreContext, MatrixSyncResponse, } from './types';
2
+ export type { MatrixAccountInfo, MatrixClientEvent, MatrixCreateRoomRequest, MatrixEventRecord, MatrixRoomRecord, MatrixSendEventRequest, MatrixStore, MatrixStoreContext, MatrixSyncResponse, } from './types';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/matrix/index.ts"],"names":[],"mappings":";;;AAAA,mDAA8E;AAArE,gHAAA,cAAc,OAAA","sourcesContent":["export { PodMatrixStore, type PodMatrixStoreOptions } from './PodMatrixStore';\nexport type {\n MatrixClientEvent,\n MatrixCreateRoomRequest,\n MatrixEventRecord,\n MatrixRoomRecord,\n MatrixSendEventRequest,\n MatrixStore,\n MatrixStoreContext,\n MatrixSyncResponse,\n} from './types';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/matrix/index.ts"],"names":[],"mappings":";;;AAAA,mDAA8E;AAArE,gHAAA,cAAc,OAAA","sourcesContent":["export { PodMatrixStore, type PodMatrixStoreOptions } from './PodMatrixStore';\nexport type {\n MatrixAccountInfo,\n MatrixClientEvent,\n MatrixCreateRoomRequest,\n MatrixEventRecord,\n MatrixRoomRecord,\n MatrixSendEventRequest,\n MatrixStore,\n MatrixStoreContext,\n MatrixSyncResponse,\n} from './types';\n"]}
@@ -1,13 +1,19 @@
1
1
  import type { AuthContext } from '../auth/AuthContext';
2
+ import type { ReconcilerOwner } from '../reconciler';
2
3
  export interface MatrixStoreContext {
3
- userId: string;
4
+ /** Authenticated Solid WebID used as the Pod actor/resource owner. */
5
+ webId: string;
6
+ /** Storage Pod selected by the current SP/gateway, not necessarily the WebID issuer origin. */
7
+ podUrl?: string;
4
8
  auth?: AuthContext;
5
9
  }
6
10
  export interface MatrixRoomRecord {
7
11
  roomId: string;
12
+ canonicalAlias?: string;
8
13
  name?: string;
9
14
  topic?: string;
10
15
  creator: string;
16
+ reconcilerOwner: ReconcilerOwner;
11
17
  createdAt: number;
12
18
  }
13
19
  export interface MatrixEventRecord {
@@ -36,7 +42,6 @@ export interface MatrixCreateRoomRequest {
36
42
  content?: Record<string, unknown>;
37
43
  }>;
38
44
  preset?: string;
39
- is_direct?: boolean;
40
45
  }
41
46
  export interface MatrixSendEventRequest {
42
47
  body?: string;
@@ -55,6 +60,9 @@ export interface MatrixSyncResponse {
55
60
  limited: boolean;
56
61
  prev_batch?: string;
57
62
  };
63
+ 'co.undefineds.coordination'?: {
64
+ reconcilerOwner: ReconcilerOwner;
65
+ };
58
66
  }>;
59
67
  };
60
68
  }
@@ -68,13 +76,28 @@ export interface MatrixClientEvent {
68
76
  state_key?: string;
69
77
  unsigned?: Record<string, unknown>;
70
78
  }
79
+ export interface MatrixAccountInfo {
80
+ userId: string;
81
+ deviceId?: string;
82
+ displayName?: string;
83
+ avatarUrl?: string;
84
+ }
71
85
  export interface MatrixStore {
86
+ getAccount(context: MatrixStoreContext): Promise<MatrixAccountInfo>;
72
87
  createRoom(input: MatrixCreateRoomRequest, context: MatrixStoreContext): Promise<MatrixRoomRecord>;
88
+ joinRoom(roomIdOrAlias: string, context: MatrixStoreContext): Promise<{
89
+ roomId: string;
90
+ }>;
91
+ inviteUser(roomId: string, userId: string, context: MatrixStoreContext): Promise<void>;
92
+ leaveRoom(roomId: string, context: MatrixStoreContext): Promise<void>;
73
93
  sendEvent(roomId: string, eventType: string, txnId: string, content: MatrixSendEventRequest, context: MatrixStoreContext): Promise<MatrixEventRecord>;
94
+ setState(roomId: string, eventType: string, stateKey: string, content: Record<string, unknown>, context: MatrixStoreContext): Promise<MatrixEventRecord>;
74
95
  sync(context: MatrixStoreContext, options?: {
75
96
  since?: string;
76
97
  limit?: number;
77
98
  }): Promise<MatrixSyncResponse>;
99
+ listJoinedRooms(context: MatrixStoreContext): Promise<string[]>;
100
+ getMembers(roomId: string, context: MatrixStoreContext): Promise<MatrixClientEvent[]>;
78
101
  listMessages(roomId: string, context: MatrixStoreContext, options?: {
79
102
  limit?: number;
80
103
  dir?: 'b' | 'f';
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/matrix/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AuthContext } from '../auth/AuthContext';\n\nexport interface MatrixStoreContext {\n userId: string;\n auth?: AuthContext;\n}\n\nexport interface MatrixRoomRecord {\n roomId: string;\n name?: string;\n topic?: string;\n creator: string;\n createdAt: number;\n}\n\nexport interface MatrixEventRecord {\n eventId: string;\n roomId: string;\n type: string;\n sender: string;\n senderWebId?: string;\n originServerTs: number;\n depth?: number;\n txnId?: string;\n content: Record<string, unknown>;\n stateKey?: string;\n unsigned?: Record<string, unknown>;\n}\n\nexport interface MatrixCreateRoomRequest {\n visibility?: 'private' | 'public';\n room_alias_name?: string;\n name?: string;\n topic?: string;\n invite?: string[];\n creation_content?: Record<string, unknown>;\n initial_state?: Array<{\n type: string;\n state_key?: string;\n content?: Record<string, unknown>;\n }>;\n preset?: string;\n is_direct?: boolean;\n}\n\nexport interface MatrixSendEventRequest {\n body?: string;\n msgtype?: string;\n [key: string]: unknown;\n}\n\nexport interface MatrixSyncResponse {\n next_batch: string;\n rooms: {\n join: Record<string, {\n state: { events: MatrixClientEvent[] };\n timeline: {\n events: MatrixClientEvent[];\n limited: boolean;\n prev_batch?: string;\n };\n }>;\n };\n}\n\nexport interface MatrixClientEvent {\n event_id: string;\n room_id: string;\n type: string;\n sender: string;\n origin_server_ts: number;\n content: Record<string, unknown>;\n state_key?: string;\n unsigned?: Record<string, unknown>;\n}\n\nexport interface MatrixStore {\n createRoom(input: MatrixCreateRoomRequest, context: MatrixStoreContext): Promise<MatrixRoomRecord>;\n sendEvent(\n roomId: string,\n eventType: string,\n txnId: string,\n content: MatrixSendEventRequest,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord>;\n sync(context: MatrixStoreContext, options?: { since?: string; limit?: number }): Promise<MatrixSyncResponse>;\n listMessages(\n roomId: string,\n context: MatrixStoreContext,\n options?: { limit?: number; dir?: 'b' | 'f'; from?: string },\n ): Promise<{ chunk: MatrixClientEvent[]; start?: string; end: string }>;\n getEvent(roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixClientEvent>;\n getState(\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<Record<string, unknown>>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/matrix/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AuthContext } from '../auth/AuthContext';\nimport type { ReconcilerOwner } from '../reconciler';\n\nexport interface MatrixStoreContext {\n /** Authenticated Solid WebID used as the Pod actor/resource owner. */\n webId: string;\n /** Storage Pod selected by the current SP/gateway, not necessarily the WebID issuer origin. */\n podUrl?: string;\n auth?: AuthContext;\n}\n\nexport interface MatrixRoomRecord {\n roomId: string;\n canonicalAlias?: string;\n name?: string;\n topic?: string;\n creator: string;\n reconcilerOwner: ReconcilerOwner;\n createdAt: number;\n}\n\nexport interface MatrixEventRecord {\n eventId: string;\n roomId: string;\n type: string;\n sender: string;\n senderWebId?: string;\n originServerTs: number;\n depth?: number;\n txnId?: string;\n content: Record<string, unknown>;\n stateKey?: string;\n unsigned?: Record<string, unknown>;\n}\n\nexport interface MatrixCreateRoomRequest {\n visibility?: 'private' | 'public';\n room_alias_name?: string;\n name?: string;\n topic?: string;\n invite?: string[];\n creation_content?: Record<string, unknown>;\n initial_state?: Array<{\n type: string;\n state_key?: string;\n content?: Record<string, unknown>;\n }>;\n preset?: string;\n}\n\nexport interface MatrixSendEventRequest {\n body?: string;\n msgtype?: string;\n [key: string]: unknown;\n}\n\nexport interface MatrixSyncResponse {\n next_batch: string;\n rooms: {\n join: Record<string, {\n state: { events: MatrixClientEvent[] };\n timeline: {\n events: MatrixClientEvent[];\n limited: boolean;\n prev_batch?: string;\n };\n 'co.undefineds.coordination'?: {\n reconcilerOwner: ReconcilerOwner;\n };\n }>;\n };\n}\n\nexport interface MatrixClientEvent {\n event_id: string;\n room_id: string;\n type: string;\n sender: string;\n origin_server_ts: number;\n content: Record<string, unknown>;\n state_key?: string;\n unsigned?: Record<string, unknown>;\n}\n\nexport interface MatrixAccountInfo {\n userId: string;\n deviceId?: string;\n displayName?: string;\n avatarUrl?: string;\n}\n\nexport interface MatrixStore {\n getAccount(context: MatrixStoreContext): Promise<MatrixAccountInfo>;\n createRoom(input: MatrixCreateRoomRequest, context: MatrixStoreContext): Promise<MatrixRoomRecord>;\n joinRoom(roomIdOrAlias: string, context: MatrixStoreContext): Promise<{ roomId: string }>;\n inviteUser(roomId: string, userId: string, context: MatrixStoreContext): Promise<void>;\n leaveRoom(roomId: string, context: MatrixStoreContext): Promise<void>;\n sendEvent(\n roomId: string,\n eventType: string,\n txnId: string,\n content: MatrixSendEventRequest,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord>;\n setState(\n roomId: string,\n eventType: string,\n stateKey: string,\n content: Record<string, unknown>,\n context: MatrixStoreContext,\n ): Promise<MatrixEventRecord>;\n sync(context: MatrixStoreContext, options?: { since?: string; limit?: number }): Promise<MatrixSyncResponse>;\n listJoinedRooms(context: MatrixStoreContext): Promise<string[]>;\n getMembers(roomId: string, context: MatrixStoreContext): Promise<MatrixClientEvent[]>;\n listMessages(\n roomId: string,\n context: MatrixStoreContext,\n options?: { limit?: number; dir?: 'b' | 'f'; from?: string },\n ): Promise<{ chunk: MatrixClientEvent[]; start?: string; end: string }>;\n getEvent(roomId: string, eventId: string, context: MatrixStoreContext): Promise<MatrixClientEvent>;\n getState(\n roomId: string,\n eventType: string,\n stateKey: string,\n context: MatrixStoreContext,\n ): Promise<Record<string, unknown>>;\n}\n"]}
@@ -32,4 +32,5 @@ export declare class AuthMiddleware {
32
32
  */
33
33
  process(request: AuthenticatedRequest, response: ServerResponse): Promise<boolean>;
34
34
  private sendUnauthorized;
35
+ private safeContextForLog;
35
36
  }
@@ -31,7 +31,9 @@ class AuthMiddleware {
31
31
  }
32
32
  // Attempt authentication
33
33
  const result = await this.authenticator.authenticate(request);
34
- console.log(`[AuthMiddleware] ${request.method} ${request.url} - success: ${result.success}, error: ${result.error}, context: ${JSON.stringify(result.context)}`);
34
+ this.logger.debug(`Auth ${request.method} ${request.url} success=${result.success}` +
35
+ (result.error ? ` error=${result.error}` : '') +
36
+ (result.context ? ` context=${JSON.stringify(this.safeContextForLog(result.context))}` : ''));
35
37
  if (!result.success) {
36
38
  this.sendUnauthorized(response, result.error ?? 'Authentication failed');
37
39
  return false;
@@ -46,6 +48,16 @@ class AuthMiddleware {
46
48
  response.setHeader('WWW-Authenticate', 'Bearer, DPoP');
47
49
  response.end(JSON.stringify({ error: 'Unauthorized', message }));
48
50
  }
51
+ safeContextForLog(context) {
52
+ return {
53
+ type: context.type,
54
+ webId: context.webId,
55
+ accountId: context.accountId,
56
+ clientId: context.clientId,
57
+ tokenType: context.tokenType,
58
+ viaApiKey: context.viaApiKey,
59
+ };
60
+ }
49
61
  }
50
62
  exports.AuthMiddleware = AuthMiddleware;
51
63
  //# sourceMappingURL=AuthMiddleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthMiddleware.js","sourceRoot":"","sources":["../../../src/api/middleware/AuthMiddleware.ts"],"names":[],"mappings":";;;AACA,iEAAqD;AAmBrD;;GAEG;AACH,MAAa,cAAc;IAKzB,YAAmB,OAA8B;QAJhC,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAK3C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,IAAY;QAC9B,0CAA0C;QAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,OAAO,CAAC,OAA6B,EAAE,QAAwB;QAC1E,iCAAiC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE9D,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,eAAe,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,KAAK,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAElK,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,IAAI,uBAAuB,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,iCAAiC;QACjC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,gBAAgB,CAAC,QAAwB,EAAE,OAAe;QAChE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;QAC1B,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACvD,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;QACvD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;CACF;AAnDD,wCAmDC","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { Authenticator } from '../auth/Authenticator';\nimport type { AuthContext } from '../auth/AuthContext';\n\n/**\n * Extended request with auth context\n */\nexport interface AuthenticatedRequest extends IncomingMessage {\n auth?: AuthContext;\n}\n\nexport interface AuthMiddlewareOptions {\n authenticator: Authenticator;\n /**\n * Paths that do not require authentication\n */\n publicPaths?: string[];\n}\n\n/**\n * Middleware that handles authentication for API requests\n */\nexport class AuthMiddleware {\n private readonly logger = getLoggerFor(this);\n private readonly authenticator: Authenticator;\n private readonly publicPaths: Set<string>;\n\n public constructor(options: AuthMiddlewareOptions) {\n this.authenticator = options.authenticator;\n this.publicPaths = new Set(options.publicPaths ?? []);\n }\n\n /**\n * Check if a path is public (does not require authentication)\n */\n public isPublicPath(path: string): boolean {\n // Normalize path by removing query string\n const normalizedPath = path.split('?')[0];\n return this.publicPaths.has(normalizedPath);\n }\n\n /**\n * Process the request, adding auth context if authenticated\n * Returns true if request should continue, false if response was sent\n */\n public async process(request: AuthenticatedRequest, response: ServerResponse): Promise<boolean> {\n // Check for authorization header\n if (!request.headers.authorization) {\n this.sendUnauthorized(response, 'Authentication required');\n return false;\n }\n\n // Attempt authentication\n const result = await this.authenticator.authenticate(request);\n\n console.log(`[AuthMiddleware] ${request.method} ${request.url} - success: ${result.success}, error: ${result.error}, context: ${JSON.stringify(result.context)}`);\n\n if (!result.success) {\n this.sendUnauthorized(response, result.error ?? 'Authentication failed');\n return false;\n }\n\n // Attach auth context to request\n request.auth = result.context;\n return true;\n }\n\n private sendUnauthorized(response: ServerResponse, message: string): void {\n response.statusCode = 401;\n response.setHeader('Content-Type', 'application/json');\n response.setHeader('WWW-Authenticate', 'Bearer, DPoP');\n response.end(JSON.stringify({ error: 'Unauthorized', message }));\n }\n}\n"]}
1
+ {"version":3,"file":"AuthMiddleware.js","sourceRoot":"","sources":["../../../src/api/middleware/AuthMiddleware.ts"],"names":[],"mappings":";;;AACA,iEAAqD;AAmBrD;;GAEG;AACH,MAAa,cAAc;IAKzB,YAAmB,OAA8B;QAJhC,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAK3C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,IAAY;QAC9B,0CAA0C;QAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,OAAO,CAAC,OAA6B,EAAE,QAAwB;QAC1E,iCAAiC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,QAAQ,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,YAAY,MAAM,CAAC,OAAO,EAAE;YACjE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7F,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,IAAI,uBAAuB,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,iCAAiC;QACjC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,gBAAgB,CAAC,QAAwB,EAAE,OAAe;QAChE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;QAC1B,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACvD,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;QACvD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,iBAAiB,CAAC,OAAoB;QAC5C,OAAO;YACL,IAAI,EAAG,OAAe,CAAC,IAAI;YAC3B,KAAK,EAAG,OAAe,CAAC,KAAK;YAC7B,SAAS,EAAG,OAAe,CAAC,SAAS;YACrC,QAAQ,EAAG,OAAe,CAAC,QAAQ;YACnC,SAAS,EAAG,OAAe,CAAC,SAAS;YACrC,SAAS,EAAG,OAAe,CAAC,SAAS;SACtC,CAAC;IACJ,CAAC;CACF;AAlED,wCAkEC","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { Authenticator } from '../auth/Authenticator';\nimport type { AuthContext } from '../auth/AuthContext';\n\n/**\n * Extended request with auth context\n */\nexport interface AuthenticatedRequest extends IncomingMessage {\n auth?: AuthContext;\n}\n\nexport interface AuthMiddlewareOptions {\n authenticator: Authenticator;\n /**\n * Paths that do not require authentication\n */\n publicPaths?: string[];\n}\n\n/**\n * Middleware that handles authentication for API requests\n */\nexport class AuthMiddleware {\n private readonly logger = getLoggerFor(this);\n private readonly authenticator: Authenticator;\n private readonly publicPaths: Set<string>;\n\n public constructor(options: AuthMiddlewareOptions) {\n this.authenticator = options.authenticator;\n this.publicPaths = new Set(options.publicPaths ?? []);\n }\n\n /**\n * Check if a path is public (does not require authentication)\n */\n public isPublicPath(path: string): boolean {\n // Normalize path by removing query string\n const normalizedPath = path.split('?')[0];\n return this.publicPaths.has(normalizedPath);\n }\n\n /**\n * Process the request, adding auth context if authenticated\n * Returns true if request should continue, false if response was sent\n */\n public async process(request: AuthenticatedRequest, response: ServerResponse): Promise<boolean> {\n // Check for authorization header\n if (!request.headers.authorization) {\n this.sendUnauthorized(response, 'Authentication required');\n return false;\n }\n\n // Attempt authentication\n const result = await this.authenticator.authenticate(request);\n\n this.logger.debug(\n `Auth ${request.method} ${request.url} success=${result.success}` +\n (result.error ? ` error=${result.error}` : '') +\n (result.context ? ` context=${JSON.stringify(this.safeContextForLog(result.context))}` : ''),\n );\n\n if (!result.success) {\n this.sendUnauthorized(response, result.error ?? 'Authentication failed');\n return false;\n }\n\n // Attach auth context to request\n request.auth = result.context;\n return true;\n }\n\n private sendUnauthorized(response: ServerResponse, message: string): void {\n response.statusCode = 401;\n response.setHeader('Content-Type', 'application/json');\n response.setHeader('WWW-Authenticate', 'Bearer, DPoP');\n response.end(JSON.stringify({ error: 'Unauthorized', message }));\n }\n\n private safeContextForLog(context: AuthContext): Record<string, unknown> {\n return {\n type: (context as any).type,\n webId: (context as any).webId,\n accountId: (context as any).accountId,\n clientId: (context as any).clientId,\n tokenType: (context as any).tokenType,\n viaApiKey: (context as any).viaApiKey,\n };\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export type ProtocolMetadata = Record<string, unknown>;
2
+ export declare function getProtocolMetadata(metadata: ProtocolMetadata | null | undefined, namespace: string): ProtocolMetadata | undefined;
3
+ export declare function withProtocolMetadata(metadata: ProtocolMetadata | null | undefined, namespace: string, values: ProtocolMetadata): ProtocolMetadata;
4
+ export declare function withoutProtocolProjectionKeys(metadata: ProtocolMetadata | null | undefined, keys: readonly string[]): ProtocolMetadata | undefined;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProtocolMetadata = getProtocolMetadata;
4
+ exports.withProtocolMetadata = withProtocolMetadata;
5
+ exports.withoutProtocolProjectionKeys = withoutProtocolProjectionKeys;
6
+ const PROTOCOL_METADATA_KEY = 'protocols';
7
+ function isRecord(value) {
8
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
9
+ }
10
+ function definedEntries(values) {
11
+ return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== undefined));
12
+ }
13
+ function getProtocolMetadata(metadata, namespace) {
14
+ if (!metadata) {
15
+ return undefined;
16
+ }
17
+ const protocols = metadata[PROTOCOL_METADATA_KEY];
18
+ if (Array.isArray(protocols)) {
19
+ const merged = protocols.reduce((acc, entry) => {
20
+ if (!isRecord(entry)) {
21
+ return acc;
22
+ }
23
+ const namespaced = entry[namespace];
24
+ return isRecord(namespaced) ? { ...acc, ...namespaced } : acc;
25
+ }, {});
26
+ return Object.keys(merged).length > 0 ? merged : undefined;
27
+ }
28
+ if (isRecord(protocols)) {
29
+ const namespaced = protocols[namespace];
30
+ return isRecord(namespaced) ? namespaced : undefined;
31
+ }
32
+ return undefined;
33
+ }
34
+ function withProtocolMetadata(metadata, namespace, values) {
35
+ const base = metadata ?? {};
36
+ const protocols = isRecord(base[PROTOCOL_METADATA_KEY])
37
+ ? base[PROTOCOL_METADATA_KEY]
38
+ : {};
39
+ const current = isRecord(protocols[namespace])
40
+ ? protocols[namespace]
41
+ : {};
42
+ const next = definedEntries(values);
43
+ return {
44
+ ...base,
45
+ [PROTOCOL_METADATA_KEY]: {
46
+ ...protocols,
47
+ [namespace]: {
48
+ ...current,
49
+ ...next,
50
+ },
51
+ },
52
+ };
53
+ }
54
+ function withoutProtocolProjectionKeys(metadata, keys) {
55
+ if (!metadata) {
56
+ return undefined;
57
+ }
58
+ const result = { ...metadata };
59
+ for (const key of keys) {
60
+ delete result[key];
61
+ }
62
+ return Object.keys(result).length > 0 ? result : undefined;
63
+ }
64
+ //# sourceMappingURL=protocol-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-metadata.js","sourceRoot":"","sources":["../../src/api/protocol-metadata.ts"],"names":[],"mappings":"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","sourcesContent":["export type ProtocolMetadata = Record<string, unknown>;\n\nconst PROTOCOL_METADATA_KEY = 'protocols';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction definedEntries(values: ProtocolMetadata): ProtocolMetadata {\n return Object.fromEntries(\n Object.entries(values).filter(([, value]) => value !== undefined),\n );\n}\n\nexport function getProtocolMetadata(\n metadata: ProtocolMetadata | null | undefined,\n namespace: string,\n): ProtocolMetadata | undefined {\n if (!metadata) {\n return undefined;\n }\n\n const protocols = metadata[PROTOCOL_METADATA_KEY];\n if (Array.isArray(protocols)) {\n const merged = protocols.reduce<ProtocolMetadata>((acc, entry) => {\n if (!isRecord(entry)) {\n return acc;\n }\n const namespaced = entry[namespace];\n return isRecord(namespaced) ? { ...acc, ...namespaced } : acc;\n }, {});\n return Object.keys(merged).length > 0 ? merged : undefined;\n }\n\n if (isRecord(protocols)) {\n const namespaced = protocols[namespace];\n return isRecord(namespaced) ? namespaced : undefined;\n }\n\n return undefined;\n}\n\nexport function withProtocolMetadata(\n metadata: ProtocolMetadata | null | undefined,\n namespace: string,\n values: ProtocolMetadata,\n): ProtocolMetadata {\n const base = metadata ?? {};\n const protocols = isRecord(base[PROTOCOL_METADATA_KEY])\n ? base[PROTOCOL_METADATA_KEY] as ProtocolMetadata\n : {};\n const current = isRecord(protocols[namespace])\n ? protocols[namespace] as ProtocolMetadata\n : {};\n const next = definedEntries(values);\n\n return {\n ...base,\n [PROTOCOL_METADATA_KEY]: {\n ...protocols,\n [namespace]: {\n ...current,\n ...next,\n },\n },\n };\n}\n\nexport function withoutProtocolProjectionKeys(\n metadata: ProtocolMetadata | null | undefined,\n keys: readonly string[],\n): ProtocolMetadata | undefined {\n if (!metadata) {\n return undefined;\n }\n\n const result = { ...metadata };\n for (const key of keys) {\n delete result[key];\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { type ClientCapability, type ClientKind, type ClientReconcilerLease } from './coordination';
2
+ export declare const DEFAULT_CLIENT_RECONCILER_HEARTBEAT_TTL_MS = 45000;
3
+ export declare const DEFAULT_CLIENT_RECONCILER_LEASE_TTL_MS = 30000;
4
+ export interface ClientReconcilerCoordinatorOptions {
5
+ redisUrl?: string;
6
+ now?: () => Date;
7
+ heartbeatTtlMs?: number;
8
+ leaseTtlMs?: number;
9
+ namespace?: string;
10
+ }
11
+ export interface UpsertClientCapabilityInput {
12
+ clientId: string;
13
+ kind: ClientKind;
14
+ user: string;
15
+ canCoordinateClientOwnedThread?: boolean;
16
+ canRunAgent?: boolean;
17
+ workspaces?: string[];
18
+ heartbeatAt?: string;
19
+ }
20
+ export interface ActivateClientReconcilerLeaseInput {
21
+ thread: string;
22
+ ownerUser: string;
23
+ requesterClientId?: string;
24
+ }
25
+ export interface ReleaseClientReconcilerLeaseInput {
26
+ thread: string;
27
+ ownerUser: string;
28
+ clientId: string;
29
+ }
30
+ export declare class ClientReconcilerCoordinator {
31
+ private readonly now;
32
+ private readonly heartbeatTtlMs;
33
+ private readonly leaseTtlMs;
34
+ private readonly backend;
35
+ constructor(options?: ClientReconcilerCoordinatorOptions);
36
+ upsertClientCapability(input: UpsertClientCapabilityInput): Promise<ClientCapability>;
37
+ listClientCapabilities(user: string): Promise<ClientCapability[]>;
38
+ activate(input: ActivateClientReconcilerLeaseInput): Promise<ClientReconcilerLease | undefined>;
39
+ getLease(thread: string): Promise<ClientReconcilerLease | undefined>;
40
+ releaseLease(input: ReleaseClientReconcilerLeaseInput): Promise<boolean>;
41
+ close(): Promise<void>;
42
+ }