kernl 0.12.3 → 0.12.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +18 -0
- package/README.md +29 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +2 -0
- package/dist/kernl/kernl.d.ts +6 -0
- package/dist/kernl/kernl.d.ts.map +1 -1
- package/dist/kernl/kernl.js +19 -0
- package/dist/kernl/types.d.ts +6 -0
- package/dist/kernl/types.d.ts.map +1 -1
- package/dist/lib/env.d.ts +2 -2
- package/dist/mcp/http.d.ts.map +1 -1
- package/dist/mcp/http.js +1 -5
- package/dist/mcp/sse.d.ts.map +1 -1
- package/dist/mcp/sse.js +1 -5
- package/dist/mcp/stdio.d.ts.map +1 -1
- package/dist/mcp/stdio.js +1 -5
- package/dist/task.d.ts.map +1 -1
- package/dist/task.js +0 -1
- package/dist/thread/__tests__/thread.test.js +241 -0
- package/dist/thread/thread.d.ts +5 -4
- package/dist/thread/thread.d.ts.map +1 -1
- package/dist/thread/thread.js +91 -22
- package/dist/thread/types.d.ts +5 -0
- package/dist/thread/types.d.ts.map +1 -1
- package/dist/tool/tool.d.ts +2 -2
- package/dist/tool/tool.d.ts.map +1 -1
- package/dist/tracing/__tests__/composite.test.d.ts +2 -0
- package/dist/tracing/__tests__/composite.test.d.ts.map +1 -0
- package/dist/tracing/__tests__/composite.test.js +146 -0
- package/dist/tracing/__tests__/dispatch.test.d.ts +2 -0
- package/dist/tracing/__tests__/dispatch.test.d.ts.map +1 -0
- package/dist/tracing/__tests__/dispatch.test.js +160 -0
- package/dist/tracing/__tests__/helpers.d.ts +69 -0
- package/dist/tracing/__tests__/helpers.d.ts.map +1 -0
- package/dist/tracing/__tests__/helpers.js +109 -0
- package/dist/tracing/__tests__/integration.test.d.ts +2 -0
- package/dist/tracing/__tests__/integration.test.d.ts.map +1 -0
- package/dist/tracing/__tests__/integration.test.js +675 -0
- package/dist/tracing/__tests__/span.test.d.ts +2 -0
- package/dist/tracing/__tests__/span.test.d.ts.map +1 -0
- package/dist/tracing/__tests__/span.test.js +188 -0
- package/dist/tracing/dispatch.d.ts +43 -0
- package/dist/tracing/dispatch.d.ts.map +1 -0
- package/dist/tracing/dispatch.js +70 -0
- package/dist/tracing/index.d.ts +8 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +6 -0
- package/dist/tracing/span.d.ts +69 -0
- package/dist/tracing/span.d.ts.map +1 -0
- package/dist/tracing/span.js +64 -0
- package/dist/tracing/subscriber.d.ts +53 -0
- package/dist/tracing/subscriber.d.ts.map +1 -0
- package/dist/tracing/subscriber.js +1 -0
- package/dist/tracing/subscribers/composite.d.ts +26 -0
- package/dist/tracing/subscribers/composite.d.ts.map +1 -0
- package/dist/tracing/subscribers/composite.js +96 -0
- package/dist/tracing/subscribers/console.d.ts +22 -0
- package/dist/tracing/subscribers/console.d.ts.map +1 -0
- package/dist/tracing/subscribers/console.js +82 -0
- package/dist/tracing/types.d.ts +77 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/tracing/types.js +1 -0
- package/package.json +6 -2
- package/src/agent.ts +2 -0
- package/src/index.ts +1 -0
- package/src/kernl/kernl.ts +21 -0
- package/src/kernl/types.ts +7 -0
- package/src/mcp/http.ts +1 -9
- package/src/mcp/sse.ts +1 -10
- package/src/mcp/stdio.ts +1 -10
- package/src/task.ts +0 -1
- package/src/thread/__tests__/thread.test.ts +280 -0
- package/src/thread/thread.ts +111 -24
- package/src/thread/types.ts +5 -0
- package/src/tool/tool.ts +1 -1
- package/src/tracing/__tests__/composite.test.ts +218 -0
- package/src/tracing/__tests__/dispatch.test.ts +222 -0
- package/src/tracing/__tests__/helpers.ts +138 -0
- package/src/tracing/__tests__/integration.test.ts +808 -0
- package/src/tracing/__tests__/span.test.ts +250 -0
- package/src/tracing/dispatch.ts +114 -0
- package/src/tracing/index.ts +39 -0
- package/src/tracing/span.ts +115 -0
- package/src/tracing/subscriber.ts +62 -0
- package/src/tracing/subscribers/composite.ts +102 -0
- package/src/tracing/subscribers/console.ts +101 -0
- package/src/tracing/types.ts +115 -0
- package/dist/trace/processor.d.ts +0 -1
- package/dist/trace/processor.d.ts.map +0 -1
- package/dist/trace/processor.js +0 -1
- package/dist/trace/traces.d.ts +0 -1
- package/dist/trace/traces.d.ts.map +0 -1
- package/dist/trace/traces.js +0 -73
- package/dist/trace/utils.d.ts +0 -22
- package/dist/trace/utils.d.ts.map +0 -1
- package/dist/trace/utils.js +0 -30
- package/src/trace/processor.ts +0 -0
- package/src/trace/traces.ts +0 -86
- package/src/trace/utils.ts +0 -38
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { SpanId, SpanData, EventData } from "../types";
|
|
2
|
+
import type { Subscriber } from "../subscriber";
|
|
3
|
+
|
|
4
|
+
interface SpanRecord {
|
|
5
|
+
data: SpanData;
|
|
6
|
+
parent: SpanId | null;
|
|
7
|
+
startTime: number;
|
|
8
|
+
entered: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A simple console subscriber for development and debugging.
|
|
13
|
+
* Logs span lifecycle events and events to the console.
|
|
14
|
+
*/
|
|
15
|
+
export class ConsoleSubscriber implements Subscriber {
|
|
16
|
+
private spans = new Map<SpanId, SpanRecord>();
|
|
17
|
+
private nextId = 0;
|
|
18
|
+
|
|
19
|
+
enabled(_data: SpanData): boolean {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
span(data: SpanData, parent: SpanId | null): SpanId {
|
|
24
|
+
const id = `span_${this.nextId++}`;
|
|
25
|
+
this.spans.set(id, {
|
|
26
|
+
data,
|
|
27
|
+
parent,
|
|
28
|
+
startTime: Date.now(),
|
|
29
|
+
entered: false,
|
|
30
|
+
});
|
|
31
|
+
console.log(`[span:new] ${id} ${data.kind}`, this.fmt(data));
|
|
32
|
+
return id;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
enter(spanId: SpanId): void {
|
|
36
|
+
const record = this.spans.get(spanId);
|
|
37
|
+
if (record) {
|
|
38
|
+
record.entered = true;
|
|
39
|
+
console.log(`[span:enter] ${spanId} ${record.data.kind}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
exit(spanId: SpanId): void {
|
|
44
|
+
const record = this.spans.get(spanId);
|
|
45
|
+
if (record) {
|
|
46
|
+
console.log(`[span:exit] ${spanId} ${record.data.kind}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
record(spanId: SpanId, delta: Partial<SpanData>): void {
|
|
51
|
+
const record = this.spans.get(spanId);
|
|
52
|
+
if (record) {
|
|
53
|
+
Object.assign(record.data, delta);
|
|
54
|
+
console.log(`[span:record] ${spanId}`, this.fmt(delta));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
error(spanId: SpanId, error: Error): void {
|
|
59
|
+
const record = this.spans.get(spanId);
|
|
60
|
+
if (record) {
|
|
61
|
+
console.log(`[span:error] ${spanId} ${record.data.kind}`, error.message);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
close(spanId: SpanId): void {
|
|
66
|
+
const record = this.spans.get(spanId);
|
|
67
|
+
if (record) {
|
|
68
|
+
const duration = Date.now() - record.startTime;
|
|
69
|
+
console.log(`[span:close] ${spanId} ${record.data.kind} (${duration}ms)`);
|
|
70
|
+
this.spans.delete(spanId);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
event(data: EventData, parent: SpanId | null): void {
|
|
75
|
+
console.log(`[event] ${data.kind}`, { ...data, parent });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async flush(): Promise<void> {
|
|
79
|
+
// Console subscriber doesn't buffer
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async shutdown(_timeout?: number): Promise<void> {
|
|
83
|
+
this.spans.clear();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private fmt(data: Partial<SpanData>): Record<string, unknown> {
|
|
87
|
+
const { kind, ...rest } = data as any;
|
|
88
|
+
// Truncate large fields for readability
|
|
89
|
+
const formatted: Record<string, unknown> = {};
|
|
90
|
+
for (const [key, value] of Object.entries(rest)) {
|
|
91
|
+
if (typeof value === "string" && value.length > 100) {
|
|
92
|
+
formatted[key] = value.slice(0, 100) + "...";
|
|
93
|
+
} else if (Array.isArray(value) && value.length > 3) {
|
|
94
|
+
formatted[key] = `[${value.length} items]`;
|
|
95
|
+
} else {
|
|
96
|
+
formatted[key] = value;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return formatted;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
LanguageModelItem,
|
|
3
|
+
LanguageModelTool,
|
|
4
|
+
LanguageModelUsage,
|
|
5
|
+
LanguageModelFinishReason,
|
|
6
|
+
LanguageModelResponseItem,
|
|
7
|
+
LanguageModelRequestSettings,
|
|
8
|
+
LanguageModelResponseType,
|
|
9
|
+
SharedWarning,
|
|
10
|
+
ToolCallState,
|
|
11
|
+
} from "@kernl-sdk/protocol";
|
|
12
|
+
|
|
13
|
+
import { ThreadState } from "@/internal";
|
|
14
|
+
|
|
15
|
+
// -----------------------------------------------------------------------------
|
|
16
|
+
// Span Data
|
|
17
|
+
// -----------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
export type SpanId = string;
|
|
20
|
+
|
|
21
|
+
export interface ThreadSpan {
|
|
22
|
+
kind: "thread";
|
|
23
|
+
threadId: string;
|
|
24
|
+
agentId: string;
|
|
25
|
+
namespace: string;
|
|
26
|
+
context?: unknown;
|
|
27
|
+
state?: ThreadState;
|
|
28
|
+
result?: unknown;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface ModelCallSpan {
|
|
33
|
+
kind: "model.call";
|
|
34
|
+
provider: string;
|
|
35
|
+
modelId: string;
|
|
36
|
+
request?: {
|
|
37
|
+
input: LanguageModelItem[];
|
|
38
|
+
settings?: LanguageModelRequestSettings;
|
|
39
|
+
responseType?: LanguageModelResponseType;
|
|
40
|
+
tools?: LanguageModelTool[];
|
|
41
|
+
};
|
|
42
|
+
response?: {
|
|
43
|
+
content: LanguageModelResponseItem[];
|
|
44
|
+
finishReason: LanguageModelFinishReason;
|
|
45
|
+
usage?: LanguageModelUsage;
|
|
46
|
+
warnings?: SharedWarning[];
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ToolCallSpan {
|
|
51
|
+
kind: "tool.call";
|
|
52
|
+
toolId: string;
|
|
53
|
+
callId: string;
|
|
54
|
+
args?: Record<string, unknown>;
|
|
55
|
+
state?: ToolCallState;
|
|
56
|
+
result?: string;
|
|
57
|
+
error?: string | null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type SpanData = ThreadSpan | ModelCallSpan | ToolCallSpan;
|
|
61
|
+
export type SpanKind = SpanData["kind"];
|
|
62
|
+
|
|
63
|
+
// -----------------------------------------------------------------------------
|
|
64
|
+
// Event Data
|
|
65
|
+
// -----------------------------------------------------------------------------
|
|
66
|
+
|
|
67
|
+
export interface ThreadErrorEvent {
|
|
68
|
+
kind: "thread.error";
|
|
69
|
+
message: string;
|
|
70
|
+
stack?: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface ThreadAbortedEvent {
|
|
74
|
+
kind: "thread.aborted";
|
|
75
|
+
reason?: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface ThreadGuardrailTriggeredEvent {
|
|
79
|
+
kind: "thread.guardrail_triggered";
|
|
80
|
+
name: string;
|
|
81
|
+
type: "input" | "output";
|
|
82
|
+
passed: boolean;
|
|
83
|
+
reason?: string;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface ToolApprovalRequestedEvent {
|
|
87
|
+
kind: "tool.approval_requested";
|
|
88
|
+
toolId: string;
|
|
89
|
+
callId: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface ToolApprovalGrantedEvent {
|
|
93
|
+
kind: "tool.approval_granted";
|
|
94
|
+
toolId: string;
|
|
95
|
+
callId: string;
|
|
96
|
+
approver?: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface ToolApprovalDeniedEvent {
|
|
100
|
+
kind: "tool.approval_denied";
|
|
101
|
+
toolId: string;
|
|
102
|
+
callId: string;
|
|
103
|
+
reason?: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export type EventData =
|
|
107
|
+
| ThreadErrorEvent
|
|
108
|
+
| ThreadAbortedEvent
|
|
109
|
+
| ThreadGuardrailTriggeredEvent
|
|
110
|
+
| ToolApprovalRequestedEvent
|
|
111
|
+
| ToolApprovalGrantedEvent
|
|
112
|
+
| ToolApprovalDeniedEvent;
|
|
113
|
+
|
|
114
|
+
export type EventKind = EventData["kind"];
|
|
115
|
+
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=processor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/trace/processor.ts"],"names":[],"mappings":""}
|
package/dist/trace/processor.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";
|
package/dist/trace/traces.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=traces.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"traces.d.ts","sourceRoot":"","sources":["../../src/trace/traces.ts"],"names":[],"mappings":""}
|
package/dist/trace/traces.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// import { defaultProcessor, TracingProcessor } from "./processor.js";
|
|
3
|
-
// import { generateTraceId } from "./utils.js";
|
|
4
|
-
// export type TraceOptions = {
|
|
5
|
-
// traceId?: string;
|
|
6
|
-
// name?: string;
|
|
7
|
-
// groupId?: string;
|
|
8
|
-
// metadata?: Record<string, any>;
|
|
9
|
-
// started?: boolean;
|
|
10
|
-
// };
|
|
11
|
-
// export class Trace {
|
|
12
|
-
// public type = "trace" as const;
|
|
13
|
-
// public traceId: string;
|
|
14
|
-
// public name: string;
|
|
15
|
-
// public groupId: string | null = null;
|
|
16
|
-
// public metadata?: Record<string, any>;
|
|
17
|
-
// #processor: TracingProcessor;
|
|
18
|
-
// #started: boolean;
|
|
19
|
-
// constructor(options: TraceOptions, processor?: TracingProcessor) {
|
|
20
|
-
// this.traceId = options.traceId ?? generateTraceId();
|
|
21
|
-
// this.name = options.name ?? "Agent workflow";
|
|
22
|
-
// this.groupId = options.groupId ?? null;
|
|
23
|
-
// this.metadata = options.metadata ?? {};
|
|
24
|
-
// this.#processor = processor ?? defaultProcessor();
|
|
25
|
-
// this.#started = options.started ?? false;
|
|
26
|
-
// }
|
|
27
|
-
// async start() {
|
|
28
|
-
// if (this.#started) {
|
|
29
|
-
// return;
|
|
30
|
-
// }
|
|
31
|
-
// this.#started = true;
|
|
32
|
-
// await this.#processor.onTraceStart(this);
|
|
33
|
-
// }
|
|
34
|
-
// async end() {
|
|
35
|
-
// if (!this.#started) {
|
|
36
|
-
// return;
|
|
37
|
-
// }
|
|
38
|
-
// this.#started = false;
|
|
39
|
-
// await this.#processor.onTraceEnd(this);
|
|
40
|
-
// }
|
|
41
|
-
// clone(): Trace {
|
|
42
|
-
// return new Trace({
|
|
43
|
-
// traceId: this.traceId,
|
|
44
|
-
// name: this.name,
|
|
45
|
-
// groupId: this.groupId ?? undefined,
|
|
46
|
-
// metadata: this.metadata,
|
|
47
|
-
// started: this.#started,
|
|
48
|
-
// });
|
|
49
|
-
// }
|
|
50
|
-
// toJSON(): object | null {
|
|
51
|
-
// return {
|
|
52
|
-
// object: this.type,
|
|
53
|
-
// id: this.traceId,
|
|
54
|
-
// workflow_name: this.name, // (TODO): why workflow?
|
|
55
|
-
// group_id: this.groupId,
|
|
56
|
-
// metadata: this.metadata,
|
|
57
|
-
// };
|
|
58
|
-
// }
|
|
59
|
-
// }
|
|
60
|
-
// export class NoopTrace extends Trace {
|
|
61
|
-
// constructor() {
|
|
62
|
-
// super({});
|
|
63
|
-
// }
|
|
64
|
-
// async start(): Promise<void> {
|
|
65
|
-
// return;
|
|
66
|
-
// }
|
|
67
|
-
// async end(): Promise<void> {
|
|
68
|
-
// return;
|
|
69
|
-
// }
|
|
70
|
-
// toJSON(): object | null {
|
|
71
|
-
// return null;
|
|
72
|
-
// }
|
|
73
|
-
// }
|
package/dist/trace/utils.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generate a trace ID using 16 random bytes (128-bit, 32 hex chars).
|
|
3
|
-
* @returns A trace ID prefixed with `trace_`.
|
|
4
|
-
*/
|
|
5
|
-
export declare function generateTraceId(): string;
|
|
6
|
-
/**
|
|
7
|
-
* Generate a span ID using 12 random bytes (96-bit, 24 hex chars).
|
|
8
|
-
* @returns A span ID prefixed with `span_`.
|
|
9
|
-
*/
|
|
10
|
-
export declare function generateSpanId(): string;
|
|
11
|
-
/**
|
|
12
|
-
* Generate a group ID using 12 random bytes (96-bit, 24 hex chars).
|
|
13
|
-
* @returns A group ID prefixed with `group_`.
|
|
14
|
-
*/
|
|
15
|
-
export declare function generateGroupId(): string;
|
|
16
|
-
/**
|
|
17
|
-
* Remove fields that start with an underscore from an object.
|
|
18
|
-
* @param obj - The object to remove private fields from.
|
|
19
|
-
* @returns A new object with private fields removed.
|
|
20
|
-
*/
|
|
21
|
-
export declare function removePrivateFields(obj: Record<string, any>): Record<string, any>;
|
|
22
|
-
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/trace/utils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACvB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAIrB"}
|
package/dist/trace/utils.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { randomID } from "@kernl-sdk/shared/lib";
|
|
2
|
-
/**
|
|
3
|
-
* Generate a trace ID using 16 random bytes (128-bit, 32 hex chars).
|
|
4
|
-
* @returns A trace ID prefixed with `trace_`.
|
|
5
|
-
*/
|
|
6
|
-
export function generateTraceId() {
|
|
7
|
-
return `trace_${randomID(16)}`;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Generate a span ID using 12 random bytes (96-bit, 24 hex chars).
|
|
11
|
-
* @returns A span ID prefixed with `span_`.
|
|
12
|
-
*/
|
|
13
|
-
export function generateSpanId() {
|
|
14
|
-
return `span_${randomID(12)}`;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Generate a group ID using 12 random bytes (96-bit, 24 hex chars).
|
|
18
|
-
* @returns A group ID prefixed with `group_`.
|
|
19
|
-
*/
|
|
20
|
-
export function generateGroupId() {
|
|
21
|
-
return `group_${randomID(12)}`;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Remove fields that start with an underscore from an object.
|
|
25
|
-
* @param obj - The object to remove private fields from.
|
|
26
|
-
* @returns A new object with private fields removed.
|
|
27
|
-
*/
|
|
28
|
-
export function removePrivateFields(obj) {
|
|
29
|
-
return Object.fromEntries(Object.entries(obj).filter(([key]) => !key.startsWith("_")));
|
|
30
|
-
}
|
package/src/trace/processor.ts
DELETED
|
File without changes
|
package/src/trace/traces.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
// import { defaultProcessor, TracingProcessor } from "./processor";
|
|
2
|
-
// import { generateTraceId } from "./utils";
|
|
3
|
-
|
|
4
|
-
// export type TraceOptions = {
|
|
5
|
-
// traceId?: string;
|
|
6
|
-
// name?: string;
|
|
7
|
-
// groupId?: string;
|
|
8
|
-
// metadata?: Record<string, any>;
|
|
9
|
-
// started?: boolean;
|
|
10
|
-
// };
|
|
11
|
-
|
|
12
|
-
// export class Trace {
|
|
13
|
-
// public type = "trace" as const;
|
|
14
|
-
// public traceId: string;
|
|
15
|
-
// public name: string;
|
|
16
|
-
// public groupId: string | null = null;
|
|
17
|
-
// public metadata?: Record<string, any>;
|
|
18
|
-
|
|
19
|
-
// #processor: TracingProcessor;
|
|
20
|
-
// #started: boolean;
|
|
21
|
-
|
|
22
|
-
// constructor(options: TraceOptions, processor?: TracingProcessor) {
|
|
23
|
-
// this.traceId = options.traceId ?? generateTraceId();
|
|
24
|
-
// this.name = options.name ?? "Agent workflow";
|
|
25
|
-
// this.groupId = options.groupId ?? null;
|
|
26
|
-
// this.metadata = options.metadata ?? {};
|
|
27
|
-
// this.#processor = processor ?? defaultProcessor();
|
|
28
|
-
// this.#started = options.started ?? false;
|
|
29
|
-
// }
|
|
30
|
-
|
|
31
|
-
// async start() {
|
|
32
|
-
// if (this.#started) {
|
|
33
|
-
// return;
|
|
34
|
-
// }
|
|
35
|
-
|
|
36
|
-
// this.#started = true;
|
|
37
|
-
// await this.#processor.onTraceStart(this);
|
|
38
|
-
// }
|
|
39
|
-
|
|
40
|
-
// async end() {
|
|
41
|
-
// if (!this.#started) {
|
|
42
|
-
// return;
|
|
43
|
-
// }
|
|
44
|
-
|
|
45
|
-
// this.#started = false;
|
|
46
|
-
// await this.#processor.onTraceEnd(this);
|
|
47
|
-
// }
|
|
48
|
-
|
|
49
|
-
// clone(): Trace {
|
|
50
|
-
// return new Trace({
|
|
51
|
-
// traceId: this.traceId,
|
|
52
|
-
// name: this.name,
|
|
53
|
-
// groupId: this.groupId ?? undefined,
|
|
54
|
-
// metadata: this.metadata,
|
|
55
|
-
// started: this.#started,
|
|
56
|
-
// });
|
|
57
|
-
// }
|
|
58
|
-
|
|
59
|
-
// toJSON(): object | null {
|
|
60
|
-
// return {
|
|
61
|
-
// object: this.type,
|
|
62
|
-
// id: this.traceId,
|
|
63
|
-
// workflow_name: this.name, // (TODO): why workflow?
|
|
64
|
-
// group_id: this.groupId,
|
|
65
|
-
// metadata: this.metadata,
|
|
66
|
-
// };
|
|
67
|
-
// }
|
|
68
|
-
// }
|
|
69
|
-
|
|
70
|
-
// export class NoopTrace extends Trace {
|
|
71
|
-
// constructor() {
|
|
72
|
-
// super({});
|
|
73
|
-
// }
|
|
74
|
-
|
|
75
|
-
// async start(): Promise<void> {
|
|
76
|
-
// return;
|
|
77
|
-
// }
|
|
78
|
-
|
|
79
|
-
// async end(): Promise<void> {
|
|
80
|
-
// return;
|
|
81
|
-
// }
|
|
82
|
-
|
|
83
|
-
// toJSON(): object | null {
|
|
84
|
-
// return null;
|
|
85
|
-
// }
|
|
86
|
-
// }
|
package/src/trace/utils.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { randomID } from "@kernl-sdk/shared/lib";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Generate a trace ID using 16 random bytes (128-bit, 32 hex chars).
|
|
5
|
-
* @returns A trace ID prefixed with `trace_`.
|
|
6
|
-
*/
|
|
7
|
-
export function generateTraceId(): string {
|
|
8
|
-
return `trace_${randomID(16)}`;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Generate a span ID using 12 random bytes (96-bit, 24 hex chars).
|
|
13
|
-
* @returns A span ID prefixed with `span_`.
|
|
14
|
-
*/
|
|
15
|
-
export function generateSpanId(): string {
|
|
16
|
-
return `span_${randomID(12)}`;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Generate a group ID using 12 random bytes (96-bit, 24 hex chars).
|
|
21
|
-
* @returns A group ID prefixed with `group_`.
|
|
22
|
-
*/
|
|
23
|
-
export function generateGroupId(): string {
|
|
24
|
-
return `group_${randomID(12)}`;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Remove fields that start with an underscore from an object.
|
|
29
|
-
* @param obj - The object to remove private fields from.
|
|
30
|
-
* @returns A new object with private fields removed.
|
|
31
|
-
*/
|
|
32
|
-
export function removePrivateFields(
|
|
33
|
-
obj: Record<string, any>,
|
|
34
|
-
): Record<string, any> {
|
|
35
|
-
return Object.fromEntries(
|
|
36
|
-
Object.entries(obj).filter(([key]) => !key.startsWith("_")),
|
|
37
|
-
);
|
|
38
|
-
}
|