@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.
Files changed (104) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/ai/models/openai.d.ts +16 -0
  3. package/dist/ai/models/openai.d.ts.map +1 -1
  4. package/dist/ai/models/openai.js +26 -0
  5. package/dist/ai/models/openai.js.map +1 -1
  6. package/dist/ai/nodes/generic-chat/generic-chat.node.d.ts +1 -1
  7. package/dist/ai/nodes/index.d.ts +0 -1
  8. package/dist/ai/nodes/index.d.ts.map +1 -1
  9. package/dist/ai/nodes/index.js +0 -1
  10. package/dist/ai/nodes/index.js.map +1 -1
  11. package/dist/ai/semantic-router-factory/create-semantic-router.d.ts +1 -2
  12. package/dist/ai/semantic-router-factory/create-semantic-router.d.ts.map +1 -1
  13. package/dist/ai/semantic-router-factory/create-semantic-router.js +2 -3
  14. package/dist/ai/semantic-router-factory/create-semantic-router.js.map +1 -1
  15. package/dist/ai/tools/ask-ixo-guru/ask-ixo-guru.d.ts +1 -1
  16. package/dist/ai/tools/ask-ixo-guru/ask-ixo-guru.d.ts.map +1 -1
  17. package/dist/ai/tools/index.d.ts +0 -1
  18. package/dist/ai/tools/index.d.ts.map +1 -1
  19. package/dist/ai/tools/index.js +0 -1
  20. package/dist/ai/tools/index.js.map +1 -1
  21. package/dist/ai/tools/parser-action-tool.d.ts +1 -1
  22. package/dist/ai/tools/parser-action-tool.d.ts.map +1 -1
  23. package/dist/ai/tools/parser-action-tool.js +10 -3
  24. package/dist/ai/tools/parser-action-tool.js.map +1 -1
  25. package/dist/ai/tools/parser-browser-tool.d.ts +1 -1
  26. package/dist/ai/tools/parser-browser-tool.d.ts.map +1 -1
  27. package/dist/ai/tools/scrape-web-page.d.ts +1 -1
  28. package/dist/ai/tools/scrape-web-page.d.ts.map +1 -1
  29. package/dist/ai/tools/web-search-tool.d.ts +1 -1
  30. package/dist/ai/tools/web-search-tool.d.ts.map +1 -1
  31. package/dist/ai/utils/load-file.d.ts +1 -0
  32. package/dist/ai/utils/load-file.d.ts.map +1 -1
  33. package/dist/ai/utils/load-file.js +8 -0
  34. package/dist/ai/utils/load-file.js.map +1 -1
  35. package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.d.ts +10 -0
  36. package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.d.ts.map +1 -1
  37. package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.js +4 -1
  38. package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.js.map +1 -1
  39. package/dist/ai/utils/verify-matrix-openId-token.js +2 -2
  40. package/dist/ai/utils/verify-matrix-openId-token.js.map +1 -1
  41. package/dist/services/env/env.service.js.map +1 -1
  42. package/dist/services/memory-engine/memory-engine.service.d.ts +22 -16
  43. package/dist/services/memory-engine/memory-engine.service.d.ts.map +1 -1
  44. package/dist/services/memory-engine/memory-engine.service.js +136 -111
  45. package/dist/services/memory-engine/memory-engine.service.js.map +1 -1
  46. package/dist/services/memory-engine/types.d.ts +16 -0
  47. package/dist/services/memory-engine/types.d.ts.map +1 -1
  48. package/dist/services/memory-engine/types.js +4 -1
  49. package/dist/services/memory-engine/types.js.map +1 -1
  50. package/dist/services/session-manager/dto.d.ts +7 -0
  51. package/dist/services/session-manager/dto.d.ts.map +1 -1
  52. package/dist/services/session-manager/dto.js +42 -0
  53. package/dist/services/session-manager/dto.js.map +1 -1
  54. package/dist/services/session-manager/session-manager.service.d.ts +2 -2
  55. package/dist/services/session-manager/session-manager.service.d.ts.map +1 -1
  56. package/dist/services/session-manager/session-manager.service.js +81 -36
  57. package/dist/services/session-manager/session-manager.service.js.map +1 -1
  58. package/dist/utils/get-user-subscription.d.ts +2 -1
  59. package/dist/utils/get-user-subscription.d.ts.map +1 -1
  60. package/dist/utils/get-user-subscription.js +11 -7
  61. package/dist/utils/get-user-subscription.js.map +1 -1
  62. package/package.json +24 -25
  63. package/src/ai/models/openai.ts +31 -0
  64. package/src/ai/nodes/index.ts +0 -1
  65. package/src/ai/semantic-router-factory/create-semantic-router.test.ts +0 -3
  66. package/src/ai/semantic-router-factory/create-semantic-router.ts +2 -7
  67. package/src/ai/tools/index.ts +0 -1
  68. package/src/ai/tools/parser-action-tool.ts +19 -3
  69. package/src/ai/utils/load-file.ts +17 -0
  70. package/src/ai/utils/transformGraphStateMessageToListMessageResponse.ts +18 -1
  71. package/src/ai/utils/verify-matrix-openId-token.ts +2 -2
  72. package/src/services/env/env.service.ts +1 -1
  73. package/src/services/memory-engine/memory-engine.service.ts +228 -240
  74. package/src/services/memory-engine/types.ts +34 -0
  75. package/src/services/session-manager/dto.ts +30 -0
  76. package/src/services/session-manager/session-manager.service.ts +98 -38
  77. package/src/utils/get-user-subscription.ts +13 -6
  78. package/tsconfig.tsbuildinfo +1 -1
  79. package/dist/ai/nodes/find-docs/find-docs.prompt.d.ts +0 -3
  80. package/dist/ai/nodes/find-docs/find-docs.prompt.d.ts.map +0 -1
  81. package/dist/ai/nodes/find-docs/find-docs.prompt.js +0 -61
  82. package/dist/ai/nodes/find-docs/find-docs.prompt.js.map +0 -1
  83. package/dist/ai/nodes/find-docs/index.d.ts +0 -3
  84. package/dist/ai/nodes/find-docs/index.d.ts.map +0 -1
  85. package/dist/ai/nodes/find-docs/index.js +0 -3
  86. package/dist/ai/nodes/find-docs/index.js.map +0 -1
  87. package/dist/ai/nodes/find-docs/node.d.ts +0 -17
  88. package/dist/ai/nodes/find-docs/node.d.ts.map +0 -1
  89. package/dist/ai/nodes/find-docs/node.js +0 -46
  90. package/dist/ai/nodes/find-docs/node.js.map +0 -1
  91. package/dist/ai/tools/retriever-tool/index.d.ts +0 -2
  92. package/dist/ai/tools/retriever-tool/index.d.ts.map +0 -1
  93. package/dist/ai/tools/retriever-tool/index.js +0 -2
  94. package/dist/ai/tools/retriever-tool/index.js.map +0 -1
  95. package/dist/ai/tools/retriever-tool/retriever-tool.d.ts +0 -18
  96. package/dist/ai/tools/retriever-tool/retriever-tool.d.ts.map +0 -1
  97. package/dist/ai/tools/retriever-tool/retriever-tool.js +0 -62
  98. package/dist/ai/tools/retriever-tool/retriever-tool.js.map +0 -1
  99. package/src/ai/nodes/find-docs/find-docs.prompt.ts +0 -61
  100. package/src/ai/nodes/find-docs/index.ts +0 -2
  101. package/src/ai/nodes/find-docs/node.ts +0 -83
  102. package/src/ai/tools/retriever-tool/index.ts +0 -1
  103. package/src/ai/tools/retriever-tool/retriever-tool.test.ts +0 -163
  104. 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 { getChatOpenAiModel } from '../../ai/index.js';
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 llm = getChatOpenAiModel({
45
- model: 'meta-llama/llama-3.1-8b-instruct',
46
- temperature: 0.3,
47
- apiKey: process.env.OPEN_ROUTER_API_KEY,
48
- timeout: 20 * 1000 * 60, // 20 minutes
49
- configuration: {
50
- baseURL: 'https://openrouter.ai/api/v1',
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: _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 rows = db
302
- .prepare(
303
- `SELECT
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
- .all(limit, offset) as Array<{
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
- const { roomId } = await this.matrixManger.getOracleRoomIdWithHomeServer({
354
- userDid: createSessionDto.did,
355
- oracleEntityDid: createSessionDto.oracleEntityDid,
356
- userHomeServer,
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 = await this.matrixManger.sendMessage({
363
- message: 'New Conversation Started',
364
- roomId,
365
- isOracleAdmin: true,
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 (this.memoryEngineService) {
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
- console.error(
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
- console.error('Error fetching user subscription:', error);
88
+ Logger.error('Error fetching user subscription:', error);
82
89
  return null;
83
90
  }
84
91
  };