@ixo/common 1.1.2 → 1.1.4
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/.turbo/turbo-build.log +1 -1
- package/dist/ai/models/openai.d.ts +16 -0
- package/dist/ai/models/openai.d.ts.map +1 -1
- package/dist/ai/models/openai.js +26 -0
- package/dist/ai/models/openai.js.map +1 -1
- package/dist/ai/nodes/generic-chat/generic-chat.node.d.ts +1 -1
- package/dist/ai/nodes/index.d.ts +0 -1
- package/dist/ai/nodes/index.d.ts.map +1 -1
- package/dist/ai/nodes/index.js +0 -1
- package/dist/ai/nodes/index.js.map +1 -1
- package/dist/ai/semantic-router-factory/create-semantic-router.d.ts +1 -2
- package/dist/ai/semantic-router-factory/create-semantic-router.d.ts.map +1 -1
- package/dist/ai/semantic-router-factory/create-semantic-router.js +2 -3
- package/dist/ai/semantic-router-factory/create-semantic-router.js.map +1 -1
- package/dist/ai/tools/ask-ixo-guru/ask-ixo-guru.d.ts +1 -1
- package/dist/ai/tools/ask-ixo-guru/ask-ixo-guru.d.ts.map +1 -1
- package/dist/ai/tools/index.d.ts +0 -1
- package/dist/ai/tools/index.d.ts.map +1 -1
- package/dist/ai/tools/index.js +0 -1
- package/dist/ai/tools/index.js.map +1 -1
- package/dist/ai/tools/parser-action-tool.d.ts +1 -1
- package/dist/ai/tools/parser-action-tool.d.ts.map +1 -1
- package/dist/ai/tools/parser-action-tool.js +10 -3
- package/dist/ai/tools/parser-action-tool.js.map +1 -1
- package/dist/ai/tools/parser-browser-tool.d.ts +1 -1
- package/dist/ai/tools/parser-browser-tool.d.ts.map +1 -1
- package/dist/ai/tools/scrape-web-page.d.ts +1 -1
- package/dist/ai/tools/scrape-web-page.d.ts.map +1 -1
- package/dist/ai/tools/web-search-tool.d.ts +1 -1
- package/dist/ai/tools/web-search-tool.d.ts.map +1 -1
- package/dist/ai/utils/load-file.d.ts +1 -0
- package/dist/ai/utils/load-file.d.ts.map +1 -1
- package/dist/ai/utils/load-file.js +8 -0
- package/dist/ai/utils/load-file.js.map +1 -1
- package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.d.ts +10 -0
- package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.d.ts.map +1 -1
- package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.js +4 -1
- package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.js.map +1 -1
- package/dist/ai/utils/verify-matrix-openId-token.js +2 -2
- package/dist/ai/utils/verify-matrix-openId-token.js.map +1 -1
- package/dist/services/env/env.service.js.map +1 -1
- package/dist/services/memory-engine/memory-engine.service.d.ts +22 -16
- package/dist/services/memory-engine/memory-engine.service.d.ts.map +1 -1
- package/dist/services/memory-engine/memory-engine.service.js +136 -111
- package/dist/services/memory-engine/memory-engine.service.js.map +1 -1
- package/dist/services/memory-engine/types.d.ts +16 -0
- package/dist/services/memory-engine/types.d.ts.map +1 -1
- package/dist/services/memory-engine/types.js +4 -1
- package/dist/services/memory-engine/types.js.map +1 -1
- package/dist/services/session-manager/dto.d.ts +7 -0
- package/dist/services/session-manager/dto.d.ts.map +1 -1
- package/dist/services/session-manager/dto.js +42 -0
- package/dist/services/session-manager/dto.js.map +1 -1
- package/dist/services/session-manager/session-manager.service.d.ts +2 -2
- package/dist/services/session-manager/session-manager.service.d.ts.map +1 -1
- package/dist/services/session-manager/session-manager.service.js +81 -36
- package/dist/services/session-manager/session-manager.service.js.map +1 -1
- package/dist/utils/get-user-subscription.d.ts +2 -1
- package/dist/utils/get-user-subscription.d.ts.map +1 -1
- package/dist/utils/get-user-subscription.js +11 -7
- package/dist/utils/get-user-subscription.js.map +1 -1
- package/package.json +24 -25
- package/src/ai/models/openai.ts +31 -0
- package/src/ai/nodes/index.ts +0 -1
- package/src/ai/semantic-router-factory/create-semantic-router.test.ts +0 -3
- package/src/ai/semantic-router-factory/create-semantic-router.ts +2 -7
- package/src/ai/tools/index.ts +0 -1
- package/src/ai/tools/parser-action-tool.ts +19 -3
- package/src/ai/utils/load-file.ts +17 -0
- package/src/ai/utils/transformGraphStateMessageToListMessageResponse.ts +18 -1
- package/src/ai/utils/verify-matrix-openId-token.ts +2 -2
- package/src/services/env/env.service.ts +1 -1
- package/src/services/memory-engine/memory-engine.service.ts +228 -240
- package/src/services/memory-engine/types.ts +34 -0
- package/src/services/session-manager/dto.ts +30 -0
- package/src/services/session-manager/session-manager.service.ts +98 -38
- package/src/utils/get-user-subscription.ts +13 -6
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/ai/nodes/find-docs/find-docs.prompt.d.ts +0 -3
- package/dist/ai/nodes/find-docs/find-docs.prompt.d.ts.map +0 -1
- package/dist/ai/nodes/find-docs/find-docs.prompt.js +0 -61
- package/dist/ai/nodes/find-docs/find-docs.prompt.js.map +0 -1
- package/dist/ai/nodes/find-docs/index.d.ts +0 -3
- package/dist/ai/nodes/find-docs/index.d.ts.map +0 -1
- package/dist/ai/nodes/find-docs/index.js +0 -3
- package/dist/ai/nodes/find-docs/index.js.map +0 -1
- package/dist/ai/nodes/find-docs/node.d.ts +0 -17
- package/dist/ai/nodes/find-docs/node.d.ts.map +0 -1
- package/dist/ai/nodes/find-docs/node.js +0 -46
- package/dist/ai/nodes/find-docs/node.js.map +0 -1
- package/dist/ai/tools/retriever-tool/index.d.ts +0 -2
- package/dist/ai/tools/retriever-tool/index.d.ts.map +0 -1
- package/dist/ai/tools/retriever-tool/index.js +0 -2
- package/dist/ai/tools/retriever-tool/index.js.map +0 -1
- package/dist/ai/tools/retriever-tool/retriever-tool.d.ts +0 -18
- package/dist/ai/tools/retriever-tool/retriever-tool.d.ts.map +0 -1
- package/dist/ai/tools/retriever-tool/retriever-tool.js +0 -62
- package/dist/ai/tools/retriever-tool/retriever-tool.js.map +0 -1
- package/src/ai/nodes/find-docs/find-docs.prompt.ts +0 -61
- package/src/ai/nodes/find-docs/index.ts +0 -2
- package/src/ai/nodes/find-docs/node.ts +0 -83
- package/src/ai/tools/retriever-tool/index.ts +0 -1
- package/src/ai/tools/retriever-tool/retriever-tool.test.ts +0 -163
- package/src/ai/tools/retriever-tool/retriever-tool.ts +0 -107
|
@@ -2,7 +2,12 @@ import { Logger } from '@ixo/logger';
|
|
|
2
2
|
import { MatrixManager } from '@ixo/matrix';
|
|
3
3
|
import { getMatrixHomeServerCroppedForDid } from '@ixo/oracles-chain-client';
|
|
4
4
|
import { type Database } from 'better-sqlite3';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
getChatOpenAiModel,
|
|
7
|
+
getLLMProvider,
|
|
8
|
+
getOpenRouterChatModel,
|
|
9
|
+
getProviderConfig,
|
|
10
|
+
} from '../../ai/index.js';
|
|
6
11
|
import { type MemoryEngineService } from '../memory-engine/memory-engine.service.js';
|
|
7
12
|
import { type UserContextData } from '../memory-engine/types.js';
|
|
8
13
|
import {
|
|
@@ -41,18 +46,28 @@ export class SessionManagerService {
|
|
|
41
46
|
if (messages.length === 0) {
|
|
42
47
|
return 'Untitled';
|
|
43
48
|
}
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
const provider = getLLMProvider();
|
|
50
|
+
const config = getProviderConfig();
|
|
51
|
+
|
|
52
|
+
const llm =
|
|
53
|
+
provider === 'openrouter'
|
|
54
|
+
? getOpenRouterChatModel({
|
|
55
|
+
model: 'meta-llama/llama-3.1-8b-instruct',
|
|
56
|
+
temperature: 0.3,
|
|
57
|
+
timeout: 60_000,
|
|
58
|
+
})
|
|
59
|
+
: getChatOpenAiModel({
|
|
60
|
+
model: 'meta-llama/Meta-Llama-3.1-8B-Instruct',
|
|
61
|
+
temperature: 0.3,
|
|
62
|
+
apiKey: config.apiKey,
|
|
63
|
+
timeout: 60_000,
|
|
64
|
+
configuration: {
|
|
65
|
+
baseURL: config.baseURL,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
53
68
|
const response = await llm.invoke(
|
|
54
|
-
`Based on this messages messages, Add a title for this convo and only based on the messages? MAKE SURE TO ONLY RESPOND WITH THE TITLE.
|
|
55
|
-
|
|
69
|
+
`Based on this messages messages, Add a title for this convo and only based on the messages? MAKE SURE TO ONLY RESPOND WITH THE TITLE.
|
|
70
|
+
|
|
56
71
|
## RESPONSE FORMAT
|
|
57
72
|
ONLY RESPOND WITH THE TITLE not anything else that title will be saved to the store directly from your response so generated based on the messages.
|
|
58
73
|
|
|
@@ -125,7 +140,7 @@ ___________________________________________________________
|
|
|
125
140
|
messages,
|
|
126
141
|
oracleEntityDid,
|
|
127
142
|
oracleName,
|
|
128
|
-
roomId
|
|
143
|
+
roomId,
|
|
129
144
|
lastProcessedCount,
|
|
130
145
|
oracleDid,
|
|
131
146
|
userContext,
|
|
@@ -158,6 +173,7 @@ ___________________________________________________________
|
|
|
158
173
|
oracleEntityDid,
|
|
159
174
|
oracleDid,
|
|
160
175
|
userContext,
|
|
176
|
+
roomId,
|
|
161
177
|
slackThreadTs,
|
|
162
178
|
};
|
|
163
179
|
|
|
@@ -165,8 +181,8 @@ ___________________________________________________________
|
|
|
165
181
|
db.prepare(
|
|
166
182
|
`
|
|
167
183
|
INSERT INTO sessions (
|
|
168
|
-
session_id, title, last_updated_at, created_at, oracle_name,
|
|
169
|
-
oracle_did, oracle_entity_did, last_processed_count,
|
|
184
|
+
session_id, title, last_updated_at, created_at, oracle_name,
|
|
185
|
+
oracle_did, oracle_entity_did, last_processed_count,
|
|
170
186
|
user_context, room_id, slack_thread_ts
|
|
171
187
|
)
|
|
172
188
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -203,6 +219,19 @@ ___________________________________________________________
|
|
|
203
219
|
})
|
|
204
220
|
: selectedSession.title;
|
|
205
221
|
|
|
222
|
+
if (allowTitleUpdate && roomId && title) {
|
|
223
|
+
this.matrixManger
|
|
224
|
+
.editMessage({
|
|
225
|
+
messageId: sessionId,
|
|
226
|
+
roomId,
|
|
227
|
+
message: title,
|
|
228
|
+
isOracleAdmin: true,
|
|
229
|
+
})
|
|
230
|
+
.catch((err) => {
|
|
231
|
+
Logger.error('Failed to update conversation title in Matrix:', err);
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
206
235
|
const lastUpdatedAt = new Date().toISOString();
|
|
207
236
|
const updatedSession: ChatSession = {
|
|
208
237
|
...selectedSession,
|
|
@@ -214,7 +243,7 @@ ___________________________________________________________
|
|
|
214
243
|
|
|
215
244
|
db.prepare(
|
|
216
245
|
`
|
|
217
|
-
UPDATE sessions
|
|
246
|
+
UPDATE sessions
|
|
218
247
|
SET title = ?, last_updated_at = ?, last_processed_count = ?, slack_thread_ts = ?
|
|
219
248
|
WHERE session_id = ?
|
|
220
249
|
`,
|
|
@@ -237,11 +266,11 @@ ___________________________________________________________
|
|
|
237
266
|
const db = await this.syncService.getUserDatabase(did);
|
|
238
267
|
const row = db
|
|
239
268
|
.prepare(
|
|
240
|
-
`SELECT
|
|
269
|
+
`SELECT
|
|
241
270
|
session_id, title, last_updated_at, created_at, oracle_name,
|
|
242
271
|
oracle_did, oracle_entity_did, last_processed_count,
|
|
243
272
|
user_context, room_id, slack_thread_ts
|
|
244
|
-
FROM sessions
|
|
273
|
+
FROM sessions
|
|
245
274
|
WHERE session_id = ?`,
|
|
246
275
|
)
|
|
247
276
|
.get(sessionId) as
|
|
@@ -297,19 +326,32 @@ ___________________________________________________________
|
|
|
297
326
|
const limit = listSessionsDto.limit ?? 20;
|
|
298
327
|
const offset = listSessionsDto.offset ?? 0;
|
|
299
328
|
|
|
300
|
-
// Get paginated sessions with total count
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
329
|
+
// Get paginated sessions with total count, optionally filtered by roomId
|
|
330
|
+
const hasRoomFilter = !!listSessionsDto.roomId;
|
|
331
|
+
const sql = hasRoomFilter
|
|
332
|
+
? `SELECT
|
|
304
333
|
session_id, title, last_updated_at, created_at, oracle_name,
|
|
305
334
|
oracle_did, oracle_entity_did, last_processed_count,
|
|
306
335
|
user_context, room_id, slack_thread_ts,
|
|
307
336
|
COUNT(*) OVER() as total
|
|
308
|
-
FROM sessions
|
|
337
|
+
FROM sessions
|
|
338
|
+
WHERE room_id = ?
|
|
309
339
|
ORDER BY last_updated_at DESC
|
|
310
|
-
LIMIT ? OFFSET
|
|
311
|
-
|
|
312
|
-
|
|
340
|
+
LIMIT ? OFFSET ?`
|
|
341
|
+
: `SELECT
|
|
342
|
+
session_id, title, last_updated_at, created_at, oracle_name,
|
|
343
|
+
oracle_did, oracle_entity_did, last_processed_count,
|
|
344
|
+
user_context, room_id, slack_thread_ts,
|
|
345
|
+
COUNT(*) OVER() as total
|
|
346
|
+
FROM sessions
|
|
347
|
+
ORDER BY last_updated_at DESC
|
|
348
|
+
LIMIT ? OFFSET ?`;
|
|
349
|
+
|
|
350
|
+
const params = hasRoomFilter
|
|
351
|
+
? [listSessionsDto.roomId, limit, offset]
|
|
352
|
+
: [limit, offset];
|
|
353
|
+
|
|
354
|
+
const rows = db.prepare(sql).all(...params) as Array<{
|
|
313
355
|
session_id: string;
|
|
314
356
|
title: string | null;
|
|
315
357
|
last_updated_at: string;
|
|
@@ -346,34 +388,52 @@ ___________________________________________________________
|
|
|
346
388
|
|
|
347
389
|
public async createSession(
|
|
348
390
|
createSessionDto: CreateChatSessionDto,
|
|
391
|
+
overrideEventId?: string,
|
|
349
392
|
): Promise<CreateChatSessionResponseDto> {
|
|
350
393
|
const userHomeServer =
|
|
351
394
|
createSessionDto.homeServer ||
|
|
352
395
|
(await getMatrixHomeServerCroppedForDid(createSessionDto.did));
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
396
|
+
|
|
397
|
+
// Use the provided roomId override (e.g. task-specific room),
|
|
398
|
+
// or fall back to resolving the user's main oracle room.
|
|
399
|
+
let roomId = createSessionDto.roomId;
|
|
400
|
+
if (!roomId) {
|
|
401
|
+
const resolved = await this.matrixManger.getOracleRoomIdWithHomeServer({
|
|
402
|
+
userDid: createSessionDto.did,
|
|
403
|
+
oracleEntityDid: createSessionDto.oracleEntityDid,
|
|
404
|
+
userHomeServer,
|
|
405
|
+
});
|
|
406
|
+
roomId = resolved.roomId;
|
|
407
|
+
}
|
|
358
408
|
|
|
359
409
|
if (!roomId) {
|
|
360
410
|
throw new Error('Room ID not found');
|
|
361
411
|
}
|
|
362
|
-
const eventId =
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
412
|
+
const eventId =
|
|
413
|
+
overrideEventId ??
|
|
414
|
+
(await this.matrixManger.sendMessage({
|
|
415
|
+
message: 'New Conversation Started',
|
|
416
|
+
roomId,
|
|
417
|
+
isOracleAdmin: true,
|
|
418
|
+
}));
|
|
367
419
|
|
|
368
420
|
// Gather user context from Memory Engine
|
|
369
421
|
let userContext: UserContextData | undefined;
|
|
370
|
-
if (
|
|
422
|
+
if (
|
|
423
|
+
this.memoryEngineService &&
|
|
424
|
+
(createSessionDto.ucanInvocation ||
|
|
425
|
+
(createSessionDto.oracleToken && createSessionDto.userToken))
|
|
426
|
+
) {
|
|
371
427
|
try {
|
|
372
428
|
Logger.debug('Gathering user context from Memory Engine');
|
|
373
429
|
userContext = await this.memoryEngineService.gatherUserContext({
|
|
374
430
|
oracleDid: createSessionDto.oracleDid,
|
|
375
|
-
userDid: createSessionDto.did,
|
|
376
431
|
roomId,
|
|
432
|
+
oracleToken: createSessionDto.oracleToken ?? '',
|
|
433
|
+
userToken: createSessionDto.userToken ?? '',
|
|
434
|
+
oracleHomeServer: createSessionDto.oracleHomeServer ?? '',
|
|
435
|
+
userHomeServer: createSessionDto.userHomeServer ?? '',
|
|
436
|
+
ucanInvocation: createSessionDto.ucanInvocation,
|
|
377
437
|
});
|
|
378
438
|
} catch (error) {
|
|
379
439
|
Logger.error('Failed to gather user context:', error);
|
|
@@ -34,30 +34,37 @@ export interface GetUserSubscriptionParams {
|
|
|
34
34
|
network: 'mainnet' | 'testnet' | 'devnet';
|
|
35
35
|
bearerToken: string;
|
|
36
36
|
subscriptionUrl?: string;
|
|
37
|
+
/** When set to 'ucan', includes X-Auth-Type header for UCAN invocation auth */
|
|
38
|
+
authType?: 'ucan';
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
export const getUserSubscription = async ({
|
|
40
42
|
bearerToken,
|
|
41
43
|
network,
|
|
42
44
|
subscriptionUrl: _subscriptionUrl,
|
|
45
|
+
authType,
|
|
43
46
|
}: GetUserSubscriptionParams): Promise<GetMySubscriptionsResponseDto | null> => {
|
|
44
47
|
const subscriptionUrl =
|
|
45
48
|
_subscriptionUrl ?? getSubscriptionUrlByNetwork(network);
|
|
46
49
|
try {
|
|
47
50
|
Logger.debug('Fetching user subscription from:', subscriptionUrl);
|
|
51
|
+
const headers: Record<string, string> = {
|
|
52
|
+
Authorization: `Bearer ${bearerToken}`,
|
|
53
|
+
'Content-Type': 'application/json',
|
|
54
|
+
};
|
|
55
|
+
if (authType === 'ucan') {
|
|
56
|
+
headers['X-Auth-Type'] = 'ucan';
|
|
57
|
+
}
|
|
48
58
|
const response = await fetch(
|
|
49
59
|
`${subscriptionUrl.endsWith('/') ? subscriptionUrl.slice(0, -1) : subscriptionUrl}/api/v1/subscriptions`,
|
|
50
60
|
{
|
|
51
61
|
method: 'GET',
|
|
52
|
-
headers
|
|
53
|
-
Authorization: `Bearer ${bearerToken}`,
|
|
54
|
-
'Content-Type': 'application/json',
|
|
55
|
-
},
|
|
62
|
+
headers,
|
|
56
63
|
},
|
|
57
64
|
);
|
|
58
65
|
|
|
59
66
|
if (!response.ok) {
|
|
60
|
-
|
|
67
|
+
Logger.error(
|
|
61
68
|
`Failed to fetch user subscription: ${response.status} ${response.statusText}`,
|
|
62
69
|
);
|
|
63
70
|
return null;
|
|
@@ -78,7 +85,7 @@ export const getUserSubscription = async ({
|
|
|
78
85
|
adminAddress: subscription.adminAddress,
|
|
79
86
|
};
|
|
80
87
|
} catch (error) {
|
|
81
|
-
|
|
88
|
+
Logger.error('Error fetching user subscription:', error);
|
|
82
89
|
return null;
|
|
83
90
|
}
|
|
84
91
|
};
|