@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Logger } from '@ixo/logger';
|
|
2
2
|
import { MatrixManager } from '@ixo/matrix';
|
|
3
3
|
import { getMatrixHomeServerCroppedForDid } from '@ixo/oracles-chain-client';
|
|
4
|
-
import { getChatOpenAiModel } from '../../ai/index.js';
|
|
4
|
+
import { getChatOpenAiModel, getLLMProvider, getOpenRouterChatModel, getProviderConfig, } from '../../ai/index.js';
|
|
5
5
|
export class SessionManagerService {
|
|
6
6
|
syncService;
|
|
7
7
|
matrixManger;
|
|
@@ -18,17 +18,25 @@ export class SessionManagerService {
|
|
|
18
18
|
if (messages.length === 0) {
|
|
19
19
|
return 'Untitled';
|
|
20
20
|
}
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
const provider = getLLMProvider();
|
|
22
|
+
const config = getProviderConfig();
|
|
23
|
+
const llm = provider === 'openrouter'
|
|
24
|
+
? getOpenRouterChatModel({
|
|
25
|
+
model: 'meta-llama/llama-3.1-8b-instruct',
|
|
26
|
+
temperature: 0.3,
|
|
27
|
+
timeout: 60_000,
|
|
28
|
+
})
|
|
29
|
+
: getChatOpenAiModel({
|
|
30
|
+
model: 'meta-llama/Meta-Llama-3.1-8B-Instruct',
|
|
31
|
+
temperature: 0.3,
|
|
32
|
+
apiKey: config.apiKey,
|
|
33
|
+
timeout: 60_000,
|
|
34
|
+
configuration: {
|
|
35
|
+
baseURL: config.baseURL,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
const response = await llm.invoke(`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.
|
|
39
|
+
|
|
32
40
|
## RESPONSE FORMAT
|
|
33
41
|
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.
|
|
34
42
|
|
|
@@ -81,7 +89,7 @@ ___________________________________________________________
|
|
|
81
89
|
db.prepare('UPDATE sessions SET last_processed_count = ? WHERE session_id = ?').run(lastProcessedCount, sessionId);
|
|
82
90
|
return;
|
|
83
91
|
}
|
|
84
|
-
async syncSessionSet({ sessionId, did, messages, oracleEntityDid, oracleName, roomId
|
|
92
|
+
async syncSessionSet({ sessionId, did, messages, oracleEntityDid, oracleName, roomId, lastProcessedCount, oracleDid, userContext, slackThreadTs, }) {
|
|
85
93
|
const db = await this.syncService.getUserDatabase(did);
|
|
86
94
|
const selectedSession = await this.getSession(sessionId, did, false);
|
|
87
95
|
if (!selectedSession) {
|
|
@@ -96,12 +104,13 @@ ___________________________________________________________
|
|
|
96
104
|
oracleEntityDid,
|
|
97
105
|
oracleDid,
|
|
98
106
|
userContext,
|
|
107
|
+
roomId,
|
|
99
108
|
slackThreadTs,
|
|
100
109
|
};
|
|
101
110
|
db.prepare(`
|
|
102
111
|
INSERT INTO sessions (
|
|
103
|
-
session_id, title, last_updated_at, created_at, oracle_name,
|
|
104
|
-
oracle_did, oracle_entity_did, last_processed_count,
|
|
112
|
+
session_id, title, last_updated_at, created_at, oracle_name,
|
|
113
|
+
oracle_did, oracle_entity_did, last_processed_count,
|
|
105
114
|
user_context, room_id, slack_thread_ts
|
|
106
115
|
)
|
|
107
116
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -118,6 +127,18 @@ ___________________________________________________________
|
|
|
118
127
|
messages,
|
|
119
128
|
})
|
|
120
129
|
: selectedSession.title;
|
|
130
|
+
if (allowTitleUpdate && roomId && title) {
|
|
131
|
+
this.matrixManger
|
|
132
|
+
.editMessage({
|
|
133
|
+
messageId: sessionId,
|
|
134
|
+
roomId,
|
|
135
|
+
message: title,
|
|
136
|
+
isOracleAdmin: true,
|
|
137
|
+
})
|
|
138
|
+
.catch((err) => {
|
|
139
|
+
Logger.error('Failed to update conversation title in Matrix:', err);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
121
142
|
const lastUpdatedAt = new Date().toISOString();
|
|
122
143
|
const updatedSession = {
|
|
123
144
|
...selectedSession,
|
|
@@ -127,7 +148,7 @@ ___________________________________________________________
|
|
|
127
148
|
slackThreadTs,
|
|
128
149
|
};
|
|
129
150
|
db.prepare(`
|
|
130
|
-
UPDATE sessions
|
|
151
|
+
UPDATE sessions
|
|
131
152
|
SET title = ?, last_updated_at = ?, last_processed_count = ?, slack_thread_ts = ?
|
|
132
153
|
WHERE session_id = ?
|
|
133
154
|
`).run(updatedSession.title ?? null, lastUpdatedAt, updatedSession.lastProcessedCount ?? null, updatedSession.slackThreadTs ?? null, sessionId);
|
|
@@ -136,11 +157,11 @@ ___________________________________________________________
|
|
|
136
157
|
async getSession(sessionId, did, throwOnNotFound = true) {
|
|
137
158
|
const db = await this.syncService.getUserDatabase(did);
|
|
138
159
|
const row = db
|
|
139
|
-
.prepare(`SELECT
|
|
160
|
+
.prepare(`SELECT
|
|
140
161
|
session_id, title, last_updated_at, created_at, oracle_name,
|
|
141
162
|
oracle_did, oracle_entity_did, last_processed_count,
|
|
142
163
|
user_context, room_id, slack_thread_ts
|
|
143
|
-
FROM sessions
|
|
164
|
+
FROM sessions
|
|
144
165
|
WHERE session_id = ?`)
|
|
145
166
|
.get(sessionId);
|
|
146
167
|
const selectedSession = row
|
|
@@ -172,16 +193,29 @@ ___________________________________________________________
|
|
|
172
193
|
const db = await this.syncService.getUserDatabase(listSessionsDto.did);
|
|
173
194
|
const limit = listSessionsDto.limit ?? 20;
|
|
174
195
|
const offset = listSessionsDto.offset ?? 0;
|
|
175
|
-
const
|
|
176
|
-
|
|
196
|
+
const hasRoomFilter = !!listSessionsDto.roomId;
|
|
197
|
+
const sql = hasRoomFilter
|
|
198
|
+
? `SELECT
|
|
199
|
+
session_id, title, last_updated_at, created_at, oracle_name,
|
|
200
|
+
oracle_did, oracle_entity_did, last_processed_count,
|
|
201
|
+
user_context, room_id, slack_thread_ts,
|
|
202
|
+
COUNT(*) OVER() as total
|
|
203
|
+
FROM sessions
|
|
204
|
+
WHERE room_id = ?
|
|
205
|
+
ORDER BY last_updated_at DESC
|
|
206
|
+
LIMIT ? OFFSET ?`
|
|
207
|
+
: `SELECT
|
|
177
208
|
session_id, title, last_updated_at, created_at, oracle_name,
|
|
178
209
|
oracle_did, oracle_entity_did, last_processed_count,
|
|
179
210
|
user_context, room_id, slack_thread_ts,
|
|
180
211
|
COUNT(*) OVER() as total
|
|
181
|
-
FROM sessions
|
|
212
|
+
FROM sessions
|
|
182
213
|
ORDER BY last_updated_at DESC
|
|
183
|
-
LIMIT ? OFFSET
|
|
184
|
-
|
|
214
|
+
LIMIT ? OFFSET ?`;
|
|
215
|
+
const params = hasRoomFilter
|
|
216
|
+
? [listSessionsDto.roomId, limit, offset]
|
|
217
|
+
: [limit, offset];
|
|
218
|
+
const rows = db.prepare(sql).all(...params);
|
|
185
219
|
const total = rows[0]?.total ?? 0;
|
|
186
220
|
const sessions = rows.map((row) => ({
|
|
187
221
|
sessionId: row.session_id,
|
|
@@ -200,30 +234,41 @@ ___________________________________________________________
|
|
|
200
234
|
}));
|
|
201
235
|
return { sessions, total };
|
|
202
236
|
}
|
|
203
|
-
async createSession(createSessionDto) {
|
|
237
|
+
async createSession(createSessionDto, overrideEventId) {
|
|
204
238
|
const userHomeServer = createSessionDto.homeServer ||
|
|
205
239
|
(await getMatrixHomeServerCroppedForDid(createSessionDto.did));
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
240
|
+
let roomId = createSessionDto.roomId;
|
|
241
|
+
if (!roomId) {
|
|
242
|
+
const resolved = await this.matrixManger.getOracleRoomIdWithHomeServer({
|
|
243
|
+
userDid: createSessionDto.did,
|
|
244
|
+
oracleEntityDid: createSessionDto.oracleEntityDid,
|
|
245
|
+
userHomeServer,
|
|
246
|
+
});
|
|
247
|
+
roomId = resolved.roomId;
|
|
248
|
+
}
|
|
211
249
|
if (!roomId) {
|
|
212
250
|
throw new Error('Room ID not found');
|
|
213
251
|
}
|
|
214
|
-
const eventId =
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
252
|
+
const eventId = overrideEventId ??
|
|
253
|
+
(await this.matrixManger.sendMessage({
|
|
254
|
+
message: 'New Conversation Started',
|
|
255
|
+
roomId,
|
|
256
|
+
isOracleAdmin: true,
|
|
257
|
+
}));
|
|
219
258
|
let userContext;
|
|
220
|
-
if (this.memoryEngineService
|
|
259
|
+
if (this.memoryEngineService &&
|
|
260
|
+
(createSessionDto.ucanInvocation ||
|
|
261
|
+
(createSessionDto.oracleToken && createSessionDto.userToken))) {
|
|
221
262
|
try {
|
|
222
263
|
Logger.debug('Gathering user context from Memory Engine');
|
|
223
264
|
userContext = await this.memoryEngineService.gatherUserContext({
|
|
224
265
|
oracleDid: createSessionDto.oracleDid,
|
|
225
|
-
userDid: createSessionDto.did,
|
|
226
266
|
roomId,
|
|
267
|
+
oracleToken: createSessionDto.oracleToken ?? '',
|
|
268
|
+
userToken: createSessionDto.userToken ?? '',
|
|
269
|
+
oracleHomeServer: createSessionDto.oracleHomeServer ?? '',
|
|
270
|
+
userHomeServer: createSessionDto.userHomeServer ?? '',
|
|
271
|
+
ucanInvocation: createSessionDto.ucanInvocation,
|
|
227
272
|
});
|
|
228
273
|
}
|
|
229
274
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.service.js","sourceRoot":"","sources":["../../../src/services/session-manager/session-manager.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAE7E,OAAO,
|
|
1
|
+
{"version":3,"file":"session-manager.service.js","sourceRoot":"","sources":["../../../src/services/session-manager/session-manager.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export interface GetUserSubscriptionParams {
|
|
|
16
16
|
network: 'mainnet' | 'testnet' | 'devnet';
|
|
17
17
|
bearerToken: string;
|
|
18
18
|
subscriptionUrl?: string;
|
|
19
|
+
authType?: 'ucan';
|
|
19
20
|
}
|
|
20
|
-
export declare const getUserSubscription: ({ bearerToken, network, subscriptionUrl: _subscriptionUrl, }: GetUserSubscriptionParams) => Promise<GetMySubscriptionsResponseDto | null>;
|
|
21
|
+
export declare const getUserSubscription: ({ bearerToken, network, subscriptionUrl: _subscriptionUrl, authType, }: GetUserSubscriptionParams) => Promise<GetMySubscriptionsResponseDto | null>;
|
|
21
22
|
//# sourceMappingURL=get-user-subscription.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-user-subscription.d.ts","sourceRoot":"","sources":["../../src/utils/get-user-subscription.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,2BAA2B,GACtC,SAAS,SAAS,GAAG,SAAS,GAAG,QAAQ,WAO1C,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;AAED,MAAM,WAAW,6BAA6B;IAC5C,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IACvD,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"get-user-subscription.d.ts","sourceRoot":"","sources":["../../src/utils/get-user-subscription.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,2BAA2B,GACtC,SAAS,SAAS,GAAG,SAAS,GAAG,QAAQ,WAO1C,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;AAED,MAAM,WAAW,6BAA6B;IAC5C,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IACvD,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,GAAU,wEAKvC,yBAAyB,KAAG,OAAO,CAAC,6BAA6B,GAAG,IAAI,CA6C1E,CAAC"}
|
|
@@ -6,19 +6,23 @@ export const getSubscriptionUrlByNetwork = (network) => {
|
|
|
6
6
|
devnet: 'https://subscriptions-api.ixo-api.workers.dev',
|
|
7
7
|
}[network];
|
|
8
8
|
};
|
|
9
|
-
export const getUserSubscription = async ({ bearerToken, network, subscriptionUrl: _subscriptionUrl, }) => {
|
|
9
|
+
export const getUserSubscription = async ({ bearerToken, network, subscriptionUrl: _subscriptionUrl, authType, }) => {
|
|
10
10
|
const subscriptionUrl = _subscriptionUrl ?? getSubscriptionUrlByNetwork(network);
|
|
11
11
|
try {
|
|
12
12
|
Logger.debug('Fetching user subscription from:', subscriptionUrl);
|
|
13
|
+
const headers = {
|
|
14
|
+
Authorization: `Bearer ${bearerToken}`,
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
};
|
|
17
|
+
if (authType === 'ucan') {
|
|
18
|
+
headers['X-Auth-Type'] = 'ucan';
|
|
19
|
+
}
|
|
13
20
|
const response = await fetch(`${subscriptionUrl.endsWith('/') ? subscriptionUrl.slice(0, -1) : subscriptionUrl}/api/v1/subscriptions`, {
|
|
14
21
|
method: 'GET',
|
|
15
|
-
headers
|
|
16
|
-
Authorization: `Bearer ${bearerToken}`,
|
|
17
|
-
'Content-Type': 'application/json',
|
|
18
|
-
},
|
|
22
|
+
headers,
|
|
19
23
|
});
|
|
20
24
|
if (!response.ok) {
|
|
21
|
-
|
|
25
|
+
Logger.error(`Failed to fetch user subscription: ${response.status} ${response.statusText}`);
|
|
22
26
|
return null;
|
|
23
27
|
}
|
|
24
28
|
const data = await response.json();
|
|
@@ -37,7 +41,7 @@ export const getUserSubscription = async ({ bearerToken, network, subscriptionUr
|
|
|
37
41
|
};
|
|
38
42
|
}
|
|
39
43
|
catch (error) {
|
|
40
|
-
|
|
44
|
+
Logger.error('Error fetching user subscription:', error);
|
|
41
45
|
return null;
|
|
42
46
|
}
|
|
43
47
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-user-subscription.js","sourceRoot":"","sources":["../../src/utils/get-user-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAyC,EACzC,EAAE;IACF,OAAO;QACL,OAAO,EAAE,uDAAuD;QAChE,OAAO,EAAE,uDAAuD;QAChE,MAAM,EAAE,+CAA+C;KACxD,CAAC,OAAO,CAAC,CAAC;AACb,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"get-user-subscription.js","sourceRoot":"","sources":["../../src/utils/get-user-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAyC,EACzC,EAAE;IACF,OAAO;QACL,OAAO,EAAE,uDAAuD;QAChE,OAAO,EAAE,uDAAuD;QAChE,MAAM,EAAE,+CAA+C;KACxD,CAAC,OAAO,CAAC,CAAC;AACb,CAAC,CAAC;AA8BF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,EACxC,WAAW,EACX,OAAO,EACP,eAAe,EAAE,gBAAgB,EACjC,QAAQ,GACkB,EAAiD,EAAE;IAC7E,MAAM,eAAe,GACnB,gBAAgB,IAAI,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,eAAe,CAAC,CAAC;QAClE,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,WAAW,EAAE;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;QAClC,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,uBAAuB,EACxG;YACE,MAAM,EAAE,KAAK;YACb,OAAO;SACR,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CACV,sCAAsC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC/E,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,YAAY,GAAG,IAAmC,CAAC;QACzD,OAAO;YACL,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;YAC/C,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,eAAe,EAAE,YAAY,CAAC,eAAe;YAC7C,YAAY,EAAE,YAAY,CAAC,YAAY;YACvC,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,YAAY,EAAE,YAAY,CAAC,YAAY;SACxC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ixo/common",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -24,32 +24,31 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@langchain/langgraph-checkpoint-validation": "^1.0.
|
|
27
|
+
"@langchain/langgraph-checkpoint-validation": "^1.0.9",
|
|
28
28
|
"@testcontainers/postgresql": "^10.16.0",
|
|
29
29
|
"@types/better-sqlite3": "^7.6.13",
|
|
30
30
|
"@types/node": "^22.7.3",
|
|
31
31
|
"@types/store": "^2.0.5",
|
|
32
|
-
"better-sqlite3": "^12.
|
|
32
|
+
"better-sqlite3": "^12.9.0",
|
|
33
33
|
"testcontainers": "^10.16.0",
|
|
34
34
|
"typescript": "^5.3.3",
|
|
35
|
-
"@ixo/data-store": "^1.0.1",
|
|
36
35
|
"@ixo/eslint-config": "2.0.0",
|
|
37
|
-
"@ixo/oracles-events": "^1.0.
|
|
38
|
-
"@ixo/
|
|
39
|
-
"@ixo/
|
|
36
|
+
"@ixo/oracles-events": "^1.0.4",
|
|
37
|
+
"@ixo/vitest-config": "1.0.0",
|
|
38
|
+
"@ixo/typescript-config": "1.0.0"
|
|
40
39
|
},
|
|
41
40
|
"dependencies": {
|
|
42
41
|
"@cosmjs/proto-signing": "^0.33.0",
|
|
43
42
|
"@cosmjs/stargate": "^0.33.0",
|
|
44
43
|
"@ixo/impactxclient-sdk": "^2.3.1",
|
|
45
|
-
"@langchain/community": "^1.
|
|
46
|
-
"@langchain/core": "1.
|
|
47
|
-
"@langchain/langgraph": "1.
|
|
48
|
-
"@langchain/langgraph-checkpoint": "^1.0.
|
|
49
|
-
"@langchain/langgraph-checkpoint-sqlite": "^1.0.
|
|
50
|
-
"@langchain/openai": "^1.
|
|
51
|
-
"@langchain/textsplitters": "^1.0.
|
|
52
|
-
"@tavily/core": "0.
|
|
44
|
+
"@langchain/community": "^1.1.27",
|
|
45
|
+
"@langchain/core": "^1.1.42",
|
|
46
|
+
"@langchain/langgraph": "^1.2.9",
|
|
47
|
+
"@langchain/langgraph-checkpoint": "^1.0.1",
|
|
48
|
+
"@langchain/langgraph-checkpoint-sqlite": "^1.0.1",
|
|
49
|
+
"@langchain/openai": "^1.4.5",
|
|
50
|
+
"@langchain/textsplitters": "^1.0.1",
|
|
51
|
+
"@tavily/core": "0.7.2",
|
|
53
52
|
"axios": "^1.7.9",
|
|
54
53
|
"axios-retry": "^4.5.0",
|
|
55
54
|
"class-transformer": "^0.5.1",
|
|
@@ -57,18 +56,18 @@
|
|
|
57
56
|
"dotenv": "^16.4.5",
|
|
58
57
|
"duck-duck-scrape": "^2.2.5",
|
|
59
58
|
"html-to-text": "9.0.5",
|
|
60
|
-
"langchain": "1.
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
59
|
+
"langchain": "^1.3.5",
|
|
60
|
+
"langsmith": "^0.5.25",
|
|
61
|
+
"mammoth": "1.12.0",
|
|
62
|
+
"openai": "^6.34.0",
|
|
63
|
+
"pdf-parse": "2.4.5",
|
|
64
|
+
"playwright": "^1.59.1",
|
|
65
|
+
"node-emoji": "^2.2.0",
|
|
67
66
|
"store": "^2.0.12",
|
|
68
|
-
"zod": "^4.
|
|
67
|
+
"zod": "^4.3.6",
|
|
69
68
|
"@ixo/logger": "0.0.2",
|
|
70
|
-
"@ixo/oracles-chain-client": "1.2.
|
|
71
|
-
"@ixo/matrix": "1.2.
|
|
69
|
+
"@ixo/oracles-chain-client": "1.2.2",
|
|
70
|
+
"@ixo/matrix": "1.2.31"
|
|
72
71
|
},
|
|
73
72
|
"scripts": {
|
|
74
73
|
"build": "tsc && tsc-alias",
|
package/src/ai/models/openai.ts
CHANGED
|
@@ -8,6 +8,37 @@ import {
|
|
|
8
8
|
} from '@langchain/openai';
|
|
9
9
|
import OpenAI, { type ClientOptions } from 'openai';
|
|
10
10
|
|
|
11
|
+
export type LLMProvider = 'openrouter' | 'nebius';
|
|
12
|
+
|
|
13
|
+
export function getLLMProvider(): LLMProvider {
|
|
14
|
+
const raw = (process.env.LLM_PROVIDER ?? 'openrouter').toLowerCase();
|
|
15
|
+
if (raw === 'nebius') return 'nebius';
|
|
16
|
+
return 'openrouter';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Provider-aware base URL and API key. */
|
|
20
|
+
export function getProviderConfig() {
|
|
21
|
+
const provider = getLLMProvider();
|
|
22
|
+
|
|
23
|
+
if (provider === 'nebius') {
|
|
24
|
+
return {
|
|
25
|
+
provider,
|
|
26
|
+
baseURL: 'https://api.tokenfactory.nebius.com/v1/',
|
|
27
|
+
apiKey: process.env.NEBIUS_API_KEY ?? '',
|
|
28
|
+
headers: {} as Record<string, string>,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
provider,
|
|
34
|
+
baseURL: 'https://openrouter.ai/api/v1',
|
|
35
|
+
apiKey: process.env.OPEN_ROUTER_API_KEY ?? '',
|
|
36
|
+
headers: {
|
|
37
|
+
'HTTP-Referer': 'oracle-app.com',
|
|
38
|
+
'X-Title': process.env.ORACLE_NAME ?? 'Oracle App',
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
11
42
|
const getChatOpenAiModel = (params?: ChatOpenAIFields): ChatOpenAI =>
|
|
12
43
|
new ChatOpenAI({
|
|
13
44
|
temperature: 0.2,
|
package/src/ai/nodes/index.ts
CHANGED
|
@@ -2,9 +2,6 @@ import { createSemanticRouter } from './create-semantic-router.js';
|
|
|
2
2
|
|
|
3
3
|
const parse = vi.fn();
|
|
4
4
|
const create = vi.fn();
|
|
5
|
-
vi.mock('langfuse', () => ({
|
|
6
|
-
observeOpenAI: vi.fn((client: unknown) => client),
|
|
7
|
-
}));
|
|
8
5
|
vi.mock('openai', () => ({
|
|
9
6
|
OpenAI: vi.fn().mockImplementation(() => {
|
|
10
7
|
function fn(): unknown {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Logger } from '@ixo/logger';
|
|
2
2
|
import { PromptTemplate } from '@langchain/core/prompts';
|
|
3
|
-
import { type LangfuseConfig, observeOpenAI } from 'langfuse';
|
|
4
3
|
import { OpenAI } from 'openai';
|
|
5
4
|
import { zodResponseFormat } from 'openai/helpers/zod';
|
|
6
5
|
import z from 'zod';
|
|
@@ -39,10 +38,7 @@ export const createSemanticRouter = <
|
|
|
39
38
|
| 'gpt-4.1-nano'
|
|
40
39
|
| 'gpt-4.1-mini' = 'gpt-4.1-mini',
|
|
41
40
|
isComplex = false,
|
|
42
|
-
): ((
|
|
43
|
-
state: EnsureKeys<Record<string, unknown>, K>,
|
|
44
|
-
traceConfig?: LangfuseConfig,
|
|
45
|
-
) => Promise<keyof R>) => {
|
|
41
|
+
): ((state: EnsureKeys<Record<string, unknown>, K>) => Promise<keyof R>) => {
|
|
46
42
|
const keys = validateRoutes(routes, basedOn);
|
|
47
43
|
const schema = z.object({
|
|
48
44
|
nextRoute: z.enum(
|
|
@@ -52,7 +48,6 @@ export const createSemanticRouter = <
|
|
|
52
48
|
});
|
|
53
49
|
return async <T extends Record<string, unknown>>(
|
|
54
50
|
state: EnsureKeys<T, K>,
|
|
55
|
-
traceConfig?: LangfuseConfig,
|
|
56
51
|
): Promise<keyof R> => {
|
|
57
52
|
const selectedValues = {} as Record<string, string | object>;
|
|
58
53
|
for (const key of basedOn) {
|
|
@@ -72,7 +67,7 @@ export const createSemanticRouter = <
|
|
|
72
67
|
// find the route that matches the state
|
|
73
68
|
const prompt = PromptTemplate.fromTemplate(semanticRouterPrompt);
|
|
74
69
|
|
|
75
|
-
const client =
|
|
70
|
+
const client = new OpenAI();
|
|
76
71
|
const promptWithState = await prompt.format({
|
|
77
72
|
routes: jsonToYaml(routes),
|
|
78
73
|
state: jsonToYaml(selectedValues),
|
package/src/ai/tools/index.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export * from './ask-ixo-guru/index.js';
|
|
2
2
|
export * from './browser-tool-caller.js';
|
|
3
3
|
export * from './parser-browser-tool.js';
|
|
4
|
-
export * from './retriever-tool/index.js';
|
|
5
4
|
export * from './scrape-web-page.js';
|
|
6
5
|
export * from './web-search-tool.js';
|
|
7
6
|
export * from './log-action-to-matrix.js';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type IRunnableConfigWithRequiredFields } from '@ixo/matrix';
|
|
2
2
|
import { tool } from '@langchain/core/tools';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
3
4
|
import { callAgAction } from './action-caller.js';
|
|
4
5
|
import { logActionToMatrix } from './log-action-to-matrix.js';
|
|
5
6
|
|
|
@@ -16,19 +17,34 @@ export function parserActionTool(action: IParseAgActionParams) {
|
|
|
16
17
|
async (input, runnableConfig) => {
|
|
17
18
|
const { configurable } =
|
|
18
19
|
runnableConfig as IRunnableConfigWithRequiredFields;
|
|
19
|
-
|
|
20
|
+
// Prefer explicit `sessionId` — sub-agent wrappers set this to the real
|
|
21
|
+
// user WS session so routing works from nested contexts. Fall back to
|
|
22
|
+
// `thread_id` for direct invocations from the main agent (where
|
|
23
|
+
// thread_id IS the user's session).
|
|
24
|
+
const sessionIdField = (configurable as { sessionId?: unknown })
|
|
25
|
+
.sessionId;
|
|
26
|
+
const sessionId =
|
|
27
|
+
typeof sessionIdField === 'string' && sessionIdField.length > 0
|
|
28
|
+
? sessionIdField
|
|
29
|
+
: configurable.thread_id;
|
|
30
|
+
const { requestId, configs } = configurable;
|
|
20
31
|
|
|
21
32
|
if (!sessionId) {
|
|
22
33
|
throw new Error('sessionId is required for AG-UI actions');
|
|
23
34
|
}
|
|
24
35
|
|
|
36
|
+
// Unique toolCallId per invocation. Protects against:
|
|
37
|
+
// - Multiple tool calls sharing one requestId (React key collisions)
|
|
38
|
+
// - Any future code path that forgets to propagate requestId
|
|
39
|
+
const toolCallId = `ag_${requestId ?? 'noreq'}_${randomUUID().slice(0, 8)}`;
|
|
40
|
+
|
|
25
41
|
// Call the action and WAIT for result from frontend
|
|
26
42
|
const result = await callAgAction({
|
|
27
43
|
sessionId,
|
|
28
|
-
toolCallId
|
|
44
|
+
toolCallId,
|
|
29
45
|
toolName: name,
|
|
30
46
|
args: input as Record<string, unknown>,
|
|
31
|
-
timeout:
|
|
47
|
+
timeout: 15000, // 15 seconds
|
|
32
48
|
});
|
|
33
49
|
|
|
34
50
|
if (configs?.matrix.roomId) {
|
|
@@ -107,6 +107,23 @@ export const loadFile = async (
|
|
|
107
107
|
}
|
|
108
108
|
};
|
|
109
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Loads a file from a buffer and returns processed content.
|
|
112
|
+
* Useful when you already have the file data (e.g., downloaded from Matrix).
|
|
113
|
+
*/
|
|
114
|
+
export const loadFileFromBuffer = async (
|
|
115
|
+
buffer: Buffer,
|
|
116
|
+
mimetype: string,
|
|
117
|
+
filename?: string,
|
|
118
|
+
): Promise<Document[]> => {
|
|
119
|
+
const fileType = determineFileType(filename ?? '', mimetype);
|
|
120
|
+
if (!fileType) {
|
|
121
|
+
throw new Error(`Unsupported file type: ${mimetype}`);
|
|
122
|
+
}
|
|
123
|
+
const blob = new Blob([buffer], { type: mimetype });
|
|
124
|
+
return processFile(blob, fileType);
|
|
125
|
+
};
|
|
126
|
+
|
|
110
127
|
const processFile = async (
|
|
111
128
|
blob: Blob,
|
|
112
129
|
fileType: SupportedFileType,
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
} from '@langchain/core/messages';
|
|
6
6
|
import { isUUID } from 'class-validator';
|
|
7
7
|
import crypto from 'node:crypto';
|
|
8
|
+
import { emojify } from 'node-emoji';
|
|
8
9
|
|
|
9
10
|
interface ToolCall {
|
|
10
11
|
name: string;
|
|
@@ -14,6 +15,15 @@ interface ToolCall {
|
|
|
14
15
|
output?: string;
|
|
15
16
|
}
|
|
16
17
|
|
|
18
|
+
export interface AttachmentMeta {
|
|
19
|
+
filename: string;
|
|
20
|
+
mimetype: string;
|
|
21
|
+
size?: number;
|
|
22
|
+
mxcUri?: string;
|
|
23
|
+
eventId?: string;
|
|
24
|
+
category: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
17
27
|
interface MessageDto {
|
|
18
28
|
id: string;
|
|
19
29
|
type: 'ai' | 'human';
|
|
@@ -22,6 +32,7 @@ interface MessageDto {
|
|
|
22
32
|
reasoning?: string;
|
|
23
33
|
isComplete?: boolean;
|
|
24
34
|
isReasoning?: boolean;
|
|
35
|
+
attachment?: AttachmentMeta;
|
|
25
36
|
}
|
|
26
37
|
|
|
27
38
|
export interface ListOracleMessagesResponse {
|
|
@@ -36,6 +47,7 @@ export interface CleanAdditionalKwargs {
|
|
|
36
47
|
type: string;
|
|
37
48
|
text: string;
|
|
38
49
|
}>;
|
|
50
|
+
attachment?: AttachmentMeta;
|
|
39
51
|
[key: string]: unknown; // Allow additional properties for LangChain compatibility
|
|
40
52
|
}
|
|
41
53
|
|
|
@@ -55,9 +67,13 @@ export function transformGraphStateMessageToListMessageResponse(
|
|
|
55
67
|
message.additional_kwargs as CleanAdditionalKwargs;
|
|
56
68
|
const reasoning = additionalKwargs?.reasoning;
|
|
57
69
|
|
|
70
|
+
// Extract attachment metadata for human messages
|
|
71
|
+
const attachment =
|
|
72
|
+
message.type === 'human' ? additionalKwargs?.attachment : undefined;
|
|
73
|
+
|
|
58
74
|
acc.push({
|
|
59
75
|
type: message.type === 'ai' ? 'ai' : 'human',
|
|
60
|
-
content: String(message.content),
|
|
76
|
+
content: emojify(String(message.content)),
|
|
61
77
|
id: uuidFromString(message.id ?? String(message.content)),
|
|
62
78
|
toolCalls: (message as AIMessage).tool_calls?.map((toolCall) => ({
|
|
63
79
|
name: toolCall.name,
|
|
@@ -68,6 +84,7 @@ export function transformGraphStateMessageToListMessageResponse(
|
|
|
68
84
|
reasoning,
|
|
69
85
|
isComplete: true, // Messages from DB are always complete
|
|
70
86
|
isReasoning: false, // since this is not a reasoning message and the request is done
|
|
87
|
+
...(attachment && { attachment }),
|
|
71
88
|
});
|
|
72
89
|
}
|
|
73
90
|
if (toolMsg) {
|
|
@@ -16,7 +16,7 @@ export async function verifyMatrixOpenIdToken(
|
|
|
16
16
|
|
|
17
17
|
if (response.ok) {
|
|
18
18
|
const userInfo = (await response.json()) as { sub: string };
|
|
19
|
-
|
|
19
|
+
Logger.info('User info from server:', userInfo);
|
|
20
20
|
|
|
21
21
|
return {
|
|
22
22
|
isValid: true,
|
|
@@ -36,7 +36,7 @@ export async function verifyMatrixOpenIdToken(
|
|
|
36
36
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
37
37
|
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
Logger.error(
|
|
40
40
|
'Error verifying Matrix OpenID token:',
|
|
41
41
|
errorMessage,
|
|
42
42
|
errorStack,
|
|
@@ -11,7 +11,7 @@ export class EnvService<T extends z.ZodType> {
|
|
|
11
11
|
private constructor(schema: T, onError?: (error: z.ZodError) => void) {
|
|
12
12
|
try {
|
|
13
13
|
// Parse and validate environment variables
|
|
14
|
-
this.validatedEnv = schema.parse(process.env) as z.infer<T>;
|
|
14
|
+
this.validatedEnv = schema.parse(process.env) as unknown as z.infer<T>;
|
|
15
15
|
} catch (error) {
|
|
16
16
|
if (error instanceof z.ZodError) {
|
|
17
17
|
if (onError) {
|