@dexto/core 1.5.4 → 1.5.6
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/agent/DextoAgent.cjs +61 -155
- package/dist/agent/DextoAgent.d.ts +11 -54
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +61 -155
- package/dist/context/compaction/strategies/reactive-overflow.cjs +5 -3
- package/dist/context/compaction/strategies/reactive-overflow.d.ts +1 -0
- package/dist/context/compaction/strategies/reactive-overflow.d.ts.map +1 -1
- package/dist/context/compaction/strategies/reactive-overflow.js +5 -3
- package/dist/context/compaction/types.d.ts +13 -1
- package/dist/context/compaction/types.d.ts.map +1 -1
- package/dist/errors/types.cjs +0 -2
- package/dist/errors/types.d.ts +1 -5
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/errors/types.js +0 -2
- package/dist/events/index.cjs +0 -2
- package/dist/events/index.d.ts +6 -25
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +0 -2
- package/dist/llm/executor/stream-processor.cjs +85 -27
- package/dist/llm/executor/stream-processor.d.ts +4 -0
- package/dist/llm/executor/stream-processor.d.ts.map +1 -1
- package/dist/llm/executor/stream-processor.js +85 -27
- package/dist/llm/executor/turn-executor.cjs +58 -130
- package/dist/llm/executor/turn-executor.d.ts +9 -43
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +58 -130
- package/dist/llm/executor/types.d.ts +0 -28
- package/dist/llm/executor/types.d.ts.map +1 -1
- package/dist/llm/services/vercel.cjs +2 -5
- package/dist/llm/services/vercel.d.ts +1 -6
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +2 -5
- package/dist/logger/logger.cjs +6 -7
- package/dist/logger/logger.d.ts +1 -0
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +6 -7
- package/dist/session/chat-session.cjs +19 -12
- package/dist/session/chat-session.d.ts +3 -6
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +19 -12
- package/dist/session/session-manager.cjs +0 -135
- package/dist/session/session-manager.d.ts +0 -43
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +0 -135
- package/dist/telemetry/telemetry.cjs +12 -5
- package/dist/telemetry/telemetry.d.ts.map +1 -1
- package/dist/telemetry/telemetry.js +12 -5
- package/dist/tools/schemas.cjs +2 -2
- package/dist/tools/schemas.js +2 -2
- package/package.json +15 -5
- package/dist/filesystem/error-codes.cjs +0 -53
- package/dist/filesystem/error-codes.d.ts +0 -31
- package/dist/filesystem/error-codes.d.ts.map +0 -1
- package/dist/filesystem/error-codes.js +0 -30
- package/dist/filesystem/errors.cjs +0 -303
- package/dist/filesystem/errors.d.ts +0 -109
- package/dist/filesystem/errors.d.ts.map +0 -1
- package/dist/filesystem/errors.js +0 -280
- package/dist/filesystem/filesystem-service.cjs +0 -534
- package/dist/filesystem/filesystem-service.d.ts +0 -97
- package/dist/filesystem/filesystem-service.d.ts.map +0 -1
- package/dist/filesystem/filesystem-service.js +0 -501
- package/dist/filesystem/index.cjs +0 -37
- package/dist/filesystem/index.d.ts +0 -11
- package/dist/filesystem/index.d.ts.map +0 -1
- package/dist/filesystem/index.js +0 -11
- package/dist/filesystem/path-validator.cjs +0 -250
- package/dist/filesystem/path-validator.d.ts +0 -103
- package/dist/filesystem/path-validator.d.ts.map +0 -1
- package/dist/filesystem/path-validator.js +0 -217
- package/dist/filesystem/types.cjs +0 -16
- package/dist/filesystem/types.d.ts +0 -175
- package/dist/filesystem/types.d.ts.map +0 -1
- package/dist/filesystem/types.js +0 -0
- package/dist/process/command-validator.cjs +0 -554
- package/dist/process/command-validator.d.ts +0 -49
- package/dist/process/command-validator.d.ts.map +0 -1
- package/dist/process/command-validator.js +0 -531
- package/dist/process/error-codes.cjs +0 -47
- package/dist/process/error-codes.d.ts +0 -25
- package/dist/process/error-codes.d.ts.map +0 -1
- package/dist/process/error-codes.js +0 -24
- package/dist/process/errors.cjs +0 -244
- package/dist/process/errors.d.ts +0 -87
- package/dist/process/errors.d.ts.map +0 -1
- package/dist/process/errors.js +0 -221
- package/dist/process/index.cjs +0 -37
- package/dist/process/index.d.ts +0 -11
- package/dist/process/index.d.ts.map +0 -1
- package/dist/process/index.js +0 -11
- package/dist/process/process-service.cjs +0 -497
- package/dist/process/process-service.d.ts +0 -69
- package/dist/process/process-service.d.ts.map +0 -1
- package/dist/process/process-service.js +0 -464
- package/dist/process/types.cjs +0 -16
- package/dist/process/types.d.ts +0 -107
- package/dist/process/types.d.ts.map +0 -1
- package/dist/process/types.js +0 -0
- package/dist/session/compaction-service.cjs +0 -139
- package/dist/session/compaction-service.d.ts +0 -81
- package/dist/session/compaction-service.d.ts.map +0 -1
- package/dist/session/compaction-service.js +0 -106
|
@@ -212,15 +212,15 @@ class ChatSession {
|
|
|
212
212
|
*
|
|
213
213
|
* @param content - String or ContentPart[] (text, images, files)
|
|
214
214
|
* @param options - { signal?: AbortSignal }
|
|
215
|
-
* @returns Promise that resolves to object with text
|
|
215
|
+
* @returns Promise that resolves to object with text response
|
|
216
216
|
*
|
|
217
217
|
* @example
|
|
218
218
|
* ```typescript
|
|
219
219
|
* // Text only
|
|
220
|
-
* const { text
|
|
220
|
+
* const { text } = await session.stream('What is the weather?');
|
|
221
221
|
*
|
|
222
222
|
* // Multiple images
|
|
223
|
-
* const { text
|
|
223
|
+
* const { text } = await session.stream([
|
|
224
224
|
* { type: 'text', text: 'Compare these images' },
|
|
225
225
|
* { type: 'image', image: base64Data1, mimeType: 'image/png' },
|
|
226
226
|
* { type: 'image', image: base64Data2, mimeType: 'image/png' }
|
|
@@ -298,10 +298,7 @@ class ChatSession {
|
|
|
298
298
|
}
|
|
299
299
|
);
|
|
300
300
|
return {
|
|
301
|
-
text: modifiedResponsePayload.content
|
|
302
|
-
didCompact: streamResult.didCompact,
|
|
303
|
-
// Use spread to conditionally include compaction (exactOptionalPropertyTypes)
|
|
304
|
-
...streamResult.compaction && { compaction: streamResult.compaction }
|
|
301
|
+
text: modifiedResponsePayload.content
|
|
305
302
|
};
|
|
306
303
|
} catch (error) {
|
|
307
304
|
const aborted = error instanceof Error && error.name === "AbortError" || typeof error === "object" && error !== null && error.aborted === true;
|
|
@@ -314,13 +311,23 @@ class ChatSession {
|
|
|
314
311
|
try {
|
|
315
312
|
const history = await this.getHistory();
|
|
316
313
|
const lastAssistant = history.filter((m) => m.role === "assistant").pop();
|
|
317
|
-
if (lastAssistant
|
|
318
|
-
|
|
314
|
+
if (lastAssistant) {
|
|
315
|
+
if (typeof lastAssistant.content === "string") {
|
|
316
|
+
return { text: lastAssistant.content };
|
|
317
|
+
}
|
|
318
|
+
if (Array.isArray(lastAssistant.content)) {
|
|
319
|
+
const text = lastAssistant.content.filter(
|
|
320
|
+
(part) => part.type === "text"
|
|
321
|
+
).map((part) => part.text).join("");
|
|
322
|
+
if (text) {
|
|
323
|
+
return { text };
|
|
324
|
+
}
|
|
325
|
+
}
|
|
319
326
|
}
|
|
320
327
|
} catch {
|
|
321
328
|
this.logger.debug("Failed to retrieve partial response from history on cancel");
|
|
322
329
|
}
|
|
323
|
-
return { text: ""
|
|
330
|
+
return { text: "" };
|
|
324
331
|
}
|
|
325
332
|
if (error instanceof import_errors.DextoRuntimeError && error.code === import_error_codes.PluginErrorCode.PLUGIN_BLOCKED_EXECUTION && error.scope === import_errors.ErrorScope.PLUGIN && error.type === import_errors.ErrorType.FORBIDDEN) {
|
|
326
333
|
const textContent = parts.filter((p) => p.type === "text").map((p) => p.text).join("\n");
|
|
@@ -334,7 +341,7 @@ class ChatSession {
|
|
|
334
341
|
`Failed to save blocked interaction to history: ${saveError instanceof Error ? saveError.message : String(saveError)}`
|
|
335
342
|
);
|
|
336
343
|
}
|
|
337
|
-
return { text: error.message
|
|
344
|
+
return { text: error.message };
|
|
338
345
|
}
|
|
339
346
|
this.logger.error(
|
|
340
347
|
`Error in ChatSession.stream: ${error instanceof Error ? error.message : String(error)}`
|
|
@@ -403,7 +410,7 @@ class ChatSession {
|
|
|
403
410
|
* @see {@link ContextManager.resetConversation} for the underlying implementation
|
|
404
411
|
*/
|
|
405
412
|
async reset() {
|
|
406
|
-
await this.
|
|
413
|
+
await this.llmService.getContextManager().resetConversation();
|
|
407
414
|
this.services.agentEventBus.emit("session:reset", {
|
|
408
415
|
sessionId: this.id
|
|
409
416
|
});
|
|
@@ -12,7 +12,6 @@ import type { IDextoLogger } from '../logger/v2/types.js';
|
|
|
12
12
|
import type { InternalMessage } from '../context/types.js';
|
|
13
13
|
import type { UserMessageInput } from './message-queue.js';
|
|
14
14
|
import type { ContentInput } from '../agent/types.js';
|
|
15
|
-
import type { CompactionData } from '../llm/executor/types.js';
|
|
16
15
|
/**
|
|
17
16
|
* Represents an isolated conversation session within a Dexto agent.
|
|
18
17
|
*
|
|
@@ -163,15 +162,15 @@ export declare class ChatSession {
|
|
|
163
162
|
*
|
|
164
163
|
* @param content - String or ContentPart[] (text, images, files)
|
|
165
164
|
* @param options - { signal?: AbortSignal }
|
|
166
|
-
* @returns Promise that resolves to object with text
|
|
165
|
+
* @returns Promise that resolves to object with text response
|
|
167
166
|
*
|
|
168
167
|
* @example
|
|
169
168
|
* ```typescript
|
|
170
169
|
* // Text only
|
|
171
|
-
* const { text
|
|
170
|
+
* const { text } = await session.stream('What is the weather?');
|
|
172
171
|
*
|
|
173
172
|
* // Multiple images
|
|
174
|
-
* const { text
|
|
173
|
+
* const { text } = await session.stream([
|
|
175
174
|
* { type: 'text', text: 'Compare these images' },
|
|
176
175
|
* { type: 'image', image: base64Data1, mimeType: 'image/png' },
|
|
177
176
|
* { type: 'image', image: base64Data2, mimeType: 'image/png' }
|
|
@@ -182,8 +181,6 @@ export declare class ChatSession {
|
|
|
182
181
|
signal?: AbortSignal;
|
|
183
182
|
}): Promise<{
|
|
184
183
|
text: string;
|
|
185
|
-
didCompact: boolean;
|
|
186
|
-
compaction?: CompactionData;
|
|
187
184
|
}>;
|
|
188
185
|
/**
|
|
189
186
|
* Combine multiple abort signals into one.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/session/chat-session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACH,eAAe,EACf,aAAa,EAIhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/session/chat-session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACH,eAAe,EACf,aAAa,EAIhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,qBAAa,WAAW;IA6DhB,OAAO,CAAC,QAAQ;aAWA,EAAE,EAAE,MAAM;IAvE9B;;;;;;;;;;OAUG;IACH,SAAgB,QAAQ,EAAE,eAAe,CAAC;IAE1C;;;OAGG;IACH,OAAO,CAAC,eAAe,CAAgC;IAEvD;;;;;OAKG;IACH,OAAO,CAAC,UAAU,CAAoB;IAEtC;;;OAGG;IACH,OAAO,CAAC,UAAU,CAA6D;IAE/E;;OAEG;IACH,OAAO,CAAC,wBAAwB,CACvB;IAET;;;OAGG;IACH,OAAO,CAAC,oBAAoB,CAAgC;IAE5D,OAAO,CAAC,MAAM,CAAe;IAE7B;;;;;;;;;;;OAWG;gBAES,QAAQ,EAAE;QACd,YAAY,EAAE,iBAAiB,CAAC;QAChC,mBAAmB,EAAE,mBAAmB,CAAC;QACzC,WAAW,EAAE,WAAW,CAAC;QACzB,aAAa,EAAE,aAAa,CAAC;QAC7B,cAAc,EAAE,cAAc,CAAC;QAC/B,eAAe,EAAE,OAAO,uBAAuB,EAAE,eAAe,CAAC;QACjE,aAAa,EAAE,aAAa,CAAC;QAC7B,UAAU,EAAE,UAAU,CAAC;QACvB,cAAc,EAAE,OAAO,sBAAsB,EAAE,cAAc,CAAC;KACjE,EACe,EAAE,EAAE,MAAM,EAC1B,MAAM,EAAE,YAAY;IAaxB;;;OAGG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAyB9B;;OAEG;YACW,kBAAkB;IAsChC;;;;;;;;;;OAUG;YACW,sBAAsB;IAoCpC;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,MAAM,CACf,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACnC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAiL5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,UAAU;IAIvB;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IASnC;;;;OAIG;IACI,iBAAiB,IAAI,cAAc,CAAC,OAAO,CAAC;IAInD;;;;OAIG;IACI,aAAa,IAAI,gBAAgB;IAIxC;;;;;;;;;;;;;;;;;;OAkBG;IACU,SAAS,CAAC,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CvE;;;;OAIG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBrC;;;;;;OAMG;IACI,OAAO,IAAI,IAAI;IAoBtB;;;OAGG;IACI,MAAM,IAAI,OAAO;IAIxB;;;;;;OAMG;IACI,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;IAI9F;;;OAGG;IACI,iBAAiB,IAAI,OAAO,YAAY,EAAE,aAAa,EAAE;IAIhE;;;;OAIG;IACI,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/C;;;OAGG;IACI,iBAAiB,IAAI,MAAM;IAOlC;;;OAGG;IACI,MAAM,IAAI,OAAO;CAa3B"}
|
|
@@ -193,15 +193,15 @@ class ChatSession {
|
|
|
193
193
|
*
|
|
194
194
|
* @param content - String or ContentPart[] (text, images, files)
|
|
195
195
|
* @param options - { signal?: AbortSignal }
|
|
196
|
-
* @returns Promise that resolves to object with text
|
|
196
|
+
* @returns Promise that resolves to object with text response
|
|
197
197
|
*
|
|
198
198
|
* @example
|
|
199
199
|
* ```typescript
|
|
200
200
|
* // Text only
|
|
201
|
-
* const { text
|
|
201
|
+
* const { text } = await session.stream('What is the weather?');
|
|
202
202
|
*
|
|
203
203
|
* // Multiple images
|
|
204
|
-
* const { text
|
|
204
|
+
* const { text } = await session.stream([
|
|
205
205
|
* { type: 'text', text: 'Compare these images' },
|
|
206
206
|
* { type: 'image', image: base64Data1, mimeType: 'image/png' },
|
|
207
207
|
* { type: 'image', image: base64Data2, mimeType: 'image/png' }
|
|
@@ -279,10 +279,7 @@ class ChatSession {
|
|
|
279
279
|
}
|
|
280
280
|
);
|
|
281
281
|
return {
|
|
282
|
-
text: modifiedResponsePayload.content
|
|
283
|
-
didCompact: streamResult.didCompact,
|
|
284
|
-
// Use spread to conditionally include compaction (exactOptionalPropertyTypes)
|
|
285
|
-
...streamResult.compaction && { compaction: streamResult.compaction }
|
|
282
|
+
text: modifiedResponsePayload.content
|
|
286
283
|
};
|
|
287
284
|
} catch (error) {
|
|
288
285
|
const aborted = error instanceof Error && error.name === "AbortError" || typeof error === "object" && error !== null && error.aborted === true;
|
|
@@ -295,13 +292,23 @@ class ChatSession {
|
|
|
295
292
|
try {
|
|
296
293
|
const history = await this.getHistory();
|
|
297
294
|
const lastAssistant = history.filter((m) => m.role === "assistant").pop();
|
|
298
|
-
if (lastAssistant
|
|
299
|
-
|
|
295
|
+
if (lastAssistant) {
|
|
296
|
+
if (typeof lastAssistant.content === "string") {
|
|
297
|
+
return { text: lastAssistant.content };
|
|
298
|
+
}
|
|
299
|
+
if (Array.isArray(lastAssistant.content)) {
|
|
300
|
+
const text = lastAssistant.content.filter(
|
|
301
|
+
(part) => part.type === "text"
|
|
302
|
+
).map((part) => part.text).join("");
|
|
303
|
+
if (text) {
|
|
304
|
+
return { text };
|
|
305
|
+
}
|
|
306
|
+
}
|
|
300
307
|
}
|
|
301
308
|
} catch {
|
|
302
309
|
this.logger.debug("Failed to retrieve partial response from history on cancel");
|
|
303
310
|
}
|
|
304
|
-
return { text: ""
|
|
311
|
+
return { text: "" };
|
|
305
312
|
}
|
|
306
313
|
if (error instanceof DextoRuntimeError && error.code === PluginErrorCode.PLUGIN_BLOCKED_EXECUTION && error.scope === ErrorScope.PLUGIN && error.type === ErrorType.FORBIDDEN) {
|
|
307
314
|
const textContent = parts.filter((p) => p.type === "text").map((p) => p.text).join("\n");
|
|
@@ -315,7 +322,7 @@ class ChatSession {
|
|
|
315
322
|
`Failed to save blocked interaction to history: ${saveError instanceof Error ? saveError.message : String(saveError)}`
|
|
316
323
|
);
|
|
317
324
|
}
|
|
318
|
-
return { text: error.message
|
|
325
|
+
return { text: error.message };
|
|
319
326
|
}
|
|
320
327
|
this.logger.error(
|
|
321
328
|
`Error in ChatSession.stream: ${error instanceof Error ? error.message : String(error)}`
|
|
@@ -384,7 +391,7 @@ class ChatSession {
|
|
|
384
391
|
* @see {@link ContextManager.resetConversation} for the underlying implementation
|
|
385
392
|
*/
|
|
386
393
|
async reset() {
|
|
387
|
-
await this.
|
|
394
|
+
await this.llmService.getContextManager().resetConversation();
|
|
388
395
|
this.services.agentEventBus.emit("session:reset", {
|
|
389
396
|
sessionId: this.id
|
|
390
397
|
});
|
|
@@ -518,7 +518,6 @@ class SessionManager {
|
|
|
518
518
|
}
|
|
519
519
|
/**
|
|
520
520
|
* Get the raw session data for a session ID.
|
|
521
|
-
* This is used for accessing continuation fields and other metadata.
|
|
522
521
|
*
|
|
523
522
|
* @param sessionId The session ID
|
|
524
523
|
* @returns Session data if found, undefined otherwise
|
|
@@ -528,140 +527,6 @@ class SessionManager {
|
|
|
528
527
|
const sessionKey = `session:${sessionId}`;
|
|
529
528
|
return await this.services.storageManager.getDatabase().get(sessionKey);
|
|
530
529
|
}
|
|
531
|
-
/**
|
|
532
|
-
* Creates a continuation session from a compacted session.
|
|
533
|
-
* The new session will have the summary as its first message.
|
|
534
|
-
*
|
|
535
|
-
* @param fromSessionId The session being compacted
|
|
536
|
-
* @returns The new session ID and ChatSession
|
|
537
|
-
*/
|
|
538
|
-
async createContinuationSession(fromSessionId) {
|
|
539
|
-
await this.ensureInitialized();
|
|
540
|
-
const fromSessionData = await this.getSessionData(fromSessionId);
|
|
541
|
-
if (!fromSessionData) {
|
|
542
|
-
throw import_errors.SessionError.notFound(fromSessionId);
|
|
543
|
-
}
|
|
544
|
-
const activeSessionKeys = await this.services.storageManager.getDatabase().list("session:");
|
|
545
|
-
if (activeSessionKeys.length >= this.maxSessions) {
|
|
546
|
-
throw import_errors.SessionError.maxSessionsExceeded(activeSessionKeys.length, this.maxSessions);
|
|
547
|
-
}
|
|
548
|
-
const newSessionId = (0, import_crypto.randomUUID)();
|
|
549
|
-
const originalLLMConfig = this.services.stateManager.getRuntimeConfig(fromSessionId).llm;
|
|
550
|
-
this.services.stateManager.updateLLM(originalLLMConfig, newSessionId);
|
|
551
|
-
const parentCompactionCount = fromSessionData.compactionCount ?? 0;
|
|
552
|
-
const newSessionData = {
|
|
553
|
-
id: newSessionId,
|
|
554
|
-
createdAt: Date.now(),
|
|
555
|
-
lastActivity: Date.now(),
|
|
556
|
-
messageCount: 0,
|
|
557
|
-
continuedFrom: fromSessionId,
|
|
558
|
-
compactionCount: parentCompactionCount + 1,
|
|
559
|
-
...fromSessionData.userId !== void 0 && { userId: fromSessionData.userId },
|
|
560
|
-
...fromSessionData.metadata && {
|
|
561
|
-
metadata: {
|
|
562
|
-
...fromSessionData.metadata,
|
|
563
|
-
title: fromSessionData.metadata?.title
|
|
564
|
-
// Preserve title
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
};
|
|
568
|
-
const sessionKey = `session:${newSessionId}`;
|
|
569
|
-
try {
|
|
570
|
-
await this.services.storageManager.getDatabase().set(sessionKey, newSessionData);
|
|
571
|
-
await this.services.storageManager.getCache().set(sessionKey, newSessionData, this.sessionTTL / 1e3);
|
|
572
|
-
} catch (error) {
|
|
573
|
-
this.services.stateManager.clearSessionOverride(newSessionId);
|
|
574
|
-
throw error;
|
|
575
|
-
}
|
|
576
|
-
const session = new import_chat_session.ChatSession(
|
|
577
|
-
{ ...this.services, sessionManager: this },
|
|
578
|
-
newSessionId,
|
|
579
|
-
this.logger
|
|
580
|
-
);
|
|
581
|
-
try {
|
|
582
|
-
await session.init();
|
|
583
|
-
} catch (error) {
|
|
584
|
-
session.dispose();
|
|
585
|
-
await this.services.storageManager.getDatabase().delete(sessionKey);
|
|
586
|
-
await this.services.storageManager.getCache().delete(sessionKey);
|
|
587
|
-
this.services.stateManager.clearSessionOverride(newSessionId);
|
|
588
|
-
throw error;
|
|
589
|
-
}
|
|
590
|
-
this.sessions.set(newSessionId, session);
|
|
591
|
-
this.logger.info(
|
|
592
|
-
`Created continuation session ${newSessionId} from compacted session ${fromSessionId}`
|
|
593
|
-
);
|
|
594
|
-
return { sessionId: newSessionId, session };
|
|
595
|
-
}
|
|
596
|
-
/**
|
|
597
|
-
* Marks a session as compacted and links it to its continuation session.
|
|
598
|
-
*
|
|
599
|
-
* @param sessionId The session being compacted
|
|
600
|
-
* @param continuedToId The new session created from compaction
|
|
601
|
-
*/
|
|
602
|
-
async markSessionCompacted(sessionId, continuedToId) {
|
|
603
|
-
await this.ensureInitialized();
|
|
604
|
-
const sessionKey = `session:${sessionId}`;
|
|
605
|
-
const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
|
|
606
|
-
if (!sessionData) {
|
|
607
|
-
throw import_errors.SessionError.notFound(sessionId);
|
|
608
|
-
}
|
|
609
|
-
sessionData.continuedTo = continuedToId;
|
|
610
|
-
sessionData.compactedAt = Date.now();
|
|
611
|
-
sessionData.lastActivity = Date.now();
|
|
612
|
-
await this.services.storageManager.getDatabase().set(sessionKey, sessionData);
|
|
613
|
-
await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
|
|
614
|
-
this.logger.debug(`Marked session ${sessionId} as compacted \u2192 ${continuedToId}`);
|
|
615
|
-
}
|
|
616
|
-
/**
|
|
617
|
-
* Gets the compaction count for a session.
|
|
618
|
-
* Returns 0 if the session has never been compacted.
|
|
619
|
-
*
|
|
620
|
-
* @param sessionId The session ID
|
|
621
|
-
* @returns Number of times this session chain has been compacted
|
|
622
|
-
*/
|
|
623
|
-
async getCompactionCount(sessionId) {
|
|
624
|
-
const sessionData = await this.getSessionData(sessionId);
|
|
625
|
-
return sessionData?.compactionCount ?? 0;
|
|
626
|
-
}
|
|
627
|
-
/**
|
|
628
|
-
* Gets the chain of linked sessions (ancestors and descendants).
|
|
629
|
-
* Returns sessions in chronological order (oldest first).
|
|
630
|
-
*
|
|
631
|
-
* @param sessionId Any session ID in the chain
|
|
632
|
-
* @returns Array of session data in the chain, ordered chronologically
|
|
633
|
-
*/
|
|
634
|
-
async getSessionChain(sessionId) {
|
|
635
|
-
await this.ensureInitialized();
|
|
636
|
-
const chain = [];
|
|
637
|
-
const visited = /* @__PURE__ */ new Set();
|
|
638
|
-
let currentData = await this.getSessionData(sessionId);
|
|
639
|
-
if (!currentData) {
|
|
640
|
-
return [];
|
|
641
|
-
}
|
|
642
|
-
while (currentData?.continuedFrom && !visited.has(currentData.continuedFrom)) {
|
|
643
|
-
visited.add(currentData.id);
|
|
644
|
-
const parent = await this.getSessionData(currentData.continuedFrom);
|
|
645
|
-
if (!parent) {
|
|
646
|
-
break;
|
|
647
|
-
}
|
|
648
|
-
currentData = parent;
|
|
649
|
-
}
|
|
650
|
-
if (currentData && !visited.has(currentData.id)) {
|
|
651
|
-
visited.add(currentData.id);
|
|
652
|
-
}
|
|
653
|
-
visited.clear();
|
|
654
|
-
while (currentData && !visited.has(currentData.id)) {
|
|
655
|
-
visited.add(currentData.id);
|
|
656
|
-
chain.push(currentData);
|
|
657
|
-
if (currentData.continuedTo) {
|
|
658
|
-
currentData = await this.getSessionData(currentData.continuedTo);
|
|
659
|
-
} else {
|
|
660
|
-
break;
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
return chain;
|
|
664
|
-
}
|
|
665
530
|
/**
|
|
666
531
|
* Cleanup all sessions and resources.
|
|
667
532
|
* This should be called when shutting down the application.
|
|
@@ -34,14 +34,6 @@ export interface SessionData {
|
|
|
34
34
|
metadata?: Record<string, any>;
|
|
35
35
|
tokenUsage?: SessionTokenUsage;
|
|
36
36
|
estimatedCost?: number;
|
|
37
|
-
/** Parent session that was compacted to create this session */
|
|
38
|
-
continuedFrom?: string;
|
|
39
|
-
/** Child session created when this session was compacted */
|
|
40
|
-
continuedTo?: string;
|
|
41
|
-
/** Timestamp when this session was compacted (created a continuation) */
|
|
42
|
-
compactedAt?: number;
|
|
43
|
-
/** Number of times this session chain has been compacted (inherited + 1 on each compaction) */
|
|
44
|
-
compactionCount?: number;
|
|
45
37
|
}
|
|
46
38
|
/**
|
|
47
39
|
* Manages multiple chat sessions within a Dexto agent.
|
|
@@ -214,46 +206,11 @@ export declare class SessionManager {
|
|
|
214
206
|
}>;
|
|
215
207
|
/**
|
|
216
208
|
* Get the raw session data for a session ID.
|
|
217
|
-
* This is used for accessing continuation fields and other metadata.
|
|
218
209
|
*
|
|
219
210
|
* @param sessionId The session ID
|
|
220
211
|
* @returns Session data if found, undefined otherwise
|
|
221
212
|
*/
|
|
222
213
|
getSessionData(sessionId: string): Promise<SessionData | undefined>;
|
|
223
|
-
/**
|
|
224
|
-
* Creates a continuation session from a compacted session.
|
|
225
|
-
* The new session will have the summary as its first message.
|
|
226
|
-
*
|
|
227
|
-
* @param fromSessionId The session being compacted
|
|
228
|
-
* @returns The new session ID and ChatSession
|
|
229
|
-
*/
|
|
230
|
-
createContinuationSession(fromSessionId: string): Promise<{
|
|
231
|
-
sessionId: string;
|
|
232
|
-
session: ChatSession;
|
|
233
|
-
}>;
|
|
234
|
-
/**
|
|
235
|
-
* Marks a session as compacted and links it to its continuation session.
|
|
236
|
-
*
|
|
237
|
-
* @param sessionId The session being compacted
|
|
238
|
-
* @param continuedToId The new session created from compaction
|
|
239
|
-
*/
|
|
240
|
-
markSessionCompacted(sessionId: string, continuedToId: string): Promise<void>;
|
|
241
|
-
/**
|
|
242
|
-
* Gets the compaction count for a session.
|
|
243
|
-
* Returns 0 if the session has never been compacted.
|
|
244
|
-
*
|
|
245
|
-
* @param sessionId The session ID
|
|
246
|
-
* @returns Number of times this session chain has been compacted
|
|
247
|
-
*/
|
|
248
|
-
getCompactionCount(sessionId: string): Promise<number>;
|
|
249
|
-
/**
|
|
250
|
-
* Gets the chain of linked sessions (ancestors and descendants).
|
|
251
|
-
* Returns sessions in chronological order (oldest first).
|
|
252
|
-
*
|
|
253
|
-
* @param sessionId Any session ID in the chain
|
|
254
|
-
* @returns Array of session data in the chain, ordered chronologically
|
|
255
|
-
*/
|
|
256
|
-
getSessionChain(sessionId: string): Promise<SessionData[]>;
|
|
257
214
|
/**
|
|
258
215
|
* Cleanup all sessions and resources.
|
|
259
216
|
* This should be called when shutting down the application.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;AAErD,MAAM,WAAW,eAAe;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -496,7 +496,6 @@ class SessionManager {
|
|
|
496
496
|
}
|
|
497
497
|
/**
|
|
498
498
|
* Get the raw session data for a session ID.
|
|
499
|
-
* This is used for accessing continuation fields and other metadata.
|
|
500
499
|
*
|
|
501
500
|
* @param sessionId The session ID
|
|
502
501
|
* @returns Session data if found, undefined otherwise
|
|
@@ -506,140 +505,6 @@ class SessionManager {
|
|
|
506
505
|
const sessionKey = `session:${sessionId}`;
|
|
507
506
|
return await this.services.storageManager.getDatabase().get(sessionKey);
|
|
508
507
|
}
|
|
509
|
-
/**
|
|
510
|
-
* Creates a continuation session from a compacted session.
|
|
511
|
-
* The new session will have the summary as its first message.
|
|
512
|
-
*
|
|
513
|
-
* @param fromSessionId The session being compacted
|
|
514
|
-
* @returns The new session ID and ChatSession
|
|
515
|
-
*/
|
|
516
|
-
async createContinuationSession(fromSessionId) {
|
|
517
|
-
await this.ensureInitialized();
|
|
518
|
-
const fromSessionData = await this.getSessionData(fromSessionId);
|
|
519
|
-
if (!fromSessionData) {
|
|
520
|
-
throw SessionError.notFound(fromSessionId);
|
|
521
|
-
}
|
|
522
|
-
const activeSessionKeys = await this.services.storageManager.getDatabase().list("session:");
|
|
523
|
-
if (activeSessionKeys.length >= this.maxSessions) {
|
|
524
|
-
throw SessionError.maxSessionsExceeded(activeSessionKeys.length, this.maxSessions);
|
|
525
|
-
}
|
|
526
|
-
const newSessionId = randomUUID();
|
|
527
|
-
const originalLLMConfig = this.services.stateManager.getRuntimeConfig(fromSessionId).llm;
|
|
528
|
-
this.services.stateManager.updateLLM(originalLLMConfig, newSessionId);
|
|
529
|
-
const parentCompactionCount = fromSessionData.compactionCount ?? 0;
|
|
530
|
-
const newSessionData = {
|
|
531
|
-
id: newSessionId,
|
|
532
|
-
createdAt: Date.now(),
|
|
533
|
-
lastActivity: Date.now(),
|
|
534
|
-
messageCount: 0,
|
|
535
|
-
continuedFrom: fromSessionId,
|
|
536
|
-
compactionCount: parentCompactionCount + 1,
|
|
537
|
-
...fromSessionData.userId !== void 0 && { userId: fromSessionData.userId },
|
|
538
|
-
...fromSessionData.metadata && {
|
|
539
|
-
metadata: {
|
|
540
|
-
...fromSessionData.metadata,
|
|
541
|
-
title: fromSessionData.metadata?.title
|
|
542
|
-
// Preserve title
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
};
|
|
546
|
-
const sessionKey = `session:${newSessionId}`;
|
|
547
|
-
try {
|
|
548
|
-
await this.services.storageManager.getDatabase().set(sessionKey, newSessionData);
|
|
549
|
-
await this.services.storageManager.getCache().set(sessionKey, newSessionData, this.sessionTTL / 1e3);
|
|
550
|
-
} catch (error) {
|
|
551
|
-
this.services.stateManager.clearSessionOverride(newSessionId);
|
|
552
|
-
throw error;
|
|
553
|
-
}
|
|
554
|
-
const session = new ChatSession(
|
|
555
|
-
{ ...this.services, sessionManager: this },
|
|
556
|
-
newSessionId,
|
|
557
|
-
this.logger
|
|
558
|
-
);
|
|
559
|
-
try {
|
|
560
|
-
await session.init();
|
|
561
|
-
} catch (error) {
|
|
562
|
-
session.dispose();
|
|
563
|
-
await this.services.storageManager.getDatabase().delete(sessionKey);
|
|
564
|
-
await this.services.storageManager.getCache().delete(sessionKey);
|
|
565
|
-
this.services.stateManager.clearSessionOverride(newSessionId);
|
|
566
|
-
throw error;
|
|
567
|
-
}
|
|
568
|
-
this.sessions.set(newSessionId, session);
|
|
569
|
-
this.logger.info(
|
|
570
|
-
`Created continuation session ${newSessionId} from compacted session ${fromSessionId}`
|
|
571
|
-
);
|
|
572
|
-
return { sessionId: newSessionId, session };
|
|
573
|
-
}
|
|
574
|
-
/**
|
|
575
|
-
* Marks a session as compacted and links it to its continuation session.
|
|
576
|
-
*
|
|
577
|
-
* @param sessionId The session being compacted
|
|
578
|
-
* @param continuedToId The new session created from compaction
|
|
579
|
-
*/
|
|
580
|
-
async markSessionCompacted(sessionId, continuedToId) {
|
|
581
|
-
await this.ensureInitialized();
|
|
582
|
-
const sessionKey = `session:${sessionId}`;
|
|
583
|
-
const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
|
|
584
|
-
if (!sessionData) {
|
|
585
|
-
throw SessionError.notFound(sessionId);
|
|
586
|
-
}
|
|
587
|
-
sessionData.continuedTo = continuedToId;
|
|
588
|
-
sessionData.compactedAt = Date.now();
|
|
589
|
-
sessionData.lastActivity = Date.now();
|
|
590
|
-
await this.services.storageManager.getDatabase().set(sessionKey, sessionData);
|
|
591
|
-
await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
|
|
592
|
-
this.logger.debug(`Marked session ${sessionId} as compacted \u2192 ${continuedToId}`);
|
|
593
|
-
}
|
|
594
|
-
/**
|
|
595
|
-
* Gets the compaction count for a session.
|
|
596
|
-
* Returns 0 if the session has never been compacted.
|
|
597
|
-
*
|
|
598
|
-
* @param sessionId The session ID
|
|
599
|
-
* @returns Number of times this session chain has been compacted
|
|
600
|
-
*/
|
|
601
|
-
async getCompactionCount(sessionId) {
|
|
602
|
-
const sessionData = await this.getSessionData(sessionId);
|
|
603
|
-
return sessionData?.compactionCount ?? 0;
|
|
604
|
-
}
|
|
605
|
-
/**
|
|
606
|
-
* Gets the chain of linked sessions (ancestors and descendants).
|
|
607
|
-
* Returns sessions in chronological order (oldest first).
|
|
608
|
-
*
|
|
609
|
-
* @param sessionId Any session ID in the chain
|
|
610
|
-
* @returns Array of session data in the chain, ordered chronologically
|
|
611
|
-
*/
|
|
612
|
-
async getSessionChain(sessionId) {
|
|
613
|
-
await this.ensureInitialized();
|
|
614
|
-
const chain = [];
|
|
615
|
-
const visited = /* @__PURE__ */ new Set();
|
|
616
|
-
let currentData = await this.getSessionData(sessionId);
|
|
617
|
-
if (!currentData) {
|
|
618
|
-
return [];
|
|
619
|
-
}
|
|
620
|
-
while (currentData?.continuedFrom && !visited.has(currentData.continuedFrom)) {
|
|
621
|
-
visited.add(currentData.id);
|
|
622
|
-
const parent = await this.getSessionData(currentData.continuedFrom);
|
|
623
|
-
if (!parent) {
|
|
624
|
-
break;
|
|
625
|
-
}
|
|
626
|
-
currentData = parent;
|
|
627
|
-
}
|
|
628
|
-
if (currentData && !visited.has(currentData.id)) {
|
|
629
|
-
visited.add(currentData.id);
|
|
630
|
-
}
|
|
631
|
-
visited.clear();
|
|
632
|
-
while (currentData && !visited.has(currentData.id)) {
|
|
633
|
-
visited.add(currentData.id);
|
|
634
|
-
chain.push(currentData);
|
|
635
|
-
if (currentData.continuedTo) {
|
|
636
|
-
currentData = await this.getSessionData(currentData.continuedTo);
|
|
637
|
-
} else {
|
|
638
|
-
break;
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
return chain;
|
|
642
|
-
}
|
|
643
508
|
/**
|
|
644
509
|
* Cleanup all sessions and resources.
|
|
645
510
|
* This should be called when shutting down the application.
|
|
@@ -123,15 +123,18 @@ class Telemetry {
|
|
|
123
123
|
if (enabled) {
|
|
124
124
|
let NodeSDK;
|
|
125
125
|
let Resource;
|
|
126
|
-
let
|
|
126
|
+
let HttpInstrumentation;
|
|
127
|
+
let UndiciInstrumentation;
|
|
127
128
|
let ATTR_SERVICE_NAME;
|
|
128
129
|
try {
|
|
129
130
|
const sdkModule = await import("@opentelemetry/sdk-node");
|
|
130
131
|
NodeSDK = sdkModule.NodeSDK;
|
|
131
132
|
const resourcesModule = await import("@opentelemetry/resources");
|
|
132
133
|
Resource = resourcesModule.Resource;
|
|
133
|
-
const
|
|
134
|
-
|
|
134
|
+
const httpInstModule = await import("@opentelemetry/instrumentation-http");
|
|
135
|
+
HttpInstrumentation = httpInstModule.HttpInstrumentation;
|
|
136
|
+
const undiciInstModule = await import("@opentelemetry/instrumentation-undici");
|
|
137
|
+
UndiciInstrumentation = undiciInstModule.UndiciInstrumentation;
|
|
135
138
|
const semanticModule = await import("@opentelemetry/semantic-conventions");
|
|
136
139
|
ATTR_SERVICE_NAME = semanticModule.ATTR_SERVICE_NAME;
|
|
137
140
|
} catch (importError) {
|
|
@@ -139,7 +142,8 @@ class Telemetry {
|
|
|
139
142
|
if (err.code === "ERR_MODULE_NOT_FOUND") {
|
|
140
143
|
throw import_errors.TelemetryError.dependencyNotInstalled([
|
|
141
144
|
"@opentelemetry/sdk-node",
|
|
142
|
-
"@opentelemetry/
|
|
145
|
+
"@opentelemetry/instrumentation-http",
|
|
146
|
+
"@opentelemetry/instrumentation-undici",
|
|
143
147
|
"@opentelemetry/resources",
|
|
144
148
|
"@opentelemetry/semantic-conventions",
|
|
145
149
|
"@opentelemetry/sdk-trace-base",
|
|
@@ -158,7 +162,10 @@ class Telemetry {
|
|
|
158
162
|
sdk = new NodeSDK({
|
|
159
163
|
resource,
|
|
160
164
|
traceExporter,
|
|
161
|
-
instrumentations: [
|
|
165
|
+
instrumentations: [
|
|
166
|
+
new HttpInstrumentation(),
|
|
167
|
+
new UndiciInstrumentation()
|
|
168
|
+
]
|
|
162
169
|
});
|
|
163
170
|
await sdk.start();
|
|
164
171
|
const sigterm = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAYtD,OAAO,CAAC,MAAM,CAAC;IACX,IAAI,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACX,MAAM,EAAE,MAAM,CAA4B;IACjD,IAAI,EAAE,MAAM,CAAmB;IAC/B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,IAAI,CAAC,CAA0B;IACvC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAiC;IAC7D,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAA0D;IAEzF,OAAO;mBAYc,kBAAkB;IA0DvC;;;;;OAKG;WACU,IAAI,CACb,MAAM,GAAE,iBAAsB,EAC9B,QAAQ,CAAC,EAAE,OAAO,+BAA+B,EAAE,YAAY,GAChE,OAAO,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAYtD,OAAO,CAAC,MAAM,CAAC;IACX,IAAI,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACX,MAAM,EAAE,MAAM,CAA4B;IACjD,IAAI,EAAE,MAAM,CAAmB;IAC/B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,IAAI,CAAC,CAA0B;IACvC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAiC;IAC7D,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAA0D;IAEzF,OAAO;mBAYc,kBAAkB;IA0DvC;;;;;OAKG;WACU,IAAI,CACb,MAAM,GAAE,iBAAsB,EAC9B,QAAQ,CAAC,EAAE,OAAO,+BAA+B,EAAE,YAAY,GAChE,OAAO,CAAC,SAAS,CAAC;IA8HrB,MAAM,CAAC,aAAa;IAKpB;;;;OAIG;IACH,MAAM,CAAC,GAAG,IAAI,SAAS;IAOvB;;;OAGG;IACH,MAAM,CAAC,iBAAiB,IAAI,OAAO;IAInC;;;;;OAKG;WACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5C;;;OAGG;IACI,aAAa,IAAI,OAAO;IAI/B,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,GAAE,OAA8B;IAc5F,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI;IAI/C;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUxC;;;;;;;;;OASG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BzC"}
|