@undefineds.co/xpod 0.3.32 → 0.3.34
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/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/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/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/http/search/SearchHttpHandler.js +2 -2
- package/dist/http/search/SearchHttpHandler.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.d.ts +1 -0
- package/dist/storage/SparqlUpdateResourceStore.js +5 -0
- package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.jsonld +4 -0
- package/dist/storage/vector/VectorIndexingListener.js +2 -2
- package/dist/storage/vector/VectorIndexingListener.js.map +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
|
@@ -19,16 +19,16 @@ export declare const Chat: import("@undefineds.co/drizzle-solid/dist/core/schema
|
|
|
19
19
|
participants: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
|
|
20
20
|
metadata: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"object", null, false, false>;
|
|
21
21
|
lastActiveAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
22
|
-
|
|
22
|
+
lastMessage: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
23
23
|
lastMessagePreview: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
24
24
|
createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
|
|
25
25
|
updatedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
|
|
26
26
|
}>>;
|
|
27
27
|
export declare const Thread: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
28
28
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
29
|
-
|
|
30
|
-
surfaceId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
29
|
+
scope: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
31
30
|
chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
31
|
+
task: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
32
32
|
title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
33
33
|
status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
34
34
|
starred: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"boolean", null, false, true>;
|
|
@@ -39,8 +39,7 @@ export declare const Thread: import("@undefineds.co/drizzle-solid/dist/core/sche
|
|
|
39
39
|
}>>;
|
|
40
40
|
export declare const Message: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
41
41
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
42
|
-
|
|
43
|
-
surfaceId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
42
|
+
scope: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
44
43
|
chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
45
44
|
thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
46
45
|
maker: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
@@ -58,7 +57,7 @@ export declare const Message: import("@undefineds.co/drizzle-solid/dist/core/sch
|
|
|
58
57
|
mentions: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
|
|
59
58
|
replyTo: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
60
59
|
routedBy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
61
|
-
|
|
60
|
+
routeTargetAgent: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
62
61
|
coordinationId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
63
62
|
createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
|
|
64
63
|
updatedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
@@ -45,12 +45,16 @@ class PodMatrixStore {
|
|
|
45
45
|
});
|
|
46
46
|
await db.insert(models_1.threadResource).values({
|
|
47
47
|
id: threadId,
|
|
48
|
-
commandKind: 'chat',
|
|
49
|
-
surfaceId: this.surfaceIdFromRoomId(roomId),
|
|
50
48
|
chat: chatId,
|
|
51
49
|
title: input.name ?? roomId,
|
|
52
50
|
status: 'active',
|
|
53
|
-
metadata: {
|
|
51
|
+
metadata: {
|
|
52
|
+
protocol: 'matrix',
|
|
53
|
+
roomId,
|
|
54
|
+
commandKind: 'chat',
|
|
55
|
+
surface_id: this.surfaceIdFromRoomId(roomId),
|
|
56
|
+
chat_id: this.surfaceIdFromRoomId(roomId),
|
|
57
|
+
},
|
|
54
58
|
createdAt: new Date(now).toISOString(),
|
|
55
59
|
updatedAt: new Date(now).toISOString(),
|
|
56
60
|
});
|
|
@@ -119,7 +123,7 @@ class PodMatrixStore {
|
|
|
119
123
|
async sendEvent(roomId, eventType, txnId, content, context) {
|
|
120
124
|
const db = await this.getDb(context);
|
|
121
125
|
await this.ensureRoomExists(db, roomId);
|
|
122
|
-
const existing = await this.findEventByTxnId(db, roomId, txnId);
|
|
126
|
+
const existing = await this.findEventByTxnId(db, roomId, txnId, context);
|
|
123
127
|
if (existing) {
|
|
124
128
|
return existing;
|
|
125
129
|
}
|
|
@@ -141,7 +145,7 @@ class PodMatrixStore {
|
|
|
141
145
|
const limit = options.limit && options.limit > 0 ? options.limit : 50;
|
|
142
146
|
const join = {};
|
|
143
147
|
for (const room of rooms) {
|
|
144
|
-
const events = await this.listEvents(db, room.roomId, {
|
|
148
|
+
const events = await this.listEvents(db, room.roomId, context, {
|
|
145
149
|
sinceTs,
|
|
146
150
|
limit,
|
|
147
151
|
});
|
|
@@ -166,7 +170,7 @@ class PodMatrixStore {
|
|
|
166
170
|
const limit = options.limit && options.limit > 0 ? options.limit : 50;
|
|
167
171
|
const fromTs = this.parseSyncToken(options.from);
|
|
168
172
|
const forward = options.dir === 'f';
|
|
169
|
-
const events = await this.listEvents(db, roomId, {
|
|
173
|
+
const events = await this.listEvents(db, roomId, context, {
|
|
170
174
|
sinceTs: forward && fromTs > 0 ? fromTs : undefined,
|
|
171
175
|
beforeOrAtTs: !forward && fromTs > 0 ? fromTs : undefined,
|
|
172
176
|
limit,
|
|
@@ -181,7 +185,7 @@ class PodMatrixStore {
|
|
|
181
185
|
}
|
|
182
186
|
async getEvent(roomId, eventId, context) {
|
|
183
187
|
const db = await this.getDb(context);
|
|
184
|
-
const event = await this.findEventById(db, roomId, eventId);
|
|
188
|
+
const event = await this.findEventById(db, roomId, eventId, context);
|
|
185
189
|
if (!event) {
|
|
186
190
|
throw new Error(`Matrix event not found: ${eventId}`);
|
|
187
191
|
}
|
|
@@ -189,7 +193,7 @@ class PodMatrixStore {
|
|
|
189
193
|
}
|
|
190
194
|
async getState(roomId, eventType, stateKey, context) {
|
|
191
195
|
const db = await this.getDb(context);
|
|
192
|
-
const event = await this.findLatestStateEvent(db, roomId, eventType, stateKey);
|
|
196
|
+
const event = await this.findLatestStateEvent(db, roomId, eventType, stateKey, context);
|
|
193
197
|
if (!event) {
|
|
194
198
|
throw new Error(`Matrix state not found: ${eventType}/${stateKey}`);
|
|
195
199
|
}
|
|
@@ -229,7 +233,7 @@ class PodMatrixStore {
|
|
|
229
233
|
}
|
|
230
234
|
async appendEvent(db, input, context) {
|
|
231
235
|
const eventId = this.generateEventId(context);
|
|
232
|
-
const depth = await this.nextEventDepth(db, input.roomId);
|
|
236
|
+
const depth = await this.nextEventDepth(db, input.roomId, context);
|
|
233
237
|
const originIso = new Date(input.originServerTs).toISOString();
|
|
234
238
|
const record = {
|
|
235
239
|
eventId,
|
|
@@ -246,8 +250,6 @@ class PodMatrixStore {
|
|
|
246
250
|
};
|
|
247
251
|
await db.insert(models_1.messageResource).values({
|
|
248
252
|
id: this.messageResourceIdFromEvent(input.roomId, eventId, input.originServerTs),
|
|
249
|
-
commandKind: 'chat',
|
|
250
|
-
surfaceId: this.surfaceIdFromRoomId(input.roomId),
|
|
251
253
|
chat: this.chatResourceIdFromRoomId(input.roomId),
|
|
252
254
|
thread: this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(input.roomId), context),
|
|
253
255
|
maker: context.userId,
|
|
@@ -266,6 +268,9 @@ class PodMatrixStore {
|
|
|
266
268
|
txnId: input.txnId ?? null,
|
|
267
269
|
stateKey: input.stateKey ?? null,
|
|
268
270
|
content: input.content,
|
|
271
|
+
commandKind: 'chat',
|
|
272
|
+
surface_id: this.surfaceIdFromRoomId(input.roomId),
|
|
273
|
+
chat_id: this.surfaceIdFromRoomId(input.roomId),
|
|
269
274
|
},
|
|
270
275
|
createdAt: originIso,
|
|
271
276
|
updatedAt: originIso,
|
|
@@ -278,9 +283,9 @@ class PodMatrixStore {
|
|
|
278
283
|
.map((room) => this.chatSourceToRoomRecord(room))
|
|
279
284
|
.filter((room) => room !== undefined);
|
|
280
285
|
}
|
|
281
|
-
async listEvents(db, roomId, options = {}) {
|
|
286
|
+
async listEvents(db, roomId, context, options = {}) {
|
|
282
287
|
const conditions = [
|
|
283
|
-
(0, drizzle_solid_1.eq)(models_1.messageResource.
|
|
288
|
+
(0, drizzle_solid_1.eq)(models_1.messageResource.thread, this.resolveDataResourceUriFromId(this.threadResourceIdFromRoomId(roomId), context)),
|
|
284
289
|
options.sinceTs !== undefined ? (0, drizzle_solid_1.gt)(models_1.messageResource.createdAt, new Date(options.sinceTs).toISOString()) : undefined,
|
|
285
290
|
options.beforeOrAtTs !== undefined ? (0, drizzle_solid_1.lte)(models_1.messageResource.createdAt, new Date(options.beforeOrAtTs).toISOString()) : undefined,
|
|
286
291
|
];
|
|
@@ -294,20 +299,20 @@ class PodMatrixStore {
|
|
|
294
299
|
const events = await query;
|
|
295
300
|
return events.map((event) => this.eventSourceToRecord(event));
|
|
296
301
|
}
|
|
297
|
-
async findEventByTxnId(db, roomId, txnId) {
|
|
298
|
-
const records = await this.listEvents(db, roomId);
|
|
302
|
+
async findEventByTxnId(db, roomId, txnId, context) {
|
|
303
|
+
const records = await this.listEvents(db, roomId, context);
|
|
299
304
|
return records.find((record) => record.txnId === txnId);
|
|
300
305
|
}
|
|
301
|
-
async findEventById(db, roomId, eventId) {
|
|
302
|
-
const records = await this.listEvents(db, roomId);
|
|
306
|
+
async findEventById(db, roomId, eventId, context) {
|
|
307
|
+
const records = await this.listEvents(db, roomId, context);
|
|
303
308
|
return records.find((record) => record.eventId === eventId);
|
|
304
309
|
}
|
|
305
|
-
async nextEventDepth(db, roomId) {
|
|
306
|
-
const records = await this.listEvents(db, roomId);
|
|
310
|
+
async nextEventDepth(db, roomId, context) {
|
|
311
|
+
const records = await this.listEvents(db, roomId, context);
|
|
307
312
|
return records.reduce((max, record) => Math.max(max, record.depth ?? 0), 0) + 1;
|
|
308
313
|
}
|
|
309
|
-
async findLatestStateEvent(db, roomId, eventType, stateKey) {
|
|
310
|
-
const records = await this.listEvents(db, roomId, { newestFirst: true });
|
|
314
|
+
async findLatestStateEvent(db, roomId, eventType, stateKey, context) {
|
|
315
|
+
const records = await this.listEvents(db, roomId, context, { newestFirst: true });
|
|
311
316
|
return records.find((record) => record.type === eventType && (record.stateKey ?? '') === stateKey);
|
|
312
317
|
}
|
|
313
318
|
eventSourceToRecord(source) {
|
|
@@ -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":"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","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"]}
|
|
@@ -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, };
|