@tokenjam/sdk 0.2.0

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/index.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClaudeCodeEvents = exports.TjAttributes = exports.GenAIAttributes = exports.SpanBuilder = exports.SpanStatus = exports.SpanKind = exports.TjClient = void 0;
4
+ var client_js_1 = require("./client.js");
5
+ Object.defineProperty(exports, "TjClient", { enumerable: true, get: function () { return client_js_1.TjClient; } });
6
+ var types_js_1 = require("./types.js");
7
+ Object.defineProperty(exports, "SpanKind", { enumerable: true, get: function () { return types_js_1.SpanKind; } });
8
+ Object.defineProperty(exports, "SpanStatus", { enumerable: true, get: function () { return types_js_1.SpanStatus; } });
9
+ var span_builder_js_1 = require("./span-builder.js");
10
+ Object.defineProperty(exports, "SpanBuilder", { enumerable: true, get: function () { return span_builder_js_1.SpanBuilder; } });
11
+ var semconv_js_1 = require("./semconv.js");
12
+ Object.defineProperty(exports, "GenAIAttributes", { enumerable: true, get: function () { return semconv_js_1.GenAIAttributes; } });
13
+ Object.defineProperty(exports, "TjAttributes", { enumerable: true, get: function () { return semconv_js_1.TjAttributes; } });
14
+ Object.defineProperty(exports, "ClaudeCodeEvents", { enumerable: true, get: function () { return semconv_js_1.ClaudeCodeEvents; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA6D;AAApD,qGAAA,QAAQ,OAAA;AACjB,uCAAgG;AAAzC,oGAAA,QAAQ,OAAA;AAAE,sGAAA,UAAU,OAAA;AAC3E,qDAAgD;AAAvC,8GAAA,WAAW,OAAA;AACpB,2CAA+E;AAAtE,6GAAA,eAAe,OAAA;AAAE,0GAAA,YAAY,OAAA;AAAE,8GAAA,gBAAgB,OAAA"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * OpenTelemetry GenAI Semantic Convention attribute names.
3
+ * Mirrors ocw/otel/semconv.py — keep in sync.
4
+ */
5
+ export declare const GenAIAttributes: {
6
+ readonly AGENT_ID: "gen_ai.agent.id";
7
+ readonly AGENT_NAME: "gen_ai.agent.name";
8
+ readonly AGENT_VERSION: "gen_ai.agent.version";
9
+ readonly PROVIDER_NAME: "gen_ai.provider.name";
10
+ readonly REQUEST_MODEL: "gen_ai.request.model";
11
+ readonly REQUEST_TYPE: "gen_ai.request.type";
12
+ readonly INPUT_TOKENS: "gen_ai.usage.input_tokens";
13
+ readonly OUTPUT_TOKENS: "gen_ai.usage.output_tokens";
14
+ readonly CACHE_READ_TOKENS: "gen_ai.usage.cache_read_tokens";
15
+ readonly CACHE_CREATE_TOKENS: "gen_ai.usage.cache_creation_tokens";
16
+ readonly TOOL_NAME: "gen_ai.tool.name";
17
+ readonly TOOL_DESCRIPTION: "gen_ai.tool.description";
18
+ readonly TOOL_INPUT: "gen_ai.tool.input";
19
+ readonly TOOL_OUTPUT: "gen_ai.tool.output";
20
+ readonly CONVERSATION_ID: "gen_ai.conversation.id";
21
+ readonly PROMPT_CONTENT: "gen_ai.prompt.content";
22
+ readonly COMPLETION_CONTENT: "gen_ai.completion.content";
23
+ readonly SPAN_INVOKE_AGENT: "invoke_agent";
24
+ readonly SPAN_CREATE_AGENT: "create_agent";
25
+ readonly SPAN_TOOL_CALL: "gen_ai.tool.call";
26
+ readonly SPAN_LLM_CALL: "gen_ai.llm.call";
27
+ };
28
+ export declare const TjAttributes: {
29
+ readonly COST_USD: "ocw.cost_usd";
30
+ readonly ALERT_TYPE: "ocw.alert.type";
31
+ readonly ALERT_SEVERITY: "ocw.alert.severity";
32
+ readonly SANDBOX_EVENT: "ocw.sandbox.event";
33
+ readonly EGRESS_HOST: "ocw.sandbox.egress_host";
34
+ readonly EGRESS_PORT: "ocw.sandbox.egress_port";
35
+ readonly FILESYSTEM_PATH: "ocw.sandbox.filesystem_path";
36
+ readonly SYSCALL_NAME: "ocw.sandbox.syscall_name";
37
+ };
38
+ /**
39
+ * Event names and attribute constants from Claude Code's OTel log exporter.
40
+ * Mirrors ClaudeCodeEvents in ocw/otel/semconv.py — keep in sync.
41
+ */
42
+ export declare const ClaudeCodeEvents: {
43
+ readonly API_REQUEST: "claude_code.api_request";
44
+ readonly TOOL_RESULT: "claude_code.tool_result";
45
+ readonly API_ERROR: "claude_code.api_error";
46
+ readonly USER_PROMPT: "claude_code.user_prompt";
47
+ readonly TOOL_DECISION: "claude_code.tool_decision";
48
+ readonly SESSION_ID: "session.id";
49
+ readonly PROMPT_ID: "prompt.id";
50
+ readonly EVENT_SEQUENCE: "event.sequence";
51
+ readonly COST_USD: "cost_usd";
52
+ readonly DURATION_MS: "duration_ms";
53
+ readonly SPEED: "speed";
54
+ readonly INPUT_TOKENS: "input_tokens";
55
+ readonly OUTPUT_TOKENS: "output_tokens";
56
+ readonly CACHE_READ_TOKENS: "cache_read_tokens";
57
+ readonly CACHE_CREATION_TOKENS: "cache_creation_tokens";
58
+ readonly TOOL_NAME: "tool_name";
59
+ readonly SUCCESS: "success";
60
+ readonly ERROR: "error";
61
+ readonly TOOL_PARAMETERS: "tool_parameters";
62
+ readonly TOOL_INPUT: "tool_input";
63
+ readonly DECISION_TYPE: "decision_type";
64
+ readonly TOOL_RESULT_SIZE: "tool_result_size_bytes";
65
+ readonly STATUS_CODE_HTTP: "status_code";
66
+ readonly ATTEMPT: "attempt";
67
+ readonly DECISION: "decision";
68
+ readonly DECISION_SOURCE: "source";
69
+ };
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClaudeCodeEvents = exports.TjAttributes = exports.GenAIAttributes = void 0;
4
+ /**
5
+ * OpenTelemetry GenAI Semantic Convention attribute names.
6
+ * Mirrors ocw/otel/semconv.py — keep in sync.
7
+ */
8
+ exports.GenAIAttributes = {
9
+ AGENT_ID: "gen_ai.agent.id",
10
+ AGENT_NAME: "gen_ai.agent.name",
11
+ AGENT_VERSION: "gen_ai.agent.version",
12
+ PROVIDER_NAME: "gen_ai.provider.name",
13
+ REQUEST_MODEL: "gen_ai.request.model",
14
+ REQUEST_TYPE: "gen_ai.request.type",
15
+ INPUT_TOKENS: "gen_ai.usage.input_tokens",
16
+ OUTPUT_TOKENS: "gen_ai.usage.output_tokens",
17
+ CACHE_READ_TOKENS: "gen_ai.usage.cache_read_tokens",
18
+ CACHE_CREATE_TOKENS: "gen_ai.usage.cache_creation_tokens",
19
+ TOOL_NAME: "gen_ai.tool.name",
20
+ TOOL_DESCRIPTION: "gen_ai.tool.description",
21
+ TOOL_INPUT: "gen_ai.tool.input",
22
+ TOOL_OUTPUT: "gen_ai.tool.output",
23
+ CONVERSATION_ID: "gen_ai.conversation.id",
24
+ PROMPT_CONTENT: "gen_ai.prompt.content",
25
+ COMPLETION_CONTENT: "gen_ai.completion.content",
26
+ SPAN_INVOKE_AGENT: "invoke_agent",
27
+ SPAN_CREATE_AGENT: "create_agent",
28
+ SPAN_TOOL_CALL: "gen_ai.tool.call",
29
+ SPAN_LLM_CALL: "gen_ai.llm.call",
30
+ };
31
+ exports.TjAttributes = {
32
+ COST_USD: "ocw.cost_usd",
33
+ ALERT_TYPE: "ocw.alert.type",
34
+ ALERT_SEVERITY: "ocw.alert.severity",
35
+ SANDBOX_EVENT: "ocw.sandbox.event",
36
+ EGRESS_HOST: "ocw.sandbox.egress_host",
37
+ EGRESS_PORT: "ocw.sandbox.egress_port",
38
+ FILESYSTEM_PATH: "ocw.sandbox.filesystem_path",
39
+ SYSCALL_NAME: "ocw.sandbox.syscall_name",
40
+ };
41
+ /**
42
+ * Event names and attribute constants from Claude Code's OTel log exporter.
43
+ * Mirrors ClaudeCodeEvents in ocw/otel/semconv.py — keep in sync.
44
+ */
45
+ exports.ClaudeCodeEvents = {
46
+ // Event names (logRecord body values)
47
+ API_REQUEST: "claude_code.api_request",
48
+ TOOL_RESULT: "claude_code.tool_result",
49
+ API_ERROR: "claude_code.api_error",
50
+ USER_PROMPT: "claude_code.user_prompt",
51
+ TOOL_DECISION: "claude_code.tool_decision",
52
+ // Standard context attributes present on all events
53
+ SESSION_ID: "session.id",
54
+ PROMPT_ID: "prompt.id",
55
+ EVENT_SEQUENCE: "event.sequence",
56
+ // api_request attributes
57
+ COST_USD: "cost_usd",
58
+ DURATION_MS: "duration_ms",
59
+ SPEED: "speed",
60
+ INPUT_TOKENS: "input_tokens",
61
+ OUTPUT_TOKENS: "output_tokens",
62
+ CACHE_READ_TOKENS: "cache_read_tokens",
63
+ CACHE_CREATION_TOKENS: "cache_creation_tokens",
64
+ // tool_result attributes
65
+ TOOL_NAME: "tool_name",
66
+ SUCCESS: "success",
67
+ ERROR: "error",
68
+ TOOL_PARAMETERS: "tool_parameters",
69
+ TOOL_INPUT: "tool_input",
70
+ DECISION_TYPE: "decision_type",
71
+ TOOL_RESULT_SIZE: "tool_result_size_bytes",
72
+ // api_error attributes
73
+ STATUS_CODE_HTTP: "status_code",
74
+ ATTEMPT: "attempt",
75
+ // tool_decision attributes
76
+ DECISION: "decision",
77
+ DECISION_SOURCE: "source",
78
+ };
79
+ //# sourceMappingURL=semconv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semconv.js","sourceRoot":"","sources":["../src/semconv.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,eAAe,GAAG;IAC7B,QAAQ,EAAE,iBAAiB;IAC3B,UAAU,EAAE,mBAAmB;IAC/B,aAAa,EAAE,sBAAsB;IACrC,aAAa,EAAE,sBAAsB;IACrC,aAAa,EAAE,sBAAsB;IACrC,YAAY,EAAE,qBAAqB;IACnC,YAAY,EAAE,2BAA2B;IACzC,aAAa,EAAE,4BAA4B;IAC3C,iBAAiB,EAAE,gCAAgC;IACnD,mBAAmB,EAAE,oCAAoC;IACzD,SAAS,EAAE,kBAAkB;IAC7B,gBAAgB,EAAE,yBAAyB;IAC3C,UAAU,EAAE,mBAAmB;IAC/B,WAAW,EAAE,oBAAoB;IACjC,eAAe,EAAE,wBAAwB;IACzC,cAAc,EAAE,uBAAuB;IACvC,kBAAkB,EAAE,2BAA2B;IAC/C,iBAAiB,EAAE,cAAc;IACjC,iBAAiB,EAAE,cAAc;IACjC,cAAc,EAAE,kBAAkB;IAClC,aAAa,EAAE,iBAAiB;CACxB,CAAC;AAEE,QAAA,YAAY,GAAG;IAC1B,QAAQ,EAAE,cAAc;IACxB,UAAU,EAAE,gBAAgB;IAC5B,cAAc,EAAE,oBAAoB;IACpC,aAAa,EAAE,mBAAmB;IAClC,WAAW,EAAE,yBAAyB;IACtC,WAAW,EAAE,yBAAyB;IACtC,eAAe,EAAE,6BAA6B;IAC9C,YAAY,EAAE,0BAA0B;CAChC,CAAC;AAEX;;;GAGG;AACU,QAAA,gBAAgB,GAAG;IAC9B,sCAAsC;IACtC,WAAW,EAAE,yBAAyB;IACtC,WAAW,EAAE,yBAAyB;IACtC,SAAS,EAAE,uBAAuB;IAClC,WAAW,EAAE,yBAAyB;IACtC,aAAa,EAAE,2BAA2B;IAE1C,oDAAoD;IACpD,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,WAAW;IACtB,cAAc,EAAE,gBAAgB;IAEhC,yBAAyB;IACzB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;IAC1B,KAAK,EAAE,OAAO;IACd,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,iBAAiB,EAAE,mBAAmB;IACtC,qBAAqB,EAAE,uBAAuB;IAE9C,yBAAyB;IACzB,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,iBAAiB;IAClC,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,wBAAwB;IAE1C,uBAAuB;IACvB,gBAAgB,EAAE,aAAa;IAC/B,OAAO,EAAE,SAAS;IAElB,2BAA2B;IAC3B,QAAQ,EAAE,UAAU;IACpB,eAAe,EAAE,QAAQ;CACjB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const semconv_js_1 = require("./semconv.js");
9
+ (0, node_test_1.describe)("GenAIAttributes", () => {
10
+ (0, node_test_1.it)("has standard GenAI attribute keys", () => {
11
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.AGENT_ID, "gen_ai.agent.id");
12
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.PROVIDER_NAME, "gen_ai.provider.name");
13
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.REQUEST_MODEL, "gen_ai.request.model");
14
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.INPUT_TOKENS, "gen_ai.usage.input_tokens");
15
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.OUTPUT_TOKENS, "gen_ai.usage.output_tokens");
16
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.TOOL_NAME, "gen_ai.tool.name");
17
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.CONVERSATION_ID, "gen_ai.conversation.id");
18
+ });
19
+ (0, node_test_1.it)("has standard span names", () => {
20
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.SPAN_LLM_CALL, "gen_ai.llm.call");
21
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.SPAN_TOOL_CALL, "gen_ai.tool.call");
22
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.SPAN_INVOKE_AGENT, "invoke_agent");
23
+ });
24
+ });
25
+ (0, node_test_1.describe)("TjAttributes", () => {
26
+ (0, node_test_1.it)("has ocw-specific attribute keys", () => {
27
+ strict_1.default.equal(semconv_js_1.TjAttributes.COST_USD, "ocw.cost_usd");
28
+ strict_1.default.equal(semconv_js_1.TjAttributes.ALERT_TYPE, "ocw.alert.type");
29
+ strict_1.default.equal(semconv_js_1.TjAttributes.SANDBOX_EVENT, "ocw.sandbox.event");
30
+ });
31
+ });
32
+ //# sourceMappingURL=semconv.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semconv.test.js","sourceRoot":"","sources":["../src/semconv.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAyC;AACzC,gEAAwC;AACxC,6CAA6D;AAE7D,IAAA,oBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAA,cAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAC1D,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;QACpE,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;QACpE,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC;QACxE,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAC;QAC1E,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAC5D,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC/D,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACjE,gBAAM,CAAC,KAAK,CAAC,4BAAe,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAA,cAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,gBAAM,CAAC,KAAK,CAAC,yBAAY,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACpD,gBAAM,CAAC,KAAK,CAAC,yBAAY,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACxD,gBAAM,CAAC,KAAK,CAAC,yBAAY,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type Span, SpanKind, SpanStatus } from "./types.js";
2
+ export declare class SpanBuilder {
3
+ private span;
4
+ constructor(name: string);
5
+ traceId(id: string): this;
6
+ spanId(id: string): this;
7
+ parentSpanId(id: string): this;
8
+ kind(kind: SpanKind): this;
9
+ status(code: SpanStatus, message?: string): this;
10
+ startTime(iso: string): this;
11
+ endTime(iso: string): this;
12
+ durationMs(ms: number): this;
13
+ agentId(id: string): this;
14
+ agentName(name: string): this;
15
+ agentVersion(version: string): this;
16
+ sessionId(id: string): this;
17
+ conversationId(id: string): this;
18
+ provider(name: string): this;
19
+ model(name: string): this;
20
+ inputTokens(n: number): this;
21
+ outputTokens(n: number): this;
22
+ cacheReadTokens(n: number): this;
23
+ cacheCreateTokens(n: number): this;
24
+ toolName(name: string): this;
25
+ toolInput(input: string): this;
26
+ toolOutput(output: string): this;
27
+ attribute(key: string, value: unknown): this;
28
+ build(): Span;
29
+ }
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpanBuilder = void 0;
4
+ /**
5
+ * Fluent builder for constructing Span objects with GenAI semantic conventions.
6
+ */
7
+ const node_crypto_1 = require("node:crypto");
8
+ const semconv_js_1 = require("./semconv.js");
9
+ const types_js_1 = require("./types.js");
10
+ function newTraceId() {
11
+ return (0, node_crypto_1.randomUUID)().replace(/-/g, "");
12
+ }
13
+ function newSpanId() {
14
+ return (0, node_crypto_1.randomUUID)().replace(/-/g, "").slice(0, 16);
15
+ }
16
+ class SpanBuilder {
17
+ span;
18
+ constructor(name) {
19
+ const now = new Date().toISOString();
20
+ this.span = {
21
+ spanId: newSpanId(),
22
+ traceId: newTraceId(),
23
+ name,
24
+ kind: types_js_1.SpanKind.CLIENT,
25
+ statusCode: types_js_1.SpanStatus.OK,
26
+ startTime: now,
27
+ attributes: {},
28
+ };
29
+ }
30
+ traceId(id) {
31
+ this.span.traceId = id;
32
+ return this;
33
+ }
34
+ spanId(id) {
35
+ this.span.spanId = id;
36
+ return this;
37
+ }
38
+ parentSpanId(id) {
39
+ this.span.parentSpanId = id;
40
+ return this;
41
+ }
42
+ kind(kind) {
43
+ this.span.kind = kind;
44
+ return this;
45
+ }
46
+ status(code, message) {
47
+ this.span.statusCode = code;
48
+ if (message)
49
+ this.span.statusMessage = message;
50
+ return this;
51
+ }
52
+ startTime(iso) {
53
+ this.span.startTime = iso;
54
+ return this;
55
+ }
56
+ endTime(iso) {
57
+ this.span.endTime = iso;
58
+ return this;
59
+ }
60
+ durationMs(ms) {
61
+ this.span.durationMs = ms;
62
+ return this;
63
+ }
64
+ agentId(id) {
65
+ this.span.agentId = id;
66
+ this.span.attributes[semconv_js_1.GenAIAttributes.AGENT_ID] = id;
67
+ return this;
68
+ }
69
+ agentName(name) {
70
+ this.span.attributes[semconv_js_1.GenAIAttributes.AGENT_NAME] = name;
71
+ return this;
72
+ }
73
+ agentVersion(version) {
74
+ this.span.attributes[semconv_js_1.GenAIAttributes.AGENT_VERSION] = version;
75
+ return this;
76
+ }
77
+ sessionId(id) {
78
+ this.span.sessionId = id;
79
+ this.span.attributes["gen_ai.session.id"] = id;
80
+ return this;
81
+ }
82
+ conversationId(id) {
83
+ this.span.conversationId = id;
84
+ this.span.attributes[semconv_js_1.GenAIAttributes.CONVERSATION_ID] = id;
85
+ return this;
86
+ }
87
+ provider(name) {
88
+ this.span.attributes[semconv_js_1.GenAIAttributes.PROVIDER_NAME] = name;
89
+ return this;
90
+ }
91
+ model(name) {
92
+ this.span.attributes[semconv_js_1.GenAIAttributes.REQUEST_MODEL] = name;
93
+ return this;
94
+ }
95
+ inputTokens(n) {
96
+ this.span.attributes[semconv_js_1.GenAIAttributes.INPUT_TOKENS] = n;
97
+ return this;
98
+ }
99
+ outputTokens(n) {
100
+ this.span.attributes[semconv_js_1.GenAIAttributes.OUTPUT_TOKENS] = n;
101
+ return this;
102
+ }
103
+ cacheReadTokens(n) {
104
+ this.span.attributes[semconv_js_1.GenAIAttributes.CACHE_READ_TOKENS] = n;
105
+ return this;
106
+ }
107
+ cacheCreateTokens(n) {
108
+ this.span.attributes[semconv_js_1.GenAIAttributes.CACHE_CREATE_TOKENS] = n;
109
+ return this;
110
+ }
111
+ toolName(name) {
112
+ this.span.attributes[semconv_js_1.GenAIAttributes.TOOL_NAME] = name;
113
+ return this;
114
+ }
115
+ toolInput(input) {
116
+ this.span.attributes[semconv_js_1.GenAIAttributes.TOOL_INPUT] = input;
117
+ return this;
118
+ }
119
+ toolOutput(output) {
120
+ this.span.attributes[semconv_js_1.GenAIAttributes.TOOL_OUTPUT] = output;
121
+ return this;
122
+ }
123
+ attribute(key, value) {
124
+ this.span.attributes[key] = value;
125
+ return this;
126
+ }
127
+ build() {
128
+ const endTime = (!this.span.endTime && this.span.durationMs != null)
129
+ ? new Date(new Date(this.span.startTime).getTime() + this.span.durationMs).toISOString()
130
+ : this.span.endTime;
131
+ return { ...this.span, endTime, attributes: { ...this.span.attributes } };
132
+ }
133
+ }
134
+ exports.SpanBuilder = SpanBuilder;
135
+ //# sourceMappingURL=span-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-builder.js","sourceRoot":"","sources":["../src/span-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const span_builder_js_1 = require("./span-builder.js");
9
+ const types_js_1 = require("./types.js");
10
+ const semconv_js_1 = require("./semconv.js");
11
+ (0, node_test_1.describe)("SpanBuilder", () => {
12
+ (0, node_test_1.it)("creates a span with required fields", () => {
13
+ const span = new span_builder_js_1.SpanBuilder("gen_ai.llm.call").build();
14
+ strict_1.default.ok(span.spanId);
15
+ strict_1.default.ok(span.traceId);
16
+ strict_1.default.equal(span.name, "gen_ai.llm.call");
17
+ strict_1.default.equal(span.kind, types_js_1.SpanKind.CLIENT);
18
+ strict_1.default.equal(span.statusCode, types_js_1.SpanStatus.OK);
19
+ strict_1.default.ok(span.startTime);
20
+ });
21
+ (0, node_test_1.it)("sets agent and provider attributes", () => {
22
+ const span = new span_builder_js_1.SpanBuilder("gen_ai.llm.call")
23
+ .agentId("my-agent")
24
+ .provider("anthropic")
25
+ .model("claude-haiku-4-5")
26
+ .build();
27
+ strict_1.default.equal(span.agentId, "my-agent");
28
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.AGENT_ID], "my-agent");
29
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.PROVIDER_NAME], "anthropic");
30
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.REQUEST_MODEL], "claude-haiku-4-5");
31
+ });
32
+ (0, node_test_1.it)("sets token counts", () => {
33
+ const span = new span_builder_js_1.SpanBuilder("gen_ai.llm.call")
34
+ .inputTokens(1000)
35
+ .outputTokens(200)
36
+ .cacheReadTokens(500)
37
+ .build();
38
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.INPUT_TOKENS], 1000);
39
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.OUTPUT_TOKENS], 200);
40
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.CACHE_READ_TOKENS], 500);
41
+ });
42
+ (0, node_test_1.it)("sets tool call attributes", () => {
43
+ const span = new span_builder_js_1.SpanBuilder("gen_ai.tool.call")
44
+ .kind(types_js_1.SpanKind.INTERNAL)
45
+ .toolName("search")
46
+ .toolInput('{"query": "test"}')
47
+ .toolOutput('{"results": []}')
48
+ .build();
49
+ strict_1.default.equal(span.kind, types_js_1.SpanKind.INTERNAL);
50
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.TOOL_NAME], "search");
51
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.TOOL_INPUT], '{"query": "test"}');
52
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.TOOL_OUTPUT], '{"results": []}');
53
+ });
54
+ (0, node_test_1.it)("sets conversation and session IDs", () => {
55
+ const span = new span_builder_js_1.SpanBuilder("gen_ai.llm.call")
56
+ .conversationId("conv-123")
57
+ .sessionId("sess-456")
58
+ .build();
59
+ strict_1.default.equal(span.conversationId, "conv-123");
60
+ strict_1.default.equal(span.sessionId, "sess-456");
61
+ strict_1.default.equal(span.attributes[semconv_js_1.GenAIAttributes.CONVERSATION_ID], "conv-123");
62
+ });
63
+ (0, node_test_1.it)("calculates endTime from durationMs", () => {
64
+ const start = "2026-03-28T10:00:00.000Z";
65
+ const span = new span_builder_js_1.SpanBuilder("gen_ai.llm.call")
66
+ .startTime(start)
67
+ .durationMs(500)
68
+ .build();
69
+ strict_1.default.equal(span.endTime, "2026-03-28T10:00:00.500Z");
70
+ });
71
+ (0, node_test_1.it)("sets custom attributes", () => {
72
+ const span = new span_builder_js_1.SpanBuilder("gen_ai.llm.call")
73
+ .attribute("custom.key", "custom-value")
74
+ .attribute("custom.number", 42)
75
+ .build();
76
+ strict_1.default.equal(span.attributes["custom.key"], "custom-value");
77
+ strict_1.default.equal(span.attributes["custom.number"], 42);
78
+ });
79
+ (0, node_test_1.it)("sets error status", () => {
80
+ const span = new span_builder_js_1.SpanBuilder("gen_ai.llm.call")
81
+ .status(types_js_1.SpanStatus.ERROR, "rate limited")
82
+ .build();
83
+ strict_1.default.equal(span.statusCode, types_js_1.SpanStatus.ERROR);
84
+ strict_1.default.equal(span.statusMessage, "rate limited");
85
+ });
86
+ (0, node_test_1.it)("sets parent span ID and trace ID", () => {
87
+ const span = new span_builder_js_1.SpanBuilder("gen_ai.llm.call")
88
+ .traceId("aabbccdd00112233aabbccdd00112233")
89
+ .parentSpanId("1122334455667788")
90
+ .build();
91
+ strict_1.default.equal(span.traceId, "aabbccdd00112233aabbccdd00112233");
92
+ strict_1.default.equal(span.parentSpanId, "1122334455667788");
93
+ });
94
+ (0, node_test_1.it)("returns a copy on build (immutable)", () => {
95
+ const builder = new span_builder_js_1.SpanBuilder("gen_ai.llm.call").agentId("agent-1");
96
+ const span1 = builder.build();
97
+ const span2 = builder.agentId("agent-2").build();
98
+ strict_1.default.equal(span1.agentId, "agent-1");
99
+ strict_1.default.equal(span2.agentId, "agent-2");
100
+ // Attributes should be independent copies
101
+ strict_1.default.equal(span1.attributes[semconv_js_1.GenAIAttributes.AGENT_ID], "agent-1");
102
+ });
103
+ });
104
+ //# sourceMappingURL=span-builder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-builder.test.js","sourceRoot":"","sources":["../src/span-builder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Core types for the OCW TypeScript SDK.
3
+ */
4
+ export declare enum SpanKind {
5
+ INTERNAL = "internal",
6
+ CLIENT = "client",
7
+ SERVER = "server",
8
+ PRODUCER = "producer",
9
+ CONSUMER = "consumer"
10
+ }
11
+ export declare enum SpanStatus {
12
+ OK = "ok",
13
+ ERROR = "error",
14
+ UNSET = "unset"
15
+ }
16
+ export interface Span {
17
+ spanId: string;
18
+ traceId: string;
19
+ parentSpanId?: string;
20
+ name: string;
21
+ kind: SpanKind;
22
+ statusCode: SpanStatus;
23
+ statusMessage?: string;
24
+ startTime: string;
25
+ endTime?: string;
26
+ durationMs?: number;
27
+ attributes: Record<string, unknown>;
28
+ events?: Array<Record<string, unknown>>;
29
+ agentId?: string;
30
+ sessionId?: string;
31
+ conversationId?: string;
32
+ }
33
+ export interface SpanBatch {
34
+ resourceSpans: Array<{
35
+ resource: {
36
+ attributes: Array<{
37
+ key: string;
38
+ value: {
39
+ stringValue: string;
40
+ };
41
+ }>;
42
+ };
43
+ scopeSpans: Array<{
44
+ spans: Array<OtlpSpan>;
45
+ }>;
46
+ }>;
47
+ }
48
+ export interface OtlpSpan {
49
+ traceId: string;
50
+ spanId: string;
51
+ parentSpanId?: string;
52
+ name: string;
53
+ kind: number;
54
+ startTimeUnixNano: string;
55
+ endTimeUnixNano?: string;
56
+ status: {
57
+ code: number;
58
+ message?: string;
59
+ };
60
+ attributes: Array<{
61
+ key: string;
62
+ value: OtlpValue;
63
+ }>;
64
+ events?: Array<{
65
+ timeUnixNano: string;
66
+ name: string;
67
+ attributes?: Array<{
68
+ key: string;
69
+ value: OtlpValue;
70
+ }>;
71
+ }>;
72
+ }
73
+ export type OtlpValue = {
74
+ stringValue: string;
75
+ } | {
76
+ intValue: string;
77
+ } | {
78
+ doubleValue: number;
79
+ } | {
80
+ boolValue: boolean;
81
+ } | {
82
+ arrayValue: {
83
+ values: OtlpValue[];
84
+ };
85
+ };
86
+ export interface IngestResult {
87
+ ingested: number;
88
+ rejected: number;
89
+ rejections: Array<{
90
+ span_id: string;
91
+ reason: string;
92
+ }>;
93
+ }
package/dist/types.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Core types for the OCW TypeScript SDK.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SpanStatus = exports.SpanKind = void 0;
7
+ var SpanKind;
8
+ (function (SpanKind) {
9
+ SpanKind["INTERNAL"] = "internal";
10
+ SpanKind["CLIENT"] = "client";
11
+ SpanKind["SERVER"] = "server";
12
+ SpanKind["PRODUCER"] = "producer";
13
+ SpanKind["CONSUMER"] = "consumer";
14
+ })(SpanKind || (exports.SpanKind = SpanKind = {}));
15
+ var SpanStatus;
16
+ (function (SpanStatus) {
17
+ SpanStatus["OK"] = "ok";
18
+ SpanStatus["ERROR"] = "error";
19
+ SpanStatus["UNSET"] = "unset";
20
+ })(SpanStatus || (exports.SpanStatus = SpanStatus = {}));
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;IACjB,iCAAqB,CAAA;IACrB,iCAAqB,CAAA;AACvB,CAAC,EANW,QAAQ,wBAAR,QAAQ,QAMnB;AAED,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,uBAAS,CAAA;IACT,6BAAe,CAAA;IACf,6BAAe,CAAA;AACjB,CAAC,EAJW,UAAU,0BAAV,UAAU,QAIrB"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@tokenjam/sdk",
3
+ "version": "0.2.0",
4
+ "description": "TypeScript SDK for TokenJam — local-first observability for AI agents",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "test": "node --test dist/client.test.js dist/span-builder.test.js dist/semconv.test.js",
10
+ "pretest": "tsc",
11
+ "lint": "tsc --noEmit"
12
+ },
13
+ "keywords": [
14
+ "ai",
15
+ "agents",
16
+ "observability",
17
+ "opentelemetry",
18
+ "llm"
19
+ ],
20
+ "license": "MIT",
21
+ "devDependencies": {
22
+ "@types/node": "^25.5.0",
23
+ "typescript": "^5.4"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "README.md"
28
+ ],
29
+ "engines": {
30
+ "node": ">=18"
31
+ }
32
+ }