@undefineds.co/xpod 0.3.31 → 0.3.33
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.
- package/dist/api/auth/AuthContext.d.ts +3 -2
- package/dist/api/auth/AuthContext.js +2 -1
- package/dist/api/auth/AuthContext.js.map +1 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +2 -12
- package/dist/api/auth/ClientCredentialsAuthenticator.js +4 -4
- package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
- package/dist/api/auth/ServiceTokenAuthenticator.d.ts +2 -2
- package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -1
- package/dist/api/chatkit/pod-store.d.ts +3 -0
- package/dist/api/chatkit/pod-store.js +93 -59
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/schema.d.ts +5 -6
- package/dist/api/container/business-token.d.ts +1 -1
- package/dist/api/container/business-token.js +5 -1
- package/dist/api/container/business-token.js.map +1 -1
- package/dist/api/container/common.js +14 -10
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/routes.js +16 -3
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +2 -4
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/ChatHandler.d.ts +1 -1
- package/dist/api/handlers/ChatHandler.js +1 -1
- package/dist/api/handlers/ChatHandler.js.map +1 -1
- package/dist/api/handlers/EdgeNodeSignalHandler.js +3 -1
- package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -1
- package/dist/api/handlers/PodManagementHandler.d.ts +2 -0
- package/dist/api/handlers/PodManagementHandler.js +114 -12
- package/dist/api/handlers/PodManagementHandler.js.map +1 -1
- package/dist/api/handlers/ProvisionHandler.d.ts +27 -0
- package/dist/api/handlers/ProvisionHandler.js +339 -32
- package/dist/api/handlers/ProvisionHandler.js.map +1 -1
- package/dist/api/handlers/QuotaHandler.js +0 -12
- package/dist/api/handlers/QuotaHandler.js.map +1 -1
- package/dist/api/handlers/index.d.ts +0 -1
- package/dist/api/handlers/index.js +0 -1
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/matrix/PodMatrixStore.js +26 -21
- package/dist/api/matrix/PodMatrixStore.js.map +1 -1
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
- package/dist/api/runs/schema.d.ts +5 -7
- package/dist/api/runs/store.js +6 -4
- package/dist/api/runs/store.js.map +1 -1
- package/dist/api/runtime.js +3 -3
- package/dist/api/runtime.js.map +1 -1
- package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
- package/dist/api/tasks/schema.d.ts +17 -13
- package/dist/api/tasks/schema.js +7 -2
- package/dist/api/tasks/schema.js.map +1 -1
- package/dist/api/tasks/store.js +1 -2
- package/dist/api/tasks/store.js.map +1 -1
- package/dist/components/context.jsonld +12 -0
- package/dist/edge/EdgeNodeAgent.d.ts +1 -1
- package/dist/edge/EdgeNodeAgent.js +1 -1
- package/dist/edge/EdgeNodeAgent.js.map +1 -1
- package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -0
- package/dist/edge/EdgeNodeDnsCoordinator.js +9 -3
- package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
- package/dist/edge/EdgeNodeDnsCoordinator.jsonld +4 -0
- package/dist/edge/EdgeNodeHealthProbeService.d.ts +3 -0
- package/dist/edge/EdgeNodeHealthProbeService.js +22 -2
- package/dist/edge/EdgeNodeHealthProbeService.js.map +1 -1
- package/dist/edge/EdgeNodeHealthProbeService.jsonld +12 -0
- package/dist/http/ClusterIngressRouter.js +6 -3
- package/dist/http/ClusterIngressRouter.js.map +1 -1
- package/dist/http/ClusterWebSocketConfigurator.js +6 -2
- package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
- package/dist/http/EdgeNodeDirectDebugHttpHandler.d.ts +2 -0
- package/dist/http/EdgeNodeDirectDebugHttpHandler.js +18 -3
- package/dist/http/EdgeNodeDirectDebugHttpHandler.js.map +1 -1
- package/dist/http/EdgeNodeDirectDebugHttpHandler.jsonld +8 -0
- package/dist/http/EdgeNodeProxyHttpHandler.js +6 -2
- package/dist/http/EdgeNodeProxyHttpHandler.js.map +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.d.ts +2 -2
- package/dist/http/cluster/PodMigrationHttpHandler.js +2 -2
- package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
- package/dist/http/quota/QuotaAdminHttpHandler.js +27 -21
- package/dist/http/quota/QuotaAdminHttpHandler.js.map +1 -1
- package/dist/http/search/SearchHttpHandler.js +2 -2
- package/dist/http/search/SearchHttpHandler.js.map +1 -1
- package/dist/identity/drizzle/AccountRepository.d.ts +4 -22
- package/dist/identity/drizzle/AccountRepository.js +9 -113
- package/dist/identity/drizzle/AccountRepository.js.map +1 -1
- package/dist/identity/drizzle/AccountRoleRepository.d.ts +5 -5
- package/dist/identity/drizzle/AccountRoleRepository.js +204 -97
- package/dist/identity/drizzle/AccountRoleRepository.js.map +1 -1
- package/dist/identity/drizzle/DdnsRepository.d.ts +5 -20
- package/dist/identity/drizzle/DdnsRepository.js +13 -49
- package/dist/identity/drizzle/DdnsRepository.js.map +1 -1
- package/dist/identity/drizzle/EdgeNodeRepository.d.ts +13 -6
- package/dist/identity/drizzle/EdgeNodeRepository.js +167 -66
- package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
- package/dist/identity/drizzle/PodLookupRepository.d.ts +7 -36
- package/dist/identity/drizzle/PodLookupRepository.js +103 -126
- package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
- package/dist/identity/drizzle/ServiceTokenRepository.d.ts +13 -1
- package/dist/identity/drizzle/ServiceTokenRepository.js +7 -0
- package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -1
- package/dist/identity/drizzle/db.d.ts +2 -1
- package/dist/identity/drizzle/db.js +173 -297
- package/dist/identity/drizzle/db.js.map +1 -1
- package/dist/identity/drizzle/schema.pg.d.ts +3 -11
- package/dist/identity/drizzle/schema.pg.js +10 -45
- package/dist/identity/drizzle/schema.pg.js.map +1 -1
- package/dist/identity/drizzle/schema.sqlite.d.ts +88 -531
- package/dist/identity/drizzle/schema.sqlite.js +13 -46
- package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
- package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +3 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.js +18 -6
- package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -1
- package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +22 -0
- package/dist/provision/ProvisionCodeCodec.js +10 -1
- package/dist/provision/ProvisionCodeCodec.js.map +1 -1
- package/dist/provision/ProvisionPodCreator.d.ts +8 -2
- package/dist/provision/ProvisionPodCreator.js +134 -41
- package/dist/provision/ProvisionPodCreator.js.map +1 -1
- package/dist/provision/ProvisionPodCreator.jsonld +38 -3
- package/dist/quota/DrizzleQuotaService.d.ts +0 -4
- package/dist/quota/DrizzleQuotaService.js +1 -21
- package/dist/quota/DrizzleQuotaService.js.map +1 -1
- package/dist/quota/DrizzleQuotaService.jsonld +0 -16
- package/dist/quota/NoopQuotaService.d.ts +0 -4
- package/dist/quota/NoopQuotaService.js +0 -8
- package/dist/quota/NoopQuotaService.js.map +1 -1
- package/dist/quota/NoopQuotaService.jsonld +0 -16
- package/dist/quota/QuotaService.d.ts +0 -4
- package/dist/quota/QuotaService.js.map +1 -1
- package/dist/quota/QuotaService.jsonld +0 -16
- package/dist/service/EdgeNodeSignalClient.d.ts +0 -2
- package/dist/service/EdgeNodeSignalClient.js +0 -4
- package/dist/service/EdgeNodeSignalClient.js.map +1 -1
- package/dist/service/PodMigrationService.d.ts +2 -2
- package/dist/service/PodMigrationService.js +4 -4
- package/dist/service/PodMigrationService.js.map +1 -1
- package/dist/setup/LocalSetupServiceTokenRepository.d.ts +22 -0
- package/dist/setup/LocalSetupServiceTokenRepository.js +68 -0
- package/dist/setup/LocalSetupServiceTokenRepository.js.map +1 -0
- package/dist/storage/quota/PerAccountQuotaStrategy.js +2 -2
- package/dist/storage/quota/PerAccountQuotaStrategy.js.map +1 -1
- package/dist/storage/quota/UsageRepository.d.ts +10 -32
- package/dist/storage/quota/UsageRepository.js +84 -281
- package/dist/storage/quota/UsageRepository.js.map +1 -1
- package/dist/storage/vector/VectorIndexingListener.js +2 -2
- package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
- package/dist/subdomain/SubdomainService.d.ts +1 -1
- package/dist/subdomain/SubdomainService.js +1 -1
- package/dist/subdomain/SubdomainService.js.map +1 -1
- package/dist/subdomain/SubdomainService.jsonld +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/exact-records.d.ts +21 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/exact-records.d.ts.map +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/exact-records.js +85 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/exact-records.js.map +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/default-id-template.d.ts +10 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/default-id-template.d.ts.map +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/default-id-template.js +365 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/default-id-template.js.map +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/index.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/index.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/index.js +3 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/index.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js +5 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/repository.d.ts +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/repository.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/repository.js +2 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/repository.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts +18 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js +234 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts +13 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js +19 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/exact-records.d.ts +21 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/exact-records.d.ts.map +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/exact-records.js +78 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/exact-records.js.map +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/default-id-template.d.ts +10 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/default-id-template.d.ts.map +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/default-id-template.js +362 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/default-id-template.js.map +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/index.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/index.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/index.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/index.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js +5 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/repository.d.ts +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/repository.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/repository.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/repository.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts +18 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js +225 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts +13 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js +19 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/index.d.ts +5 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/index.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/index.js +4 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/index.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/index.d.ts +5 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/index.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/index.js +20 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/index.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
- package/package.json +3 -3
- package/dist/api/handlers/ApiKeyHandler.d.ts +0 -15
- package/dist/api/handlers/ApiKeyHandler.js +0 -153
- package/dist/api/handlers/ApiKeyHandler.js.map +0 -1
- package/dist/api/store/DrizzleClientCredentialsStore.d.ts +0 -51
- package/dist/api/store/DrizzleClientCredentialsStore.js +0 -115
- package/dist/api/store/DrizzleClientCredentialsStore.js.map +0 -1
|
@@ -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 surfaceId?: string | null;\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 commandKind: 'chat',\n surfaceId: this.surfaceIdFromRoomId(roomId),\n chat: chatId,\n title: input.name ?? roomId,\n status: 'active',\n metadata: { protocol: 'matrix', roomId },\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);\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, {\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, {\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);\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);\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);\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 commandKind: 'chat',\n surfaceId: this.surfaceIdFromRoomId(input.roomId),\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 },\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 options: {\n sinceTs?: number;\n beforeOrAtTs?: number;\n limit?: number;\n newestFirst?: boolean;\n } = {},\n ): Promise<MatrixEventRecord[]> {\n const conditions = [\n eq(messageResource.surfaceId, this.surfaceIdFromRoomId(roomId)),\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): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId);\n return records.find((record) => record.txnId === txnId);\n }\n\n private async findEventById(db: Db, roomId: string, eventId: string): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId);\n return records.find((record) => record.eventId === eventId);\n }\n\n private async nextEventDepth(db: Db, roomId: string): Promise<number> {\n const records = await this.listEvents(db, roomId);\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 ): Promise<MatrixEventRecord | undefined> {\n const records = await this.listEvents(db, roomId, { 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":"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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"]}
|
|
@@ -147,7 +147,7 @@ export declare class InngestRunExecutionBackend implements RunExecutionBackend {
|
|
|
147
147
|
readonly event: "xpod/run.continue_requested";
|
|
148
148
|
}], Omit<Omit<import("inngest").BaseContext<Inngest.Any>, never> & Record<never, never> & {
|
|
149
149
|
logger: import("inngest").Logger;
|
|
150
|
-
}, "group" | "requestId" | "
|
|
150
|
+
}, "group" | "requestId" | "event" | "runId" | "step" | "defer" | "events" | "jobId" | "attempt" | "maxAttempts"> & import("inngest").FailureEventArgs<EventPayload<any>> & {
|
|
151
151
|
step: {
|
|
152
152
|
sendEvent: (idOrOptions: import("inngest").StepOptionsOrId, payload: import("inngest").SendEventPayload) => Promise<import("inngest/types").SendEventOutput<import("inngest").ClientOptionsFromInngest<Inngest<import("inngest").ClientOptions>>>>;
|
|
153
153
|
waitForSignal: <TData>(idOrOptions: import("inngest").StepOptionsOrId, opts: {
|
|
@@ -318,7 +318,7 @@ export declare class InngestRunExecutionBackend implements RunExecutionBackend {
|
|
|
318
318
|
readonly event: "xpod/run.continue_requested";
|
|
319
319
|
}], Omit<Omit<import("inngest").BaseContext<Inngest.Any>, never> & Record<never, never> & {
|
|
320
320
|
logger: import("inngest").Logger;
|
|
321
|
-
}, "group" | "requestId" | "
|
|
321
|
+
}, "group" | "requestId" | "event" | "runId" | "step" | "defer" | "events" | "jobId" | "attempt" | "maxAttempts"> & import("inngest").FailureEventArgs<EventPayload<any>> & {
|
|
322
322
|
step: {
|
|
323
323
|
sendEvent: (idOrOptions: import("inngest").StepOptionsOrId, payload: import("inngest").SendEventPayload) => Promise<import("inngest/types").SendEventOutput<import("inngest").ClientOptionsFromInngest<Inngest<import("inngest").ClientOptions>>>>;
|
|
324
324
|
waitForSignal: <TData>(idOrOptions: import("inngest").StepOptionsOrId, opts: {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { RunStatus, RunStepType, type RunRow, type RunStatusType, type RunStepRow, type RunStepTypeValue } from '@undefineds.co/models';
|
|
2
2
|
export declare const Run: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
3
3
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
4
|
-
commandKind: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
5
|
-
surfaceId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
6
4
|
task: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
5
|
+
delivery: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
6
|
+
trigger: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
7
|
+
input: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
7
8
|
thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
|
|
8
9
|
workspace: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
|
|
9
10
|
status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
@@ -23,13 +24,10 @@ export declare const Run: import("@undefineds.co/drizzle-solid/dist/core/schema"
|
|
|
23
24
|
}>>;
|
|
24
25
|
export declare const RunStep: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
25
26
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
26
|
-
commandKind: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
27
|
-
surfaceId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
28
|
-
runId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
29
27
|
run: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
|
|
30
|
-
|
|
28
|
+
stepType: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
31
29
|
message: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
32
|
-
|
|
30
|
+
payload: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"object", null, false, false>;
|
|
33
31
|
createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
|
|
34
32
|
}>>;
|
|
35
33
|
export { RunStatus, RunStepType };
|
package/dist/api/runs/store.js
CHANGED
|
@@ -13,7 +13,6 @@ exports.buildRunResourceId = buildRunResourceId;
|
|
|
13
13
|
exports.buildRunStepResourceId = buildRunStepResourceId;
|
|
14
14
|
exports.resolveRunUrn = resolveRunUrn;
|
|
15
15
|
exports.resolveDataResource = resolveDataResource;
|
|
16
|
-
const models_1 = require("@undefineds.co/models");
|
|
17
16
|
function isClaimableRunStatus(status) {
|
|
18
17
|
return status === 'queued' || status === 'running';
|
|
19
18
|
}
|
|
@@ -68,7 +67,8 @@ function generateRunResourceId(input) {
|
|
|
68
67
|
throw new Error(`Run id generator requires a local key, got resource id: ${input.key}`);
|
|
69
68
|
}
|
|
70
69
|
assertLocalKey(input.key, 'Run id generator');
|
|
71
|
-
|
|
70
|
+
const { yyyy, MM, dd } = datePathFromTimestamp(input.createdAt);
|
|
71
|
+
return `${input.commandKind}/${input.surfaceId}/${yyyy}/${MM}/${dd}/runs.ttl#${input.key}`;
|
|
72
72
|
}
|
|
73
73
|
function generateRunStepResourceId(input) {
|
|
74
74
|
if (isBaseRelativeResourceId(input.key)) {
|
|
@@ -76,9 +76,11 @@ function generateRunStepResourceId(input) {
|
|
|
76
76
|
}
|
|
77
77
|
assertLocalKey(input.key, 'RunStep id generator');
|
|
78
78
|
if (input.runId && isRunResourceId(input.runId)) {
|
|
79
|
-
|
|
79
|
+
const runDoc = input.runId.slice(0, input.runId.lastIndexOf('#'));
|
|
80
|
+
return `${runDoc}#${input.key}`;
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
+
const { yyyy, MM, dd } = datePathFromTimestamp(input.createdAt);
|
|
83
|
+
return `${input.commandKind}/${input.surfaceId}/${yyyy}/${MM}/${dd}/runs.ttl#${input.key}`;
|
|
82
84
|
}
|
|
83
85
|
function buildRunResourceId(input) {
|
|
84
86
|
void input.commandKind;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/api/runs/store.ts"],"names":[],"mappings":";;AAiEA,oDAEC;AAED,8CAKC;AAED,kCAWC;AAED,4DAKC;AAED,0CAGC;AAYD,wDASC;AAED,sDAOC;AAED,sDAWC;AAED,8DAiBC;AAED,gDAaC;AAED,wDAeC;AAED,sCAEC;AAED,kDAUC;AAhND,kDAAyE;AAgEzE,SAAgB,oBAAoB,CAAC,MAA+B;IAClE,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,CAAC;AACrD,CAAC;AAED,SAAgB,iBAAiB,CAC/B,GAAyD,EACzD,GAAW;IAEX,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;AACnF,CAAC;AAED,SAAgB,WAAW,CACzB,GAAoE,EACpE,KAGC;IAED,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC;AACnF,CAAC;AAED,SAAgB,wBAAwB,CAAC,KAAgC;IACvE,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3F,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,eAAe,CAAC,KAAgC;IAC9D,OAAO,wBAAwB,CAAC,KAAK,CAAC;WACjC,6DAA6D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa;IAClD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5F,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,UAAkB;IACvD,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,OAAO,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;QAC1D,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAED,SAAgB,qBAAqB,CAAC,SAA6B;IACjE,MAAM,IAAI,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACrF,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QACnD,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAgB,qBAAqB,CAAC,KAKrC;IACC,IAAI,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,2DAA2D,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC9C,OAAO,IAAA,sBAAa,EAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,yBAAyB,CAAC,KAMzC;IACC,IAAI,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,+DAA+D,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAElD,IAAI,KAAK,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,IAAA,0BAAiB,EAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,IAAA,0BAAiB,EAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAKlC;IACC,KAAK,KAAK,CAAC,WAAW,CAAC;IACvB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,8CAA8C,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,SAAgB,sBAAsB,CAAC,KAMtC;IACC,KAAK,KAAK,CAAC,KAAK,CAAC;IACjB,KAAK,KAAK,CAAC,WAAW,CAAC;IACvB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,sDAAsD,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAO,gBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,SAAgB,mBAAmB,CAAC,UAAkB,EAAE,UAAkB;IACxE,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,IAAI,UAAU,QAAQ,EAAE,CAAC;AACrC,CAAC","sourcesContent":["import type { WorkspaceRef } from '../workspace/types';\nimport { runResourceId, runStepResourceId } from '@undefineds.co/models';\nimport type { RunStatusType, RunStepTypeValue } from './schema';\n\nexport interface RunRecordData {\n /** Base-relative Solid resource id, e.g. `chat/default/2026/05/18/runs.ttl#run_x`. */\n id: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n task?: string;\n thread: string;\n workspace: WorkspaceRef;\n status: RunStatusType;\n runner: string;\n prompt?: string;\n externalRunId?: string;\n leaseOwner?: string;\n leaseExpiresAt?: number;\n heartbeatAt?: number;\n cancelRequestedAt?: number;\n error?: string;\n metadata?: Record<string, unknown>;\n createdAt: number;\n startedAt?: number;\n completedAt?: number;\n updatedAt: number;\n}\n\nexport interface RunStepRecordData {\n /** Base-relative Solid resource id, e.g. `chat/default/2026/05/18/runs.ttl#step_x`. */\n id: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n /** Denormalized Run resource id for lookup; semantic relation is `run`. */\n runId: string;\n run: string;\n type: RunStepTypeValue | string;\n message?: string;\n data?: Record<string, unknown>;\n createdAt: number;\n}\n\nexport interface RunListOptions {\n task?: string;\n thread?: string;\n workspace?: WorkspaceRef;\n commandKind?: 'chat' | 'task';\n status?: RunStatusType;\n limit?: number;\n}\n\nexport interface RunStore<TContext> {\n saveRun(run: RunRecordData, context: TContext): Promise<void>;\n loadRun(id: string, context: TContext): Promise<RunRecordData>;\n listRuns(options: RunListOptions, context: TContext): Promise<RunRecordData[]>;\n appendRunStep(event: RunStepRecordData, context: TContext): Promise<void>;\n loadRunSteps(runId: string, context: TContext): Promise<RunStepRecordData[]>;\n claimRun?(input: {\n runId: string;\n leaseOwner: string;\n leaseExpiresAt: number;\n now: number;\n }, context: TContext): Promise<RunRecordData | undefined>;\n}\n\nexport function isClaimableRunStatus(status: RunRecordData['status']): boolean {\n return status === 'queued' || status === 'running';\n}\n\nexport function hasActiveRunLease(\n run: Pick<RunRecordData, 'leaseOwner' | 'leaseExpiresAt'>,\n now: number,\n): boolean {\n return Boolean(run.leaseOwner && run.leaseExpiresAt && run.leaseExpiresAt > now);\n}\n\nexport function canClaimRun(\n run: Pick<RunRecordData, 'status' | 'leaseOwner' | 'leaseExpiresAt'>,\n input: {\n leaseOwner: string;\n now: number;\n },\n): boolean {\n if (!isClaimableRunStatus(run.status)) {\n return false;\n }\n return !hasActiveRunLease(run, input.now) || run.leaseOwner === input.leaseOwner;\n}\n\nexport function isBaseRelativeResourceId(value: string | null | undefined): value is string {\n if (!value || /^https?:\\/\\//.test(value) || value.startsWith('/') || value.startsWith('#')) {\n return false;\n }\n return /\\.(ttl|jsonld|json)(?:#[^#]+)?$/i.test(value);\n}\n\nexport function isRunResourceId(value: string | null | undefined): value is string {\n return isBaseRelativeResourceId(value)\n && /^(chat|task)\\/[^/]+\\/\\d{4}\\/\\d{2}\\/\\d{2}\\/runs\\.ttl#[^#/]+$/.test(value);\n}\n\nfunction assertLocalKey(value: string, label: string): void {\n if (value.includes('/') || value.includes('#') || /\\.(ttl|jsonld|json)(?:#|$)/i.test(value)) {\n throw new Error(`${label} requires a local key: ${value}`);\n }\n}\n\n/**\n * Extracts the local template fragment for display or protocol compatibility.\n * Do not use this to turn a canonical resource id back into the durable `id`.\n */\nexport function extractResourceLocalId(resourceId: string): string {\n const hashIndex = resourceId.lastIndexOf('#');\n if (hashIndex >= 0 && hashIndex < resourceId.length - 1) {\n return resourceId.slice(hashIndex + 1);\n }\n const slashIndex = resourceId.lastIndexOf('/');\n return slashIndex >= 0 && slashIndex < resourceId.length - 1\n ? resourceId.slice(slashIndex + 1)\n : resourceId;\n}\n\nexport function datePathFromTimestamp(timestamp: number | undefined): { yyyy: string; MM: string; dd: string } {\n const date = typeof timestamp === 'number' ? new Date(timestamp * 1000) : new Date();\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\nexport function generateRunResourceId(input: {\n key: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n createdAt?: number;\n}): string {\n if (isBaseRelativeResourceId(input.key)) {\n throw new Error(`Run id generator requires a local key, got resource id: ${input.key}`);\n }\n assertLocalKey(input.key, 'Run id generator');\n return runResourceId(input.key, input);\n}\n\nexport function generateRunStepResourceId(input: {\n key: string;\n runId?: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n createdAt?: number;\n}): string {\n if (isBaseRelativeResourceId(input.key)) {\n throw new Error(`RunStep id generator requires a local key, got resource id: ${input.key}`);\n }\n assertLocalKey(input.key, 'RunStep id generator');\n\n if (input.runId && isRunResourceId(input.runId)) {\n return runStepResourceId(input.key, input);\n }\n\n return runStepResourceId(input.key, input);\n}\n\nexport function buildRunResourceId(input: {\n id: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n createdAt?: number;\n}): string {\n void input.commandKind;\n void input.surfaceId;\n void input.createdAt;\n if (!isRunResourceId(input.id)) {\n throw new Error(`Run id must be a complete Run resource id: ${input.id}`);\n }\n return input.id;\n}\n\nexport function buildRunStepResourceId(input: {\n id: string;\n runId?: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n createdAt?: number;\n}): string {\n void input.runId;\n void input.commandKind;\n void input.surfaceId;\n void input.createdAt;\n if (!isRunResourceId(input.id)) {\n throw new Error(`RunStep id must be a complete RunStep resource id: ${input.id}`);\n }\n return input.id;\n}\n\nexport function resolveRunUrn(runId: string): string {\n return `urn:xpod:run:${encodeURIComponent(runId)}`;\n}\n\nexport function resolveDataResource(podBaseUrl: string, resourceId: string): string {\n if (/^https?:\\/\\//.test(resourceId)) {\n return resourceId;\n }\n const base = podBaseUrl.replace(/\\/$/, '');\n const relative = resourceId.replace(/^\\/+/, '');\n if (relative.startsWith('.data/')) {\n return `${base}/${relative}`;\n }\n return `${base}/.data/${relative}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/api/runs/store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WorkspaceRef } from '../workspace/types';\nimport type { RunStatusType, RunStepTypeValue } from './schema';\n\nexport interface RunRecordData {\n /** Base-relative Solid resource id, e.g. `chat/default/2026/05/18/runs.ttl#run_x`. */\n id: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n task?: string;\n thread: string;\n workspace: WorkspaceRef;\n status: RunStatusType;\n runner: string;\n prompt?: string;\n externalRunId?: string;\n leaseOwner?: string;\n leaseExpiresAt?: number;\n heartbeatAt?: number;\n cancelRequestedAt?: number;\n error?: string;\n metadata?: Record<string, unknown>;\n createdAt: number;\n startedAt?: number;\n completedAt?: number;\n updatedAt: number;\n}\n\nexport interface RunStepRecordData {\n /** Base-relative Solid resource id, e.g. `chat/default/2026/05/18/runs.ttl#step_x`. */\n id: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n /** Denormalized Run resource id for lookup; semantic relation is `run`. */\n runId: string;\n run: string;\n type: RunStepTypeValue | string;\n message?: string;\n data?: Record<string, unknown>;\n createdAt: number;\n}\n\nexport interface RunListOptions {\n task?: string;\n thread?: string;\n workspace?: WorkspaceRef;\n commandKind?: 'chat' | 'task';\n status?: RunStatusType;\n limit?: number;\n}\n\nexport interface RunStore<TContext> {\n saveRun(run: RunRecordData, context: TContext): Promise<void>;\n loadRun(id: string, context: TContext): Promise<RunRecordData>;\n listRuns(options: RunListOptions, context: TContext): Promise<RunRecordData[]>;\n appendRunStep(event: RunStepRecordData, context: TContext): Promise<void>;\n loadRunSteps(runId: string, context: TContext): Promise<RunStepRecordData[]>;\n claimRun?(input: {\n runId: string;\n leaseOwner: string;\n leaseExpiresAt: number;\n now: number;\n }, context: TContext): Promise<RunRecordData | undefined>;\n}\n\nexport function isClaimableRunStatus(status: RunRecordData['status']): boolean {\n return status === 'queued' || status === 'running';\n}\n\nexport function hasActiveRunLease(\n run: Pick<RunRecordData, 'leaseOwner' | 'leaseExpiresAt'>,\n now: number,\n): boolean {\n return Boolean(run.leaseOwner && run.leaseExpiresAt && run.leaseExpiresAt > now);\n}\n\nexport function canClaimRun(\n run: Pick<RunRecordData, 'status' | 'leaseOwner' | 'leaseExpiresAt'>,\n input: {\n leaseOwner: string;\n now: number;\n },\n): boolean {\n if (!isClaimableRunStatus(run.status)) {\n return false;\n }\n return !hasActiveRunLease(run, input.now) || run.leaseOwner === input.leaseOwner;\n}\n\nexport function isBaseRelativeResourceId(value: string | null | undefined): value is string {\n if (!value || /^https?:\\/\\//.test(value) || value.startsWith('/') || value.startsWith('#')) {\n return false;\n }\n return /\\.(ttl|jsonld|json)(?:#[^#]+)?$/i.test(value);\n}\n\nexport function isRunResourceId(value: string | null | undefined): value is string {\n return isBaseRelativeResourceId(value)\n && /^(chat|task)\\/[^/]+\\/\\d{4}\\/\\d{2}\\/\\d{2}\\/runs\\.ttl#[^#/]+$/.test(value);\n}\n\nfunction assertLocalKey(value: string, label: string): void {\n if (value.includes('/') || value.includes('#') || /\\.(ttl|jsonld|json)(?:#|$)/i.test(value)) {\n throw new Error(`${label} requires a local key: ${value}`);\n }\n}\n\n/**\n * Extracts the local template fragment for display or protocol compatibility.\n * Do not use this to turn a canonical resource id back into the durable `id`.\n */\nexport function extractResourceLocalId(resourceId: string): string {\n const hashIndex = resourceId.lastIndexOf('#');\n if (hashIndex >= 0 && hashIndex < resourceId.length - 1) {\n return resourceId.slice(hashIndex + 1);\n }\n const slashIndex = resourceId.lastIndexOf('/');\n return slashIndex >= 0 && slashIndex < resourceId.length - 1\n ? resourceId.slice(slashIndex + 1)\n : resourceId;\n}\n\nexport function datePathFromTimestamp(timestamp: number | undefined): { yyyy: string; MM: string; dd: string } {\n const date = typeof timestamp === 'number' ? new Date(timestamp * 1000) : new Date();\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\nexport function generateRunResourceId(input: {\n key: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n createdAt?: number;\n}): string {\n if (isBaseRelativeResourceId(input.key)) {\n throw new Error(`Run id generator requires a local key, got resource id: ${input.key}`);\n }\n assertLocalKey(input.key, 'Run id generator');\n const { yyyy, MM, dd } = datePathFromTimestamp(input.createdAt);\n return `${input.commandKind}/${input.surfaceId}/${yyyy}/${MM}/${dd}/runs.ttl#${input.key}`;\n}\n\nexport function generateRunStepResourceId(input: {\n key: string;\n runId?: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n createdAt?: number;\n}): string {\n if (isBaseRelativeResourceId(input.key)) {\n throw new Error(`RunStep id generator requires a local key, got resource id: ${input.key}`);\n }\n assertLocalKey(input.key, 'RunStep id generator');\n\n if (input.runId && isRunResourceId(input.runId)) {\n const runDoc = input.runId.slice(0, input.runId.lastIndexOf('#'));\n return `${runDoc}#${input.key}`;\n }\n\n const { yyyy, MM, dd } = datePathFromTimestamp(input.createdAt);\n return `${input.commandKind}/${input.surfaceId}/${yyyy}/${MM}/${dd}/runs.ttl#${input.key}`;\n}\n\nexport function buildRunResourceId(input: {\n id: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n createdAt?: number;\n}): string {\n void input.commandKind;\n void input.surfaceId;\n void input.createdAt;\n if (!isRunResourceId(input.id)) {\n throw new Error(`Run id must be a complete Run resource id: ${input.id}`);\n }\n return input.id;\n}\n\nexport function buildRunStepResourceId(input: {\n id: string;\n runId?: string;\n commandKind: 'chat' | 'task';\n surfaceId: string;\n createdAt?: number;\n}): string {\n void input.runId;\n void input.commandKind;\n void input.surfaceId;\n void input.createdAt;\n if (!isRunResourceId(input.id)) {\n throw new Error(`RunStep id must be a complete RunStep resource id: ${input.id}`);\n }\n return input.id;\n}\n\nexport function resolveRunUrn(runId: string): string {\n return `urn:xpod:run:${encodeURIComponent(runId)}`;\n}\n\nexport function resolveDataResource(podBaseUrl: string, resourceId: string): string {\n if (/^https?:\\/\\//.test(resourceId)) {\n return resourceId;\n }\n const base = podBaseUrl.replace(/\\/$/, '');\n const relative = resourceId.replace(/^\\/+/, '');\n if (relative.startsWith('.data/')) {\n return `${base}/${relative}`;\n }\n return `${base}/.data/${relative}`;\n}\n"]}
|
package/dist/api/runtime.js
CHANGED
|
@@ -18,12 +18,12 @@ function initApiLogger() {
|
|
|
18
18
|
async function registerPrimaryServiceToken(container, config, logger) {
|
|
19
19
|
try {
|
|
20
20
|
const serviceToken = process.env.XPOD_SERVICE_TOKEN;
|
|
21
|
-
if (!serviceToken) {
|
|
21
|
+
if (!serviceToken || config.edition !== 'cloud') {
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
24
|
const serviceTokenRepo = container.resolve('serviceTokenRepo');
|
|
25
|
-
const serviceType =
|
|
26
|
-
const serviceId = process.env.XPOD_NODE_ID ||
|
|
25
|
+
const serviceType = 'cloud';
|
|
26
|
+
const serviceId = process.env.XPOD_NODE_ID || 'cloud-1';
|
|
27
27
|
await serviceTokenRepo.registerToken(serviceToken, {
|
|
28
28
|
serviceType,
|
|
29
29
|
serviceId,
|
package/dist/api/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/api/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { asValue, type AwilixContainer } from 'awilix';\nimport { setGlobalLoggerFactory, getLoggerFor } from 'global-logger-factory';\nimport { ConfigurableLoggerFactory } from '../logging/ConfigurableLoggerFactory';\nimport { createApiContainer, loadConfigFromEnv, type ApiContainerConfig, type ApiContainerCradle } from './container';\nimport { registerRoutes } from './container/routes';\nimport type { AuthContext } from './auth/AuthContext';\nimport { OpenAuthMiddleware } from './middleware/OpenAuthMiddleware';\nimport type { RuntimeHost } from '../runtime/host/types';\nimport { EmbeddedInngestService, type EmbeddedInngestRuntimeConfig } from './runs/EmbeddedInngestService';\n\nexport interface StartApiServiceOptions {\n config?: ApiContainerConfig;\n open?: boolean;\n authContext?: AuthContext;\n initializeLogger?: boolean;\n runtimeHost?: RuntimeHost;\n}\n\nexport interface ApiServiceHandle {\n config: ApiContainerConfig;\n container: AwilixContainer<ApiContainerCradle>;\n inngestRuntimeConfig?: EmbeddedInngestRuntimeConfig;\n stop: () => Promise<void>;\n}\n\nfunction initApiLogger(): void {\n const loggerFactory = new ConfigurableLoggerFactory(process.env.CSS_LOGGING_LEVEL || 'info', {\n fileName: './logs/xpod-%DATE%.log',\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n}\n\nasync function registerPrimaryServiceToken(\n container: AwilixContainer<ApiContainerCradle>,\n config: ApiContainerConfig,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<void> {\n try {\n const serviceToken = process.env.XPOD_SERVICE_TOKEN;\n if (!serviceToken) {\n return;\n }\n\n const serviceTokenRepo = container.resolve('serviceTokenRepo') as any;\n const serviceType = config.edition === 'cloud' ? 'cloud' : 'local';\n const serviceId = process.env.XPOD_NODE_ID || (config.edition === 'cloud' ? 'cloud-1' : 'local-1');\n\n await serviceTokenRepo.registerToken(serviceToken, {\n serviceType,\n serviceId,\n scopes: ['quota:write', 'usage:read', 'account:manage'],\n });\n\n logger.info(`Registered service token for ${serviceType}:${serviceId}`);\n } catch (error) {\n logger.error(`Failed to register service token: ${error}`);\n }\n}\n\nasync function startBackgroundServices(\n container: AwilixContainer<ApiContainerCradle>,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<void> {\n try {\n const localNetworkManager = container.resolve('localNetworkManager', { allowUnregistered: true }) as any;\n if (localNetworkManager) {\n localNetworkManager.start();\n }\n } catch (error) {\n logger.error(`Failed to initialize LocalNetworkManager: ${error}`);\n }\n\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n if (ddnsManager) {\n await ddnsManager.start();\n logger.info('DDNS Manager started');\n }\n } catch (error) {\n logger.error(`Failed to initialize DdnsManager: ${error}`);\n }\n\n try {\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true }) as any;\n\n if (localTunnelProvider) {\n logger.info('Starting local tunnel provider...');\n const localPort = Number.parseInt(\n process.env.XPOD_MAIN_PORT ?? process.env.CSS_PORT ?? process.env.PORT ?? '3000',\n 10,\n );\n const config = await localTunnelProvider.setup({\n subdomain: 'local',\n localPort: Number.isFinite(localPort) && localPort > 0 ? localPort : 3000,\n localProtocol: 'http',\n });\n await localTunnelProvider.start(config);\n logger.info('Local tunnel provider started');\n }\n } catch (error) {\n logger.error(`Failed to start local tunnel provider: ${error}`);\n }\n}\n\nasync function stopBackgroundServices(container: AwilixContainer<ApiContainerCradle>): Promise<void> {\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n ddnsManager?.stop();\n } catch {\n // ignore shutdown errors\n }\n\n try {\n const localNetworkManager = container.resolve('localNetworkManager', { allowUnregistered: true });\n await localNetworkManager?.stop();\n } catch {\n // ignore shutdown errors\n }\n\n try {\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true }) as any;\n await localTunnelProvider?.stop();\n } catch {\n // ignore shutdown errors\n }\n}\n\nfunction resolveApiBaseUrl(config: ApiContainerConfig): string {\n if (process.env.XPOD_API_BASE_URL) {\n return process.env.XPOD_API_BASE_URL;\n }\n if (process.env.CSS_BASE_URL) {\n return process.env.CSS_BASE_URL;\n }\n if (config.socketPath) {\n return 'http://localhost/';\n }\n return `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}`;\n}\n\nasync function startEmbeddedInngestService(\n config: ApiContainerConfig,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<{ service: EmbeddedInngestService; runtimeConfig: EmbeddedInngestRuntimeConfig }> {\n const service = new EmbeddedInngestService({\n edition: config.edition,\n apiBaseUrl: resolveApiBaseUrl(config),\n databaseUrl: config.databaseUrl,\n redisUrl: config.redisUrl,\n enabled: config.inngest?.enabled,\n mode: config.inngest?.mode,\n host: config.inngest?.host,\n port: config.inngest?.port,\n baseUrl: config.inngest?.baseUrl,\n eventKey: config.inngest?.eventKey,\n signingKey: config.inngest?.signingKey,\n binaryPath: config.inngest?.binaryPath,\n sqliteDir: config.inngest?.sqliteDir,\n });\n const runtimeConfig = await service.start();\n if (runtimeConfig.enabled) {\n logger.info(`Inngest runtime configured: ${runtimeConfig.baseUrl}`);\n } else {\n logger.info('Inngest runtime disabled');\n }\n return { service, runtimeConfig };\n}\n\nexport async function startApiService(options: StartApiServiceOptions = {}): Promise<ApiServiceHandle> {\n if (options.initializeLogger !== false) {\n initApiLogger();\n }\n\n const baseConfig = options.config ?? loadConfigFromEnv();\n const config = {\n ...baseConfig,\n runtimeHost: options.runtimeHost ?? baseConfig.runtimeHost,\n };\n const logger = getLoggerFor('ApiRuntime');\n\n if (!config.databaseUrl) {\n throw new Error('CSS_IDENTITY_DB_URL or DATABASE_URL environment variable is required');\n }\n\n logger.info(`Starting API Service (edition: ${config.edition})...`);\n\n const embeddedInngest = await startEmbeddedInngestService(config, logger);\n const container = createApiContainer({\n ...config,\n inngestRuntimeConfig: embeddedInngest.runtimeConfig,\n });\n\n if (options.open) {\n container.register({\n authMiddleware: asValue(new OpenAuthMiddleware({ context: options.authContext })),\n });\n }\n\n registerRoutes(container);\n await registerPrimaryServiceToken(container, config, logger);\n await startBackgroundServices(container, logger);\n\n const server = container.resolve('apiServer');\n await server.start();\n logger.info(`API Service active on ${config.socketPath ? `unix://${config.socketPath}` : `${config.host}:${config.port}`}`);\n\n return {\n config,\n container,\n inngestRuntimeConfig: embeddedInngest.runtimeConfig,\n stop: async(): Promise<void> => {\n logger.info('Stopping API Service...');\n await stopBackgroundServices(container);\n await server.stop();\n await embeddedInngest.service.stop();\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/api/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { asValue, type AwilixContainer } from 'awilix';\nimport { setGlobalLoggerFactory, getLoggerFor } from 'global-logger-factory';\nimport { ConfigurableLoggerFactory } from '../logging/ConfigurableLoggerFactory';\nimport { createApiContainer, loadConfigFromEnv, type ApiContainerConfig, type ApiContainerCradle } from './container';\nimport { registerRoutes } from './container/routes';\nimport type { AuthContext } from './auth/AuthContext';\nimport { OpenAuthMiddleware } from './middleware/OpenAuthMiddleware';\nimport type { RuntimeHost } from '../runtime/host/types';\nimport { EmbeddedInngestService, type EmbeddedInngestRuntimeConfig } from './runs/EmbeddedInngestService';\n\nexport interface StartApiServiceOptions {\n config?: ApiContainerConfig;\n open?: boolean;\n authContext?: AuthContext;\n initializeLogger?: boolean;\n runtimeHost?: RuntimeHost;\n}\n\nexport interface ApiServiceHandle {\n config: ApiContainerConfig;\n container: AwilixContainer<ApiContainerCradle>;\n inngestRuntimeConfig?: EmbeddedInngestRuntimeConfig;\n stop: () => Promise<void>;\n}\n\nfunction initApiLogger(): void {\n const loggerFactory = new ConfigurableLoggerFactory(process.env.CSS_LOGGING_LEVEL || 'info', {\n fileName: './logs/xpod-%DATE%.log',\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n}\n\nasync function registerPrimaryServiceToken(\n container: AwilixContainer<ApiContainerCradle>,\n config: ApiContainerConfig,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<void> {\n try {\n const serviceToken = process.env.XPOD_SERVICE_TOKEN;\n if (!serviceToken || config.edition !== 'cloud') {\n return;\n }\n\n const serviceTokenRepo = container.resolve('serviceTokenRepo') as any;\n const serviceType = 'cloud';\n const serviceId = process.env.XPOD_NODE_ID || 'cloud-1';\n\n await serviceTokenRepo.registerToken(serviceToken, {\n serviceType,\n serviceId,\n scopes: ['quota:write', 'usage:read', 'account:manage'],\n });\n\n logger.info(`Registered service token for ${serviceType}:${serviceId}`);\n } catch (error) {\n logger.error(`Failed to register service token: ${error}`);\n }\n}\n\nasync function startBackgroundServices(\n container: AwilixContainer<ApiContainerCradle>,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<void> {\n try {\n const localNetworkManager = container.resolve('localNetworkManager', { allowUnregistered: true }) as any;\n if (localNetworkManager) {\n localNetworkManager.start();\n }\n } catch (error) {\n logger.error(`Failed to initialize LocalNetworkManager: ${error}`);\n }\n\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n if (ddnsManager) {\n await ddnsManager.start();\n logger.info('DDNS Manager started');\n }\n } catch (error) {\n logger.error(`Failed to initialize DdnsManager: ${error}`);\n }\n\n try {\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true }) as any;\n\n if (localTunnelProvider) {\n logger.info('Starting local tunnel provider...');\n const localPort = Number.parseInt(\n process.env.XPOD_MAIN_PORT ?? process.env.CSS_PORT ?? process.env.PORT ?? '3000',\n 10,\n );\n const config = await localTunnelProvider.setup({\n subdomain: 'local',\n localPort: Number.isFinite(localPort) && localPort > 0 ? localPort : 3000,\n localProtocol: 'http',\n });\n await localTunnelProvider.start(config);\n logger.info('Local tunnel provider started');\n }\n } catch (error) {\n logger.error(`Failed to start local tunnel provider: ${error}`);\n }\n}\n\nasync function stopBackgroundServices(container: AwilixContainer<ApiContainerCradle>): Promise<void> {\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n ddnsManager?.stop();\n } catch {\n // ignore shutdown errors\n }\n\n try {\n const localNetworkManager = container.resolve('localNetworkManager', { allowUnregistered: true });\n await localNetworkManager?.stop();\n } catch {\n // ignore shutdown errors\n }\n\n try {\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true }) as any;\n await localTunnelProvider?.stop();\n } catch {\n // ignore shutdown errors\n }\n}\n\nfunction resolveApiBaseUrl(config: ApiContainerConfig): string {\n if (process.env.XPOD_API_BASE_URL) {\n return process.env.XPOD_API_BASE_URL;\n }\n if (process.env.CSS_BASE_URL) {\n return process.env.CSS_BASE_URL;\n }\n if (config.socketPath) {\n return 'http://localhost/';\n }\n return `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}`;\n}\n\nasync function startEmbeddedInngestService(\n config: ApiContainerConfig,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<{ service: EmbeddedInngestService; runtimeConfig: EmbeddedInngestRuntimeConfig }> {\n const service = new EmbeddedInngestService({\n edition: config.edition,\n apiBaseUrl: resolveApiBaseUrl(config),\n databaseUrl: config.databaseUrl,\n redisUrl: config.redisUrl,\n enabled: config.inngest?.enabled,\n mode: config.inngest?.mode,\n host: config.inngest?.host,\n port: config.inngest?.port,\n baseUrl: config.inngest?.baseUrl,\n eventKey: config.inngest?.eventKey,\n signingKey: config.inngest?.signingKey,\n binaryPath: config.inngest?.binaryPath,\n sqliteDir: config.inngest?.sqliteDir,\n });\n const runtimeConfig = await service.start();\n if (runtimeConfig.enabled) {\n logger.info(`Inngest runtime configured: ${runtimeConfig.baseUrl}`);\n } else {\n logger.info('Inngest runtime disabled');\n }\n return { service, runtimeConfig };\n}\n\nexport async function startApiService(options: StartApiServiceOptions = {}): Promise<ApiServiceHandle> {\n if (options.initializeLogger !== false) {\n initApiLogger();\n }\n\n const baseConfig = options.config ?? loadConfigFromEnv();\n const config = {\n ...baseConfig,\n runtimeHost: options.runtimeHost ?? baseConfig.runtimeHost,\n };\n const logger = getLoggerFor('ApiRuntime');\n\n if (!config.databaseUrl) {\n throw new Error('CSS_IDENTITY_DB_URL or DATABASE_URL environment variable is required');\n }\n\n logger.info(`Starting API Service (edition: ${config.edition})...`);\n\n const embeddedInngest = await startEmbeddedInngestService(config, logger);\n const container = createApiContainer({\n ...config,\n inngestRuntimeConfig: embeddedInngest.runtimeConfig,\n });\n\n if (options.open) {\n container.register({\n authMiddleware: asValue(new OpenAuthMiddleware({ context: options.authContext })),\n });\n }\n\n registerRoutes(container);\n await registerPrimaryServiceToken(container, config, logger);\n await startBackgroundServices(container, logger);\n\n const server = container.resolve('apiServer');\n await server.start();\n logger.info(`API Service active on ${config.socketPath ? `unix://${config.socketPath}` : `${config.host}:${config.port}`}`);\n\n return {\n config,\n container,\n inngestRuntimeConfig: embeddedInngest.runtimeConfig,\n stop: async(): Promise<void> => {\n logger.info('Stopping API Service...');\n await stopBackgroundServices(container);\n await server.stop();\n await embeddedInngest.service.stop();\n },\n };\n}\n"]}
|
|
@@ -128,7 +128,7 @@ export declare class InngestTaskScheduler<TContext = StoreContext> {
|
|
|
128
128
|
readonly event: "xpod/task.materialize_due";
|
|
129
129
|
}], Omit<Omit<import("inngest/types").BaseContext<import("inngest").Inngest.Any>, never> & Record<never, never> & {
|
|
130
130
|
logger: import("inngest").Logger;
|
|
131
|
-
}, "group" | "requestId" | "
|
|
131
|
+
}, "group" | "requestId" | "event" | "runId" | "step" | "defer" | "events" | "jobId" | "attempt" | "maxAttempts"> & import("inngest/types").FailureEventArgs<EventPayload<any>> & {
|
|
132
132
|
step: {
|
|
133
133
|
sendEvent: (idOrOptions: import("inngest/types").StepOptionsOrId, payload: import("inngest").SendEventPayload) => Promise<import("inngest/types").SendEventOutput<import("inngest").ClientOptionsFromInngest<import("inngest").Inngest<import("inngest/types").ClientOptions>>>>;
|
|
134
134
|
waitForSignal: <TData>(idOrOptions: import("inngest/types").StepOptionsOrId, opts: {
|
|
@@ -296,7 +296,7 @@ export declare class InngestTaskScheduler<TContext = StoreContext> {
|
|
|
296
296
|
readonly event: "xpod/task.materialize_due";
|
|
297
297
|
}], Omit<Omit<import("inngest/types").BaseContext<import("inngest").Inngest.Any>, never> & Record<never, never> & {
|
|
298
298
|
logger: import("inngest").Logger;
|
|
299
|
-
}, "group" | "requestId" | "
|
|
299
|
+
}, "group" | "requestId" | "event" | "runId" | "step" | "defer" | "events" | "jobId" | "attempt" | "maxAttempts"> & import("inngest/types").FailureEventArgs<EventPayload<any>> & {
|
|
300
300
|
step: {
|
|
301
301
|
sendEvent: (idOrOptions: import("inngest/types").StepOptionsOrId, payload: import("inngest").SendEventPayload) => Promise<import("inngest/types").SendEventOutput<import("inngest").ClientOptionsFromInngest<import("inngest").Inngest<import("inngest/types").ClientOptions>>>>;
|
|
302
302
|
waitForSignal: <TData>(idOrOptions: import("inngest/types").StepOptionsOrId, opts: {
|
|
@@ -469,7 +469,7 @@ export declare class InngestTaskScheduler<TContext = StoreContext> {
|
|
|
469
469
|
readonly event: "xpod/task.event";
|
|
470
470
|
}], Omit<Omit<import("inngest/types").BaseContext<import("inngest").Inngest.Any>, never> & Record<never, never> & {
|
|
471
471
|
logger: import("inngest").Logger;
|
|
472
|
-
}, "group" | "requestId" | "
|
|
472
|
+
}, "group" | "requestId" | "event" | "runId" | "step" | "defer" | "events" | "jobId" | "attempt" | "maxAttempts"> & import("inngest/types").FailureEventArgs<EventPayload<any>> & {
|
|
473
473
|
step: {
|
|
474
474
|
sendEvent: (idOrOptions: import("inngest/types").StepOptionsOrId, payload: import("inngest").SendEventPayload) => Promise<import("inngest/types").SendEventOutput<import("inngest").ClientOptionsFromInngest<import("inngest").Inngest<import("inngest/types").ClientOptions>>>>;
|
|
475
475
|
waitForSignal: <TData>(idOrOptions: import("inngest/types").StepOptionsOrId, opts: {
|
|
@@ -635,7 +635,7 @@ export declare class InngestTaskScheduler<TContext = StoreContext> {
|
|
|
635
635
|
readonly event: "xpod/task.event";
|
|
636
636
|
}], Omit<Omit<import("inngest/types").BaseContext<import("inngest").Inngest.Any>, never> & Record<never, never> & {
|
|
637
637
|
logger: import("inngest").Logger;
|
|
638
|
-
}, "group" | "requestId" | "
|
|
638
|
+
}, "group" | "requestId" | "event" | "runId" | "step" | "defer" | "events" | "jobId" | "attempt" | "maxAttempts"> & import("inngest/types").FailureEventArgs<EventPayload<any>> & {
|
|
639
639
|
step: {
|
|
640
640
|
sendEvent: (idOrOptions: import("inngest/types").StepOptionsOrId, payload: import("inngest").SendEventPayload) => Promise<import("inngest/types").SendEventOutput<import("inngest").ClientOptionsFromInngest<import("inngest").Inngest<import("inngest/types").ClientOptions>>>>;
|
|
641
641
|
waitForSignal: <TData>(idOrOptions: import("inngest/types").StepOptionsOrId, opts: {
|
|
@@ -1,23 +1,27 @@
|
|
|
1
|
-
import { TaskStatus,
|
|
1
|
+
import { TaskStatus, type TaskRow, type TaskStatusType } from '@undefineds.co/models';
|
|
2
2
|
export declare const Task: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
3
3
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
4
|
-
surfaceId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
5
4
|
title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
instruction: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
6
|
+
prompt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
7
|
+
issue: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
8
|
+
message: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
8
9
|
workspace: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
|
|
9
|
-
runner: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
10
10
|
status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
eventName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
15
|
-
nextRunAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
16
|
-
lastRunAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
11
|
+
priority: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
12
|
+
assignedTo: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
13
|
+
source: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
17
14
|
metadata: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"object", null, false, false>;
|
|
18
15
|
createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
|
|
19
16
|
updatedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
|
|
20
17
|
}>>;
|
|
21
|
-
export
|
|
18
|
+
export declare const TaskTriggerKind: {
|
|
19
|
+
readonly ONCE: "once";
|
|
20
|
+
readonly INTERVAL: "interval";
|
|
21
|
+
readonly CRON: "cron";
|
|
22
|
+
readonly EVENT: "event";
|
|
23
|
+
};
|
|
24
|
+
export type TaskTriggerKindType = (typeof TaskTriggerKind)[keyof typeof TaskTriggerKind];
|
|
25
|
+
export { TaskStatus };
|
|
22
26
|
export type TaskRecord = TaskRow;
|
|
23
|
-
export type { TaskStatusType,
|
|
27
|
+
export type { TaskStatusType, };
|
package/dist/api/tasks/schema.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.TaskStatus = exports.TaskTriggerKind = exports.Task = void 0;
|
|
4
4
|
const models_1 = require("@undefineds.co/models");
|
|
5
5
|
Object.defineProperty(exports, "TaskStatus", { enumerable: true, get: function () { return models_1.TaskStatus; } });
|
|
6
|
-
Object.defineProperty(exports, "TaskTriggerKind", { enumerable: true, get: function () { return models_1.TaskTriggerKind; } });
|
|
7
6
|
exports.Task = models_1.taskResource;
|
|
7
|
+
exports.TaskTriggerKind = {
|
|
8
|
+
ONCE: 'once',
|
|
9
|
+
INTERVAL: 'interval',
|
|
10
|
+
CRON: 'cron',
|
|
11
|
+
EVENT: 'event',
|
|
12
|
+
};
|
|
8
13
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/api/tasks/schema.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/api/tasks/schema.ts"],"names":[],"mappings":";;;AAAA,kDAK+B;AAatB,2FAjBP,mBAAU,OAiBO;AAXN,QAAA,IAAI,GAAG,qBAAY,CAAC;AAEpB,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACN,CAAC","sourcesContent":["import {\n TaskStatus,\n taskResource,\n type TaskRow,\n type TaskStatusType,\n} from '@undefineds.co/models';\n\nexport const Task = taskResource;\n\nexport const TaskTriggerKind = {\n ONCE: 'once',\n INTERVAL: 'interval',\n CRON: 'cron',\n EVENT: 'event',\n} as const;\n\nexport type TaskTriggerKindType = (typeof TaskTriggerKind)[keyof typeof TaskTriggerKind];\n\nexport { TaskStatus };\n\nexport type TaskRecord = TaskRow;\nexport type {\n TaskStatusType,\n};\n"]}
|
package/dist/api/tasks/store.js
CHANGED
|
@@ -6,7 +6,6 @@ exports.generateTaskResourceId = generateTaskResourceId;
|
|
|
6
6
|
exports.generateDefaultTaskResourceId = generateDefaultTaskResourceId;
|
|
7
7
|
exports.resolveTaskResource = resolveTaskResource;
|
|
8
8
|
exports.resolveTaskUrn = resolveTaskUrn;
|
|
9
|
-
const models_1 = require("@undefineds.co/models");
|
|
10
9
|
function isTaskResourceId(value) {
|
|
11
10
|
return typeof value === 'string'
|
|
12
11
|
&& /^index\.ttl#[^#/]+$/.test(value);
|
|
@@ -25,7 +24,7 @@ function generateTaskResourceId(input) {
|
|
|
25
24
|
if (/\.ttl(?:#|$)/i.test(key) || key.includes('/') || key.includes('#')) {
|
|
26
25
|
throw new Error(`Task id generator requires a local key: ${key}`);
|
|
27
26
|
}
|
|
28
|
-
return
|
|
27
|
+
return `index.ttl#${key}`;
|
|
29
28
|
}
|
|
30
29
|
function generateDefaultTaskResourceId(key) {
|
|
31
30
|
return generateTaskResourceId(key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/api/tasks/store.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/api/tasks/store.ts"],"names":[],"mappings":";;AAwCA,4CAGC;AAED,kDAKC;AAED,wDAaC;AAED,sEAEC;AAED,kDAOC;AAED,wCAEC;AA1CD,SAAgB,gBAAgB,CAAC,KAAgC;IAC/D,OAAO,OAAO,KAAK,KAAK,QAAQ;WAC3B,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,mBAAmB,CAAC,EAAU;IAC5C,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,gEAAgE,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,sBAAsB,CAAC,KAItC;IACC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAC1D,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,4DAA4D,GAAG,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,2CAA2C,GAAG,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,aAAa,GAAG,EAAE,CAAC;AAC5B,CAAC;AAED,SAAgB,6BAA6B,CAAC,GAAW;IACvD,OAAO,sBAAsB,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,mBAAmB,CAAC,UAAkB,EAAE,MAAc;IACpE,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjE,OAAO,GAAG,IAAI,eAAe,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED,SAAgB,cAAc,CAAC,MAAc;IAC3C,OAAO,iBAAiB,kBAAkB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;AAC5E,CAAC","sourcesContent":["import type { WorkspaceRef } from '../workspace/types';\nimport type { TaskAuthBindingSnapshot } from './TaskAuthBinding';\nimport type { TaskStatusType, TaskTriggerKindType } from './schema';\n\nexport interface TaskRecordData {\n /** Base-relative Solid resource id, e.g. `index.ttl#task_x`. */\n id: string;\n surfaceId: string;\n title?: string;\n prompt: string;\n thread: string;\n workspace: WorkspaceRef;\n runner: string;\n status: TaskStatusType;\n triggerKind: TaskTriggerKindType;\n cron?: string;\n intervalSeconds?: number;\n eventName?: string;\n nextRunAt?: number;\n lastRunAt?: number;\n authBinding?: TaskAuthBindingSnapshot;\n metadata?: Record<string, unknown>;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface TaskListOptions {\n status?: TaskStatusType;\n triggerKind?: TaskTriggerKindType;\n eventName?: string;\n dueAt?: number;\n limit?: number;\n}\n\nexport interface TaskStore<TContext> {\n saveTask(task: TaskRecordData, context: TContext): Promise<void>;\n loadTask(taskId: string, context: TContext): Promise<TaskRecordData>;\n listTasks(options: TaskListOptions, context: TContext): Promise<TaskRecordData[]>;\n}\n\nexport function isTaskResourceId(value: string | null | undefined): value is string {\n return typeof value === 'string'\n && /^index\\.ttl#[^#/]+$/.test(value);\n}\n\nexport function buildTaskResourceId(id: string): string {\n if (!isTaskResourceId(id)) {\n throw new Error(`Task id must be a complete Task resource id under index.ttl: ${id}`);\n }\n return id;\n}\n\nexport function generateTaskResourceId(input: string | {\n key: string;\n surfaceId: string;\n createdAt?: number;\n}): string {\n const key = typeof input === 'string' ? input : input.key;\n if (/^index\\.ttl#[^#/]+$/.test(key)) {\n throw new Error(`Task id generator requires a local key, got resource id: ${key}`);\n }\n if (/\\.ttl(?:#|$)/i.test(key) || key.includes('/') || key.includes('#')) {\n throw new Error(`Task id generator requires a local key: ${key}`);\n }\n return `index.ttl#${key}`;\n}\n\nexport function generateDefaultTaskResourceId(key: string): string {\n return generateTaskResourceId(key);\n}\n\nexport function resolveTaskResource(podBaseUrl: string, taskId: string): string {\n if (/^https?:\\/\\//.test(taskId)) {\n return taskId;\n }\n const base = podBaseUrl.replace(/\\/$/, '');\n const relative = buildTaskResourceId(taskId).replace(/^\\/+/, '');\n return `${base}/.data/task/${relative}`;\n}\n\nexport function resolveTaskUrn(taskId: string): string {\n return `urn:xpod:task:${encodeURIComponent(buildTaskResourceId(taskId))}`;\n}\n"]}
|